This repository has been archived on 2026-08-21. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

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/postfix vit dans la couche d'écriture du conteneur : un docker compose up --force-recreate perd 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.