Trace install tas - Stalwart
Apparence
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
- valider le compte loic@lololand.org en local
- faire la redirection réseau du port public 25 vers Stalwart
- tester depuis une source externe vers mail.lololand.org:25
- seulement ensuite modifier le MX principal du domaine
- 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).