Serveur dédié: gérez comptes et alias email avec PostfixAdmin

Si vous possédez et gérez votre propre serveur email, il peut être très intéressant de proposer des comptes emails et des alias pour vos utilisateurs.

J’ai écrit il y a quelques années un tutoriel qui faisait cela à la main avec une base SQL et des domaines virtuels mais il y a aujourd’hui beaucoup plus simple avec PostfixAdmin.

PostfixAdmin

PostfixAdmin est une interface web open-source qui permet de gérer des comptes mails, des domaines et des alias sur un serveur mail Postfix.

il s’intègre avec

  • Postfix
  • un server IMAP/POP3 comme Dovecot ou Courier
  • une base de données (sqlite, mysql, postgresql)
  • Fetchmail (optionnel)

Il est très utile pour créer des alias à la volée ou des comptes mail rapidement.

Création du sous-domaine

Je trouve cela plus simple de créer un sous-domaine pour ce type d’application. Dans votre gestionnaire DNS, il suffit d’ajouter un enregistrement de type A:

XXXXX.EXAMPLE.COM IN A xxx.xxxx.xxx.xxx

XXXXX est votre sous-domaine sur EXAMPLE.COM et xxx.xxx.xxx.xxx l’adresse IPv4 de votre serveur.

Création de la base de données

Nous utilisons MySQL/MariaDB pour postfix donc on s’identifie sur la console mysql :

mysql -u root -p 

[MOT DE PASSE ROOT]

Et on lance:

CREATE DATABASE postfix; 
CREATE USER 'mymailadmin'@'localhost' IDENTIFIED WITH mysql_native_password BY '1nyXI7Y)$spmslgz4HhdE4Lc_vm&)Gh!MsZFf64645fek'; 
GRANT ALL PRIVILEGES ON postfix.* TO 'mymailadmin'@'localhost'; 
FLUSH PRIVILEGES; EXIT;

Nous avons donc un nouvel utilisateur et une nouvelle base de données, spécifiques pour PostfixAdmin.

Configuration NginX pour PostfixAdmin

On crée un nouveau server block spécifique à PostfixAdmin:

nano /etc/nginx/sites-available/postfixadmin.conf

Voici notre configuration:

upstream php-handler-pfa {
     server unix:/run/php/php7.4-fpm.sock;
 }
 server {
     listen 80;
     listen [::]:80;
     server_name XXXXX.EXAMPLE.COM;
     # enforce https
     return 301 https://$server_name$request_uri;
 }
 server {
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     server_name XXXXX.EXAMPLE.COM;
      ssl_certificate         /etc/nginx/ssl/skyminds.net/fullchain.pem;      ssl_certificate_key     /etc/nginx/ssl/skyminds.net/privkey.pem; # Add headers to serve security related headers # Before enabling Strict-Transport-Security headers please read into this # topic first.
 #   add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload;";
     #
     # WARNING: Only add the preload option once you read about
     # the consequences in https://hstspreload.org/. This option
     # will add the domain to a hardcoded list that is shipped
     # in all major browsers and getting removed from this list
     # could take several months.
     add_header X-Content-Type-Options nosniff;
     add_header X-XSS-Protection "1; mode=block";
     add_header X-Robots-Tag none;
     add_header X-Download-Options noopen;
     add_header X-Permitted-Cross-Domain-Policies none;
     add_header Referrer-Policy "strict-origin-when-cross-origin";
 # Remove X-Powered-By, which is an information leak fastcgi_hide_header X-Powered-By; # Path to the root of your installation root /home/www/postfixadmin/public; error_log /var/log/nginx/pfa.log;
 location / {
       try_files $uri $uri/ /index.php?$args;
    }
 location ~ \.php { 
fastcgi_split_path_info ^(.+\.php)(/.*)$; 
set $path_info $fastcgi_path_info; 
try_files $fastcgi_script_name =404;     
include fastcgi_params;     
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;     
fastcgi_param PATH_INFO $fastcgi_path_info;     
fastcgi_param HTTPS on; 
# Avoid sending the security headers twice     
fastcgi_param modHeadersAvailable true;     
fastcgi_param front_controller_active true;     
fastcgi_pass php-handler-pfa;     
fastcgi_intercept_errors on;     
fastcgi_request_buffering off; 
} 

location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {     
try_files $uri /index.php$uri$is_args$args;     
# Optional: Don't log access to other assets     
access_log off; 
}

 }

N’oubliez pas de changer le server_name ainsi que le chemin et nom de vos certificats. On relance ensuite nginx:

nginx -t
service nginx reload

Installer ou mettre à jour PostfixAdmin

On se place dans le répertoire de travail et on renomme le répertoire de l’ancienne version s’il s’agit d’une mise à jour:

cd /home/www/
mv postfixadmin postfixadmin-old

On récupère l’URL de téléchargement de la dernière version de postfixadmin:

curl -s https://github.com/postfixadmin/postfixadmin/releases |  grep -m1 -Eo "archive/refs/tags/[^/]+.zip" | xargs printf "https://github.com/postfixadmin/postfixadmin/%s"

Résultat:

https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.9.zip

Copiez l’URL puis lancez:

wget https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.9.zip

On dézippe l’archive:

unzip -d ./postfixadmin/ postfixadmin-3.3.9.zip

On récupère notre fichier de configuration local, depuis notre ancienne installation:

cp ./postfixadmin-old/config.local.php ./postfixadmin/config.local.php

S’il n’existe pas, on le crée:

nano /postfixadmin/config.local.php

Et on y ajoute les informations de connexion à notre base de données:

<?php
 $CONF['database_type'] = 'mysqli';
 $CONF['database_user'] = 'mymailadmin'; // à changer selon votre config
 $CONF['database_password'] = '1nyXI7Y)$spmslgz4HhdE4Lc_vm&)Gh!MsZFf64645fek'; // à changer selon votre config
 $CONF['database_name'] = 'postfix'; // à changer selon votre config
 $CONF['configured'] = true;

Et on installe les dépendances avec composer :

cd postfixadmin
bash install.sh

On assigne les bonnes permissions:


find -type f -print0 | xargs -0 chmod 640
find -type f -print0 | xargs -0 chown root:www-data
mkdir templates_c && chmod 750 templates_c && chown -R www-data templates_c

Il ne vous reste plus qu’à visiter la page setup.php de votre installation PostfixAdmin pour mettre à jour la base de données et le setup_password de l’installation.

Note: pour vous connecter à PostfixAdmin, vous devez utiliser l’adresse https://xxxxx.example.com/login.php, il n’y a pas de page d’accueil dédiée.

Vous avez un projet WordPress ou WooCommerce en tête? Transformez votre vision en réalité avec mon expertise reconnue.

Parlons de votre projet dès aujourd'hui »

Articles conseillés :

Opinions