Une mailing-list avec sympa

Sympa est un gestionnaire de liste de diffusion open source. Il fournit des fonctionnalitées avancées avec une interface Web riche et sécurisée. C'est un projet toujours en développement bien que le projet est mature depuis longtemps.

Alternative : https://github.com/madroach/minimalist


Installation et configuration de l'application

On part du principe que nous sommes sous une Debian 11 avec une version de perl en 5.32. La partie postifx est installé dont la configuration est adapté pour des domaines virtuels (et non pas pour gérer un seul domaine).

  • L'interface de gestion sera : https://listes.autarcie.org
  • Le domaine de gestion des listes : @listes.autarcie.org
  • On utilise une base de donnée SQLite

Pensons à ce que l'enregistrement MX soit présent pour utiliser le serveur mail qu'il faut.

Si l'on modifie la configuration de sympa, il faut relancer aussi apache car il garde en cache des configuration à cause du fgci!

Sympa

Ressources :

Commençon par son installation :

apt install sympa libapache2-mod-fcgid spawn-fcgi

Il se peut que l'installateur pose quelques questions préliminaires comme :

  • Pour la sélection d'un service web : sélectionner celui qui est utilisé sur le serveur
  • Concernant les accès root : répondre Non
  • “Faut-il configurer la base de données de sympa avec dbconfig-common ?” : répondre oui
  • On ne va pas en faire une très grosse utilisation donc on choisit le type de base : sqlite3

Voici la liste des dossiers à connaitre :

Dossier Fonction
/etc/sympa/sympa/sympa.conf Fichier de configuration
/var/spool/sympa/ Emplacement temporaire des mails.
/var/lib/sympa/list_data/ Données des listes
/usr/lib/sympa/bin/ Binaires de sympa

Configuration

Voici la configuration recommendé :

# cat /etc/sympa/sympa/sympa.conf
lang    fr
domain  listes.autarcie.org
listmaster      contactAautarcie.org
cookie  `/usr/bin/head -n1 /etc/sympa/cookie`
db_type SQLite
db_name /etc/sympa/sympa/sympa.db
static_content_path     /usr/share/sympa/static_content
css_path        /var/lib/sympa/css
css_url /css-sympa
pictures_path   /var/lib/sympa/pictures
pictures_url    /pictures-sympa
use_fast_cgi    1
wwsympa_url     http://listes.autarcie.org/wws
aliases_db_type hash
aliases_program postmap
sendmail /usr/sbin/sendmail
sendmail_aliases /etc/sympa/sympa_transport
mhonarc /usr/bin/mhonarc

Créons les espaces virtuels (obligatoire?):

mkdir -m 755 /etc/sympa/listes.autarcie.org
chown -R sympa:sympa /etc/sympa/listes.autarcie.org
touch /etc/sympa/listes.autarcie.org/robot.conf
mkdir -m 750 /var/lib/sympa/list_data/listes.autarcie.org
chown sympa:sympa /var/lib/sympa/list_data/listes.autarcie.org

Postfix

On interconnecte Postfix à Sympa avec les directives ci-dessous.

touch /etc/sympa/transport.sympa
touch /etc/sympa/virtual.sympa

On ajoute les hash manquants dans les directives existantes, sinon les créer :

# cat /etc/postfix/main.cf

# [...]
virtual_mailbox_domains = domaine.org hash:/etc/sympa/transport.sympa
virtual_mailbox_maps = hash:/etc/postfix/vmailbox hash:/etc/sympa/transport.sympa hash:/etc/sympa/sympa_transport hash:/etc/sympa/virtual.sympa                                                                                                              
virtual_alias_maps = hash:/etc/postfix/virtual hash:/etc/sympa/virtual.sympa
transport_maps = hash:/etc/sympa/transport.sympa hash:/etc/sympa/sympa_transport
# cat /etc/postfix/master.cf

# [...]
# Sympa
sympa   unix    -       n       n       -       -       pipe
  flags=hqRu null_sender= user=sympa argv=/usr/lib/sympa/bin/queue ${nexthop}
sympabounce unix -      n       n       -       -       pipe
  flags=hqRu null_sender= user=sympa argv=/usr/lib/sympa/bin/bouncequeue ${nexthop}
# cat /etc/sympa/transport.sympa

listes.autarcie.org                error:User unknown in recipient table - sympa
sympa@listes.autarcie.org          sympa:sympa@listes.autarcie.org
listmaster@listes.autarcie.org     sympa:listmaster@listes.autarcie.org
bounce@listes.autarcie.org         sympabounce:sympa@mlistes.autarcie.org
abuse-feedback-report@listes.autarcie.org  sympabounce:sympa@listes.autarcie.org
# cat /etc/sympa/virtual.sympa

sympa-request@listes.autarcie.org  postmaster@localhost
sympa-owner@listes.autarcie.org    postmaster@localhost

On lance génère les bases pour postfix :

postmap hash:/etc/sympa/transport.sympa
postmap hash:/etc/sympa/virtual.sympa
postmap hash:/etc/sympa/sympa_transport

Tests

Unité

On y ajoute l'unité systemd suivante pour que le service web puisse communiquer avec l'application sympa :

cat /lib/systemd/system/wwsympa.service
[Unit]
Description=WWSympa - Web interface for Sympa mailing list manager
After=syslog.target sympa.service

[Service]
Type=forking
PIDFile=%t/sympa/wwsympa.pid
ExecStart=/usr/bin/spawn-fcgi -F $FCGI_CHILDREN \
    -P ${RUNTIME_DIRECTORY}/wwsympa.pid \
    -s ${RUNTIME_DIRECTORY}/wwsympa.socket \
    -u $FCGI_USER -g $FCGI_GROUP $FCGI_OPTS -- \
    /usr/lib/cgi-bin/sympa/wwsympa.fcgi
Environment="FCGI_CHILDREN=5"
User=sympa
Group=sympa
Environment="FCGI_USER=sympa"
Environment="FCGI_GROUP=sympa"
Environment="FCGI_OPTS=-M 0660 -U www-data -G www-data"
#EnvironmentFile=-/etc/default/sympa
Restart=always
RuntimeDirectory=sympa
RuntimeDirectoryPreserve=yes

[Install]
WantedBy=multi-user.target

On recharge les configurations et on lance le tout :

systemctl daemon-reload
systemctl restart wwsympa

Service web

Les essaient ont été portés sur Nginx et Apache.

Apache

Voici ce dont-il y a besoin :

<VirtualHost *:80 *:443>
    ServerName listes.autarcie.org
    RedirectMatch ^/$ /wws/

#        SSLEngine On
#        SSLCertificateFile /etc/letsencrypt/live/listes.autarcie.org/cert.pem
#        SSLCertificateKeyFile /etc/letsencrypt/live/listes.autarcie.org/privkey.pem
#        SSLCertificateChainFile /etc/letsencrypt/live/listes.autarcie.org/fullchain.pem

<IfModule mod_fcgid.c>
    Alias /static-sympa /usr/share/sympa/static_content
    <Directory /usr/share/sympa/static_content>
        Require all granted
    </Directory>

    Alias /css-sympa /var/lib/sympa/css
    <Directory /var/lib/sympa/css>
        Require all granted
    </Directory>

    Alias /pictures-sympa /var/lib/sympa/pictures
    <Directory /var/lib/sympa/pictures>
        Require all granted
    </Directory>

    ScriptAlias /wws /usr/lib/cgi-bin/sympa/wwsympa-wrapper.fcgi
    <Directory /usr/lib/cgi-bin/sympa>
        Require all granted
    </Directory>
</IfModule>

    #RewriteEngine On
    #RewriteCond %{HTTPS} !=on
    #RewriteCond %{HTTP:X-Forwarded-Proto} !=https
    #RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R=permanent]
    
    ErrorLog ${APACHE_LOG_DIR}/error-sympa.log
    CustomLog ${APACHE_LOG_DIR}/access-sympa.log combined

</VirtualHost>

Activons le vhost

a2disconf sympa
a2ensite sympa
systemctl reload apache2

Nginx

Cliquez pour afficher ⇲

Cliquez pour masquer ⇱

Cette configuration est cachée car j'utilise plus le service apache et qu'elle est un peu plus complexe

server {
    listen       80;

    server_name  listes.autarcie.org;
    root         /usr/lib/cgi-bin/sympa;
    access_log   /var/log/nginx/sympa.access.log;
    error_log    /var/log/nginx/sympa.error.log;

    rewrite ^/$ /wws permanent;

    # While configuring sympa, you should specify wwsympa_url for each robot.
    # if you do not do so, sympa will generate wwsympa_url as ${robot_name}/sympa.
    # So to prevent non-active urls for robots without wwsympa_url, we do this redirect:

    rewrite ^/sympa/(.*)$ /wws/$1 permanent;

    location ^~ /static-sympa/ {
        alias /usr/share/sympa/static_content/;
        access_log off;
    }
    location ^~ /css-sympa {
        alias /var/lib/sympa/css;
        access_log off;
    }
    location ^~ /pictures-sympa {
        alias /var/lib/sympa/pictures/;
        access_log off;
    }
    location ~ /\.ht {
        deny all;
    }
    location /wws {
        gzip off;
        fastcgi_pass   unix:/run/sympa/wwsympa.socket;
        fastcgi_split_path_info ^(/wws)(.+)$;
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;
        fastcgi_param  PATH_INFO          $fastcgi_path_info;
        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;
        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;
        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;

        # According to RFC3875 (https://tools.ietf.org/html/rfc3875#section-4.1.14) in SERVER_NAME
        # we should put an actual hostname user came to. For nginx it is in $host
        # This will allow to run sympa multihost instances
        fastcgi_param  SERVER_NAME        $host;

        fastcgi_param  REMOTE_USER        $remote_user;
        fastcgi_param  SCRIPT_FILENAME    $document_root/wwsympa.fcgi;

        fastcgi_param  HTTP_HOST           $http_host;
        fastcgi_intercept_errors on;
    }
}

On vérifie que la configuration est correcte et on recharge la configuration Nginx :

nginx -t
/etc/init.d/nginx reload

A présent, nous pouvons ouvrir la page http://listes.autarcie.org

SSL

Pour ajouter du chiffrement, executer ces commandes:

certbot certonly --webroot --webroot-path=/var/lib/letsencrypt/ -d listes.autarcie.org --dry-run --test-cert
certbot certonly --webroot --webroot-path=/var/lib/letsencrypt/ -d listes.autarcie.org

Reste à décommenter les bonnes directives dans les vhosts