Modèles : extraire les modèles assemblés vers un dépôt privé (Set-OPS-modeles)

Le public ne garde que le modèle générique 'socle' (preuve libre reproductible).
Les modèles assemblés (identite/observabilite/forge/collaboration/presence-web/
integral) = actif commercial, déplacés dans Set-OPS-modeles (privé). Le moteur
(rôles, machinerie) reste libre.

NB : ces modèles restent dans l'HISTORIQUE git de ce dépôt — mettre Set-OPS-Public
en visibilité privée sur le Forgejo, ou réécrire l'historique (git filter-repo).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-05 19:31:50 -04:00
parent 61a6526ffb
commit a1cfe77b4a
47 changed files with 13 additions and 802 deletions

View file

@ -1,11 +1,12 @@
# Modèles d'écosystèmes numériques
Des **instances prêtes à déployer** : un hébergeur copie le modèle qui colle à son
offre, le renseigne à ses couleurs (ou celles de son client), et instancie.
Un **modèle générique prêt à déployer** : copier `socle`, le renseigner à ses
couleurs, instancier. Le socle souverain minimal — DNS interne, AC/PKI, edge TLS,
relais courriel — sur lequel on ajoute des modules.
## Utilisation
```bash
cp -r exemples/modeles/<modele> ../mon-instance
cp -r exemples/modeles/socle ../mon-instance
# éditer mon-instance : intrants (domaine_interne, fuseau_horaire, organisation,
# identite_realm), plan/nomenclature.yml (index de fédération + zones), domaines
cd <moteur Set-OPS>
@ -13,16 +14,14 @@ ln -s ../mon-instance instance # ou export SETOPS_INSTANCE=../mon-instanc
make instancier-appliquer FORCE=1 # première génération de l'inventaire
```
## Structure : socle + modules
Tout modèle part d'un **socle souverain** (DNS interne, AC/PKI, edge TLS, relais
courriel) et ajoute des **modules** selon l'offre.
## Modèles assemblés (dépôt privé)
Les modèles **assemblés** — combinaisons de modules prêtes pour des offres
(`identite`, `observabilite`, `forge`, `collaboration`, `presence-web`, `integral`) —
ne sont pas ici. Ils constituent un **actif à part**, dans un dépôt privé
(`Set-OPS-modeles`). Le **moteur** (rôles, machinerie) reste libre ; `socle` en est
la preuve reproductible.
| Modèle | = socle + | État |
| Modèle | = socle + | |
| --- | --- | --- |
| `socle` | (rien) | ✅ |
| `presence-web` | web (frontal statique + dorsal dynamique) + données | ✅ |
| `forge` | Forgejo + données | ✅ |
| `identite` | LDAP + Keycloak (SSO) | ✅ |
| `observabilite` | Prometheus/Loki/Grafana + Icinga | ✅ |
| `collaboration` | identité + Nextcloud + Collabora | ✅ |
| `integral` | tout | ✅ |
| `socle` | (rien) — le socle générique | ✅ public (ici) |
| identite · observabilite · forge · collaboration · presence-web · integral | modules assemblés | 🔒 privé |

View file

@ -1,36 +0,0 @@
# Modèle : collaboration
Socle + identité + **collaboration****8 VM** : le modèle `identite`
(socle infra + PostgreSQL/Redis + OpenLDAP + Keycloak) **+ un nœud `collab`**
exécutant **Nextcloud** (fichiers, documents, agendas, contacts) et **Collabora
Online** (édition de documents, WOPI). SSO Keycloak, PG chiffré, exposés via l'edge.
C'est le cœur des offres **maison-obnl** (OBNL/coops) et **cabinet** (PME de
professionnels) : le remplaçant souverain de Google Workspace / Microsoft 365.
Zones : Frontière (16) · Identité (17) · Données (18) · Services-infra (19) ·
**Collaboration (20)**. VMID `ip-miroir`.
## Exposé
- `cloud.<domaine>` → Nextcloud (collab-01:80)
- `bureau.<domaine>` → Collabora (collab-01:9980, **WebSocket** auto)
Les SAN du cert edge et le plancher /etc/hosts sont **dérivés du plan** (aucune
liste manuelle) ; le vhost Collabora est WebSocket-aware via `websocket: true`.
## Secrets de voûte requis (Ansible Vault)
```yaml
vault_bd_nextcloud: "..." # mot de passe BD de l'utilisateur nextcloud
vault_nextcloud_admin: "..." # mot de passe admin Nextcloud initial
vault_nextcloud_oidc: "..." # secret du client OIDC 'nextcloud' (= côté Keycloak)
```
(plus ceux du modèle `identite` : vault_bd_keycloak, vault_keycloak_admin, PKI…)
## Utilisation
```bash
cp -r exemples/modeles/collaboration ../OPS-<tenant>
# éditer : intrants (domaine_interne, organisation, identite_realm),
# nomenclature.yml (index unique + supernet du tenant), domaines
ln -s ../OPS-<tenant> instance
make instancier-appliquer FORCE=1
```

View file

@ -1,6 +0,0 @@
---
domaine_interne: "exemple.internal"
fuseau_horaire: "America/Toronto"
organisation: "Exemple"
identite_realm: "exemple"
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,11 +0,0 @@
---
# Client OIDC 'nextcloud' enregistre dans le realm par le role serveur_keycloak.
# Le secret reference la meme variable de voute que l'app (vault_nextcloud_oidc).
serveur_keycloak_clients:
- clientId: nextcloud
redirect_uris:
- "https://cloud.{{ domaine_interne }}/apps/user_oidc/code"
- "https://cloud.{{ domaine_interne }}/*"
web_origins:
- "https://cloud.{{ domaine_interne }}"
secret: "{{ vault_nextcloud_oidc }}"

View file

@ -1,25 +0,0 @@
---
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 }
openldap: { groupe: serveur_openldap, hote: id-ldap-01 }
postgresql: { groupe: serveur_postgresql, hote: data-sql-01 }
redis: { groupe: serveur_redis, hote: data-sql-01 }
keycloak:
groupe: serveur_keycloak
hote: id-sso-01
port: 8080
expose: [keycloak.exemple.internal]
nextcloud:
groupe: serveur_nextcloud
hote: collab-01
port: 80
expose: [cloud.exemple.internal]
collabora:
groupe: serveur_collabora
hote: collab-01
port: 9980
websocket: true
expose: [bureau.exemple.internal]

View file

@ -1,20 +0,0 @@
---
serveurs_bd:
sql-01: { type: postgres, hote: data-sql-01, port: 5432, groupe: serveur_postgresql }
bases_donnees:
keycloak:
serveur: sql-01
base: keycloak
proprietaire: keycloak
secret: vault_bd_keycloak
consommateur: serveur_keycloak
portee: groupe
usage: principale
nextcloud:
serveur: sql-01
base: nextcloud
proprietaire: nextcloud
secret: vault_bd_nextcloud
consommateur: serveur_nextcloud
portee: groupe
usage: principale

View file

@ -1,4 +0,0 @@
---
domaines_publics:
exemple.ca: { autorite: primaire-cache, edge: serveur_nginx, secondaires: [], dnssec: false }
exemple.internal: { autorite: interne, edge: serveur_nginx, secondaires: [], dnssec: false }

View file

@ -1,24 +0,0 @@
---
# MODÈLE « collaboration » — socle + identité + collaboration (8 VM).
# = identite + un nœud collab (Nextcloud + Collabora). Débloque maison-obnl/cabinet.
# index : ⚠️ REMPLACER par l'index unique du tenant.
index: 1
supernet: 10.11.0.0/16
vmid_schema: ip-miroir
cidr_hote: 24
reservations: { passerelle: 1, reserve_min: 2, reserve_max: 9 }
categories:
1: { libelle: Frontiere, vlan: 16, sous_reseau: 10.11.16.0/24, passerelle: 10.11.16.1 }
2: { libelle: Identite, vlan: 17, sous_reseau: 10.11.17.0/24, passerelle: 10.11.17.1 }
3: { libelle: Donnees, vlan: 18, sous_reseau: 10.11.18.0/24, passerelle: 10.11.18.1 }
4: { libelle: Services-infra, vlan: 19, sous_reseau: 10.11.19.0/24, passerelle: 10.11.19.1 }
5: { libelle: Collaboration, vlan: 20, sous_reseau: 10.11.20.0/24, passerelle: 10.11.20.1 }
fonctions:
infra-edge: { categorie: 1, service: 1 }
id-ldap: { categorie: 2, service: 1 }
id-sso: { categorie: 2, service: 2 }
data-sql: { categorie: 3, service: 1 }
infra-dns: { categorie: 4, service: 1 }
infra-pki: { categorie: 4, service: 2 }
infra-mail: { categorie: 4, service: 3 }
collab: { categorie: 5, service: 1 }

View file

@ -1,10 +0,0 @@
---
serveurs:
infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] }
infra-edge-01: { fonction: infra-edge, etat: planifie, integrations: [client_pki] }
infra-mail-01: { fonction: infra-mail, etat: planifie, integrations: [client_pki, client_backup] }
infra-dns-01: { fonction: infra-dns, etat: planifie, disque: 40G, integrations: [client_pki] }
id-ldap-01: { fonction: id-ldap, etat: planifie, integrations: [client_pki, client_backup, client_metrique, client_journal, client_smtp] }
id-sso-01: { fonction: id-sso, etat: planifie, integrations: [client_pki] }
data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_pki, client_unbound, client_backup, client_metrique, client_journal, client_smtp] }
collab-01: { fonction: collab, etat: planifie, disque: 40G, integrations: [client_pki, client_backup, client_metrique, client_journal, client_smtp] }

View file

@ -1,8 +0,0 @@
# Modèle : forge
Base + données + **forge git****6 VM** : socle infra + PostgreSQL/Redis +
Forgejo (dépôts git, exposé via l'edge).
Zones : Frontière (16) · Données (18) · Services-infra (19) · Applications (21).
SSO non inclus — ajouter le modèle `identite` pour « Se connecter avec ... ».
VMID `ip-miroir`. Copier vers `OPS-<tenant>`, adapter `index`/domaine/intrants.

View file

@ -1,6 +0,0 @@
---
domaine_interne: "exemple.internal"
fuseau_horaire: "America/Toronto"
organisation: "Exemple"
identite_realm: "exemple"
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,9 +0,0 @@
---
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.exemple.internal] }

View file

@ -1,12 +0,0 @@
---
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

View file

@ -1,4 +0,0 @@
---
domaines_publics:
exemple.ca: { autorite: primaire-cache, edge: serveur_nginx, secondaires: [], dnssec: false }
exemple.internal: { autorite: interne, edge: serveur_nginx, secondaires: [], dnssec: false }

View file

@ -1,20 +0,0 @@
---
# MODÈLE « forge » — base + données + forge git (6 VM) : Forgejo.
# index : ⚠️ REMPLACER par l'index unique du tenant.
index: 1
supernet: 10.11.0.0/16
vmid_schema: ip-miroir
cidr_hote: 24
reservations: { passerelle: 1, reserve_min: 2, reserve_max: 9 }
categories:
1: { libelle: Frontiere, vlan: 16, sous_reseau: 10.11.16.0/24, passerelle: 10.11.16.1 }
3: { libelle: Donnees, vlan: 18, sous_reseau: 10.11.18.0/24, passerelle: 10.11.18.1 }
4: { libelle: Services-infra, vlan: 19, sous_reseau: 10.11.19.0/24, passerelle: 10.11.19.1 }
6: { libelle: Applications, vlan: 21, sous_reseau: 10.11.21.0/24, passerelle: 10.11.21.1 }
fonctions:
infra-edge: { categorie: 1, service: 1 }
data-sql: { categorie: 3, service: 1 }
infra-dns: { categorie: 4, service: 1 }
infra-pki: { categorie: 4, service: 2 }
infra-mail: { categorie: 4, service: 3 }
forge: { categorie: 6, service: 1 }

View file

@ -1,8 +0,0 @@
---
serveurs:
infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] }
infra-edge-01: { fonction: infra-edge, etat: planifie, integrations: [client_pki] }
infra-mail-01: { fonction: infra-mail, etat: planifie, integrations: [client_pki, client_backup] }
infra-dns-01: { fonction: infra-dns, etat: planifie, disque: 40G, integrations: [client_pki] }
data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_pki, client_unbound, client_backup, client_metrique, client_journal, client_smtp] }
forge-01: { fonction: forge, etat: planifie, integrations: [client_pki, client_backup, client_metrique, client_journal, client_smtp] }

View file

@ -1,7 +0,0 @@
# Modèle : identite
Base + données + **identité****7 VM** : socle infra + PostgreSQL/Redis +
OpenLDAP (annuaire, source de vérité) + Keycloak (SSO/OIDC, exposé via l'edge).
Zones : Frontière (16) · Identité (17) · Données (18) · Services-infra (19).
VMID `ip-miroir`. Copier vers `OPS-<tenant>`, adapter `index`/domaine/intrants.

View file

@ -1,6 +0,0 @@
---
domaine_interne: "exemple.internal"
fuseau_horaire: "America/Toronto"
organisation: "Exemple"
identite_realm: "exemple"
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,14 +0,0 @@
---
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 }
openldap: { groupe: serveur_openldap, hote: id-ldap-01 }
postgresql: { groupe: serveur_postgresql, hote: data-sql-01 }
redis: { groupe: serveur_redis, hote: data-sql-01 }
keycloak:
groupe: serveur_keycloak
hote: id-sso-01
port: 8080
expose: [keycloak.exemple.internal]

View file

@ -1,12 +0,0 @@
---
serveurs_bd:
sql-01: { type: postgres, hote: data-sql-01, port: 5432, groupe: serveur_postgresql }
bases_donnees:
keycloak:
serveur: sql-01
base: keycloak
proprietaire: keycloak
secret: vault_bd_keycloak
consommateur: serveur_keycloak
portee: groupe
usage: principale

View file

@ -1,4 +0,0 @@
---
domaines_publics:
exemple.ca: { autorite: primaire-cache, edge: serveur_nginx, secondaires: [], dnssec: false }
exemple.internal: { autorite: interne, edge: serveur_nginx, secondaires: [], dnssec: false }

View file

@ -1,21 +0,0 @@
---
# MODÈLE « identite » — base + données + identité (7 VM) : OpenLDAP + Keycloak.
# index : ⚠️ REMPLACER par l'index unique du tenant.
index: 1
supernet: 10.11.0.0/16
vmid_schema: ip-miroir
cidr_hote: 24
reservations: { passerelle: 1, reserve_min: 2, reserve_max: 9 }
categories:
1: { libelle: Frontiere, vlan: 16, sous_reseau: 10.11.16.0/24, passerelle: 10.11.16.1 }
2: { libelle: Identite, vlan: 17, sous_reseau: 10.11.17.0/24, passerelle: 10.11.17.1 }
3: { libelle: Donnees, vlan: 18, sous_reseau: 10.11.18.0/24, passerelle: 10.11.18.1 }
4: { libelle: Services-infra, vlan: 19, sous_reseau: 10.11.19.0/24, passerelle: 10.11.19.1 }
fonctions:
infra-edge: { categorie: 1, service: 1 }
id-ldap: { categorie: 2, service: 1 }
id-sso: { categorie: 2, service: 2 }
data-sql: { categorie: 3, service: 1 }
infra-dns: { categorie: 4, service: 1 }
infra-pki: { categorie: 4, service: 2 }
infra-mail: { categorie: 4, service: 3 }

View file

@ -1,9 +0,0 @@
---
serveurs:
infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] }
infra-edge-01: { fonction: infra-edge, etat: planifie, integrations: [client_pki] }
infra-mail-01: { fonction: infra-mail, etat: planifie, integrations: [client_pki, client_backup] }
infra-dns-01: { fonction: infra-dns, etat: planifie, disque: 40G, integrations: [client_pki] }
id-ldap-01: { fonction: id-ldap, etat: planifie, integrations: [client_pki, client_backup, client_metrique, client_journal, client_smtp] }
id-sso-01: { fonction: id-sso, etat: planifie, integrations: [client_pki] }
data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_pki, client_unbound, client_backup, client_metrique, client_journal, client_smtp] }

View file

@ -1,27 +0,0 @@
# Modèle : integral
Écosystème souverain **complet et éprouvé** — le socle de référence pour un nouveau tenant.
**12 VM** réparties en **6 zones de sécurité** (un /24 + VLAN chacune) :
| Zone | VLAN | Fonctions |
|---|---|---|
| Frontière | 16 | infra-edge (nginx), edge-mta (Postfix/rspamd) |
| Identité | 17 | id-ldap (OpenLDAP), id-sso (Keycloak) |
| Données | 18 | data-sql (PostgreSQL/Redis), sauvegarde (restic) |
| Services-infra | 19 | infra-dns (PowerDNS), infra-pki (step-ca), infra-mail (Dovecot) |
| Observabilité | 20 | obs (Prometheus/Loki/Grafana), sup (Icinga + BPM) |
| Applications | 21 | forge (Forgejo) |
## Pour instancier un tenant
1. Copier ce dépôt-modèle vers `OPS-<votre-tenant>` (dépôt d'instance autonome).
2. Adapter :
- `plan/nomenclature.yml` : **`index`** (identifiant unique du tenant → préfixe VMID + supernet `10.(10+index).0.0/16`) et les `sous_reseau`/`passerelle` des 6 zones.
- `inventories/production/group_vars/all.yml` : `domaine_interne`, `fuseau_horaire`, `organisation`, `identite_realm`.
- `plan/domaines.yml` et les FQDN d'`expose` dans `plan/applications.yml`.
3. Pointer le sélecteur (`instance → OPS-<tenant>`) puis `make instancier`.
## Dérivations automatiques
Le nom d'un serveur (`data-sql-01`) + la nomenclature suffisent : **VMID, IP, VLAN, passerelle** sont dérivés — rien à saisir. Le VMID suit le schéma **`ip-miroir`** (9 chiffres `I·VVV·HHH·NN` = index·VLAN·octet-hôte·séquence : il *contient* l'IP + le tenant).
Voir `exemples/modeles/README.md` pour le mécanisme général.

View file

@ -1,8 +0,0 @@
---
# MODÈLE integral — intrants d'identité de l'instance. À adapter à VOTRE tenant.
domaine_interne: "exemple.internal" # <- VOTRE domaine DNS interne (.internal)
fuseau_horaire: "America/Toronto" # <- fuseau de l'organisation
organisation: "Exemple" # <- nom (annuaire LDAP, certificats)
identite_realm: "exemple" # <- realm SSO Keycloak de ce tenant
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,12 +0,0 @@
---
# Client OIDC 'nextcloud' enregistre dans le realm par le role serveur_keycloak.
# (Modele integral : les autres clients — forgejo/grafana/icingaweb2 — sont a
# ajouter ici selon les apps exposees, avec leurs secrets de voute respectifs.)
serveur_keycloak_clients:
- clientId: nextcloud
redirect_uris:
- "https://cloud.{{ domaine_interne }}/apps/user_oidc/code"
- "https://cloud.{{ domaine_interne }}/*"
web_origins:
- "https://cloud.{{ domaine_interne }}"
secret: "{{ vault_nextcloud_oidc }}"

View file

@ -1,89 +0,0 @@
# MODÈLE integral — applications (application = entité pivot).
# Adapter les FQDN d'exposition à VOTRE domaine interne.
---
applications:
dovecot:
groupe: serveur_dovecot
hote: infra-mail-01
postfix:
groupe: serveur_postfix
hote: edge-mta-01
liens:
- vers: dovecot
role: mailstore
- vers: rspamd
role: milter
rspamd:
groupe: serveur_rspamd
hote: edge-mta-01
postgresql:
groupe: serveur_postgresql
hote: data-sql-01
redis:
groupe: serveur_redis
hote: data-sql-01
backup:
groupe: serveur_backup
hote: backup-01
keycloak:
groupe: serveur_keycloak
hote: id-sso-01
port: 8080
expose:
- keycloak.exemple.internal
loki:
groupe: serveur_loki
hote: obs-01
prometheus:
groupe: serveur_prometheus
hote: obs-01
grafana:
groupe: serveur_grafana
hote: obs-01
port: 3000
expose:
- grafana.exemple.internal
forgejo:
groupe: serveur_forgejo
hote: forge-01
port: 3000
expose:
- forge.exemple.internal
nextcloud:
groupe: serveur_nextcloud
hote: collab-01
port: 80
expose:
- cloud.exemple.internal
collabora:
groupe: serveur_collabora
hote: collab-01
port: 9980
websocket: true
expose:
- bureau.exemple.internal
icinga:
groupe: serveur_icinga
hote: sup-01
icingaweb2:
groupe: serveur_icingaweb2
hote: sup-01
port: 8080
oauth2_proxy:
groupe: serveur_oauth2_proxy
hote: sup-01
port: 4180
expose:
- icinga.exemple.internal
openldap:
groupe: serveur_openldap
hote: id-ldap-01
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

View file

@ -1,41 +0,0 @@
# MODÈLE integral — bases de données. 'secret' nomme une variable Ansible Vault.
---
serveurs_bd:
sql-01:
type: postgres
hote: data-sql-01
port: 5432
groupe: serveur_postgresql
bases_donnees:
keycloak:
serveur: sql-01
base: keycloak
proprietaire: keycloak
secret: vault_bd_keycloak
consommateur: serveur_keycloak
portee: groupe
usage: principale
forgejo:
serveur: sql-01
base: forgejo
proprietaire: forgejo
secret: vault_bd_forgejo
consommateur: serveur_forgejo
portee: groupe
usage: principale
icingadb:
serveur: sql-01
base: icingadb
proprietaire: icingadb
secret: vault_bd_icingadb
consommateur: serveur_icinga
portee: groupe
usage: principale
nextcloud:
serveur: sql-01
base: nextcloud
proprietaire: nextcloud
secret: vault_bd_nextcloud
consommateur: serveur_nextcloud
portee: groupe
usage: principale

View file

@ -1,15 +0,0 @@
---
# MODÈLE integral — domaines. Adapter à VOS domaines public/interne.
domaines_publics:
exemple.ca:
autorite: primaire-cache
edge: serveur_nginx
secondaires: []
dnssec: false
# Domaine interne : parent des expositions derrière l'edge nginx interne.
# Utiliser .internal (et non .local, réservé au mDNS).
exemple.internal:
autorite: interne
edge: serveur_nginx
secondaires: []
dnssec: false

View file

@ -1,69 +0,0 @@
---
# MODÈLE « integral » — écosystème souverain COMPLET (12 VM).
# Copier ce dépôt-modèle vers OPS-<votre-tenant>, puis adapter index / supernet / domaine.
#
# index : identifiant UNIQUE du tenant dans la fédération (1, 2, 3…).
# Détermine le préfixe VMID (schéma ip-miroir) et le supernet 10.(10+index).0.0/16.
# ⚠️ REMPLACER par l'index de VOTRE tenant (évite toute collision IP/VMID).
# vmid_schema: ip-miroir → VMID 9 chiffres I·VVV·HHH·NN (index·VLAN·octet-hôte·séquence) :
# le VMID contient littéralement l'IP + le tenant. Lecture directe.
index: 1
supernet: 10.11.0.0/16
vmid_schema: ip-miroir
cidr_hote: 24
reservations:
passerelle: 1
reserve_min: 2
reserve_max: 9
# 6 ZONES de sécurité, un /24 + VLAN chacune (VLAN = 3e octet), dans 10.(10+index).16.0/20.
categories:
1:
libelle: Frontiere
vlan: 16
sous_reseau: 10.11.16.0/24
passerelle: 10.11.16.1
2:
libelle: Identite
vlan: 17
sous_reseau: 10.11.17.0/24
passerelle: 10.11.17.1
3:
libelle: Donnees
vlan: 18
sous_reseau: 10.11.18.0/24
passerelle: 10.11.18.1
4:
libelle: Services-infra
vlan: 19
sous_reseau: 10.11.19.0/24
passerelle: 10.11.19.1
5:
libelle: Observabilite
vlan: 20
sous_reseau: 10.11.20.0/24
passerelle: 10.11.20.1
6:
libelle: Applications
vlan: 21
sous_reseau: 10.11.21.0/24
passerelle: 10.11.21.1
fonctions:
# Zone 1 — Frontière
infra-edge: { categorie: 1, service: 1 }
edge-mta: { categorie: 1, service: 2 }
# Zone 2 — Identité
id-ldap: { categorie: 2, service: 1 }
id-sso: { categorie: 2, service: 2 }
# Zone 3 — Données
data-sql: { categorie: 3, service: 1 }
sauvegarde: { categorie: 3, service: 2 }
# Zone 4 — Services-infra
infra-dns: { categorie: 4, service: 1 }
infra-pki: { categorie: 4, service: 2 }
infra-mail: { categorie: 4, service: 3 }
# Zone 5 — Observabilité
obs: { categorie: 5, service: 1 }
sup: { categorie: 5, service: 2 }
# Zone 6 — Applications
forge: { categorie: 6, service: 1 }
collab: { categorie: 6, service: 2 }

View file

@ -1,87 +0,0 @@
# MODÈLE integral — registre des serveurs (12 VM). etat: planifie (template).
# VMID/IP/VLAN/passerelle DERIVES de la fonction via plan/nomenclature.yml.
---
serveurs:
infra-pki-01:
fonction: infra-pki
etat: planifie
disque: 32G
integrations:
- client_backup
infra-edge-01:
fonction: infra-edge
etat: planifie
integrations:
- client_pki
infra-mail-01:
fonction: infra-mail
etat: planifie
integrations:
- client_pki
- client_backup
infra-dns-01:
fonction: infra-dns
etat: planifie
disque: 40G
integrations:
- client_pki
id-ldap-01:
fonction: id-ldap
etat: planifie
integrations:
- client_pki
- client_backup
- client_metrique
- client_journal
- client_smtp
id-sso-01:
fonction: id-sso
etat: planifie
integrations:
- client_pki
data-sql-01:
fonction: data-sql
etat: planifie
integrations:
- client_pki
- client_unbound
- client_backup
- client_metrique
- client_journal
- client_smtp
backup-01:
fonction: sauvegarde
etat: planifie
disque: 64G
obs-01:
fonction: obs
etat: planifie
integrations:
- client_pki
- client_metrique
- client_journal
- client_smtp
sup-01:
fonction: sup
etat: planifie
integrations:
- client_pki
forge-01:
fonction: forge
etat: planifie
integrations:
- client_pki
- client_backup
- client_metrique
- client_journal
- client_smtp
collab-01:
fonction: collab
etat: planifie
disque: 40G
integrations:
- client_pki
- client_backup
- client_metrique
- client_journal
- client_smtp

View file

@ -1,8 +0,0 @@
# Modèle : observabilite
Base + données + **observabilité/supervision****7 VM** : socle infra + PostgreSQL/
Redis + Prometheus/Loki/Grafana (métriques & logs) + Icinga/BPM (supervision stratégique).
Zones : Frontière (16) · Données (18) · Services-infra (19) · Observabilité (20).
SSO non inclus (auth locale) — ajouter le modèle `identite` pour fédérer.
VMID `ip-miroir`. Copier vers `OPS-<tenant>`, adapter `index`/domaine/intrants.

View file

@ -1,6 +0,0 @@
---
domaine_interne: "exemple.internal"
fuseau_horaire: "America/Toronto"
organisation: "Exemple"
identite_realm: "exemple"
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,13 +0,0 @@
---
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 }
loki: { groupe: serveur_loki, hote: obs-01 }
prometheus: { groupe: serveur_prometheus, hote: obs-01 }
grafana: { groupe: serveur_grafana, hote: obs-01, port: 3000, expose: [grafana.exemple.internal] }
icinga: { groupe: serveur_icinga, hote: sup-01 }
icingaweb2: { groupe: serveur_icingaweb2, hote: sup-01, port: 8080, expose: [icinga.exemple.internal] }

View file

@ -1,12 +0,0 @@
---
serveurs_bd:
sql-01: { type: postgres, hote: data-sql-01, port: 5432, groupe: serveur_postgresql }
bases_donnees:
icingadb:
serveur: sql-01
base: icingadb
proprietaire: icingadb
secret: vault_bd_icingadb
consommateur: serveur_icinga
portee: groupe
usage: principale

View file

@ -1,4 +0,0 @@
---
domaines_publics:
exemple.ca: { autorite: primaire-cache, edge: serveur_nginx, secondaires: [], dnssec: false }
exemple.internal: { autorite: interne, edge: serveur_nginx, secondaires: [], dnssec: false }

View file

@ -1,21 +0,0 @@
---
# MODÈLE « observabilite » — base + données + observabilité/supervision (7 VM).
# index : ⚠️ REMPLACER par l'index unique du tenant.
index: 1
supernet: 10.11.0.0/16
vmid_schema: ip-miroir
cidr_hote: 24
reservations: { passerelle: 1, reserve_min: 2, reserve_max: 9 }
categories:
1: { libelle: Frontiere, vlan: 16, sous_reseau: 10.11.16.0/24, passerelle: 10.11.16.1 }
3: { libelle: Donnees, vlan: 18, sous_reseau: 10.11.18.0/24, passerelle: 10.11.18.1 }
4: { libelle: Services-infra, vlan: 19, sous_reseau: 10.11.19.0/24, passerelle: 10.11.19.1 }
5: { libelle: Observabilite, vlan: 20, sous_reseau: 10.11.20.0/24, passerelle: 10.11.20.1 }
fonctions:
infra-edge: { categorie: 1, service: 1 }
data-sql: { categorie: 3, service: 1 }
infra-dns: { categorie: 4, service: 1 }
infra-pki: { categorie: 4, service: 2 }
infra-mail: { categorie: 4, service: 3 }
obs: { categorie: 5, service: 1 }
sup: { categorie: 5, service: 2 }

View file

@ -1,9 +0,0 @@
---
serveurs:
infra-pki-01: { fonction: infra-pki, etat: planifie, disque: 32G, integrations: [client_backup] }
infra-edge-01: { fonction: infra-edge, etat: planifie, integrations: [client_pki] }
infra-mail-01: { fonction: infra-mail, etat: planifie, integrations: [client_pki, client_backup] }
infra-dns-01: { fonction: infra-dns, etat: planifie, disque: 40G, integrations: [client_pki] }
data-sql-01: { fonction: data-sql, etat: planifie, integrations: [client_pki, client_unbound, client_backup, client_metrique, client_journal, client_smtp] }
obs-01: { fonction: obs, etat: planifie, integrations: [client_pki, client_metrique, client_journal, client_smtp] }
sup-01: { fonction: sup, etat: planifie, integrations: [client_pki] }

View file

@ -1,11 +0,0 @@
# Modèle : Présence Web ⚠️ ASPIRATIONNEL
> **Ce modèle n'est pas prêt à déployer.** Il repose sur des fonctions
> `web-frontal` / `web-dorsal` qui **n'ont pas encore de rôle Set-OPS implémenté**
> (seulement des empreintes de dimensionnement par défaut). À finaliser une fois
> ces rôles construits — voir `docs/multi-instances.md`.
Objectif visé : héberger **sites et applications web** — socle souverain (DNS, PKI,
edge TLS, relais courriel) + couche web (frontal + dorsal) + données (PostgreSQL/Redis).
En attendant, pour un écosystème complet **prouvé**, utiliser le modèle **`integral`**.

View file

@ -1,3 +0,0 @@
---
domaine_interne: "exemple.internal" # <- VOTRE domaine DNS interne
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"

View file

@ -1,12 +0,0 @@
---
# Webapps dynamiques servies par le dorsal (rôle serveur_web_dorsal) : runtime +
# service systemd, fronteées par nginx local, exposées via l'edge. Exemple Python.
# Une app à BD réseau déclare sa base dans bases-donnees.yml et passe le DSN via env.
serveur_web_dorsal_apps:
- nom: app
server_name: "app.{{ domaine_interne }}"
depot: "https://forge.{{ domaine_interne }}/…/app.git"
branche: main
port: 8001
commande: ".venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8001"
data_dir: /var/lib/app

View file

@ -1,10 +0,0 @@
---
# Sites statiques servis par le frontal (rôle serveur_web_frontal), clonés depuis
# un dépôt git souverain (Forgejo) et exposés via l'edge (voir applications.yml).
# Remplacer par les vrais sites du tenant.
serveur_web_frontal_sites:
- nom: site
server_name: "site.{{ domaine_interne }}"
depot: "https://forge.{{ domaine_interne }}/…/site.git"
branche: main
sous_dossier: public

View file

@ -1,18 +0,0 @@
---
applications:
pki: { groupe: serveur_step_ca, hote: infra-pki-01 }
edge: { groupe: serveur_nginx, hote: infra-edge-01 }
mail: { groupe: serveur_postfix, hote: infra-mail-01 }
dns: { groupe: serveur_powerdns, hote: infra-dns-01 }
bdd: { groupe: serveur_postgresql, hote: data-01, port: 5432 }
cache: { groupe: serveur_redis, hote: data-01 }
frontal:
groupe: serveur_web_frontal
hote: web-frontal-01
port: 80
expose: [site.exemple.internal]
dorsal:
groupe: serveur_web_dorsal
hote: web-dorsal-01
port: 80
expose: [app.exemple.internal]

View file

@ -1,4 +0,0 @@
---
serveurs_bd:
pg-principal: { type: postgres, hote: 10.10.13.11, port: 5432, groupe: serveur_postgresql }
bases_donnees: {}

View file

@ -1,7 +0,0 @@
---
domaines_publics:
exemple.ca: # <- VOTRE domaine public
autorite: primaire-cache
edge: serveur_nginx
secondaires: []
dnssec: false

View file

@ -1,17 +0,0 @@
---
# Adaptez le supernet à VOTRE réseau interne.
supernet: "10.10.0.0/16"
cidr_hote: 24
reservations: { passerelle: 1, reserve_min: 2, reserve_max: 9 }
categories:
1: { libelle: "Fondations", vlan: 11, sous_reseau: "10.10.11.0/24", passerelle: "10.10.11.1" }
3: { libelle: "Donnees", vlan: 13, sous_reseau: "10.10.13.0/24", passerelle: "10.10.13.1" }
5: { libelle: "Applications", vlan: 15, sous_reseau: "10.10.15.0/24", passerelle: "10.10.15.1" }
fonctions:
infra-pki: { categorie: 1, service: 1 }
infra-edge: { categorie: 1, service: 2 }
infra-mail: { categorie: 1, service: 3 }
infra-dns: { categorie: 1, service: 4 }
data: { categorie: 3, service: 1 }
web-frontal: { categorie: 5, service: 3 }
web-dorsal: { categorie: 5, service: 4 }

View file

@ -1,9 +0,0 @@
---
serveurs:
infra-pki-01: { fonction: infra-pki, etat: planifie }
infra-edge-01: { fonction: infra-edge, etat: planifie }
infra-mail-01: { fonction: infra-mail, etat: planifie }
infra-dns-01: { fonction: infra-dns, etat: planifie }
data-01: { fonction: data, etat: planifie }
web-frontal-01: { fonction: web-frontal, etat: planifie }
web-dorsal-01: { fonction: web-dorsal, etat: planifie }