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:
parent
61a6526ffb
commit
a1cfe77b4a
47 changed files with 13 additions and 802 deletions
|
|
@ -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 + | Où |
|
||||
| --- | --- | --- |
|
||||
| `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é |
|
||||
|
|
|
|||
|
|
@ -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
|
||||
```
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
domaine_interne: "exemple.internal"
|
||||
fuseau_horaire: "America/Toronto"
|
||||
organisation: "Exemple"
|
||||
identite_realm: "exemple"
|
||||
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"
|
||||
|
|
@ -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 }}"
|
||||
|
|
@ -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]
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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] }
|
||||
|
|
@ -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.
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
domaine_interne: "exemple.internal"
|
||||
fuseau_horaire: "America/Toronto"
|
||||
organisation: "Exemple"
|
||||
identite_realm: "exemple"
|
||||
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"
|
||||
|
|
@ -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] }
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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] }
|
||||
|
|
@ -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.
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
domaine_interne: "exemple.internal"
|
||||
fuseau_horaire: "America/Toronto"
|
||||
organisation: "Exemple"
|
||||
identite_realm: "exemple"
|
||||
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"
|
||||
|
|
@ -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]
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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] }
|
||||
|
|
@ -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.
|
||||
|
|
@ -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"
|
||||
|
|
@ -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 }}"
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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
|
||||
|
|
@ -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.
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
domaine_interne: "exemple.internal"
|
||||
fuseau_horaire: "America/Toronto"
|
||||
organisation: "Exemple"
|
||||
identite_realm: "exemple"
|
||||
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"
|
||||
|
|
@ -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] }
|
||||
|
|
@ -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
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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] }
|
||||
|
|
@ -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`**.
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
---
|
||||
domaine_interne: "exemple.internal" # <- VOTRE domaine DNS interne
|
||||
setops_plan_dir: "{{ playbook_dir }}/../../instance/plan"
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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]
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
---
|
||||
serveurs_bd:
|
||||
pg-principal: { type: postgres, hote: 10.10.13.11, port: 5432, groupe: serveur_postgresql }
|
||||
bases_donnees: {}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
---
|
||||
domaines_publics:
|
||||
exemple.ca: # <- VOTRE domaine public
|
||||
autorite: primaire-cache
|
||||
edge: serveur_nginx
|
||||
secondaires: []
|
||||
dnssec: false
|
||||
|
|
@ -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 }
|
||||
|
|
@ -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 }
|
||||
Loading…
Reference in a new issue