Portfolio 2026-11-01

Mettre en place un serveur mail Stalwart sur Proxmox

Déploiement d'une VM Debian 13 avec Stalwart Mail Server, publication de mail.mprost.fr, configuration DNS, SMTP, IMAP, TLS et création d'une boîte mail auto-hébergée.

Sommaire

  1. Prérequis
  2. Création de la VM
  3. Installation de Debian
  4. Configuration du hostname et du réseau
  5. Installation de Stalwart
  6. Configuration initiale de Stalwart
  7. Publication de l'interface Web
  8. Configuration des ports mail
  9. Configuration DNS
  10. Création de la boîte mail
  11. Configuration TLS SMTP et IMAP
  12. Vérifications
  13. Troubleshooting

Prérequis

  • Serveur Proxmox VE fonctionnel.
  • ISO Debian 13 amd64.
  • Domaine public mprost.fr.
  • Adresse IPv4 publique.
  • Possibilité de publier les ports mail depuis le routeur.
  • Port TCP 25 sortant fonctionnel.
  • DNS du domaine géré chez IONOS.
  • Serveur Web Nginx existant sur 192.168.1.210 pour publier l'interface Web de Stalwart.

Tester le port 25 sortant :

nc -v -w 10 gmail-smtp-in.l.google.com 25

Le port SMTP 25 est utilisé pour la remise entre serveurs mail. Stalwart génère également les enregistrements MX, SPF, DKIM, DMARC et de découverte nécessaires au domaine.


Création de la VM

  1. Dans Proxmox, créer une VM et non un conteneur LXC.

  2. Utiliser par exemple :

Nom      : Mail
CPU      : 2 vCPU
RAM      : 2 Go
Disque   : 30 Go
Réseau   : vmbr0 / VirtIO
OS       : Debian 13
IP       : 192.168.1.211
  1. Activer le démarrage automatique de la VM.

Installation de Debian

  1. Démarrer sur l'ISO Debian 13.

  2. Pour le partitionnement, choisir :

Assisté - utiliser un disque entier
Tous les fichiers dans une seule partition
  1. Dans la sélection des logiciels, conserver uniquement :
SSH server
standard system utilities
  1. Ne pas installer d'environnement graphique.

  2. Installer GRUB sur le disque principal puis redémarrer.

  3. Installer SSH si nécessaire :

apt update
apt install -y openssh-server
systemctl enable --now ssh

Configuration du hostname et du réseau

  1. Définir le FQDN :
hostnamectl set-hostname mail.mprost.fr
  1. Modifier /etc/hosts :
nano /etc/hosts

Ajouter :

127.0.0.1       localhost
127.0.1.1       mail.mprost.fr mail
  1. Vérifier :
hostname
hostname -f

Résultat attendu :

mail.mprost.fr
  1. Configurer une IPv4 fixe :
192.168.1.211/24
  1. Vérifier l'accès réseau :
ip -br a
ip route
ping -c 3 1.1.1.1

Installation de Stalwart

  1. Mettre Debian à jour :
apt update && apt full-upgrade -y
apt install -y curl ca-certificates
  1. Télécharger l'installateur :
curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
  1. Installer Stalwart :
sh install.sh
  1. Récupérer le mot de passe administrateur temporaire :
journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'
  1. Vérifier le service :
systemctl status stalwart --no-pager

Configuration initiale de Stalwart

  1. Ouvrir l'assistant initial :
http://192.168.1.211:8080/admin
  1. Configurer l'identité du serveur :
mail.mprost.fr
  1. Pour le stockage d'une petite instance, conserver le stockage local proposé par l'assistant.

  2. Pour l'annuaire des comptes, choisir :

Use the internal directory
  1. Conserver une journalisation de niveau Info.

  2. Pour le DNS, choisir :

Manual DNS server management
  1. Terminer l'assistant puis redémarrer Stalwart.

Publication de l'interface Web

L'interface Web est publiée par le Nginx déjà présent sur 192.168.1.210.

  1. Créer l'enregistrement DNS :
A    mail    IP_PUBLIQUE
  1. Sur le serveur Web, créer :
sudo nano /etc/nginx/sites-available/mail.mprost.fr
  1. Ajouter :
server {
    listen 80;
    listen [::]:80;

    server_name mail.mprost.fr;

    location / {
        proxy_pass http://192.168.1.211:8080;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  1. Activer le site :
sudo ln -s /etc/nginx/sites-available/mail.mprost.fr /etc/nginx/sites-enabled/mail.mprost.fr
sudo nginx -t
sudo systemctl reload nginx
  1. Créer le certificat HTTPS :
sudo certbot --nginx -d mail.mprost.fr
  1. Sur la VM Mail, définir l'URL publique :
nano /etc/stalwart/stalwart.env

Ajouter :

STALWART_PUBLIC_URL=https://mail.mprost.fr
  1. Redémarrer :
systemctl restart stalwart
  1. Vérifier les informations OAuth publiées :
curl.exe https://mail.mprost.fr/.well-known/oauth-authorization-server

Les URL retournées doivent utiliser https://mail.mprost.fr.


Configuration des ports mail

Créer les règles NAT/PAT suivantes vers la VM 192.168.1.211 :

TCP 25  -> 192.168.1.211:25
TCP 465 -> 192.168.1.211:465
TCP 993 -> 192.168.1.211:993

Les listeners par défaut de Stalwart utilisent notamment 25 pour SMTP, 465 pour SMTP Submission en TLS implicite et 993 pour IMAP en TLS implicite. citeturn199search45

Le port 443 public reste dirigé vers Nginx sur 192.168.1.210.

Vérifier les listeners :

ss -lntp | grep stalwart

Configuration DNS

  1. Dans Stalwart, ouvrir :
Management > Domains > Domains > mprost.fr > View Zone File

Stalwart calcule les enregistrements nécessaires et permet de les recopier manuellement lorsque le fournisseur DNS n'est pas géré automatiquement. citeturn199search46turn199search49

  1. Configurer l'entrée A :
A    mail    IP_PUBLIQUE
  1. Configurer le MX :
MX   @   priorité 10   mail.mprost.fr

Un MX indique quel serveur reçoit les mails du domaine. citeturn199search46

  1. Configurer SPF :
TXT  @     v=spf1 mx -all
TXT  mail  v=spf1 a -all
  1. Copier exactement les enregistrements DKIM fournis par Stalwart :
v1-ed25519-..._domainkey
v1-rsa-..._domainkey

Les valeurs p= sont des clés publiques destinées à être publiées dans le DNS pour permettre la vérification DKIM. citeturn199search49

  1. Configurer DMARC selon la zone fournie par Stalwart, par exemple :
TXT  _dmarc  v=DMARC1; p=reject; rua=mailto:postmaster@mprost.fr
  1. Ajouter les enregistrements SRV et d'autoconfiguration générés si souhaité :
_imaps._tcp
_submissions._tcp
autoconfig
autodiscover
  1. Vérifier :
nslookup -type=MX mprost.fr 1.1.1.1
nslookup -type=TXT mprost.fr 1.1.1.1
nslookup -type=TXT _dmarc.mprost.fr 1.1.1.1

Création de la boîte mail

  1. Dans Stalwart, ouvrir :
Directory > Accounts
  1. Créer le compte :
Username : contact
Domain   : mprost.fr

L'adresse obtenue est :

contact@mprost.fr
  1. Ajouter un mot de passe principal au compte.

  2. Créer également postmaster@mprost.fr ou un alias correspondant si les rapports DMARC/TLS sont envoyés à cette adresse.

  3. Pour un logiciel ou une application, privilégier un App Password dédié afin de pouvoir le révoquer sans changer le mot de passe principal.


Configuration TLS SMTP et IMAP

Le certificat HTTPS présenté par Nginx ne couvre pas automatiquement les connexions directes sur 465 et 993.

  1. Sur le serveur Nginx, vérifier le certificat Certbot :
sudo ls -l /etc/letsencrypt/live/mail.mprost.fr/
  1. Copier vers la VM Mail :
fullchain.pem
privkey.pem
  1. Importer dans Stalwart :
Settings > TLS > Certificates
  1. Pour le certificat, utiliser l'intégralité de fullchain.pem.

  2. Pour la clé privée, utiliser privkey.pem.

  3. Redémarrer Stalwart :

systemctl restart stalwart
  1. Vérifier SMTP TLS :
openssl s_client -connect 192.168.1.211:465 -servername mail.mprost.fr </dev/null 2>/dev/null | grep -E 'subject=|issuer=|Verify return code'

Résultat attendu :

Verify return code: 0 (ok)
  1. Prévoir une synchronisation automatique du certificat lors des renouvellements Certbot.

Vérifications

  1. Vérifier le MX :
nslookup -type=MX mprost.fr 1.1.1.1
  1. Vérifier le SMTP entrant :
Test-NetConnection mail.mprost.fr -Port 25
  1. Vérifier IMAP et SMTP Submission :
Test-NetConnection mail.mprost.fr -Port 993
Test-NetConnection mail.mprost.fr -Port 465
  1. Vérifier le service :
systemctl status stalwart --no-pager
  1. Configurer un client mail :
IMAP : mail.mprost.fr:993 / SSL-TLS
SMTP : mail.mprost.fr:465 / SSL-TLS
Utilisateur : contact@mprost.fr
  1. Tester une réception depuis une adresse externe puis un envoi vers une adresse externe.

Troubleshooting

Le port 25 sortant expire

Symptôme :

Connection timed out

Solution : vérifier auprès du FAI que TCP 25 sortant n'est pas filtré avant de poursuivre l'auto-hébergement SMTP direct.


hostname -f retourne une erreur

Vérifier /etc/hosts :

127.0.1.1 mail.mprost.fr mail

Puis :

hostname -f

Unknown client id / endpoints OAuth en HTTP

Vérifier :

grep STALWART_PUBLIC_URL /etc/stalwart/stalwart.env

Attendu :

STALWART_PUBLIC_URL=https://mail.mprost.fr

Puis :

systemctl restart stalwart

502 Bad Gateway sur mail.mprost.fr

Vérifier depuis le serveur Nginx :

curl -I http://192.168.1.211:8080/

Résultat attendu :

HTTP/1.1 302 Found
location: /account

Vérifier également les IP bloquées dans Stalwart si le serveur ferme immédiatement les connexions du reverse proxy.


Certificat auto-signé sur SMTP

Symptôme :

self-signed certificate

Solution : importer le certificat public valide de mail.mprost.fr dans Stalwart puis contrôler le port 465 avec openssl s_client.