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>
92 lines
2.8 KiB
YAML
92 lines
2.8 KiB
YAML
---
|
|
- name: Exiger le mot de passe admin Stalwart (Vault)
|
|
ansible.builtin.assert:
|
|
that:
|
|
- serveur_stalwart_admin_password | length > 0
|
|
fail_msg: "serveur_stalwart_admin_password est requis (via Ansible Vault : vault_stalwart_admin)."
|
|
|
|
- name: Créer l'utilisateur système stalwart
|
|
ansible.builtin.user:
|
|
name: "{{ serveur_stalwart_utilisateur }}"
|
|
system: true
|
|
home: "{{ serveur_stalwart_data }}"
|
|
create_home: false
|
|
shell: /usr/sbin/nologin
|
|
|
|
- name: Créer les répertoires stalwart
|
|
ansible.builtin.file:
|
|
path: "{{ item }}"
|
|
state: directory
|
|
owner: "{{ serveur_stalwart_utilisateur }}"
|
|
group: "{{ serveur_stalwart_utilisateur }}"
|
|
mode: "0750"
|
|
loop:
|
|
- "{{ serveur_stalwart_etc }}"
|
|
- "{{ serveur_stalwart_data }}"
|
|
- "{{ serveur_stalwart_store }}"
|
|
|
|
- name: Lire la version de Stalwart installée
|
|
ansible.builtin.command: "{{ serveur_stalwart_binaire }} --version"
|
|
register: serveur_stalwart_version_installee
|
|
changed_when: false
|
|
failed_when: false
|
|
|
|
- name: Installer le binaire Stalwart (absent ou version différente)
|
|
when: serveur_stalwart_version not in (serveur_stalwart_version_installee.stdout | default(''))
|
|
block:
|
|
- name: Télécharger l'archive Stalwart
|
|
ansible.builtin.get_url:
|
|
url: "{{ serveur_stalwart_url }}"
|
|
dest: "/tmp/stalwart-{{ serveur_stalwart_version }}.tar.gz"
|
|
mode: "0644"
|
|
|
|
- name: Extraire le binaire stalwart vers /usr/local/bin
|
|
ansible.builtin.unarchive:
|
|
src: "/tmp/stalwart-{{ serveur_stalwart_version }}.tar.gz"
|
|
dest: /usr/local/bin
|
|
remote_src: true
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
notify: Redémarrer stalwart
|
|
|
|
- name: Nettoyer l'archive téléchargée
|
|
ansible.builtin.file:
|
|
path: "/tmp/stalwart-{{ serveur_stalwart_version }}.tar.gz"
|
|
state: absent
|
|
|
|
- name: Déployer config.json (DataStore)
|
|
ansible.builtin.template:
|
|
src: config.json.j2
|
|
dest: "{{ serveur_stalwart_config }}"
|
|
owner: "{{ serveur_stalwart_utilisateur }}"
|
|
group: "{{ serveur_stalwart_utilisateur }}"
|
|
mode: "0640"
|
|
notify: Redémarrer stalwart
|
|
|
|
- name: Déployer l'EnvironmentFile (secret admin de récupération)
|
|
ansible.builtin.template:
|
|
src: stalwart.env.j2
|
|
dest: "{{ serveur_stalwart_env }}"
|
|
owner: root
|
|
group: "{{ serveur_stalwart_utilisateur }}"
|
|
mode: "0640"
|
|
no_log: true
|
|
notify: Redémarrer stalwart
|
|
|
|
- name: Déployer l'unité systemd stalwart
|
|
ansible.builtin.template:
|
|
src: stalwart.service.j2
|
|
dest: /etc/systemd/system/stalwart.service
|
|
owner: root
|
|
group: root
|
|
mode: "0644"
|
|
notify: Redémarrer stalwart
|
|
|
|
- name: Activer et démarrer stalwart
|
|
when: not ansible_check_mode
|
|
ansible.builtin.systemd:
|
|
name: stalwart
|
|
enabled: true
|
|
state: started
|
|
daemon_reload: true
|