From 1f9cc0a0d38a4b36a7faba55b19c297cf9bbe690 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sun, 5 Jul 2026 16:21:25 -0400 Subject: [PATCH] =?UTF-8?q?Mod=C3=A8les=20:=20nouveau=20mod=C3=A8le=20'col?= =?UTF-8?q?laboration'=20+=20collaboration=20dans=20'integral'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ce qui manquait aux modèles = la collaboration (Nextcloud/Collabora), placeholder 'rôles à construire' du README, désormais bâti. - exemples/modeles/collaboration/ : socle + identité + nœud collab (8 VM, zone Collaboration VLAN 20) ; nextcloud+collabora exposés (cloud/bureau, websocket auto), base nextcloud, client Keycloak nextcloud. SANs edge + plancher auto-dérivés. - integral : + collab-01 (zone Applications), nextcloud/collabora/base/client — il tient enfin sa promesse de « tout ». - README : collaboration ✅. Les deux modèles instancient proprement (collab dérivé, expositions auto). Co-Authored-By: Claude Opus 4.8 --- exemples/modeles/README.md | 2 +- exemples/modeles/collaboration/README.md | 36 +++++++++++++++++++ .../inventories/production/group_vars/all.yml | 6 ++++ .../group_vars/serveur_keycloak.yml | 11 ++++++ .../collaboration/plan/applications.yml | 25 +++++++++++++ .../collaboration/plan/bases-donnees.yml | 20 +++++++++++ .../modeles/collaboration/plan/domaines.yml | 4 +++ .../collaboration/plan/nomenclature.yml | 24 +++++++++++++ .../modeles/collaboration/plan/serveurs.yml | 10 ++++++ .../group_vars/serveur_keycloak.yml | 12 +++++++ .../modeles/integral/plan/applications.yml | 13 +++++++ .../modeles/integral/plan/bases-donnees.yml | 8 +++++ .../modeles/integral/plan/nomenclature.yml | 1 + exemples/modeles/integral/plan/serveurs.yml | 10 ++++++ 14 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 exemples/modeles/collaboration/README.md create mode 100644 exemples/modeles/collaboration/inventories/production/group_vars/all.yml create mode 100644 exemples/modeles/collaboration/inventories/production/group_vars/serveur_keycloak.yml create mode 100644 exemples/modeles/collaboration/plan/applications.yml create mode 100644 exemples/modeles/collaboration/plan/bases-donnees.yml create mode 100644 exemples/modeles/collaboration/plan/domaines.yml create mode 100644 exemples/modeles/collaboration/plan/nomenclature.yml create mode 100644 exemples/modeles/collaboration/plan/serveurs.yml create mode 100644 exemples/modeles/integral/inventories/production/group_vars/serveur_keycloak.yml diff --git a/exemples/modeles/README.md b/exemples/modeles/README.md index 2338558..1959846 100644 --- a/exemples/modeles/README.md +++ b/exemples/modeles/README.md @@ -24,5 +24,5 @@ courriel) et ajoute des **modules** selon l'offre. | `forge` | Forgejo + données | ✅ | | `identite` | LDAP + Keycloak (SSO) | ✅ | | `observabilite` | Prometheus/Loki/Grafana + Icinga | ✅ | -| `collaboration` | Nextcloud + Collabora | rôles à construire | +| `collaboration` | identité + Nextcloud + Collabora | ✅ | | `integral` | tout | ✅ | diff --git a/exemples/modeles/collaboration/README.md b/exemples/modeles/collaboration/README.md new file mode 100644 index 0000000..0f5c3a3 --- /dev/null +++ b/exemples/modeles/collaboration/README.md @@ -0,0 +1,36 @@ +# 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.` → Nextcloud (collab-01:80) +- `bureau.` → 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- +# éditer : intrants (domaine_interne, organisation, identite_realm), +# nomenclature.yml (index unique + supernet du tenant), domaines +ln -s ../OPS- instance +make instancier-appliquer FORCE=1 +``` diff --git a/exemples/modeles/collaboration/inventories/production/group_vars/all.yml b/exemples/modeles/collaboration/inventories/production/group_vars/all.yml new file mode 100644 index 0000000..d96622e --- /dev/null +++ b/exemples/modeles/collaboration/inventories/production/group_vars/all.yml @@ -0,0 +1,6 @@ +--- +domaine_interne: "exemple.internal" +fuseau_horaire: "America/Toronto" +organisation: "Exemple" +identite_realm: "exemple" +setops_plan_dir: "{{ playbook_dir }}/../../instance/plan" diff --git a/exemples/modeles/collaboration/inventories/production/group_vars/serveur_keycloak.yml b/exemples/modeles/collaboration/inventories/production/group_vars/serveur_keycloak.yml new file mode 100644 index 0000000..b6b1368 --- /dev/null +++ b/exemples/modeles/collaboration/inventories/production/group_vars/serveur_keycloak.yml @@ -0,0 +1,11 @@ +--- +# 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 }}" diff --git a/exemples/modeles/collaboration/plan/applications.yml b/exemples/modeles/collaboration/plan/applications.yml new file mode 100644 index 0000000..ed915b8 --- /dev/null +++ b/exemples/modeles/collaboration/plan/applications.yml @@ -0,0 +1,25 @@ +--- +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] diff --git a/exemples/modeles/collaboration/plan/bases-donnees.yml b/exemples/modeles/collaboration/plan/bases-donnees.yml new file mode 100644 index 0000000..964d7c0 --- /dev/null +++ b/exemples/modeles/collaboration/plan/bases-donnees.yml @@ -0,0 +1,20 @@ +--- +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 diff --git a/exemples/modeles/collaboration/plan/domaines.yml b/exemples/modeles/collaboration/plan/domaines.yml new file mode 100644 index 0000000..a0ff751 --- /dev/null +++ b/exemples/modeles/collaboration/plan/domaines.yml @@ -0,0 +1,4 @@ +--- +domaines_publics: + exemple.ca: { autorite: primaire-cache, edge: serveur_nginx, secondaires: [], dnssec: false } + exemple.internal: { autorite: interne, edge: serveur_nginx, secondaires: [], dnssec: false } diff --git a/exemples/modeles/collaboration/plan/nomenclature.yml b/exemples/modeles/collaboration/plan/nomenclature.yml new file mode 100644 index 0000000..9ac039f --- /dev/null +++ b/exemples/modeles/collaboration/plan/nomenclature.yml @@ -0,0 +1,24 @@ +--- +# 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 } diff --git a/exemples/modeles/collaboration/plan/serveurs.yml b/exemples/modeles/collaboration/plan/serveurs.yml new file mode 100644 index 0000000..942e4d3 --- /dev/null +++ b/exemples/modeles/collaboration/plan/serveurs.yml @@ -0,0 +1,10 @@ +--- +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] } diff --git a/exemples/modeles/integral/inventories/production/group_vars/serveur_keycloak.yml b/exemples/modeles/integral/inventories/production/group_vars/serveur_keycloak.yml new file mode 100644 index 0000000..db4b371 --- /dev/null +++ b/exemples/modeles/integral/inventories/production/group_vars/serveur_keycloak.yml @@ -0,0 +1,12 @@ +--- +# 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 }}" diff --git a/exemples/modeles/integral/plan/applications.yml b/exemples/modeles/integral/plan/applications.yml index 0e0a50b..98bf093 100644 --- a/exemples/modeles/integral/plan/applications.yml +++ b/exemples/modeles/integral/plan/applications.yml @@ -49,6 +49,19 @@ applications: 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 diff --git a/exemples/modeles/integral/plan/bases-donnees.yml b/exemples/modeles/integral/plan/bases-donnees.yml index d5ad529..088e162 100644 --- a/exemples/modeles/integral/plan/bases-donnees.yml +++ b/exemples/modeles/integral/plan/bases-donnees.yml @@ -31,3 +31,11 @@ bases_donnees: 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 diff --git a/exemples/modeles/integral/plan/nomenclature.yml b/exemples/modeles/integral/plan/nomenclature.yml index 9d11f00..7916123 100644 --- a/exemples/modeles/integral/plan/nomenclature.yml +++ b/exemples/modeles/integral/plan/nomenclature.yml @@ -66,3 +66,4 @@ fonctions: sup: { categorie: 5, service: 2 } # Zone 6 — Applications forge: { categorie: 6, service: 1 } + collab: { categorie: 6, service: 2 } diff --git a/exemples/modeles/integral/plan/serveurs.yml b/exemples/modeles/integral/plan/serveurs.yml index abd28b4..317ec0d 100644 --- a/exemples/modeles/integral/plan/serveurs.yml +++ b/exemples/modeles/integral/plan/serveurs.yml @@ -75,3 +75,13 @@ serveurs: - 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