mail-relay — relais SMTP interne
Postfix en mode satellite : il n'accepte du courrier que depuis le réseau Docker
smtp et le réexpédie au relais du fournisseur, authentifié avec un compte d'envoi.
Pas de FQDN, pas de routeur Traefik, pas de port publié, pas de volume : le dossier
porte donc le nom du service et non un domaine, comme stacks/traefik/.
Contrat avec les autres stacks — à ne pas casser
| Élément | Valeur | Pourquoi c'est figé |
|---|---|---|
| Réseau Docker | smtp |
déclaré external: true par tous les consommateurs |
| Nom d'hôte | postfix |
valeur de SMTP_HOST chez les consommateurs |
| Port | 25 |
sans TLS ni authentification, réseau interne uniquement |
Le nom d'hôte postfix vient du nom de service Compose, pas du nom de projet :
renommer le dossier ne le change pas. Renommer le service, en revanche, casserait
tous les consommateurs en silence — les mails cesseraient de partir sans qu'aucun
conteneur ne tombe.
Consommateurs : vault.opytex.org, authentik, matrix_poneyworld.
Le réseau smtp est externe
Il n'est pas créé par cette stack, pour qu'un docker compose down ici ne tente pas
de supprimer un réseau auquel d'autres stacks sont attachées. À créer une seule fois,
s'il n'existe pas déjà :
docker network ls --filter name=^smtp$ --format '{{.Name}}'
docker network create smtp # seulement si la commande ci-dessus ne renvoie rien
Déploiement
cd ~/infra/stacks/mail-relay
sops exec-env secrets.env.yaml 'docker compose up -d'
Après une modification d'un secret, up -d répond « up to date » et garde l'ancienne
valeur. Il faut forcer :
sops exec-env secrets.env.yaml 'docker compose up -d --force-recreate'
Configuration
env_file porte le relais amont et l'identité annoncée (SMTP_SERVER, SMTP_PORT,
SERVER_HOSTNAME, OVERWRITE_FROM) ; secrets.env.yaml porte les identifiants du
compte d'envoi (SMTP_USERNAME, SMTP_PASSWORD), édités avec sops edit.
Les noms sont ceux que l'image lit directement. Pour voir ce que le conteneur a réellement reçu :
docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' postfix \
| grep -E 'SMTP|SERVER|OVERWRITE'
Un SMTP_USERNAME ou SMTP_PASSWORD vide signale un sops exec-env oublié.
Vérifier que le relais fonctionne
# le nom d'hôte résout depuis un consommateur
docker exec vaultwarden getent hosts postfix
# envoi de bout en bout
docker exec -i postfix sh -c 'sendmail -t' <<'EOF'
To: destinataire@example.org
Subject: test relais
test
EOF
# file d'attente et journal
docker exec postfix mailq
docker logs --tail 50 postfix
Une file d'attente qui ne se vide pas, ou un status=deferred dans le journal, pointe
l'authentification auprès du relais amont.
Points d'attention
- La file d'attente n'est pas persistée.
/var/spool/postfixvit dans la couche d'écriture du conteneur : undocker compose up --force-recreateperd les messages non encore remis. Acceptable pour des notifications, à revoir si le relais transporte un jour du courrier qui compte. - Aucune sauvegarde. Pas de volume, rien à restaurer : la stack se reconstruit entièrement depuis ce dossier plus les secrets.
- Le relais fait confiance à tout ce qui est joint au réseau
smtp. Ne pas y attacher un service exposé qui n'a pas besoin d'envoyer du courrier.