Aller au contenu

« Trace install tas - Stalwart » : différence entre les versions

De Loic Wiki
Documentation Stalwart ajoutée: déploiement Podman rootless, vérifications locales, limites ports privilégiés et DNS
 
Daneel (discussion | contributions)
Mise à jour Stalwart: ports locaux, étapes de configuration mail et état de réception externe
 
Ligne 3 : Ligne 3 :
== Vue d'ensemble ==
== Vue d'ensemble ==
* Service mail tout-en-un ''Stalwart'' déployé sur ''tas'' via Podman rootless et Quadlet systemd user.
* Service mail tout-en-un ''Stalwart'' déployé sur ''tas'' via Podman rootless et Quadlet systemd user.
* Objectif: héberger localement les boîtes mail et l'administration, avec préparation pour les domaines ''lololand.org'' et ''pessonnier.fr''.
* Objectif: héberger localement les boîtes mail et l'administration, avec préparation pour ''lololand.org''.
* Image utilisée: ''docker.io/stalwartlabs/stalwart:latest''.
* Image utilisée: ''docker.io/stalwartlabs/stalwart:latest''.
* État actuel: service fonctionnel en local sur ports non privilégiés, mais pas encore en exposition SMTP standard 25/465/587/993 côté hôte rootless.
* État actuel: service fonctionnel en local sur ports non privilégiés, authentification testée avec succès depuis Thunderbird, mais réception Internet pas encore activée.


== Source de vérité ==
== Source de vérité ==
* Quadlet: ''/home/loic/.config/containers/systemd/stalwart.container''
* Quadlet: ''/home/loic/.config/containers/systemd/stalwart.container''
* Données persistantes: ''/home/loic/stalwart-data''
* Configuration Stalwart: ''/home/loic/stalwart-data/etc/config.toml''
* Sauvegarde avant modification: ''/home/loic/backups/stalwart-2026-04-14T01:44:34+02:00''
* Données: ''/home/loic/stalwart-data/data''
* Logs: ''/home/loic/stalwart-data/logs''
* Sauvegarde config 2026-05-03: ''/home/loic/backups/stalwart-config.toml.bak.2026-05-03T09:08:08+02:00''
* Sauvegarde quadlet 2026-05-03: ''/home/loic/backups/stalwart.container.bak.2026-05-03T09:15:01+02:00''


== Configuration Quadlet actuelle ==
== Configuration Quadlet actuelle ==
Ligne 23 : Ligne 26 :
ContainerName=stalwart
ContainerName=stalwart
AutoUpdate=registry
AutoUpdate=registry
Volume=/home/loic/stalwart-data:/opt/stalwart:Z
Volume=/home/loic/stalwart-data/etc:/etc/stalwart:Z
Volume=/home/loic/stalwart-data/data:/var/lib/stalwart:Z
Volume=/home/loic/stalwart-data/logs:/var/log/stalwart:Z
PublishPort=1025:25
PublishPort=1465:465
PublishPort=1465:465
PublishPort=1587:587
PublishPort=1587:587
Ligne 31 : Ligne 37 :
PublishPort=1995:995
PublishPort=1995:995
PublishPort=14190:4190
PublishPort=14190:4190
PublishPort=8088:8080
PublishPort=18080:8080
PublishPort=8443:443
PublishPort=18443:443


[Service]
[Service]
Ligne 42 : Ligne 48 :
</pre>
</pre>


== Déploiement ==
== Listeners internes configurés ==
* Rechargement systemd user: ''systemctl --user daemon-reload''
<pre>
* Démarrage: ''systemctl --user start stalwart.service''
SMTP      : 25
* Statut: ''systemctl --user status stalwart.service''
Submission: 587
* Logs: ''journalctl --user -u stalwart.service -n 200 --no-pager''
SMTPS    : 465
IMAP      : 143
IMAPS    : 993
POP3      : 110
POP3S    : 995
Sieve    : 4190
HTTP      : 8080
HTTPS    : 443
</pre>
 
== Cartographie des ports ==
{| class="wikitable"
! Usage !! Port local sur tas !! Port interne conteneur !! Exposition publique actuelle !! Remarques
|-
| SMTP entrant || 1025 || 25 || aucune || cible future pour la réception Internet via redirection TCP 25
|-
| SMTPS client || 1465 || 465 || aucune || test utilisateur validé avec authentification
|-
| Submission client || 1587 || 587 || aucune || alternative client authentifiée
|-
| IMAP || 1143 || 143 || aucune || accès local uniquement
|-
| IMAPS || 1993 || 993 || aucune || lecture sécurisée locale
|-
| POP3 || 1110 || 110 || aucune || non prioritaire
|-
| POP3S || 1995 || 995 || aucune || non prioritaire
|-
| ManageSieve || 14190 || 4190 || aucune || optionnel
|-
| Admin HTTP || 18080 || 8080 || aucune || interface web locale
|-
| Admin HTTPS || 18443 || 443 || aucune || interface web locale
|}


== Vérifications réalisées ==
== Vérifications réalisées ==
* Le premier démarrage avec ''PublishPort=25:25'' a échoué en rootless.
* Le service écoute bien localement sur ''1025'', ''1465'', ''1587'' et ''1993''.
* Erreur observée:
* Test HTTP local validé sur ''http://127.0.0.1:18080/''.
<pre>
* Test d'envoi fiable validé depuis Thunderbird via ''127.0.0.1:1465'' avec authentification du compte et acceptation du certificat local.
rootlessport cannot expose privileged port 25, you can add 'net.ipv4.ip_unprivileged_port_start=25' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024)
* Les logs Stalwart montrent un flux sain sur le listener ''submissions'' et une classification ''message-ingest.ham'' lors d'un envoi authentifié.
</pre>
* Les tests directs sur ''127.0.0.1:1025'' acceptent bien le SMTP entrant local, mais ce chemin peut être classé ''spam'' dans les logs pour des tests non authentifiés.
* Adaptation prudente faite: publication temporaire sur ports non privilégiés pour valider le service sans modification système globale.
 
* Ports locaux vérifiés après correction:
== Procédure de récupération admin (incident 2026-05-03) ==
** ''8088/tcp'' -> interface web HTTP Stalwart
* L'ancien ''authentication.fallback-admin'' dans ''config.toml'' ne suffisait plus pour l'interface web après mise à jour/redémarrage.
** ''8443/tcp'' -> interface HTTPS Stalwart
* Procédure ayant fonctionné sur Stalwart 0.16:
** ''1587/tcp'' -> submission
** ajouter temporairement ''STALWART_RECOVERY_ADMIN=recovery:&lt;mot_de_passe&gt;'' dans le quadlet
** ''1465/tcp'' -> SMTPS
** ''systemctl --user daemon-reload''
** ''1993/tcp'' -> IMAPS
** ''systemctl --user restart stalwart.service''
** ''1143/tcp'', ''1110/tcp'', ''1995/tcp'', ''14190/tcp'' disponibles aussi
** recréer ou réparer un vrai compte admin dans l'interface
* Test HTTP local validé:
** retirer ensuite ''STALWART_RECOVERY_ADMIN'' du quadlet et redémarrer le service
<pre>
* Sauvegarde avant retrait de la variable de recovery: ''/home/loic/backups/stalwart.container.remove-recovery.bak.2026-05-03T10:16:14+02:00''
curl -I http://127.0.0.1:8088/
 
HTTP/1.1 200 OK
== Étapes de configuration recommandées pour recevoir ''loic@lololand.org'' ==
</pre>
=== 1. Configuration Stalwart ===
* Initialisation Stalwart validée par les logs:
* Créer ou vérifier le domaine ''lololand.org'' dans l'interface d'administration.
<pre>
* Créer la boîte ou l'alias ''loic@lololand.org''.
Configuration file written to /opt/stalwart/etc/config.toml
* Vérifier que l'authentification fonctionne en local avec:
🔑 Your administrator account is 'admin' with password généré dans les logs du conteneur
** SMTP client: ''127.0.0.1:1465''
</pre>
** IMAPS: ''127.0.0.1:1993''
* Conserver les ports élevés locaux dans le conteneur rootless; l'exposition Internet doit se faire par redirection TCP devant le service.
 
=== 2. Configuration réseau / exposition SMTP ===
* Le conteneur rootless ne peut pas publier directement les ports privilégiés ''25/465/587/993''.
* Pour la réception Internet, il faut au minimum faire arriver le ''TCP/25 public'' vers ''tas'', puis vers ''127.0.0.1:1025''.
* Deux familles d'approche:
** redirection routeur + redirection hôte/firewall vers ''1025''
** ou proxy TCP dédié en frontal
* Important: ''Caddy'' standard sert de reverse proxy HTTP/HTTPS; il ne traite pas SMTP/IMAP sans module TCP/L4 additionnel.


== Limitation actuelle ==
=== 3. DNS à corriger avant bascule ===
* En Podman rootless standard, ''tas'' ne peut pas exposer directement les ports privilégiés ''25/465/587/993/...'' tant que le système n'est pas ajusté.
* ''mail.lololand.org A 82.67.187.157'' est déjà présent.
* Pour un passage en production mail réel, il faut choisir l'une des voies suivantes:
* Les MX actuels de ''lololand.org'' pointent d'abord chez OVH, puis seulement vers ''mail.lololand.org''.
** soit abaisser ''net.ipv4.ip_unprivileged_port_start''
* Pour faire de Stalwart le serveur recevant les mails du domaine, prévoir une bascule vers un MX principal du type:
** soit faire une redirection hôte/firewall des ports standards vers les ports élevés utilisés par le conteneur
** ''lololand.org. MX 10 mail.lololand.org.''
** soit exécuter la brique mail avec un mécanisme non rootless pour l'exposition des ports standards
* Publier ensuite les enregistrements ''SPF'', ''DKIM'' et ''DMARC'' générés/confirmés côté Stalwart.
* Point bloquant déjà identifié avant installation: les tests SMTP sortants vers des MX publics sur le port 25 timeout, donc un ''relay SMTP'' restera probablement nécessaire pour l'émission Internet fiable.
* Vérifier aussi le ''PTR/rDNS'' de l'IP publique si possible.


== DNS cible recommandé ==
=== 4. Ordre de bascule prudent ===
Pour chaque domaine, créer au minimum:
# valider le compte ''loic@lololand.org'' en local
* ''mail.lololand.org'' -> A vers ''82.67.187.157''
# faire la redirection réseau du port public ''25'' vers Stalwart
* ''mail.pessonnier.fr'' -> A vers ''82.67.187.157''
# tester depuis une source externe vers ''mail.lololand.org:25''
* MX du domaine vers ''mail.<domaine>.''
# seulement ensuite modifier le MX principal du domaine
* SPF, DKIM, DMARC selon les valeurs générées par Stalwart
# refaire un test réel d'envoi depuis l'extérieur vers ''loic@lololand.org''
* Idéalement PTR/rDNS de l'IP publique vers ''mail.lololand.org'' ou équivalent, si le fournisseur le permet


== Notes d'exploitation ==
== Limites et points de vigilance ==
* L'interface d'admin locale est joignable sur ''http://127.0.0.1:8088/''.
* Tant que le MX principal reste chez OVH, les mails extérieurs arriveront d'abord chez OVH et pas directement sur Stalwart.
* Les identifiants initiaux sont affichés au premier démarrage dans ''podman logs stalwart''.
* Tant que rien n'écoute ou ne redirige le ''port 25 public'' vers ''1025'', Stalwart ne peut pas recevoir de mail Internet.
* La configuration définitive des domaines et des enregistrements DNS se fait ensuite dans l'interface Stalwart, qui génère les enregistrements à publier.
* Les tests SMTP sortants vers des MX publics sur le port 25 ont déjà time-out; un ''relay SMTP'' restera probablement nécessaire pour l'émission Internet fiable.
* Si une terminaison TLS publique est ajoutée pour les ports mail, elle doit être faite en mode ''TCP passthrough'' ou avec un frontal explicitement conçu pour ces protocoles.


== Relance et diagnostic ==
== Relance et diagnostic ==
* Redémarrer: ''systemctl --user restart stalwart.service''
* Redémarrer: ''systemctl --user restart stalwart.service''
* Voir les logs du conteneur: ''podman logs --tail 200 stalwart''
* Statut: ''systemctl --user status stalwart.service''
* Vérifier les ports: ''ss -ltn | egrep ':(1110|1143|1465|1587|1993|1995|8088|8443|14190)\\s''
* Logs systemd user: ''journalctl --user -u stalwart.service -n 200 --no-pager''
* Logs conteneur: ''podman logs --tail 200 stalwart''
* Vérifier les ports: ''ss -ltn | egrep ':(1025|1110|1143|1465|1587|1993|1995|14190|18080|18443)\\s''


== Décision retenue ==
== Décision retenue à date ==
* Déployer d'abord un Stalwart fonctionnel localement, sans changement système global risqué, pour valider l'image, le volume, l'initialisation et la persistance.
* Conserver Stalwart en Podman rootless avec ports élevés locaux.
* Reporter la bascule vers les ports mail standards et la mise en production Internet complète à une étape dédiée, car elle implique un changement système ou réseau plus sensible.
* Préparer la réception Internet par une redirection réseau explicite et réversible, plutôt qu'en abaissant globalement ''net.ipv4.ip_unprivileged_port_start''.
* Documenter séparément les variantes de frontalisation possibles (routeur + firewall hôte, ou Caddy avec module layer4 si retenu).

Dernière version du 3 mai 2026 à 20:40

Trace install tas - Stalwart

Vue d'ensemble

  • Service mail tout-en-un Stalwart déployé sur tas via Podman rootless et Quadlet systemd user.
  • Objectif: héberger localement les boîtes mail et l'administration, avec préparation pour lololand.org.
  • Image utilisée: docker.io/stalwartlabs/stalwart:latest.
  • État actuel: service fonctionnel en local sur ports non privilégiés, authentification testée avec succès depuis Thunderbird, mais réception Internet pas encore activée.

Source de vérité

  • Quadlet: /home/loic/.config/containers/systemd/stalwart.container
  • Configuration Stalwart: /home/loic/stalwart-data/etc/config.toml
  • Données: /home/loic/stalwart-data/data
  • Logs: /home/loic/stalwart-data/logs
  • Sauvegarde config 2026-05-03: /home/loic/backups/stalwart-config.toml.bak.2026-05-03T09:08:08+02:00
  • Sauvegarde quadlet 2026-05-03: /home/loic/backups/stalwart.container.bak.2026-05-03T09:15:01+02:00

Configuration Quadlet actuelle

[Unit]
Description=Stalwart Mail Server
After=network-online.target
Wants=network-online.target

[Container]
Image=docker.io/stalwartlabs/stalwart:latest
ContainerName=stalwart
AutoUpdate=registry
Volume=/home/loic/stalwart-data/etc:/etc/stalwart:Z
Volume=/home/loic/stalwart-data/data:/var/lib/stalwart:Z
Volume=/home/loic/stalwart-data/logs:/var/log/stalwart:Z
PublishPort=1025:25
PublishPort=1465:465
PublishPort=1587:587
PublishPort=1143:143
PublishPort=1993:993
PublishPort=1110:110
PublishPort=1995:995
PublishPort=14190:4190
PublishPort=18080:8080
PublishPort=18443:443

[Service]
Restart=always
TimeoutStartSec=180

[Install]
WantedBy=default.target

Listeners internes configurés

SMTP      : 25
Submission: 587
SMTPS     : 465
IMAP      : 143
IMAPS     : 993
POP3      : 110
POP3S     : 995
Sieve     : 4190
HTTP      : 8080
HTTPS     : 443

Cartographie des ports

Usage Port local sur tas Port interne conteneur Exposition publique actuelle Remarques
SMTP entrant 1025 25 aucune cible future pour la réception Internet via redirection TCP 25
SMTPS client 1465 465 aucune test utilisateur validé avec authentification
Submission client 1587 587 aucune alternative client authentifiée
IMAP 1143 143 aucune accès local uniquement
IMAPS 1993 993 aucune lecture sécurisée locale
POP3 1110 110 aucune non prioritaire
POP3S 1995 995 aucune non prioritaire
ManageSieve 14190 4190 aucune optionnel
Admin HTTP 18080 8080 aucune interface web locale
Admin HTTPS 18443 443 aucune interface web locale

Vérifications réalisées

  • Le service écoute bien localement sur 1025, 1465, 1587 et 1993.
  • Test HTTP local validé sur http://127.0.0.1:18080/.
  • Test d'envoi fiable validé depuis Thunderbird via 127.0.0.1:1465 avec authentification du compte et acceptation du certificat local.
  • Les logs Stalwart montrent un flux sain sur le listener submissions et une classification message-ingest.ham lors d'un envoi authentifié.
  • Les tests directs sur 127.0.0.1:1025 acceptent bien le SMTP entrant local, mais ce chemin peut être classé spam dans les logs pour des tests non authentifiés.

Procédure de récupération admin (incident 2026-05-03)

  • L'ancien authentication.fallback-admin dans config.toml ne suffisait plus pour l'interface web après mise à jour/redémarrage.
  • Procédure ayant fonctionné sur Stalwart 0.16:
    • ajouter temporairement STALWART_RECOVERY_ADMIN=recovery:<mot_de_passe> dans le quadlet
    • systemctl --user daemon-reload
    • systemctl --user restart stalwart.service
    • recréer ou réparer un vrai compte admin dans l'interface
    • retirer ensuite STALWART_RECOVERY_ADMIN du quadlet et redémarrer le service
  • Sauvegarde avant retrait de la variable de recovery: /home/loic/backups/stalwart.container.remove-recovery.bak.2026-05-03T10:16:14+02:00

Étapes de configuration recommandées pour recevoir loic@lololand.org

1. Configuration Stalwart

  • Créer ou vérifier le domaine lololand.org dans l'interface d'administration.
  • Créer la boîte ou l'alias loic@lololand.org.
  • Vérifier que l'authentification fonctionne en local avec:
    • SMTP client: 127.0.0.1:1465
    • IMAPS: 127.0.0.1:1993
  • Conserver les ports élevés locaux dans le conteneur rootless; l'exposition Internet doit se faire par redirection TCP devant le service.

2. Configuration réseau / exposition SMTP

  • Le conteneur rootless ne peut pas publier directement les ports privilégiés 25/465/587/993.
  • Pour la réception Internet, il faut au minimum faire arriver le TCP/25 public vers tas, puis vers 127.0.0.1:1025.
  • Deux familles d'approche:
    • redirection routeur + redirection hôte/firewall vers 1025
    • ou proxy TCP dédié en frontal
  • Important: Caddy standard sert de reverse proxy HTTP/HTTPS; il ne traite pas SMTP/IMAP sans module TCP/L4 additionnel.

3. DNS à corriger avant bascule

  • mail.lololand.org A 82.67.187.157 est déjà présent.
  • Les MX actuels de lololand.org pointent d'abord chez OVH, puis seulement vers mail.lololand.org.
  • Pour faire de Stalwart le serveur recevant les mails du domaine, prévoir une bascule vers un MX principal du type:
    • lololand.org. MX 10 mail.lololand.org.
  • Publier ensuite les enregistrements SPF, DKIM et DMARC générés/confirmés côté Stalwart.
  • Vérifier aussi le PTR/rDNS de l'IP publique si possible.

4. Ordre de bascule prudent

  1. valider le compte loic@lololand.org en local
  2. faire la redirection réseau du port public 25 vers Stalwart
  3. tester depuis une source externe vers mail.lololand.org:25
  4. seulement ensuite modifier le MX principal du domaine
  5. refaire un test réel d'envoi depuis l'extérieur vers loic@lololand.org

Limites et points de vigilance

  • Tant que le MX principal reste chez OVH, les mails extérieurs arriveront d'abord chez OVH et pas directement sur Stalwart.
  • Tant que rien n'écoute ou ne redirige le port 25 public vers 1025, Stalwart ne peut pas recevoir de mail Internet.
  • Les tests SMTP sortants vers des MX publics sur le port 25 ont déjà time-out; un relay SMTP restera probablement nécessaire pour l'émission Internet fiable.
  • Si une terminaison TLS publique est ajoutée pour les ports mail, elle doit être faite en mode TCP passthrough ou avec un frontal explicitement conçu pour ces protocoles.

Relance et diagnostic

  • Redémarrer: systemctl --user restart stalwart.service
  • Statut: systemctl --user status stalwart.service
  • Logs systemd user: journalctl --user -u stalwart.service -n 200 --no-pager
  • Logs conteneur: podman logs --tail 200 stalwart
  • Vérifier les ports: ss -ltn | egrep ':(1025|1110|1143|1465|1587|1993|1995|14190|18080|18443)\\s

Décision retenue à date

  • Conserver Stalwart en Podman rootless avec ports élevés locaux.
  • Préparer la réception Internet par une redirection réseau explicite et réversible, plutôt qu'en abaissant globalement net.ipv4.ip_unprivileged_port_start.
  • Documenter séparément les variantes de frontalisation possibles (routeur + firewall hôte, ou Caddy avec module layer4 si retenu).