patient 0 : le plan de l'ecosysteme dont les autres descendront
Aujourd'hui, tout ce qui fabrique Chezlepro vit sur `eregion` — une machine HORS FLOTTE, montee a la main, que Set-OPS ne deploie pas, ne sauvegarde pas et ne prouve pas. Un ecosysteme entier depend d'un point unique que le moteur ignore. Patient 0 le remplace par le plus petit ecosysteme COMPLET (PKI, DNS, edge, courriel, PostgreSQL, forge — six machines), bati par le moteur, sauvegarde par le moteur, verifie par le harnais. On ne deplace pas le point unique de defaillance : on l'elimine. Derive du modele `forge`, avec trois ecarts assumes : - INDEX 29 (10.29.0.0/16, VLAN 1291-1296), choisi libre : 13 lab, 17 Chezlepro, 23 Technolibre ; les index bas (1, 11) ont deja force deux renumerotages. - `federe: false` — patient 0 est EXCLU des devis du site tant qu'il n'est pas materialise. Une flotte en cours de reconstruction n'a pas a se voir reserver des VLAN et des regles pour un ecosysteme qui n'existe pas (c'est exactement ce qui avait injecte les adresses d'un tenant perime dans le pare-feu partage, le 2026-08-12). A basculer a `true` AVANT `make sdn-appliquer`, le jour du deploiement. - `forge-01` recoit 80G au lieu du defaut : elle hebergera les depots de TOUTE la lignee, pas seulement les siens. Le modele `forge` dont il derive etait lui-meme perime sur deux points, corriges ici : `client_pki` liste a la main alors que l'integration est devenue universelle, et un FQDN expose reste en `exemple.internal`. Les modeles PRIVES ne sont pas couverts par le harnais — P17 ne decouvre que le modele public. VERIFIE : les quatre registres valident, le gabarit de voute couvre les 20 secrets exiges, l'inventaire est genere et applique. Et sur l'instance de l'exploitant, en pleine reconstruction : `make verifier` -> 38 OK, 0 echec, 0 saute ; les devis ne voient toujours que Chezlepro et Technolibre. CE QUI N'EST PAS ICI, ET NE LE SERA JAMAIS : le mot de passe de la voute. C'est le seul objet que la reproduction exige d'un humain — le mettre dans la forge reviendrait a enfermer la cle dans le coffre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
commit
3cf00bbf3a
11 changed files with 438 additions and 0 deletions
33
.gitignore
vendored
Normal file
33
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Secrets (jamais en clair ; Vault chiffre OK via .example)
|
||||||
|
*.vault
|
||||||
|
*.vault.yml
|
||||||
|
vault.yml
|
||||||
|
.vault-pass
|
||||||
|
*.secret
|
||||||
|
*.pem
|
||||||
|
*.key
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
# Artefact genere
|
||||||
|
inventories/*/hosts.genere.yml
|
||||||
|
|
||||||
|
# Releve du devis d identite (etat lu sur la machine, regenere a chaque `make identite-plan`)
|
||||||
|
devis-identite.json
|
||||||
|
|
||||||
|
# Releves du devis des certificats (etat lu sur chaque hote, regeneres a chaque
|
||||||
|
# `make certificats-plan`)
|
||||||
|
devis-certificats.json.*
|
||||||
|
|
||||||
|
# Releve du devis des expositions + racine AC recuperee pour les sondes HTTPS
|
||||||
|
devis-expositions.json
|
||||||
|
.racine-ac.crt
|
||||||
|
|
||||||
|
# Releves des devis PostgreSQL et courriel
|
||||||
|
devis-postgresql.json.*
|
||||||
|
devis-courriel.json.*
|
||||||
|
|
||||||
|
# Releve du devis d'etancheite de la frontiere (`make frontiere-mesurer`).
|
||||||
|
devis-frontiere.json
|
||||||
|
|
||||||
|
# Releve du devis de MTU (`make mtu-mesurer`).
|
||||||
|
devis-mtu.json
|
||||||
64
README.md
Normal file
64
README.md
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
# OPS-Patient0 — l'écosystème d'origine
|
||||||
|
|
||||||
|
> **Pour qui :** l'**exploitant** de la lignée. Ce dépôt est le plan d'un écosystème
|
||||||
|
> Set-OPS comme les autres — mais de celui dont les autres descendent.
|
||||||
|
|
||||||
|
## Ce qu'il est
|
||||||
|
|
||||||
|
Patient 0 est le **plus petit écosystème complet** : PKI, DNS, edge, courriel,
|
||||||
|
PostgreSQL, et une **forge**. Six machines. Sa raison d'être tient en une phrase :
|
||||||
|
|
||||||
|
> porter les dépôts qui fabriquent les écosystèmes, et les servir à ses enfants.
|
||||||
|
|
||||||
|
Aujourd'hui, ce rôle est tenu par `eregion.chezlepro.ca` — une machine **hors flotte**,
|
||||||
|
montée à la main, que Set-OPS ne déploie pas, ne sauvegarde pas et ne prouve pas. Tout ce
|
||||||
|
qui fabrique Chezlepro dépend d'elle. Patient 0 la remplace par un écosystème **bâti par
|
||||||
|
le moteur, sauvegardé par le moteur, vérifié par le harnais**. On ne déplace pas le point
|
||||||
|
unique de défaillance : on l'élimine.
|
||||||
|
|
||||||
|
## La boucle, et comment elle se casse
|
||||||
|
|
||||||
|
Pour rebâtir patient 0, il faut le dépôt du moteur — qui vit sur patient 0. On n'échappe
|
||||||
|
pas à ça par la ruse, mais par le **nombre**. Le génome doit exister en au moins trois
|
||||||
|
endroits vivants, sans coordination :
|
||||||
|
|
||||||
|
```
|
||||||
|
patient 0 (la forge mère) · le poste de l'exploitant · restic hors cluster
|
||||||
|
+ chaque écosystème enfant, qui en porte un miroir
|
||||||
|
```
|
||||||
|
|
||||||
|
N'importe quel survivant réamorce les autres. Une famille, pas un maître.
|
||||||
|
|
||||||
|
## Ce que ce dépôt contient, et ce qu'il ne contiendra jamais
|
||||||
|
|
||||||
|
| | |
|
||||||
|
|---|---|
|
||||||
|
| `plan/` | les six machines, leurs zones, leurs applications |
|
||||||
|
| `inventories/production/group_vars/` | les intrants, le placement Proxmox, le **gabarit** de voûte |
|
||||||
|
| `inventories/production/hosts.yml` | **généré** depuis le plan — ne jamais l'éditer à la main |
|
||||||
|
| le mot de passe de la voûte | **jamais**. Ni ici, ni dans aucun dépôt : c'est le seul objet que la reproduction exige d'un humain |
|
||||||
|
|
||||||
|
## Deux réglages à connaître
|
||||||
|
|
||||||
|
**`index: 29`** — tout l'adressage en dérive (`10.29.0.0/16`, VLAN 1291-1296). Choisi
|
||||||
|
libre : 13 est le lab, 17 Chezlepro, 23 Technolibre. Les index bas (1, 11) ont déjà forcé
|
||||||
|
deux renumérotages, ils tombaient dans des plages occupées par du matériel.
|
||||||
|
|
||||||
|
**`federe: false`** — patient 0 est **exclu des devis du site** tant qu'il n'est pas
|
||||||
|
matérialisé : ni la frontière, ni le SDN, ni le pare-feu de l'hyperviseur ne lui réservent
|
||||||
|
quoi que ce soit. C'est délibéré et temporaire. À basculer à `true` le jour où on le
|
||||||
|
déploie, **avant** `make sdn-appliquer` — sinon ses zones n'existeront nulle part.
|
||||||
|
|
||||||
|
## Ce qui reste à faire avant de le matérialiser
|
||||||
|
|
||||||
|
- [ ] **Décider où il vit.** Sur `asgard`, la perte du cluster emporte patient 0 *et*
|
||||||
|
Chezlepro d'un coup. Ailleurs, la famille survit à la perte du cluster.
|
||||||
|
Le déménagement tient en quatre valeurs (`group_vars/proxmox.yml`) et un symlink.
|
||||||
|
- [ ] **Créer la voûte réelle** :
|
||||||
|
`ansible-vault create inventories/production/group_vars/all/vault.yml`,
|
||||||
|
en couvrant les noms du gabarit (`vault.yml.example`).
|
||||||
|
- [ ] **Basculer `federe: true`**, puis `make instancier` → `make instancier-appliquer`.
|
||||||
|
- [ ] `make placement-plan` — confronter les quatre valeurs au cluster **avant** de
|
||||||
|
cloner quoi que ce soit : quarante minutes de déploiement ne se rattrapent pas.
|
||||||
|
- [ ] Déployer, puis y **pousser les quatre dépôts** du génome (moteur, instances,
|
||||||
|
hébergeur, modèles) et inscrire la parenté de chacun.
|
||||||
28
inventories/production/group_vars/all/10-intrants.yml
Normal file
28
inventories/production/group_vars/all/10-intrants.yml
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
# Intrants d'IDENTITE de patient 0 — SOURCE UNIQUE, partagee par tous les envs.
|
||||||
|
# Edite par le panneau « Intrants de base » du GUI (make inventaire-ui).
|
||||||
|
|
||||||
|
# RESEAU(X) D'ADMINISTRATION — la seule source autorisee a ouvrir SSH sur la flotte.
|
||||||
|
# 10.0.0.0/24 est le plan de gestion d'asgard (VLAN 10 de l'underlay), celui d'ou l'on
|
||||||
|
# administre aujourd'hui. A revoir si patient 0 demenage sur un autre site : c'est alors
|
||||||
|
# le plan de gestion de CE site-la qu'il faut nommer, sinon le `default deny` ferme
|
||||||
|
# l'acces d'administration sur une flotte qu'on vient de batir.
|
||||||
|
nftables_admin_ssh:
|
||||||
|
- 10.0.0.0/24
|
||||||
|
|
||||||
|
# Resolveur d'AMORCAGE, pose par cloud-init a la creation d'une VM. Il ne sert qu'une
|
||||||
|
# fois : `client_unbound` bascule ensuite /etc/resolv.conf vers 127.0.0.1. Sans lui, la
|
||||||
|
# VM nait sans resolution et `apt` ne peut rien installer.
|
||||||
|
dns_amorcage: 9.9.9.9,149.112.112.112
|
||||||
|
|
||||||
|
domaine_interne: genese.internal
|
||||||
|
fuseau_horaire: America/Toronto
|
||||||
|
identite_realm: genese
|
||||||
|
organisation: Alliance Boréale
|
||||||
|
|
||||||
|
# Adresse du compte d'amorcage — la SEULE valeur du role `amorcage_acces` qui ne peut
|
||||||
|
# pas se deriver : elle designe une personne. Elle doit etre lisible SANS l'ecosysteme
|
||||||
|
# qu'on amorce — une adresse en @genese.internal serait un piege parfait.
|
||||||
|
amorcage_acces_courriel: sysadmin@chezlepro.ca
|
||||||
|
|
||||||
|
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"
|
||||||
40
inventories/production/group_vars/all/vault.yml.example
Normal file
40
inventories/production/group_vars/all/vault.yml.example
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
---
|
||||||
|
# GABARIT de voute de patient 0 — des NOMS, jamais de valeurs.
|
||||||
|
#
|
||||||
|
# La voute reelle (group_vars/all/vault.yml, chiffree) se cree a la main :
|
||||||
|
# ansible-vault create inventories/production/group_vars/all/vault.yml
|
||||||
|
# Son mot de passe ne vit NI ici, NI dans aucun depot : c'est le seul objet que la
|
||||||
|
# reproduction exige d'un humain. Le mettre dans la forge reviendrait a enfermer la
|
||||||
|
# cle dans le coffre.
|
||||||
|
#
|
||||||
|
# P18 confronte ce gabarit aux secrets que le plan exige, puis la voute reelle a ce
|
||||||
|
# gabarit. Une cle qui manque ici passe inapercue jusqu'au deploiement.
|
||||||
|
|
||||||
|
# --- Exiges par des roles que patient 0 DEPLOIE ---
|
||||||
|
vault_backup_ssh_privkey: "" # role client_backup
|
||||||
|
vault_bd_forgejo: "" # base 'forgejo'
|
||||||
|
vault_forgejo_admin: "" # role serveur_forgejo
|
||||||
|
vault_forgejo_internal_token: "" # role serveur_forgejo
|
||||||
|
vault_forgejo_oidc: "" # role serveur_forgejo
|
||||||
|
vault_forgejo_secret_key: "" # role serveur_forgejo
|
||||||
|
vault_openldap_admin: "" # role amorcage_acces (playbook serveur_openldap.yml)
|
||||||
|
vault_postgresql_keycloak: "" # role serveur_postgresql
|
||||||
|
vault_redis: "" # role serveur_redis
|
||||||
|
vault_restic_password: "" # role client_backup
|
||||||
|
vault_step_ca_password: "" # role serveur_step_ca
|
||||||
|
vault_step_ca_provisioner_password: "" # role client_pki
|
||||||
|
|
||||||
|
# --- Exiges par le harnais, pour des services que patient 0 NE DEPLOIE PAS ---
|
||||||
|
# Ces references vivent dans des roles que patient 0 installe (ex. serveur_backup
|
||||||
|
# pousse ses resultats vers Icinga, serveur_postgresql connait les bases des
|
||||||
|
# autres). Le perimetre est donc plus large que la flotte : meme question de
|
||||||
|
# cadrage que celle corrigee sur P32 le 2026-08-20. Les laisser vides tant que le
|
||||||
|
# service correspondant n'existe pas.
|
||||||
|
vault_grafana_admin: "" # role serveur_grafana (playbook serveur_grafana.yml)
|
||||||
|
vault_grafana_oidc: "" # role serveur_grafana (playbook serveur_grafana.yml)
|
||||||
|
vault_icinga_api_depot: "" # role serveur_backup (playbook serveur_backup.yml)
|
||||||
|
vault_keycloak_admin: "" # role serveur_keycloak (playbook serveur_keycloak.yml)
|
||||||
|
vault_nextcloud_admin: "" # role serveur_nextcloud (playbook serveur_nextcloud.yml)
|
||||||
|
vault_nextcloud_oidc: "" # role serveur_nextcloud (playbook serveur_nextcloud.yml)
|
||||||
|
vault_oauth2_cookie: "" # role serveur_oauth2_proxy (playbook serveur_oauth2_proxy.yml)
|
||||||
|
vault_sysadmin_amorcage: "" # role amorcage_acces (playbook serveur_openldap.yml)
|
||||||
16
inventories/production/group_vars/proxmox.yml
Normal file
16
inventories/production/group_vars/proxmox.yml
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
---
|
||||||
|
# Proxmox, cote TENANT : son gabarit dore et ses defauts de placement.
|
||||||
|
#
|
||||||
|
# L'API du cluster, ses noeuds, ses stockages et ses ponts appartiennent a l'HEBERGEUR
|
||||||
|
# et vivent dans SON depot (proxmox-hebergeur.yml, a cote d'underlay.yml). Recopies ici,
|
||||||
|
# ils avaient deja diverge entre tenants du meme cluster.
|
||||||
|
#
|
||||||
|
# Ce qui reste ici est un CHOIX de patient 0, fait a l'interieur de ce que l'hebergeur
|
||||||
|
# offre : quel modele cloner, sur quel noeud/stockage/pont poser ses VM par defaut.
|
||||||
|
# Ce sont les QUATRE valeurs qui rattachent un tenant a une fabric (D-80) : les seules
|
||||||
|
# a changer si patient 0 demenage. `make placement-plan` les confronte au cluster reel
|
||||||
|
# AVANT de deployer — quarante minutes de clone ne se rattrapent pas.
|
||||||
|
proxmox_clone_noeud: asgard
|
||||||
|
proxmox_clone_stockage: TrueNAS
|
||||||
|
proxmox_clone_pont: vmbr1
|
||||||
|
proxmox_clone_vmid_modele: 99998
|
||||||
169
inventories/production/hosts.yml
Normal file
169
inventories/production/hosts.yml
Normal file
|
|
@ -0,0 +1,169 @@
|
||||||
|
# Inventaire GENERE depuis le plan (make instancier / instancier-appliquer).
|
||||||
|
# NE PAS editer a la main : edite instance/plan/serveurs.yml + instance/plan/applications.yml.
|
||||||
|
# Source : instance/plan/serveurs.yml + instance/plan/applications.yml + instance/plan/nomenclature.yml.
|
||||||
|
all:
|
||||||
|
children:
|
||||||
|
client_backup:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
client_journal:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-dns-01: null
|
||||||
|
infra-edge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
client_metrique:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-dns-01: null
|
||||||
|
infra-edge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
client_pki:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-dns-01: null
|
||||||
|
infra-edge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
client_smtp:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
client_unbound:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-edge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
hotes_actifs:
|
||||||
|
hosts: {}
|
||||||
|
hotes_planifies:
|
||||||
|
hosts:
|
||||||
|
data-sql-01:
|
||||||
|
ansible_host: 10.29.18.11
|
||||||
|
ansible_user: ansible
|
||||||
|
proxmox_cidr: 24
|
||||||
|
proxmox_coeurs: 3
|
||||||
|
proxmox_disque_taille: 40G
|
||||||
|
proxmox_etiquette_vlan: ''
|
||||||
|
proxmox_memoire: 4096
|
||||||
|
proxmox_passerelle: 10.29.18.1
|
||||||
|
proxmox_pont: t29donn
|
||||||
|
proxmox_vlan: 1293
|
||||||
|
proxmox_vmid: 129301101
|
||||||
|
setops_supernet: 10.29.0.0/16
|
||||||
|
forge-01:
|
||||||
|
ansible_host: 10.29.21.11
|
||||||
|
ansible_user: ansible
|
||||||
|
proxmox_cidr: 24
|
||||||
|
proxmox_coeurs: 1
|
||||||
|
proxmox_disque_taille: 80G
|
||||||
|
proxmox_etiquette_vlan: ''
|
||||||
|
proxmox_memoire: 2048
|
||||||
|
proxmox_passerelle: 10.29.21.1
|
||||||
|
proxmox_pont: t29appl
|
||||||
|
proxmox_vlan: 1296
|
||||||
|
proxmox_vmid: 129601101
|
||||||
|
setops_supernet: 10.29.0.0/16
|
||||||
|
infra-dns-01:
|
||||||
|
ansible_host: 10.29.19.11
|
||||||
|
ansible_user: ansible
|
||||||
|
proxmox_cidr: 24
|
||||||
|
proxmox_coeurs: 1
|
||||||
|
proxmox_disque_taille: 40G
|
||||||
|
proxmox_etiquette_vlan: ''
|
||||||
|
proxmox_memoire: 1536
|
||||||
|
proxmox_passerelle: 10.29.19.1
|
||||||
|
proxmox_pont: t29serv
|
||||||
|
proxmox_vlan: 1294
|
||||||
|
proxmox_vmid: 129401101
|
||||||
|
setops_supernet: 10.29.0.0/16
|
||||||
|
infra-edge-01:
|
||||||
|
ansible_host: 10.29.16.11
|
||||||
|
ansible_user: ansible
|
||||||
|
proxmox_cidr: 24
|
||||||
|
proxmox_coeurs: 1
|
||||||
|
proxmox_disque_taille: 15G
|
||||||
|
proxmox_etiquette_vlan: ''
|
||||||
|
proxmox_memoire: 1536
|
||||||
|
proxmox_passerelle: 10.29.16.1
|
||||||
|
proxmox_pont: t29fron
|
||||||
|
proxmox_vlan: 1291
|
||||||
|
proxmox_vmid: 129101101
|
||||||
|
sans_exposition:
|
||||||
|
- forge.genese.internal
|
||||||
|
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:
|
||||||
|
ansible_host: 10.29.19.21
|
||||||
|
ansible_user: ansible
|
||||||
|
proxmox_cidr: 24
|
||||||
|
proxmox_coeurs: 1
|
||||||
|
proxmox_disque_taille: 32G
|
||||||
|
proxmox_etiquette_vlan: ''
|
||||||
|
proxmox_memoire: 1024
|
||||||
|
proxmox_passerelle: 10.29.19.1
|
||||||
|
proxmox_pont: t29serv
|
||||||
|
proxmox_vlan: 1294
|
||||||
|
proxmox_vmid: 129402101
|
||||||
|
setops_supernet: 10.29.0.0/16
|
||||||
|
modeles_vm:
|
||||||
|
hosts: {}
|
||||||
|
serveur_debian:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-dns-01: null
|
||||||
|
infra-edge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
serveur_dovecot:
|
||||||
|
hosts:
|
||||||
|
infra-mail-01: null
|
||||||
|
serveur_durci:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
forge-01: null
|
||||||
|
infra-dns-01: null
|
||||||
|
infra-edge-01: null
|
||||||
|
infra-mail-01: null
|
||||||
|
infra-pki-01: null
|
||||||
|
serveur_forgejo:
|
||||||
|
hosts:
|
||||||
|
forge-01: null
|
||||||
|
serveur_nginx:
|
||||||
|
hosts:
|
||||||
|
infra-edge-01: null
|
||||||
|
serveur_postgresql:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
serveur_powerdns:
|
||||||
|
hosts:
|
||||||
|
infra-dns-01: null
|
||||||
|
serveur_redis:
|
||||||
|
hosts:
|
||||||
|
data-sql-01: null
|
||||||
|
serveur_step_ca:
|
||||||
|
hosts:
|
||||||
|
infra-pki-01: null
|
||||||
9
plan/applications.yml
Normal file
9
plan/applications.yml
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
applications:
|
||||||
|
step_ca: { groupe: serveur_step_ca, hote: infra-pki-01 }
|
||||||
|
nginx: { groupe: serveur_nginx, hote: infra-edge-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 }
|
||||||
|
redis: { groupe: serveur_redis, hote: data-sql-01 }
|
||||||
|
forgejo: { groupe: serveur_forgejo, hote: forge-01, port: 3000, expose: [forge.genese.internal] }
|
||||||
12
plan/bases-donnees.yml
Normal file
12
plan/bases-donnees.yml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
serveurs_bd:
|
||||||
|
sql-01: { type: postgres, hote: data-sql-01, port: 5432, groupe: serveur_postgresql }
|
||||||
|
bases_donnees:
|
||||||
|
forgejo:
|
||||||
|
serveur: sql-01
|
||||||
|
base: forgejo
|
||||||
|
proprietaire: forgejo
|
||||||
|
secret: vault_bd_forgejo
|
||||||
|
consommateur: serveur_forgejo
|
||||||
|
portee: groupe
|
||||||
|
usage: principale
|
||||||
12
plan/domaines.yml
Normal file
12
plan/domaines.yml
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
# Patient 0 n'a AUCUNE presence publique, et c'est un choix.
|
||||||
|
#
|
||||||
|
# Il ne sert qu'une chose : porter les depots qui fabriquent les ecosystemes, et les
|
||||||
|
# servir a ses enfants. Rien la-dedans n'a de raison d'etre joignable depuis Internet.
|
||||||
|
# Moins il expose, moins il y a a defendre sur la machine dont tout le reste descend.
|
||||||
|
#
|
||||||
|
# Le jour ou il devrait publier quelque chose (un miroir lisible de l'exterieur, par
|
||||||
|
# exemple), ajouter ici le domaine public et son `edge` — le reste (vhost, SAN du
|
||||||
|
# certificat, plancher /etc/hosts) se derive tout seul du plan.
|
||||||
|
domaines_publics:
|
||||||
|
genese.internal: { autorite: auto-heberge, edge: serveur_nginx, secondaires: [], dnssec: false }
|
||||||
42
plan/nomenclature.yml
Normal file
42
plan/nomenclature.yml
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
# Nomenclature = MODELE de l'ecosysteme (zones + placement des fonctions).
|
||||||
|
# L'ADRESSAGE (supernet, sous-reseaux, passerelles, VLAN, VMID) N'EST PAS ecrit ici :
|
||||||
|
# il se DERIVE du seul seed `index` (scripts/inventory_rules : supernet_de, base3_de,
|
||||||
|
# passerelle_de, vlan_de). Editer `index` via le panneau Intrants du GUI.
|
||||||
|
#
|
||||||
|
# INDEX 29 -> supernet 10.29.0.0/16, VLAN 1291 a 1296.
|
||||||
|
# Choisi libre le 2026-08-20 : 13 est le lab, 17 Chezlepro, 23 Technolibre. Les index
|
||||||
|
# bas (1, 11) ont deja force deux renumerotages — ils tombaient dans des plages que du
|
||||||
|
# materiel occupait deja. P21 garde la collision si un jour un autre s'en approche.
|
||||||
|
index: 29
|
||||||
|
cidr_hote: 24
|
||||||
|
reservations:
|
||||||
|
passerelle: 1
|
||||||
|
reserve_min: 2
|
||||||
|
reserve_max: 9
|
||||||
|
|
||||||
|
# PATIENT 0 NE PARTICIPE PAS ENCORE AUX DEVIS DU SITE.
|
||||||
|
#
|
||||||
|
# `federe: false` l'exclut de `devis_reseau.decouvrir()` : ni la frontiere, ni le SDN,
|
||||||
|
# ni le pare-feu de l'hyperviseur ne lui reservent quoi que ce soit. C'est deliberate et
|
||||||
|
# TEMPORAIRE — un ecosysteme qui n'est pas deploye n'a rien a faire dans la politique du
|
||||||
|
# site (c'est exactement ce qui avait injecte les adresses d'un tenant perime dans le
|
||||||
|
# pare-feu partage, le 2026-08-12).
|
||||||
|
#
|
||||||
|
# A BASCULER A `true` le jour ou on le materialise, avant `make sdn-appliquer`.
|
||||||
|
federe: false
|
||||||
|
|
||||||
|
# Zones de securite (un /24 + VLAN chacune) — seuls les libelles sont du modele.
|
||||||
|
categories:
|
||||||
|
1: { libelle: Frontiere }
|
||||||
|
3: { libelle: Donnees }
|
||||||
|
4: { libelle: Services-infra }
|
||||||
|
6: { libelle: Applications }
|
||||||
|
# Placement : quelle fonction dans quelle zone (categorie) et son rang (service).
|
||||||
|
fonctions:
|
||||||
|
data-sql: { categorie: 3, service: 1 }
|
||||||
|
forge: { categorie: 6, service: 1 }
|
||||||
|
infra-dns: { categorie: 4, service: 1 }
|
||||||
|
infra-edge: { categorie: 1, service: 1 }
|
||||||
|
infra-mail: { categorie: 4, service: 3 }
|
||||||
|
infra-pki: { categorie: 4, service: 2 }
|
||||||
13
plan/serveurs.yml
Normal file
13
plan/serveurs.yml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
# `integrations:` ne porte que les integrations FACULTATIVES. Les universelles
|
||||||
|
# (PKI, metriques, journaux, resolution locale) viennent de la politique du role —
|
||||||
|
# voir roles/client_*/meta/integration.yml : tout hote les recoit sans etre listee ici.
|
||||||
|
serveurs:
|
||||||
|
infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] }
|
||||||
|
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 }
|
||||||
|
data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_backup, client_smtp] }
|
||||||
|
# LA MACHINE QUI PORTE LE GENOME. Son disque n'est pas celui du modele : elle
|
||||||
|
# hebergera les depots de TOUS les ecosystemes de la lignee, pas seulement les siens.
|
||||||
|
forge-01: { fonction: forge, etat: planifie, disque: 80G, integrations: [client_backup, client_smtp] }
|
||||||
Loading…
Reference in a new issue