architecture : la sauvegarde sort du cluster, et Dovecot quitte le plan

DEUX DECISIONS DE L'EXPLOITANT, prises en regardant ce que patient 0 doit survivre.

1. LA SAUVEGARDE POINTE HORS CLUSTER (eregion). Le defaut du role poserait un backup-01
   sur le MEME cluster : on sauvegarderait le genome a cote du genome, et la perte du
   cluster emporterait les deux. Patient 0 existe pour survivre a la perte du reste.
   Une seule cle a surcharger — client_backup_cible — parce que le transport est du SFTP
   sur SSH, pas une derivation du plan.

   CE QUI PART EST PETIT, et c'est le raisonnement qui compte : les quatre depots du
   genome sont des MIROIRS (le poste de l'exploitant, eregion, chaque enfant en portent
   une copie) — on les repousse depuis n'importe quel survivant. Reste l'irremplacable :
   les cles de l'AC, et la base de la forge le jour ou elle portera autre chose que des
   miroirs.

   DEFAUT ASSUME, ecrit dans le fichier : eregion n'est pas geree par Set-OPS, donc ni
   prouvee ni reconstructible. C'est un domaine de panne DIFFERENT d'asgard — le point —
   pas un domaine sur. A revoir quand une troisieme machine existera.

2. DOVECOT RETIRE. Une boite aux lettres sans MTA pour l'alimenter ne servait rien ici.
   Patient 0 passe de six a cinq machines : moins de surface a defendre sur la machine
   dont tout descend, et une sauvegarde de moins a surveiller. L'application, la machine
   et la fonction orpheline partent ensemble — une nomenclature qui place une machine
   inexistante est un mensonge en attente.

Les quatre registres valident, l'inventaire est regenere.

RESTE UNE ACTION HUMAINE, sur eregion : creer le compte restic et y poser
cle-publique-sauvegarde.txt. La commande exacte est dans 20-sauvegarde.yml.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-22 10:54:30 -04:00
parent fe02d29704
commit 05347e6206
5 changed files with 23 additions and 26 deletions

View file

@ -0,0 +1,23 @@
---
# LA SAUVEGARDE DE PATIENT 0 SORT DU CLUSTER, ET C'EST TOUT L'INTERET.
#
# Le defaut du role (`backup-01.<domaine>`) poserait une VM de plus SUR LE MEME CLUSTER :
# on sauvegarderait le genome a cote du genome, et la perte du cluster emporterait les
# deux. Patient 0 existe precisement pour survivre a la perte du reste.
#
# CE QUI PART ICI EST PETIT, et c'est voulu. Les quatre depots du genome sont des
# MIROIRS : ton poste, eregion et chaque ecosysteme enfant en portent une copie, donc on
# les repousse depuis n'importe quel survivant. Ce qui est vraiment irremplacable tient en
# deux choses : les cles de l'autorite de certification (les perdre invalide toute la
# confiance) et la base de la forge le jour ou elle portera autre chose que des miroirs.
#
# CE QUE CETTE CIBLE EXIGE, sur eregion, une fois :
# sudo adduser --disabled-password --gecos "" restic
# sudo -u restic mkdir -p ~restic/.ssh && sudo -u restic chmod 700 ~restic/.ssh
# # y coller le contenu de cle-publique-sauvegarde.txt :
# sudo -u restic tee -a ~restic/.ssh/authorized_keys < cle-publique-sauvegarde.txt
#
# ET SON DEFAUT ASSUME : eregion n'est pas geree par Set-OPS. Elle n'est ni prouvee, ni
# reconstructible par le moteur. C'est un domaine de panne DIFFERENT d'asgard — ce qui est
# le point — mais pas un domaine sur. A revoir le jour ou une troisieme machine existe.
client_backup_cible: eregion.chezlepro.ca

View file

@ -7,7 +7,6 @@ all:
hosts: hosts:
data-sql-01: null data-sql-01: null
forge-01: null forge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
client_journal: client_journal:
hosts: hosts:
@ -15,7 +14,6 @@ all:
forge-01: null forge-01: null
infra-dns-01: null infra-dns-01: null
infra-edge-01: null infra-edge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
client_metrique: client_metrique:
hosts: hosts:
@ -23,7 +21,6 @@ all:
forge-01: null forge-01: null
infra-dns-01: null infra-dns-01: null
infra-edge-01: null infra-edge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
client_pki: client_pki:
hosts: hosts:
@ -31,14 +28,12 @@ all:
forge-01: null forge-01: null
infra-dns-01: null infra-dns-01: null
infra-edge-01: null infra-edge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
client_unbound: client_unbound:
hosts: hosts:
data-sql-01: null data-sql-01: null
forge-01: null forge-01: null
infra-edge-01: null infra-edge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
hotes_actifs: hotes_actifs:
hosts: {} hosts: {}
@ -98,19 +93,6 @@ all:
sans_exposition: sans_exposition:
- forge.genese.internal - forge.genese.internal
setops_supernet: 10.29.0.0/16 setops_supernet: 10.29.0.0/16
infra-mail-01:
ansible_host: 10.29.19.31
ansible_user: ansible
proxmox_cidr: 24
proxmox_coeurs: 1
proxmox_disque_taille: 20G
proxmox_etiquette_vlan: ''
proxmox_memoire: 1536
proxmox_passerelle: 10.29.19.1
proxmox_pont: t29serv
proxmox_vlan: 1294
proxmox_vmid: 129403101
setops_supernet: 10.29.0.0/16
infra-pki-01: infra-pki-01:
ansible_host: 10.29.19.21 ansible_host: 10.29.19.21
ansible_user: ansible ansible_user: ansible
@ -132,18 +114,13 @@ all:
forge-01: null forge-01: null
infra-dns-01: null infra-dns-01: null
infra-edge-01: null infra-edge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
serveur_dovecot:
hosts:
infra-mail-01: null
serveur_durci: serveur_durci:
hosts: hosts:
data-sql-01: null data-sql-01: null
forge-01: null forge-01: null
infra-dns-01: null infra-dns-01: null
infra-edge-01: null infra-edge-01: null
infra-mail-01: null
infra-pki-01: null infra-pki-01: null
serveur_forgejo: serveur_forgejo:
hosts: hosts:

View file

@ -3,7 +3,6 @@ applications:
step_ca: { groupe: serveur_step_ca, hote: infra-pki-01 } step_ca: { groupe: serveur_step_ca, hote: infra-pki-01 }
nginx: { groupe: serveur_nginx, hote: infra-edge-01 } nginx: { groupe: serveur_nginx, hote: infra-edge-01 }
powerdns: { groupe: serveur_powerdns, hote: infra-dns-01 } powerdns: { groupe: serveur_powerdns, hote: infra-dns-01 }
dovecot: { groupe: serveur_dovecot, hote: infra-mail-01 }
postgresql: { groupe: serveur_postgresql, hote: data-sql-01 } postgresql: { groupe: serveur_postgresql, hote: data-sql-01 }
redis: { groupe: serveur_redis, hote: data-sql-01 } redis: { groupe: serveur_redis, hote: data-sql-01 }
forgejo: { groupe: serveur_forgejo, hote: forge-01, port: 3000, expose: [forge.genese.internal] } forgejo: { groupe: serveur_forgejo, hote: forge-01, port: 3000, expose: [forge.genese.internal] }

View file

@ -39,5 +39,4 @@ fonctions:
forge: { categorie: 6, service: 1 } forge: { categorie: 6, service: 1 }
infra-dns: { categorie: 4, service: 1 } infra-dns: { categorie: 4, service: 1 }
infra-edge: { categorie: 1, service: 1 } infra-edge: { categorie: 1, service: 1 }
infra-mail: { categorie: 4, service: 3 }
infra-pki: { categorie: 4, service: 2 } infra-pki: { categorie: 4, service: 2 }

View file

@ -5,7 +5,6 @@
serveurs: serveurs:
infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] } infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] }
infra-edge-01: { fonction: infra-edge, etat: planifie } infra-edge-01: { fonction: infra-edge, etat: planifie }
infra-mail-01: { fonction: infra-mail, etat: planifie, integrations: [client_backup] }
infra-dns-01: { fonction: infra-dns, etat: planifie, disque: 40G } infra-dns-01: { fonction: infra-dns, etat: planifie, disque: 40G }
data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_backup] } data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_backup] }
# PAS DE `client_smtp` ICI, ni ailleurs dans ce plan : patient 0 n'a pas de MTA, et la # PAS DE `client_smtp` ICI, ni ailleurs dans ce plan : patient 0 n'a pas de MTA, et la