Modèles : nouveau modèle 'collaboration' + collaboration dans 'integral'

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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-05 16:21:25 -04:00
parent 0d2bc2c2e9
commit 1f9cc0a0d3
14 changed files with 181 additions and 1 deletions

View file

@ -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 | ✅ |

View file

@ -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.<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

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

View file

@ -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 }}"

View file

@ -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]

View file

@ -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

View file

@ -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 }

View file

@ -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 }

View file

@ -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] }

View file

@ -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 }}"

View file

@ -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

View file

@ -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

View file

@ -66,3 +66,4 @@ fonctions:
sup: { categorie: 5, service: 2 }
# Zone 6 — Applications
forge: { categorie: 6, service: 1 }
collab: { categorie: 6, service: 2 }

View file

@ -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