Set-OPS-Public/roles/serveur_stalwart/tasks/main.yml
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

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