README.md |
Migration Mailman2 vers Mailman3
Installation de Mailman3 via Docker et docker-compose
Limites et Pré-requis
Limites
Cette procédure ne traite que du cas suivant:
- Serveur SMTP utilisé: Postfix
- Système de base de données utilisée: Postgres
- Serveur mandataire inverse
Apache Httpd
Prérequis
- Un système Linux fonctionnel sur lequel
- sont installés les paquets suivants:
- git
- postfix
- docker
- docker-compose (Un binaire souvent bien plus récent que celui proposé par le gestionnaire de paquets de la distribution peut être installé directement à partir du dépôt Git.)
-
L'accès à un serveur SMTP, idéalement Postfix
-
L'accès à une base de données Postgres
Installation
-
Cloner le dépôt suivant:
-
https://github.com/maxking/docker-mailman
git clone https://github.com/maxking/docker-mailman
-
-
Éditer le fichier
docker-compose.yaml
(Il est probablement possible de faire la même chose à l'aide d'un fichier.env
oudocker-compose.override.yaml
)
-
Pour le service
mailman-core
:-
Renseigner les variables d'environnement suivantes:
Variable Commentaire (valeur) MTA Le type de MTA utilisé ( postfix
)SMTP_HOST Le FQDN du serveur SMTP utilisé SMTP_PORT Le port du serveur SMTP utilisé ( 25
)DATABASE_URL Le DSN d'accès à la base de données postgresql://<user>:<password>@<host>:<port>/<database>
DATABASE_TYPE postgres
)DATABASE_CLASS mailman.database.postgresql.PostgreSQLDatabase
HYPERKITTY_API_KEY Random encodé en base64: ie head -c 64 /dev/random | base64
-
Définir le volume
/opt/mailman/mailman/core:/opt/mailman/
Le volume est un volume local bind, le répertoire
/opt/mailman/mailman/core
devra être être crée sur la machine hôte hébergeant le container. Le répertoire peut prendre n'importe quelle valeur adaptée à la situation. -
Définir la politique de redémarrage du service à
always
-
-
Pour le service
mailman-web
:-
Renseigner les variables d'environnement suivantes:
Variable Commentaire SMTP_HOST Le FQDN du serveur SMTP utilisé SMTP_PORT Le port du serveur SMTP utilisé ( 25
)DJANGO_ALLOWED_HOSTS Le FQDN par lequel sera accédée l'interface web i.e: lists.example.com
SERVE_FROM_DOMAIN DATABASE_URL Le DSN d'accès à la base de données postgresql://<user>:<password>@<host>:<port>/<database>
DATABASE_TYPE postgres
HYPERKITTY_API_KEY La même clef que définie pour le service mailman-core
SECRET_KEY Random encodé en base64: ie head -c 64 /dev/random | base64
MAILMAN_ADMIN_USER Le nom d'utilisateur de l'administrateur par défaut MAILMAN_ADMIN_EMAIL L'adresse de courriel valide de l'administrateur -
Définir le volume
/opt/mailman/mailman/web:/opt/mailman-web-data
Le volume est un volume local bind, le répertoire
/opt/mailman/mailman/web
devra être être créé sur la machine hôte hébergeant le container (voir plus bas). Le répertoire peut prendre n'importe quelle valeur adaptée à la situation. -
Définir la politique de redémarrage du service à
always
-
Modifier la commande d'exécution du container en ajoutant l'option
--check-static
avec pour argument le volume contenant les fichiers statiquescommand: ["uwsgi", "--ini", "/opt/mailman-web/uwsgi.ini", "--check-static", "/opt/mailman-web-data"]
-
Définir l'interface réseau d'écoute du service web en ajustant les
ports
du conteneurports: - "192.168.1.2:8000:8000" # HTTP (on suppose que l'adresse LAN de l'hôte est 192.168.1.2) - "127.0.0.1:8080:8080" # uwsgi (reste en écoute sur l'interface loopback)
-
-
Créer les répertoires qui serviront de volumes aux containers
mkdir -p /opt/mailman/mailman/core /opt/mailman/mailman/web chown root: /opt/mailman/mailman/core /opt/mailman/mailman/web chmod 755 /opt/mailman/mailman/core /opt/mailman/mailman/web
Exemple de configuration du service mailman-core
mailman-core:
image: maxking/mailman-core:0.4
restart: always
container_name: mailman-core
hostname: mailman-core
volumes:
- /opt/mailman/mailman/core:/opt/mailman/
stop_grace_period: 30s
environment:
- MTA=postfix
- SMTP_HOST=smtp.example.com
- SMTP_PORT=25
- DATABASE_URL=postgresql://user:password@database_host/database
- DATABASE_TYPE=postgres
- DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase
- HYPERKITTY_API_KEY=1+wZYpHz0d9F+rItSSWuwby09R04ZLm19xONOdutzsJc/irGaWnuhO4NTIKTicEC57CG0+QsjHbf/YbNsBZhsA==
ports:
- "127.0.0.1:8001:8001" # API
- "127.0.0.1:8024:8024" # LMTP - incoming emails
networks:
mailman:
Exemple de configuration du service mailman-web
mailman-web:
image: maxking/mailman-web:0.4
restart: always
container_name: mailman-web
hostname: mailman-web
links:
- mailman-core:mailman-core
volumes:
- /opt/mailman3/mailman/web:/opt/mailman-web-data
environment:
- SMTP_HOST=smtp.example.com
- SMTP_PORT=25
- DJANGO_ALLOWED_HOSTS=lists.example.com
- DATABASE_TYPE=postgres
- DATABASE_URL=postgresql://user:password@database_host/database
- SERVE_FROM_DOMAIN=lists.example.com
- MAILMAN_ADMIN_USER=admin
- SECRET_KEY=ArtYpfQ7pfcekjA3+uv0xG0n6QlXXQ0Ywk1cP5Pks3R7WIGovBdWiSZ10aDhpjbS3h4GVUX4is/Do0b90Rkx7w==
- MAILMAN_ADMIN_EMAIL=admin@exampple.com
- HYPERKITTY_API_KEY=1+wZYpHz0d9F+rItSSWuwby09R04ZLm19xONOdutzsJc/irGaWnuhO4NTIKTicEC57CG0+QsjHbf/YbNsBZhsA==
ports:
- "192.168.1.2:8000:8000" # HTTP
- "127.0.0.1:8080:8080" # uwsgi
command: ["uwsgi", "--ini", "/opt/mailman-web/uwsgi.ini", "--check-static", "/opt/mailman-web-data"]
networks:
mailman:
Démarrage des containers
-
Démarrer les containers à l'aide la commande suivante:
docker-compose up -d
Note:
-
La création d'un service système permettant le redémarrage du conteneur est laissé au bon soin de l'administrateur du système :)
-
Les conteneurs prennent un certains temps pour démarrer, notamment la première fois.
-
L'interface d'administration des listes sera accessible sur l'adresse IP définie dans les ports du service
mailman-web
(192.168.1.2
).
Trouble shooting
Les logs sont accessibles à l'aide de la commande suivante:
docker-compose logs
Pour voir les logs défiler en direct, utiliser l'option -f
docker-compose logs -f
Documentation officielle et références
Configuration du serveur mandataire inverse (reverse-proxy)
Le service proposé par les conteneurs ne propose pas de chiffrement SSL/TLS. Un serveur mandataire inverse est donc nécesaire pour accéder au service via https.
Le serveur mandataire n'a pas nécessité à être installé sur l'hôte hébergeant les conteneurs.
Le fichier de configuration d'un hôte virtuel Apache est fourni tel quel. À vous de l'adapter à votre cas.
À noter que 192.168.1.1
est l'adresse IP du serveur mandataire inverse pas celle de l'hôte hébergeant les conteneurs qui est défini par la variable BACKEND_HOST
.
<VirtualHost 192.168.1.1:80>
# ReverseProxy with https redirect template
# Written by Doug Le Tough
# ######################
Define FQDN lists.example.com
Define BACKEND_HOST mailman-backend.local
Define BACKEND_PORT 8000
ServerName ${FQDN}
### All HTTP requests are converted to HTTPS requests
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>
ErrorLog "/var/log/httpd/${FQDN}_error.log"
CustomLog "/var/log/httpd/${FQDN}_access.log" Combined
</VirtualHost>
<VirtualHost 192.168.1.1:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
ServerName ${FQDN}
ProxyPreserveHost On
SSLEngine on
SSLCertificateFile /etc/dehydrated/certs/${FQDN}/cert.pem
SSLCertificateKeyFile /etc/dehydrated/certs/${FQDN}/privkey.pem
SSLCertificateChainFile /etc/dehydrated/certs/${FQDN}/fullchain.pem
RequestHeader set X_FORWARDED_PROTO 'https'
ProxyPass / http://${BACKEND_HOST}:${BACKEND_PORT}/
ProxyPassReverse / http://${BACKEND_HOST}:${BACKEND_PORT}/
ErrorLog "/var/log/httpd/${FQDN}_error.log"
CustomLog "/var/log/httpd/${FQDN}_access.log" Combined
</VirtualHost>
Configuration de Postfix
-
Modifier le fichier de configuration principale de Postfix (
/etc/postfix/main.cf
) de manière à-
prendre en charge le réseau des containers (
172.19.199.0/24
)mynetworks = 172.19.199.0/24, 127.0.0.0/8, 192.168.1.0/24, <Les autres réseaux supportés par l'instance postfix>
-
prendre en charge la liste des domaines et adresse de destinations des listes confiugurée dans Mailman3
transport_maps = regexp:/opt/mailman/mailman/core/var/data/postfix_lmtp local_recipient_maps = regexp:/opt/mailman/mailman/core/var/data/postfix_lmtp relay_domains = regexp:/opt/mailman/mailman/core/var/data/postfix_domains
-
Redémarrer le service Postfix pour prendre en compte les modifications.
-
Export, création et import des listes et utilisateurs
-
Se connecter via SSH sur l'hôte hébergrant Mailman2 et exporter la liste des utilisateurs pour chacune des listes à l'aide du script suivant
for LIST in $(list_lists | awk '{print $1}' | sed -e 1d); do echo $LIST; list_members $LIST > ${LIST}.txt done
Un fichier texte contenant la liste des utilisateurs sera créé dansle répertoire courant pour chacune des listes définies dans Mailman2.
- Accéder à l'interface d'administration web de Mailman3 à l'aide de l'URL définie sur le serveur mandataire inverse.
- Pour chacune des listes dont le nom s'est affiché à l'étape précédante:
- Créer et configurer une liste du même nom
- Dans
Paramètres / Atténuations DMARC
:- Bien vérifier que
Atténuation DMARC inconditionnelle
est àoui
- Bien vérifier que
- Dans
- Dans
Opérations goupées / Abonnement en masse
:- Copier la liste des utilisateurs dans le champs
Adresses de courriel à inscrire en nombre
- Cocher
Pré-confirmé
,Pré-approuvées
etPré-vérifiées
pour ne pas obliger les utilisateur à confirmer la création de leur compte - Décocher
Invitation
- Sélectionner
Non
àEnvoyer un message d'accueil
pour ne pas spammer les utilisateurs avec un courriel de bienvenue. - Cliquer sur
Subscribe users
- Copier la liste des utilisateurs dans le champs
- Créer et configurer une liste du même nom