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>
26 lines
775 B
Django/Jinja
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
|