Set-OPS-Public/roles/serveur_stalwart/templates/stalwart.service.j2
Daniel Allaire e3efbb5b1a serveur_stalwart : Phase 1 (install + démarrage), code prod
Stalwart Mail Server v0.16.11, binaire unique natif. Mécaniques réelles
validées empiriquement sur le binaire :
- config.json = objet typé {"@type":"RocksDb","path":…} (DataStore seul) ;
- démarrage IaC en mode récupération (STALWART_RECOVERY_MODE +
  STALWART_RECOVERY_ADMIN), admin depuis la voûte (vault_stalwart_admin).

Rôle : install version-épinglée, user système, unité systemd durcie
(CAP_NET_BIND_SERVICE, ProtectSystem), EnvironmentFile pour le secret.
Phase 2 (écouteurs/TLS step_ca/annuaire LDAP/DKIM via API d'admin) à venir.
Validé statiquement (ansible-lint, syntax, rendu config.json).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 10:24:50 -04:00

26 lines
775 B
Django/Jinja

# Géré par Set-OPS (rôle serveur_stalwart). Ne pas éditer à la main.
[Unit]
Description=Stalwart Mail Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User={{ serveur_stalwart_utilisateur }}
Group={{ serveur_stalwart_utilisateur }}
EnvironmentFile=-{{ serveur_stalwart_env }}
ExecStart={{ serveur_stalwart_binaire }} --config {{ serveur_stalwart_config }}
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
# Autorise l'écoute sur les ports privilégiés (25/443/465/587/993) sans être root.
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths={{ serveur_stalwart_data }}
ProtectHome=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target