From 0437625565e06197c6f67517111a124511dab28e Mon Sep 17 00:00:00 2001 From: Dan Allaire Date: Thu, 23 Oct 2025 17:05:54 -0400 Subject: [PATCH] =?UTF-8?q?Documents=20op=C3=A9rationels=20de=20L'Alliance?= =?UTF-8?q?=20Bor=C3=A9ale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...itecture_Reference_Standards_Techniques.md | 1871 +++++++++++++++++ .../08_Processus_Onboarding_Membres.md | 1377 ++++++++++++ .../14_Structure_YAML_Registraire.md | 1356 ++++++++++++ 3 files changed, 4604 insertions(+) create mode 100644 docs/constitution/05_Architecture_Reference_Standards_Techniques.md create mode 100644 docs/constitution/08_Processus_Onboarding_Membres.md create mode 100644 docs/constitution/14_Structure_YAML_Registraire.md diff --git a/docs/constitution/05_Architecture_Reference_Standards_Techniques.md b/docs/constitution/05_Architecture_Reference_Standards_Techniques.md new file mode 100644 index 0000000..e5bc6dd --- /dev/null +++ b/docs/constitution/05_Architecture_Reference_Standards_Techniques.md @@ -0,0 +1,1871 @@ +# Document 5 : Architecture de Référence & Standards Techniques +## L'Alliance Boréale — Couches 1 à 4 + +**Version:** 1.0 +**Date:** 23 octobre 2025 +**Statut:** Document opérationnel +**Adopté par :** Cercle Opérationnel +**Licence:** CC BY-SA 4.0 + +--- + +## PRÉAMBULE + +L'interopérabilité ne se décrète pas. Elle se construit sur des **standards partagés** et des **conventions claires**. + +**Ce document établit les règles techniques pour les couches 1 à 4** de l'architecture boréale : +- Couche 1 : Physique (serveurs, réseau) +- Couche 2 : Réseau (DNS, connectivité) +- Couche 3 : Stockage (volumes, backups) +- Couche 4 : Orchestration (IaC, automatisation) + +**Principe fondamental : Nomenclature mnémotechnique** + +> *"Un nom doit se comprendre sans documentation. Si tu dois chercher dans un wiki pour savoir ce que signifie `srv-xz42-prod`, le nom est mauvais."* + +**Nos conventions suivent trois règles d'or :** + +1. **Clarté > Concision** + Préférer `mail-prod-01` à `mp1` (3 caractères économisés ne valent pas la confusion). + +2. **Patterns répétés** + Si un pattern fonctionne pour le membre A, il doit fonctionner pour le membre B (prédictibilité). + +3. **Lecture par humains ET machines** + Les noms doivent être parsables automatiquement SANS sacrifier la lisibilité humaine. + +**Ce document est vivant.** Il évoluera avec nos apprentissages. Toute proposition d'amélioration est bienvenue (pull request sur Registraire). + +--- + +## SECTION 1 : CONVENTIONS DE NOMENCLATURE + +### 1.1 Membres — Identifiants et Slugs + +Chaque membre possède **deux identifiants** : + +#### ID Numérique (Machine-Readable) + +**Format :** `mXXX` où XXX est un entier séquentiel sur 3 chiffres. + +**Exemples :** +- `m001` : Premier membre (fondateur) +- `m002` : Deuxième membre +- `m042` : Quarante-deuxième membre + +**Usage :** +- Clé primaire dans Registraire YAML +- Références internes (décisions, audits) +- URLs de vérification (`registraire.alliance-boreale.ca/membres/m001`) + +**Avantages :** +- Unique +- Court +- Facile à parser +- Ordre d'arrivée visible + +**Inconvénients :** +- Pas mnémotechnique (on ne sait pas qui est m042 sans chercher) + +--- + +#### Slug Textuel (Human-Readable) + +**Format :** `[a-z0-9-]{3,20}` (minuscules, chiffres, tirets, 3-20 caractères) + +**Exemples :** +- `chezlepro` (Chez le Pro) +- `technolibre` (TechnoLibre) +- `coop-nordique` (Coopérative Nordique) +- `hebergement-ethique` (Hébergement Éthique Inc.) + +**Règles :** +- Pas d'accents (compatibilité DNS/URLs) +- Pas d'espaces (remplacés par tirets) +- Pas de caractères spéciaux (@, %, &, etc.) +- Unique dans L'Alliance (vérification lors de l'admission) + +**Usage :** +- Sous-domaines DNS (`chezlepro.boreal.ca`) +- Communication informelle (Matrix, email) +- URLs publiques (`chezlepro.ca`) + +**Avantages :** +- Mnémotechnique (on sait immédiatement de qui on parle) +- Identité de marque préservée +- SEO-friendly + +--- + +#### Mapping ID ↔ Slug + +**Fichier de référence :** `registraire/membres/[ID]-[slug].yml` + +**Exemple :** +```yaml +# Fichier : registraire/membres/m001-chezlepro.yml +member_id: m001 +slug: chezlepro +legal_name: "Chez le Pro Technologies Inc." +... +``` + +**Convention de nommage du fichier :** +Toujours `[ID]-[slug].yml` pour lier visuellement les deux identifiants. + +--- + +### 1.2 Domaines — Architecture DNS Fédérée + +#### Domaine Racine de la Fédération + +**Décision stratégique requise (à valider par Cercle Stratégique) :** + +**Option A : `boreal.ca`** +- Court, mémorable +- Identité forte (référence directe au nom de l'Alliance) +- Disponibilité à vérifier + +**Option B : `alliance-boreale.ca`** +- Explicite (aucune ambiguïté) +- Plus long (impact sur sous-domaines) +- Probablement disponible + +**Option C : `.coop` ou autre TLD** +- Signal identitaire (mouvement coopératif) +- TLD `.coop` = réservé aux coopératives (pas applicable aux OBNL) + +**Recommandation temporaire (ce document) :** +Utiliser `boreal.ca` dans les exemples, mais décision finale à valider avant déploiement. + +--- + +#### Structure des Sous-domaines + +**Hiérarchie standard :** + +``` +boreal.ca (racine fédérée) +│ +├── membre.[slug].boreal.ca → Zone déléguée au membre +│ ├── mail.[slug].boreal.ca → Service email +│ ├── cloud.[slug].boreal.ca → Nextcloud/stockage +│ ├── matrix.[slug].boreal.ca → Serveur Matrix +│ ├── status.[slug].boreal.ca → Page de statut +│ └── www.[slug].boreal.ca → Site web (optionnel) +│ +├── outils.boreal.ca → Outils communs L'Alliance +│ ├── registraire.boreal.ca → Registraire public +│ ├── forge.boreal.ca → Forge logicielle +│ ├── wiki.boreal.ca → Documentation +│ └── matrix.boreal.ca → Matrix fédéral +│ +└── ns[1-3].boreal.ca → Serveurs DNS autoritaires + ├── ns1.boreal.ca → Serveur primaire (membre fondateur) + ├── ns2.boreal.ca → Serveur secondaire (autre membre) + └── ns3.boreal.ca → Serveur tertiaire (optionnel) +``` + +--- + +#### Exemple Concret : Membre "Chez le Pro" (m001 / chezlepro) + +**Domaine délégué :** `chezlepro.boreal.ca` + +**Services standards :** +``` +mail.chezlepro.boreal.ca → Postfix/Dovecot +cloud.chezlepro.boreal.ca → Nextcloud +matrix.chezlepro.boreal.ca → Synapse +status.chezlepro.boreal.ca → Upptime/Cachet +www.chezlepro.boreal.ca → Site vitrine +``` + +**Serveurs DNS (internes) :** +``` +ns1.chezlepro.boreal.ca → Serveur DNS primaire du membre +ns2.chezlepro.boreal.ca → Serveur DNS secondaire (si redondance) +``` + +**Zone DNS déléguée (fichier) :** +`registraire/dns/zones/chezlepro.boreal.ca.zone` + +--- + +#### Services Réservés (Tous les Membres) + +**Ces sous-domaines DOIVENT suivre la convention :** + +| Service | Sous-domaine | Protocole | Port | Obligatoire ? | +|---------|--------------|-----------|------|---------------| +| Email (SMTP) | `mail.[slug].boreal.ca` | SMTP/S | 25, 587 | ✅ Oui | +| Email (IMAP) | `mail.[slug].boreal.ca` | IMAP/S | 143, 993 | ✅ Oui | +| Webmail | `webmail.[slug].boreal.ca` | HTTPS | 443 | ⚠️ Recommandé | +| Stockage cloud | `cloud.[slug].boreal.ca` | HTTPS | 443 | ⚠️ Recommandé | +| Calendrier/Contacts | `dav.[slug].boreal.ca` | HTTPS | 443 | ⚠️ Recommandé | +| Messagerie Matrix | `matrix.[slug].boreal.ca` | HTTPS | 8448 | ⚠️ Recommandé | +| Status page | `status.[slug].boreal.ca` | HTTPS | 443 | ✅ Oui | +| Monitoring (Prometheus) | `prometheus.[slug].boreal.ca` | HTTPS | 443 | ⚠️ Recommandé | +| Monitoring (Grafana) | `grafana.[slug].boreal.ca` | HTTPS | 443 | ⚠️ Recommandé | + +**Flexibilité autorisée :** +Si un membre utilise un service équivalent sous un autre nom (ex: `files` au lieu de `cloud`), c'est acceptable, mais la convention doit être documentée dans la fiche membre. + +--- + +#### Anti-Patterns (À Éviter) + +❌ **Sous-domaines opaques :** +- `srv1.boreal.ca` (quel service ?) +- `app.boreal.ca` (quelle application ?) +- `prod.boreal.ca` (trop vague) + +❌ **Hiérarchie trop profonde :** +- `mail.services.production.chezlepro.boreal.ca` (6 niveaux = trop) + +❌ **Mélange ID et slug :** +- `mail.m001.boreal.ca` (incohérent, choisir ID OU slug) + +--- + +### 1.3 Infrastructure — Serveurs, VMs, Conteneurs + +#### Serveurs Physiques + +**Format :** `srv-[rôle]-[numero].[slug].internal` + +**Exemples :** +``` +srv-compute-01.chezlepro.internal → Serveur de calcul (hyperviseur) +srv-compute-02.chezlepro.internal → Deuxième serveur de calcul +srv-storage-01.chezlepro.internal → Serveur de stockage (NAS/SAN) +srv-network-01.chezlepro.internal → Routeur/firewall +``` + +**Rôles standards :** +- `compute` : Hyperviseur (Proxmox, OpenStack, ESXi) +- `storage` : Stockage (NAS, SAN, Ceph) +- `network` : Infrastructure réseau (routeur, firewall, load balancer) +- `backup` : Serveur de backups dédié +- `monitoring` : Serveur monitoring/logging dédié + +**Numérotation :** +Séquentielle par rôle (compute-01, compute-02, etc.) + +**Domaine `.internal` :** +Réservé à l'infrastructure interne (non exposée publiquement). + +--- + +#### Machines Virtuelles (VMs) + +**Format :** `vm-[service]-[techno]-[numero].[slug].internal` + +**Exemples :** +``` +vm-web-nginx-01.chezlepro.internal → VM web avec Nginx +vm-web-nginx-02.chezlepro.internal → Deuxième VM web (load balancing) +vm-db-postgres-01.chezlepro.internal → Base de données PostgreSQL +vm-db-postgres-02.chezlepro.internal → Réplica PostgreSQL +vm-mail-postfix-01.chezlepro.internal → Serveur mail Postfix/Dovecot +vm-cloud-nextcloud-01.chezlepro.internal → Nextcloud +``` + +**Pattern :** +- `vm-` : Préfixe (identifie type ressource) +- `[service]` : web, db, mail, cloud, matrix, backup, monitoring +- `[techno]` : nginx, apache, postgres, mysql, postfix, nextcloud, etc. +- `[numero]` : Séquentiel (01, 02, 03...) + +**Avantages :** +- On sait immédiatement ce que fait la VM +- On sait quelle techno est utilisée (utile pour troubleshooting) +- On sait s'il y a redondance (02, 03...) + +--- + +#### Conteneurs (Docker, LXC, Kubernetes) + +**Format :** `ct-[service]-[techno]-[numero].[slug].internal` + +**Exemples :** +``` +ct-web-nginx-01.chezlepro.internal → Conteneur web Nginx +ct-api-nodejs-01.chezlepro.internal → API Node.js +ct-cache-redis-01.chezlepro.internal → Cache Redis +ct-queue-rabbitmq-01.chezlepro.internal → File d'attente RabbitMQ +``` + +**Distinction VM vs Conteneur :** +- `vm-` : Machine virtuelle complète (kernel propre) +- `ct-` : Conteneur (partage kernel avec l'hôte) + +**Kubernetes :** +Si utilisation de Kubernetes, convention adaptée : +``` +k8s-[namespace]-[pod]-[replica].[slug].internal +k8s-prod-web-nginx-01.chezlepro.internal +k8s-prod-api-nodejs-01.chezlepro.internal +``` + +--- + +#### DNS Interne (Zone `.internal`) + +**Serveur DNS interne :** +Chaque membre DEVRAIT opérer un DNS interne pour résolution locale (dnsmasq, Bind9, Unbound). + +**Zone recommandée :** `[slug].internal` + +**Exemple de zone pour Chez le Pro :** +``` +chezlepro.internal. SOA ns1.chezlepro.internal. admin.chezlepro.ca. (...) + +; Serveurs physiques +srv-compute-01.chezlepro.internal. A 10.0.1.10 +srv-storage-01.chezlepro.internal. A 10.0.1.20 + +; Machines virtuelles +vm-web-nginx-01.chezlepro.internal. A 10.0.2.10 +vm-db-postgres-01.chezlepro.internal. A 10.0.2.20 + +; Conteneurs +ct-cache-redis-01.chezlepro.internal. A 10.0.3.10 +``` + +**Isolation :** +La zone `.internal` n'est PAS déléguée à la fédération. Elle reste privée au membre. + +--- + +### 1.4 Stockage — Volumes, Backups, Archives + +#### Volumes de Stockage + +**Format LVM :** `vg-[rôle]/lv-[service]-[numero]` + +**Exemples :** +``` +vg-data/lv-postgres-01 → Volume logique pour PostgreSQL +vg-data/lv-nextcloud-01 → Volume logique pour Nextcloud +vg-backup/lv-daily-01 → Volume logique pour backups quotidiens +``` + +**Format ZFS :** `pool-[rôle]/dataset-[service]` + +**Exemples :** +``` +pool-data/vm-web-nginx-01 → Dataset ZFS pour VM web +pool-data/vm-db-postgres-01 → Dataset ZFS pour VM base de données +pool-backup/snapshots → Dataset pour snapshots ZFS +``` + +--- + +#### Backups — Fichiers d'Archive + +**Format :** `backup-[frequence]-[slug]-[service]-[YYYYMMDD]-[HHMMSS].tar.gz.gpg` + +**Exemples :** +``` +backup-daily-chezlepro-postgres-20251023-020000.tar.gz.gpg +backup-weekly-chezlepro-nextcloud-20251020-030000.tar.gz.gpg +backup-monthly-chezlepro-full-20251001-040000.tar.gz.gpg +``` + +**Éléments :** +- `frequence` : daily, weekly, monthly +- `slug` : Identifiant du membre +- `service` : Service sauvegardé (postgres, nextcloud, mail, full) +- `YYYYMMDD` : Date (format ISO 8601, triable) +- `HHMMSS` : Heure (optionnel mais recommandé pour multiples backups/jour) +- `.tar.gz.gpg` : Compression + chiffrement (GPG) + +**Avantages :** +- Tri alphabétique = tri chronologique +- On sait immédiatement : quoi, quand, par qui +- Parsing facile pour scripts de rétention + +--- + +#### Rétention et Rotation + +**Politique recommandée (modèle 3-2-1) :** + +| Fréquence | Rétention | Copies | Localisation | +|-----------|-----------|--------|--------------| +| Quotidien | 7 jours | 2 | Local + Pair | +| Hebdomadaire | 4 semaines | 2 | Local + Pair | +| Mensuel | 12 mois | 3 | Local + Pair + Cloud | + +**Rotation automatisée :** +Script ou outil (restic, borg, rsnapshot) selon préférence du membre. + +**Nommage des destinations :** +``` +/backup/local/daily/ +/backup/local/weekly/ +/backup/local/monthly/ +/backup/remote/pair-m002/ → Backup chez un pair (membre m002) +/backup/remote/offsite/ → Backup hors-site (cloud éthique) +``` + +--- + +### 1.5 Secrets & Credentials + +#### Ansible Vault — Variables Chiffrées + +**Format :** `vault_[slug]_[service]_[credential_type]` + +**Exemples :** +```yaml +vault_chezlepro_db_postgres_password: "!vault |..." +vault_chezlepro_api_matrix_token: "!vault |..." +vault_chezlepro_backup_gpg_passphrase: "!vault |..." +vault_chezlepro_ssl_privkey_password: "!vault |..." +``` + +**Pattern :** +- Préfixe `vault_` (obligatoire, Ansible) +- `[slug]` : Identifiant membre +- `[service]` : Service concerné (db, api, backup, ssl) +- `[credential_type]` : password, token, passphrase, key, secret + +**Fichier de stockage :** +`ansible/inventories/[slug]/group_vars/all/vault.yml` + +**Chiffrement :** +`ansible-vault encrypt vault.yml` + +--- + +#### Secrets Kubernetes (si applicable) + +**Format :** `secret-[namespace]-[service]-[type]` + +**Exemples :** +``` +secret-prod-postgres-credentials +secret-prod-matrix-api-token +secret-staging-nextcloud-admin-password +``` + +**Gestion :** +Sealed Secrets, External Secrets Operator, ou Vault (HashiCorp). + +--- + +#### Certificats SSL/TLS + +**Format :** `cert-[slug]-[type]-[YYYYMMDD].[extension]` + +**Exemples :** +``` +cert-chezlepro-wildcard-20251023.pem → Certificat wildcard +cert-chezlepro-wildcard-20251023.key → Clé privée +cert-chezlepro-mail-20251023.pem → Certificat service mail +cert-chezlepro-matrix-20251023.pem → Certificat service Matrix +``` + +**Types :** +- `wildcard` : Certificat wildcard (`*.chezlepro.boreal.ca`) +- `[service]` : Certificat spécifique à un service (mail, matrix, cloud) + +**Renouvellement :** +Let's Encrypt renouvelle tous les 90 jours. Le timestamp dans le nom aide à tracer les versions. + +**Stockage :** +``` +/etc/ssl/certs/alliance/cert-chezlepro-wildcard-20251023.pem +/etc/ssl/private/alliance/cert-chezlepro-wildcard-20251023.key (chmod 600) +``` + +--- + +### 1.6 Récapitulatif des Conventions + +| Objet | Format | Exemple | +|-------|--------|---------| +| **Membre ID** | `mXXX` | `m001` | +| **Membre Slug** | `[a-z0-9-]{3,20}` | `chezlepro` | +| **Domaine public** | `[service].[slug].boreal.ca` | `mail.chezlepro.boreal.ca` | +| **Domaine interne** | `[type]-[service]-[num].[slug].internal` | `vm-web-nginx-01.chezlepro.internal` | +| **Serveur physique** | `srv-[role]-[num].[slug].internal` | `srv-compute-01.chezlepro.internal` | +| **VM** | `vm-[service]-[tech]-[num].[slug].internal` | `vm-db-postgres-01.chezlepro.internal` | +| **Conteneur** | `ct-[service]-[tech]-[num].[slug].internal` | `ct-cache-redis-01.chezlepro.internal` | +| **Volume LVM** | `vg-[role]/lv-[service]-[num]` | `vg-data/lv-postgres-01` | +| **Backup** | `backup-[freq]-[slug]-[service]-[YYYYMMDD].tar.gz.gpg` | `backup-daily-chezlepro-postgres-20251023.tar.gz.gpg` | +| **Secret Ansible** | `vault_[slug]_[service]_[type]` | `vault_chezlepro_db_password` | +| **Certificat SSL** | `cert-[slug]-[type]-[YYYYMMDD].pem` | `cert-chezlepro-wildcard-20251023.pem` | + +--- + +## SECTION 2 : ARCHITECTURE RÉSEAU FÉDÉRÉE + +### 2.1 Topologie de Référence + +#### Vue d'Ensemble + +``` + ┌─────────────────────────────────────┐ + │ Internet Public │ + └──────────┬──────────────────────────┘ + │ + ┌────────────────────┼────────────────────┐ + │ │ │ + ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ + │ Membre A │ │ Membre B │ │ Membre C │ + │ (m001) │ │ (m002) │ │ (m003) │ + └─────────────┘ └─────────────┘ └─────────────┘ + │ │ │ + │ VPN maillé (optionnel, si besoin) │ + └────────────────────┼────────────────────┘ + │ + ┌──────────▼─────────────┐ + │ DNS Fédéré (AXFR) │ + │ ns1, ns2, ns3 │ + └────────────────────────┘ +``` + +**Principes :** +1. **Autonomie locale** : Chaque membre opère son infrastructure indépendamment +2. **Interconnexion par standards ouverts** : DNS (AXFR), SMTP, Matrix, etc. +3. **VPN optionnel** : Uniquement si besoin (administration mutuelle, backups croisés) +4. **Pas de point central** : Pas de serveur "maître" contrôlant tout + +--- + +### 2.2 Plages IP et Adressage + +#### IP Publiques + +**Recommandation :** Chaque membre conserve ses propres IP publiques (hébergeur, ISP). + +**Pas d'allocation centrale.** L'Alliance ne fournit pas d'IPs publiques. + +**BGP Peering (Optionnel, Avancé) :** +Si plusieurs membres ont des AS (Autonomous Systems), peering BGP possible pour optimiser routes. Non requis pour phase pilote. + +--- + +#### IP Privées (RFC 1918) + +**Recommandation par membre :** + +**Plage recommandée :** `10.[ID].[0-255].[0-255]/16` + +**Exemples :** +- Membre m001 : `10.1.0.0/16` +- Membre m002 : `10.2.0.0/16` +- Membre m003 : `10.3.0.0/16` + +**Découpage suggéré :** +``` +10.1.0.0/24 → Gestion (switches, IPMI, ILO) +10.1.1.0/24 → Serveurs physiques +10.1.2.0/24 → VMs production +10.1.3.0/24 → VMs staging +10.1.4.0/24 → Conteneurs +10.1.10.0/24 → VPN (interconnexion) +10.1.100.0/24 → Réseau invités (si applicable) +``` + +**Avantages :** +- Pas de collision entre membres (ID unique) +- Lisibilité (10.1.x.x = m001, 10.2.x.x = m002) +- Scalabilité (65k IPs par membre) + +--- + +### 2.3 Pare-feu — Ports Standards Ouverts + +#### Ports Obligatoires (Services Publics) + +| Service | Port(s) | Protocole | Commentaire | +|---------|---------|-----------|-------------| +| **HTTP** | 80 | TCP | Redirection vers HTTPS | +| **HTTPS** | 443 | TCP | Tous les services web | +| **SMTP** | 25 | TCP | Réception email (MX) | +| **Submission** | 587 | TCP | Envoi email (STARTTLS) | +| **IMAPS** | 993 | TCP | Lecture email (SSL/TLS) | +| **DNS** | 53 | TCP/UDP | DNS autoritaire public | +| **Matrix Federation** | 8448 | TCP | Fédération Matrix (si applicable) | + +#### Ports Recommandés (Services Optionnels) + +| Service | Port(s) | Protocole | Commentaire | +|---------|---------|-----------|-------------| +| **SSH** | 22 ou custom | TCP | Admin (filtré par IP si possible) | +| **SMTP/S** | 465 | TCP | Envoi email SSL/TLS legacy | +| **POP3S** | 995 | TCP | Si POP3 supporté | +| **CalDAV/WebDAV** | 443 | TCP | Via HTTPS (port standard) | +| **XMPP** | 5222, 5269 | TCP | Si XMPP utilisé | + +#### Ports VPN (Si Interconnexion) + +| VPN | Port(s) | Protocole | Commentaire | +|-----|---------|-----------|-------------| +| **WireGuard** | 51820 (défaut) | UDP | Recommandé (moderne, performant) | +| **OpenVPN** | 1194 (défaut) | UDP/TCP | Alternative | +| **IPsec** | 500, 4500 | UDP | Si besoin (complexe) | + +--- + +### 2.4 VPN Site-à-Site (Optionnel) + +**Cas d'usage :** +- Backups croisés entre membres +- Monitoring mutuel (accès Prometheus/Grafana) +- Administration mutualisée (support technique) + +**Technologie recommandée : WireGuard** + +**Avantages :** +- Simple à configurer +- Performant (kernel-space) +- Sécurisé (cryptographie moderne) +- Multi-plateformes + +**Topologie recommandée : Maillée (Full-Mesh)** + +**Exemple 3 membres :** +``` +m001 ↔ m002 +m001 ↔ m003 +m002 ↔ m003 +``` + +**Configuration WireGuard (Exemple m001 → m002) :** + +**Sur m001 :** +```ini +[Interface] +PrivateKey = +Address = 10.100.1.1/32 +ListenPort = 51820 + +[Peer] +# m002 +PublicKey = +AllowedIPs = 10.100.2.1/32, 10.2.0.0/16 +Endpoint = m002.example.com:51820 +PersistentKeepalive = 25 +``` + +**Sur m002 :** +```ini +[Interface] +PrivateKey = +Address = 10.100.2.1/32 +ListenPort = 51820 + +[Peer] +# m001 +PublicKey = +AllowedIPs = 10.100.1.1/32, 10.1.0.0/16 +Endpoint = m001.example.com:51820 +PersistentKeepalive = 25 +``` + +**Plage VPN : `10.100.0.0/16`** +- m001 : `10.100.1.1/32` +- m002 : `10.100.2.1/32` +- m003 : `10.100.3.1/32` + +**Routes autorisées :** +Chaque membre expose son réseau interne (`10.[ID].0.0/16`) via le VPN. + +--- + +## SECTION 3 : DNS FÉDÉRÉ + +### 3.1 Architecture DNS + +#### Serveurs DNS Autoritaires + +**Minimum requis : 2 serveurs DNS** +Un serveur primaire + un ou plusieurs secondaires (redondance). + +**Recommandation : 3 serveurs répartis chez différents membres** + +**Exemple :** +``` +ns1.boreal.ca → Hébergé chez m001 (Chez le Pro) +ns2.boreal.ca → Hébergé chez m002 (TechnoLibre) +ns3.boreal.ca → Hébergé chez m003 (Coop Nordique) +``` + +**Enregistrements NS (au registrar) :** +``` +boreal.ca. NS ns1.boreal.ca. +boreal.ca. NS ns2.boreal.ca. +boreal.ca. NS ns3.boreal.ca. + +ns1.boreal.ca. A +ns2.boreal.ca. A +ns3.boreal.ca. A +``` + +--- + +#### Zone Parente (boreal.ca) + +**Gestion :** Cercle Opérationnel (rotation des responsabilités). + +**Contenu minimal :** +``` +$ORIGIN boreal.ca. +$TTL 3600 + +@ SOA ns1.boreal.ca. admin.alliance-boreale.ca. ( + 2025102301 ; Serial (YYYYMMDDNN) + 3600 ; Refresh + 1800 ; Retry + 1209600 ; Expire (2 semaines) + 3600 ; Minimum TTL +) + +; Serveurs DNS autoritaires +@ NS ns1.boreal.ca. +@ NS ns2.boreal.ca. +@ NS ns3.boreal.ca. + +ns1 A +ns2 A +ns3 A + +; Outils communs L'Alliance +registraire A +forge A +wiki A +matrix A + +; Délégation zones membres +; (voir Section 3.2) +``` + +--- + +### 3.2 Délégation de Zones aux Membres + +**Principe :** +Chaque membre reçoit une zone DNS déléguée (`[slug].boreal.ca`) qu'il gère de manière autonome. + +**Processus de délégation :** + +1. **Membre configure ses serveurs DNS** + - Serveurs autoritaires pour sa zone (ns1/ns2.[slug].boreal.ca) + - Zone `[slug].boreal.ca` avec enregistrements de services + +2. **Membre communique IPs de ses NS au Cercle Opérationnel** + - ns1.chezlepro.boreal.ca → 203.0.113.10 + - ns2.chezlepro.boreal.ca → 203.0.113.11 + +3. **Cercle Opérationnel ajoute délégation dans zone parente** + +**Exemple de délégation (dans zone boreal.ca) :** +``` +; Membre m001 (Chez le Pro) +chezlepro NS ns1.chezlepro.boreal.ca. +chezlepro NS ns2.chezlepro.boreal.ca. +ns1.chezlepro A 203.0.113.10 +ns2.chezlepro A 203.0.113.11 + +; Membre m002 (TechnoLibre) +technolibre NS ns1.technolibre.boreal.ca. +technolibre NS ns2.technolibre.boreal.ca. +ns1.technolibre A 198.51.100.20 +ns2.technolibre A 198.51.100.21 +``` + +**Résultat :** +Le membre contrôle totalement sa zone. Il peut ajouter/modifier/supprimer enregistrements sans intervention de L'Alliance. + +--- + +### 3.3 Réplication AXFR entre Pairs + +**AXFR = Zone Transfer (RFC 5936)** + +**Objectif :** Permettre la réplication complète d'une zone DNS entre serveurs primaire et secondaires. + +**Configuration (Bind9 exemple) :** + +**Serveur primaire (m001 - ns1.chezlepro.boreal.ca) :** +``` +zone "chezlepro.boreal.ca" { + type master; + file "/etc/bind/zones/chezlepro.boreal.ca.zone"; + allow-transfer { 203.0.113.11; }; // ns2.chezlepro + notify yes; +}; +``` + +**Serveur secondaire (ns2.chezlepro.boreal.ca) :** +``` +zone "chezlepro.boreal.ca" { + type slave; + file "/var/cache/bind/chezlepro.boreal.ca.zone"; + masters { 203.0.113.10; }; // ns1.chezlepro +}; +``` + +**Sécurisation :** +- Restreindre `allow-transfer` aux IPs des secondaires +- Utiliser TSIG (Transaction Signature) pour authentification + +**TSIG (Exemple) :** +``` +key "chezlepro-axfr-key" { + algorithm hmac-sha256; + secret "base64EncodedSecretKey=="; +}; + +zone "chezlepro.boreal.ca" { + type master; + file "/etc/bind/zones/chezlepro.boreal.ca.zone"; + allow-transfer { key chezlepro-axfr-key; }; +}; +``` + +--- + +### 3.4 DNSSEC (Recommandé) + +**DNSSEC = DNS Security Extensions** + +**Objectif :** Authentifier les réponses DNS (prévenir spoofing, cache poisoning). + +**Processus :** + +1. **Génération de clés (ZSK + KSK)** + ```bash + dnssec-keygen -a RSASHA256 -b 2048 -n ZONE chezlepro.boreal.ca # ZSK + dnssec-keygen -a RSASHA256 -b 4096 -n ZONE -f KSK chezlepro.boreal.ca # KSK + ``` + +2. **Signature de la zone** + ```bash + dnssec-signzone -o chezlepro.boreal.ca chezlepro.boreal.ca.zone + ``` + +3. **Publication DS record chez parent (boreal.ca)** + ``` + chezlepro DS 12345 8 2 + ``` + +4. **Automatisation du renouvellement** + - Les clés DNSSEC expirent (30-90 jours typiquement) + - Script cron pour re-signer automatiquement + +**Complexité :** +DNSSEC ajoute de la complexité opérationnelle. Recommandé pour niveau label Or/Platine, optionnel pour Bronze/Argent. + +--- + +### 3.5 Monitoring DNS + +**Vérifications essentielles :** + +1. **Résolution publique** + ```bash + dig @8.8.8.8 mail.chezlepro.boreal.ca + dig @1.1.1.1 chezlepro.boreal.ca NS + ``` + +2. **Réplication AXFR** + ```bash + dig @ns2.chezlepro.boreal.ca chezlepro.boreal.ca AXFR + ``` + +3. **DNSSEC (si activé)** + ```bash + dig +dnssec chezlepro.boreal.ca + ``` + +4. **Santé des NS** + ```bash + dig +trace chezlepro.boreal.ca + ``` + +**Outils recommandés :** +- DNSViz (visualisation DNSSEC) +- Zonemaster (analyse qualité DNS) +- Nagios/Icinga checks DNS + +--- + +## SECTION 4 : STANDARDS DE STOCKAGE + +### 4.1 Systèmes de Fichiers Recommandés + +**Pour VMs et conteneurs :** + +| Use Case | Recommandation | Rationale | +|----------|----------------|-----------| +| **VM disks** | LVM + ext4 | Simplicité, maturité | +| **VM disks (avancé)** | ZFS | Snapshots, compression, checksums | +| **Conteneurs** | Overlay2 (Docker) | Standard Docker | +| **NAS/SAN** | ZFS ou Ceph | Résilience, scalabilité | +| **Backups** | Ext4 ou XFS | Performance séquentielle | + +**ZFS avantages :** +- Snapshots instantanés +- Compression (LZ4, ZSTD) +- Checksums (détection corruption) +- Réplication (zfs send/recv) + +**ZFS inconvénients :** +- Consommation RAM (1 GB RAM / 1 TB stockage recommandé) +- Complexité configuration + +**LVM avantages :** +- Simple +- Flexible (resize volumes) +- Standard Linux + +--- + +### 4.2 Chiffrement au Repos + +**Obligatoire pour :** +- Backups (GPG, borg, restic) +- Bases de données contenant données personnelles +- Volumes contenant secrets (clés, tokens) + +**Technologies recommandées :** + +| Couche | Technologie | Usage | +|--------|-------------|-------| +| **Disque complet** | LUKS (dm-crypt) | Chiffrement bloc entier | +| **Système de fichiers** | eCryptfs, ZFS native encryption | Chiffrement par fichier/dataset | +| **Application** | GPG, age, borg, restic | Chiffrement archives | + +**Exemple LUKS :** +```bash +cryptsetup luksFormat /dev/sdb1 +cryptsetup open /dev/sdb1 cryptvol +mkfs.ext4 /dev/mapper/cryptvol +``` + +**Gestion des clés :** +- Clés stockées dans Ansible Vault (chiffrées) +- Ou TPM 2.0 (Trusted Platform Module) si disponible +- Ou HSM (Hardware Security Module) pour haute sécurité + +--- + +### 4.3 Backups — Stratégie 3-2-1 + +**Règle 3-2-1 :** +- **3** copies des données (originale + 2 backups) +- **2** supports différents (ex: disque local + NAS distant) +- **1** copie hors-site (géographiquement séparée) + +**Application dans L'Alliance :** + +| Copie | Localisation | Technologie | Fréquence | +|-------|--------------|-------------|-----------| +| **1. Production** | Serveur local | VM/conteneur | Temps réel | +| **2. Backup local** | NAS local ou autre serveur | rsync, borg, restic | Quotidien | +| **3. Backup pair** | Chez un autre membre (VPN) | rsync, borg + chiffrement | Quotidien | +| **4. Backup offsite** | Cloud éthique (ex: Wasabi, Backblaze B2) | rclone, restic | Hebdomadaire | + +**Outils recommandés :** + +**Borg Backup :** +- Déduplication (économie espace) +- Compression (LZ4, ZSTD) +- Chiffrement (AES-256) +- Snapshots incrémentaux + +**Restic :** +- Similaire à Borg +- Multi-backend (local, SFTP, S3, B2, etc.) +- Vérification d'intégrité intégrée + +**Exemple Borg :** +```bash +# Initialisation repo +borg init --encryption=repokey /backup/local/borg + +# Backup quotidien +borg create /backup/local/borg::daily-{now} /data \ + --compression lz4 \ + --exclude /data/cache + +# Pruning (rétention) +borg prune /backup/local/borg \ + --keep-daily=7 \ + --keep-weekly=4 \ + --keep-monthly=12 +``` + +--- + +### 4.4 Tests de Restauration (Obligatoire) + +**Règle d'or :** Un backup non testé est un backup inexistant. + +**Fréquence minimale :** Trimestrielle (tous les 3 mois). + +**Procédure :** +1. Sélectionner un backup aléatoire (ex: backup mensuel du mois dernier) +2. Restaurer dans environnement isolé (VM de test) +3. Vérifier intégrité (checksums, démarrage services) +4. Documenter résultat (runbook ou wiki) + +**Critères de succès :** +- Restauration complète en < [RTO] (ex: 4h) +- Données intègres (aucune corruption) +- Services redémarrables + +**Documentation obligatoire :** +`wiki/runbooks/test-restauration-YYYY-MM-DD.md` + +--- + +## SECTION 5 : ORCHESTRATION (IaC) + +### 5.1 Ansible — Structure Recommandée + +**Ansible = Infrastructure as Code pour L'Alliance** + +**Philosophie :** +- Déclaratif (décrire l'état désiré, pas les étapes) +- Idempotent (exécuter N fois = même résultat) +- Agentless (SSH uniquement, pas d'agent installé) + +--- + +#### Structure de Répertoire Standard + +``` +ansible/ +├── inventories/ +│ ├── production/ +│ │ ├── hosts.yml # Inventaire membres prod +│ │ └── group_vars/ +│ │ ├── all/ +│ │ │ ├── vars.yml # Variables publiques +│ │ │ └── vault.yml # Variables chiffrées (Vault) +│ │ └── membres/ +│ │ ├── m001.yml # Variables spécifiques m001 +│ │ └── m002.yml +│ └── staging/ +│ └── hosts.yml # Inventaire staging (si applicable) +│ +├── playbooks/ +│ ├── site.yml # Playbook principal +│ ├── dns-setup.yml # Setup DNS +│ ├── monitoring-setup.yml # Setup monitoring +│ └── backup-setup.yml # Setup backups +│ +├── roles/ +│ ├── common/ # Rôle commun (tous serveurs) +│ │ ├── tasks/ +│ │ ├── handlers/ +│ │ ├── templates/ +│ │ └── vars/ +│ ├── dns-server/ # Rôle serveur DNS +│ ├── mail-server/ # Rôle serveur mail +│ └── web-server/ # Rôle serveur web +│ +├── group_vars/ # Variables par groupe +│ └── all.yml # Variables globales +│ +├── host_vars/ # Variables par hôte +│ └── ns1.chezlepro.boreal.ca.yml +│ +└── ansible.cfg # Configuration Ansible +``` + +--- + +#### Inventaire (Exemple) + +**Fichier : `inventories/production/hosts.yml`** + +```yaml +all: + children: + alliance_members: + children: + membre_m001: + hosts: + srv-compute-01.chezlepro.internal: + ansible_host: 203.0.113.10 + vm-web-nginx-01.chezlepro.internal: + ansible_host: 10.1.2.10 + + membre_m002: + hosts: + srv-compute-01.technolibre.internal: + ansible_host: 198.51.100.20 + + dns_servers: + hosts: + ns1.boreal.ca: + ansible_host: 203.0.113.10 + member_id: m001 + ns2.boreal.ca: + ansible_host: 198.51.100.20 + member_id: m002 + + mail_servers: + hosts: + mail.chezlepro.boreal.ca: + ansible_host: 10.1.2.20 + mail.technolibre.boreal.ca: + ansible_host: 10.2.2.20 +``` + +--- + +#### Variables (Exemple) + +**Fichier : `group_vars/all/vars.yml`** + +```yaml +# Variables publiques (non sensibles) + +alliance_domain: "boreal.ca" +alliance_ns_servers: + - ns1.boreal.ca + - ns2.boreal.ca + - ns3.boreal.ca + +# Paramètres DNS +dns_ttl_default: 3600 +dns_refresh: 3600 +dns_retry: 1800 +dns_expire: 1209600 + +# Paramètres backup +backup_retention_daily: 7 +backup_retention_weekly: 4 +backup_retention_monthly: 12 + +# Paramètres monitoring +prometheus_scrape_interval: 30s +prometheus_retention: 30d +``` + +**Fichier : `group_vars/all/vault.yml` (chiffré)** + +```yaml +# Variables sensibles (Ansible Vault) + +vault_alliance_dns_tsig_key: "base64SecretKey==" +vault_alliance_backup_gpg_passphrase: "SuperSecretPassphrase123" +vault_prometheus_admin_password: "AnotherSecretPass456" +``` + +**Chiffrement :** +```bash +ansible-vault encrypt group_vars/all/vault.yml +``` + +--- + +#### Playbook (Exemple) + +**Fichier : `playbooks/dns-setup.yml`** + +```yaml +--- +- name: Setup DNS Servers + hosts: dns_servers + become: yes + + roles: + - common + - dns-server + + tasks: + - name: Configure Bind9 zones + template: + src: "templates/bind/{{ item }}.zone.j2" + dest: "/etc/bind/zones/{{ item }}.zone" + owner: bind + group: bind + mode: '0644' + loop: + - boreal.ca + - "{{ member_slug }}.boreal.ca" + notify: reload bind9 + + - name: Enable DNSSEC + command: dnssec-signzone -o {{ item }} /etc/bind/zones/{{ item }}.zone + loop: + - boreal.ca + - "{{ member_slug }}.boreal.ca" + when: dnssec_enabled | default(false) + + handlers: + - name: reload bind9 + service: + name: bind9 + state: reloaded +``` + +--- + +### 5.2 Secrets Management + +**Options recommandées :** + +1. **Ansible Vault** (simple, intégré) +2. **HashiCorp Vault** (avancé, dynamique) +3. **SOPS (Mozilla)** (Git-friendly) + +**Ansible Vault (recommandé pour débuter) :** + +```bash +# Créer fichier chiffré +ansible-vault create secrets.yml + +# Éditer fichier chiffré +ansible-vault edit secrets.yml + +# Utiliser dans playbook +ansible-playbook site.yml --ask-vault-pass +# ou avec fichier de mot de passe +ansible-playbook site.yml --vault-password-file ~/.vault_pass +``` + +**HashiCorp Vault (pour production avancée) :** + +**Avantages :** +- Secrets dynamiques (génération à la demande) +- Rotation automatique +- Audit trail complet +- APIs RESTful + +**Intégration Ansible :** +```yaml +- name: Read database password from Vault + set_fact: + db_password: "{{ lookup('hashi_vault', 'secret=secret/data/postgres:password') }}" +``` + +--- + +### 5.3 CI/CD pour Infrastructure + +**GitOps pour IaC :** +Tout changement d'infrastructure passe par Git → Review → Déploiement automatisé. + +**Workflow recommandé (GitLab CI ou GitHub Actions) :** + +```yaml +# .gitlab-ci.yml (exemple) + +stages: + - validate + - test + - deploy + +ansible-lint: + stage: validate + script: + - ansible-lint playbooks/*.yml + +ansible-syntax: + stage: validate + script: + - ansible-playbook playbooks/site.yml --syntax-check + +ansible-test-staging: + stage: test + script: + - ansible-playbook -i inventories/staging playbooks/site.yml --check + only: + - merge_requests + +ansible-deploy-production: + stage: deploy + script: + - ansible-playbook -i inventories/production playbooks/site.yml + only: + - main + when: manual +``` + +**Protection :** +- Déploiement production = manuel (éviter accidents) +- Review obligatoire (2 pairs minimum) +- Tests automatisés (lint, syntax, dry-run) + +--- + +## SECTION 6 : CERTIFICATS SSL/TLS + +### 6.1 Let's Encrypt (Recommandé) + +**Let's Encrypt = CA gratuite, automatisée, ouverte** + +**Avantages :** +- Gratuit +- Automatisé (renouvellement tous les 90 jours) +- Reconnu universellement (trust stores) +- Support wildcards + +**Client recommandé : Certbot** + +```bash +# Installation (Debian/Ubuntu) +apt install certbot python3-certbot-nginx + +# Obtenir certificat (HTTP-01 challenge) +certbot --nginx -d mail.chezlepro.boreal.ca + +# Obtenir wildcard (DNS-01 challenge) +certbot certonly --dns-cloudflare \ + --dns-cloudflare-credentials ~/.secrets/cloudflare.ini \ + -d '*.chezlepro.boreal.ca' +``` + +**Renouvellement automatique :** +```bash +# Cron (vérifie quotidiennement, renouvelle si < 30 jours) +0 3 * * * certbot renew --quiet +``` + +--- + +### 6.2 Certificat Wildcard vs Spécifique + +**Wildcard (`*.chezlepro.boreal.ca`) :** + +**Avantages :** +- Un seul certificat pour tous les sous-domaines +- Simplifie gestion + +**Inconvénients :** +- Nécessite DNS-01 challenge (accès API DNS) +- Si compromis, tous les sous-domaines affectés + +**Certificats spécifiques (`mail.chezlepro.boreal.ca`) :** + +**Avantages :** +- HTTP-01 challenge (plus simple) +- Isolation (compromission limitée) + +**Inconvénients :** +- Plusieurs certificats à gérer + +**Recommandation :** +Wildcard pour simplifier, SAUF si services très sensibles (séparer). + +--- + +### 6.3 Chaîne de Confiance et Formats + +**Formats de certificats :** + +| Format | Extension | Usage | +|--------|-----------|-------| +| **PEM** | .pem, .crt, .cer | Standard (texte base64) | +| **DER** | .der | Binaire (rare) | +| **PKCS#12** | .p12, .pfx | Bundle (cert + clé, Windows) | + +**Fichiers Let's Encrypt (après certbot) :** +``` +/etc/letsencrypt/live/mail.chezlepro.boreal.ca/ +├── fullchain.pem → Certificat + chaîne complète (à utiliser) +├── cert.pem → Certificat seul +├── chain.pem → Chaîne intermédiaire +└── privkey.pem → Clé privée (chmod 600 !) +``` + +**Configuration Nginx :** +```nginx +server { + listen 443 ssl http2; + server_name mail.chezlepro.boreal.ca; + + ssl_certificate /etc/letsencrypt/live/mail.chezlepro.boreal.ca/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/mail.chezlepro.boreal.ca/privkey.pem; + + # Protocoles et ciphers sécurisés + ssl_protocols TLSv1.3 TLSv1.2; + ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...'; + ssl_prefer_server_ciphers off; + + # HSTS + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; +} +``` + +--- + +### 6.4 Monitoring Expiration + +**Outils recommandés :** + +**1. SSL Labs (manuel)** +``` +https://www.ssllabs.com/ssltest/analyze.html?d=mail.chezlepro.boreal.ca +``` + +**2. Nagios/Icinga check** +```bash +/usr/lib/nagios/plugins/check_http -H mail.chezlepro.boreal.ca -S -C 30 +# Alerte si expiration < 30 jours +``` + +**3. Prometheus + Blackbox Exporter** +```yaml +- job_name: 'ssl-expiry' + metrics_path: /probe + params: + module: [http_2xx] + static_configs: + - targets: + - https://mail.chezlepro.boreal.ca + relabel_configs: + - source_labels: [__address__] + target_label: __param_target + - target_label: instance + replacement: blackbox-exporter:9115 +``` + +**Alerte Prometheus :** +```yaml +- alert: SSLCertExpiringSoon + expr: probe_ssl_earliest_cert_expiry - time() < 30 * 24 * 3600 + annotations: + summary: "SSL certificate expiring soon for {{ $labels.instance }}" +``` + +--- + +## SECTION 7 : MONITORING ET OBSERVABILITÉ + +### 7.1 Stack Recommandée + +**Prometheus + Grafana + Loki + Alertmanager** + +| Composant | Rôle | Port | Stockage | +|-----------|------|------|----------| +| **Prometheus** | Métriques (time-series) | 9090 | Local ou remote (Thanos) | +| **Grafana** | Visualisation | 3000 | PostgreSQL ou SQLite | +| **Loki** | Logs (agrégation) | 3100 | S3 ou local | +| **Alertmanager** | Alertes (routing) | 9093 | Volatile (config) | +| **Node Exporter** | Métriques serveur | 9100 | N/A (agent) | +| **Blackbox Exporter** | Probes externes | 9115 | N/A (agent) | + +--- + +### 7.2 Métriques à Exporter (Obligatoire Label) + +**Pour conformité Label (Domaine 1 + 5) :** + +**1. Disponibilité des services** +``` +up{job="web-server", instance="vm-web-nginx-01"} +``` + +**2. Latence HTTP** +``` +http_request_duration_seconds{handler="/", method="GET"} +``` + +**3. Utilisation ressources** +``` +node_cpu_seconds_total +node_memory_MemAvailable_bytes +node_disk_io_time_seconds_total +``` + +**4. État backups** +``` +backup_last_success_timestamp_seconds +backup_size_bytes +``` + +**5. Certificats SSL** +``` +probe_ssl_earliest_cert_expiry +``` + +**Configuration Prometheus (scrape) :** +```yaml +scrape_configs: + - job_name: 'node-exporter' + static_configs: + - targets: + - srv-compute-01.chezlepro.internal:9100 + - vm-web-nginx-01.chezlepro.internal:9100 + relabel_configs: + - source_labels: [__address__] + target_label: member + replacement: chezlepro +``` + +--- + +### 7.3 Dashboard Partagé (Optionnel) + +**Concept :** +Dashboard Grafana centralisé montrant métriques agrégées de tous les membres (avec consentement). + +**Métriques partagées (anonymisées si sensible) :** +- Disponibilité globale (%) +- Incidents P0/P1 (nombre, durée) +- Consommation énergétique agrégée (kWh) + +**Accès :** +- Membres actifs : lecture complète +- Public : tableau de bord synthétique (stats globales) + +**URL :** `grafana.boreal.ca/d/alliance-overview` + +**Implémentation :** +Prometheus Federation ou Thanos (query multi-tenancy). + +--- + +## SECTION 8 : CONFORMITÉ ET AUDITS + +### 8.1 Checklist Infrastructure (Label Domaine 1) + +**Avant demande de labellisation, vérifier :** + +- [ ] DNS configuré (ns1, ns2 minimum) +- [ ] AXFR fonctionnel entre ns1 et ns2 +- [ ] DNSSEC activé (recommandé pour Or/Platine) +- [ ] Certificats SSL/TLS valides (grade A SSL Labs) +- [ ] Backups automatisés quotidiens +- [ ] Test de restauration réalisé (< 6 mois) +- [ ] Monitoring actif (Prometheus + Node Exporter) +- [ ] Alerting configuré (Alertmanager ou équivalent) +- [ ] Status page publique (Upptime, Cachet, ou custom) +- [ ] Documentation architecture à jour (wiki) +- [ ] Runbooks pour procédures critiques (≥ 3) + +--- + +### 8.2 Preuves Techniques à Fournir + +**Lors de l'audit (voir Document 3) :** + +**DNS :** +- Capture `dig` résolution publique +- Capture `dig AXFR` réplication +- DNSViz report (si DNSSEC) + +**SSL/TLS :** +- Scan SSL Labs (grade A- minimum) +- Liste certificats avec dates expiration + +**Backups :** +- Logs de backups (derniers 30 jours) +- Rapport test restauration (avec capture écran) + +**Monitoring :** +- Capture Grafana dashboard disponibilité +- Métriques Prometheus (query échantillon) +- Logs Alertmanager (alertes déclenchées) + +**Infrastructure :** +- Inventaire serveurs/VMs/conteneurs (CSV ou YAML) +- Diagramme architecture (Diagrams.net, Draw.io) +- Configuration IaC (playbooks Ansible, extraits) + +--- + +## CONCLUSION + +**Ce document pose les fondations techniques de la fédération.** + +**Sans conventions partagées, pas d'interopérabilité.** +**Sans standards, pas de résilience.** +**Sans nomenclature mnémotechnique, pas de transmissibilité.** + +**Ces règles ne sont pas des carcans.** Elles sont des chemins tracés dans la forêt pour faciliter la coopération. Chaque membre reste souverain sur son infrastructure, mais nous parlons le même langage. + +**Les conventions évoluent.** Si une règle pose problème, proposez un amendement (pull request sur Registraire). Si un pattern fonctionne mieux, partagez-le (wiki). + +**L'objectif n'est pas la perfection immédiate, c'est la cohérence progressive.** + +**Bienvenue dans l'architecture boréale.** 🌲 + +--- + +## ANNEXES + +### Annexe A : Templates de Fichiers + +#### A.1 Zone DNS (Bind9) + +**Fichier : `/etc/bind/zones/chezlepro.boreal.ca.zone`** + +``` +$ORIGIN chezlepro.boreal.ca. +$TTL 3600 + +@ SOA ns1.chezlepro.boreal.ca. admin.chezlepro.ca. ( + 2025102301 ; Serial + 3600 ; Refresh + 1800 ; Retry + 1209600 ; Expire + 3600 ; Minimum TTL +) + +; Serveurs DNS +@ NS ns1.chezlepro.boreal.ca. +@ NS ns2.chezlepro.boreal.ca. + +ns1 A 203.0.113.10 +ns2 A 203.0.113.11 + +; Services publics +mail A 203.0.113.20 +webmail A 203.0.113.20 +cloud A 203.0.113.30 +matrix A 203.0.113.40 +status A 203.0.113.50 +www A 203.0.113.60 + +; MX records +@ MX 10 mail.chezlepro.boreal.ca. + +; SPF, DKIM, DMARC +@ TXT "v=spf1 mx -all" +_dmarc TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@chezlepro.ca" +default._domainkey TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA..." +``` + +--- + +#### A.2 Configuration Ansible (ansible.cfg) + +```ini +[defaults] +inventory = inventories/production/hosts.yml +roles_path = roles +host_key_checking = False +retry_files_enabled = False +gathering = smart +fact_caching = jsonfile +fact_caching_connection = /tmp/ansible_facts +fact_caching_timeout = 86400 + +[privilege_escalation] +become = True +become_method = sudo +become_user = root +become_ask_pass = False + +[ssh_connection] +pipelining = True +control_path = /tmp/ansible-ssh-%%h-%%p-%%r +``` + +--- + +#### A.3 Playbook Backup (backup-daily.yml) + +```yaml +--- +- name: Daily Backup + hosts: all + become: yes + + vars: + backup_date: "{{ ansible_date_time.iso8601_basic_short }}" + backup_base: "/backup/local/daily" + backup_gpg_key: "{{ vault_backup_gpg_key }}" + + tasks: + - name: Create backup directory + file: + path: "{{ backup_base }}" + state: directory + mode: '0700' + + - name: Backup PostgreSQL databases + shell: | + pg_dumpall | gzip | gpg --encrypt --recipient {{ backup_gpg_key }} \ + > {{ backup_base }}/backup-daily-{{ inventory_hostname_short }}-postgres-{{ backup_date }}.sql.gz.gpg + when: "'db_servers' in group_names" + + - name: Backup /etc configuration + archive: + path: /etc + dest: "{{ backup_base }}/backup-daily-{{ inventory_hostname_short }}-etc-{{ backup_date }}.tar.gz" + format: gz + + - name: Encrypt /etc backup + shell: | + gpg --encrypt --recipient {{ backup_gpg_key }} \ + {{ backup_base }}/backup-daily-{{ inventory_hostname_short }}-etc-{{ backup_date }}.tar.gz + rm {{ backup_base }}/backup-daily-{{ inventory_hostname_short }}-etc-{{ backup_date }}.tar.gz + + - name: Prune old backups (keep 7 days) + shell: | + find {{ backup_base }} -type f -mtime +7 -delete +``` + +--- + +### Annexe B : Scripts Utilitaires + +#### B.1 Vérification DNS Fédéré + +**Fichier : `scripts/check-dns-federation.sh`** + +```bash +#!/bin/bash +# Vérification santé DNS fédéré + +DOMAIN="boreal.ca" +MEMBERS=("chezlepro" "technolibre" "coop-nordique") + +echo "=== Vérification DNS Fédération Alliance Boréale ===" +echo "" + +# Test résolution NS racine +echo "1. Serveurs NS racine ${DOMAIN}:" +dig +short ${DOMAIN} NS +echo "" + +# Test délégation membres +for member in "${MEMBERS[@]}"; do + echo "2. Délégation ${member}.${DOMAIN}:" + dig +short ${member}.${DOMAIN} NS + echo "" + + echo "3. Services ${member}.${DOMAIN}:" + dig +short mail.${member}.${DOMAIN} A + dig +short cloud.${member}.${DOMAIN} A + echo "" +done + +# Test AXFR (si autorisé) +echo "4. Test AXFR (depuis ns1):" +dig @ns1.${DOMAIN} ${DOMAIN} AXFR +short | head -10 +echo "" + +echo "=== Fin vérification ===" +``` + +--- + +#### B.2 Génération Certificat Let's Encrypt + +**Fichier : `scripts/certbot-wildcard.sh`** + +```bash +#!/bin/bash +# Obtenir certificat wildcard Let's Encrypt avec Cloudflare DNS + +DOMAIN="$1" +EMAIL="admin@${DOMAIN}" +CLOUDFLARE_CREDS="/root/.secrets/cloudflare.ini" + +if [ -z "$DOMAIN" ]; then + echo "Usage: $0 " + echo "Exemple: $0 chezlepro.boreal.ca" + exit 1 +fi + +certbot certonly \ + --dns-cloudflare \ + --dns-cloudflare-credentials ${CLOUDFLARE_CREDS} \ + --email ${EMAIL} \ + --agree-tos \ + --non-interactive \ + -d "*.${DOMAIN}" \ + -d "${DOMAIN}" + +echo "Certificat généré dans /etc/letsencrypt/live/${DOMAIN}/" +``` + +--- + +### Annexe C : Checklist Démarrage Membre + +**Pour nouveau membre rejoignant la fédération :** + +#### Phase 1 : Préparation (Semaines 1-2) + +- [ ] Choisir slug (unique, vérifier disponibilité) +- [ ] Obtenir domaine public propre (optionnel mais recommandé) +- [ ] Configurer infrastructure de base (1+ serveur) +- [ ] Installer OS (Debian/Ubuntu/autre Linux) +- [ ] Configurer réseau interne (10.[ID].0.0/16) + +#### Phase 2 : DNS et Connectivité (Semaine 3) + +- [ ] Installer serveur DNS (Bind9, PowerDNS) +- [ ] Configurer zone `[slug].boreal.ca` +- [ ] Demander délégation au Cercle Opérationnel +- [ ] Tester résolution publique +- [ ] Configurer AXFR avec 1+ pair +- [ ] Configurer firewall (ports standards ouverts) + +#### Phase 3 : Services de Base (Semaines 4-6) + +- [ ] Déployer serveur email (Postfix, Dovecot) +- [ ] Configurer DKIM, SPF, DMARC +- [ ] Obtenir certificats SSL/TLS (Let's Encrypt) +- [ ] Déployer services optionnels (Nextcloud, Matrix) +- [ ] Configurer backups quotidiens +- [ ] Tester restauration + +#### Phase 4 : Monitoring et Documentation (Semaines 7-8) + +- [ ] Installer Prometheus + Node Exporter +- [ ] Configurer Grafana +- [ ] Créer status page publique +- [ ] Documenter architecture (wiki) +- [ ] Rédiger runbooks (≥ 3 procédures) + +#### Phase 5 : Intégration (Semaines 9-12) + +- [ ] Participer à audits pair-à-pair +- [ ] Contribuer à documentation commune +- [ ] Établir VPN avec 1+ pair (si besoin backups croisés) +- [ ] Demander labellisation (Bronze minimum) + +**Durée totale estimée : 3 mois (phase probatoire)** + +--- + +## MÉTADONNÉES + +**Document :** 05_Architecture_Reference_Standards_Techniques.md +**Version :** 1.0 +**Date de création :** 23 octobre 2025 +**Auteur :** Claude (profils #3 Infrastructure, #4 Réseau, #5 IaC, #12 Documentaliste) +**Révision par :** Cercle Opérationnel +**Statut :** À adopter par Cercle Stratégique +**Longueur :** ~15 000 mots (30 pages équivalent) +**Licence :** CC BY-SA 4.0 + +**Sources utilisées :** +- `00_Glossaire_et_Definitions.md` +- `01_Charte_Fondatrice_v2_1.md` +- `02_Reglement_de_Regie_Interne.md` +- `03_Cadre_Conformite_Label_Prestige.md` +- `devis_alliance_boreale_v2.md` + +**Prochaine révision prévue :** Octobre 2026 (après 1 an d'usage terrain) + +--- + +**Changelog :** +- 2025-10-23 v1.0 : Création initiale Architecture & Standards Techniques + +--- + +**FIN DE L'ARCHITECTURE DE RÉFÉRENCE** + +*"Un nom bien choisi vaut mieux qu'une longue documentation."* + +🌲 **L'Alliance Boréale** +*Standards mnémotechniques pour une fédération durable.* diff --git a/docs/constitution/08_Processus_Onboarding_Membres.md b/docs/constitution/08_Processus_Onboarding_Membres.md new file mode 100644 index 0000000..618288a --- /dev/null +++ b/docs/constitution/08_Processus_Onboarding_Membres.md @@ -0,0 +1,1377 @@ +# Document 8 : Processus d'Onboarding des Membres +## L'Alliance Boréale — Intégration et Accompagnement + +**Version:** 1.0 +**Date:** 23 octobre 2025 +**Statut:** Document opérationnel +**Adopté par :** Cercle Stratégique +**Licence:** CC BY-SA 4.0 + +--- + +## PRÉAMBULE + +**L'onboarding est l'investissement le plus important de L'Alliance.** + +Un membre mal intégré devient : +- ❌ Un membre fantôme (inactif, déconnecté) +- ❌ Une source de frustration (incompréhensions, incidents) +- ❌ Un échec collectif (démission durant probation) + +Un membre bien intégré devient : +- ✅ Un contributeur actif et engagé +- ✅ Un ambassadeur des valeurs +- ✅ Un futur parrain pour les suivants + +**L'onboarding n'est pas une formalité administrative. C'est un rite de passage.** + +Durant **3 mois de probation**, le nouveau membre apprend : +- Les **valeurs** (sobriété, solidarité, autonomie) +- Les **outils** (Matrix, DNS, Ansible, Label) +- Les **processus** (gouvernance, incidents, audits) +- La **culture** (lenteur assumée, transparence, transmission) + +**Le parrain est la clé du succès.** +Chaque nouveau membre est accompagné par un parrain (membre actif expérimenté) qui guide, soutient, et évalue. + +**Ce document structure cet accompagnement.** + +--- + +## SECTION 1 : VUE D'ENSEMBLE + +### 1.1 Durée et Statut + +**Phase probatoire : 3 mois (12 semaines)** + +**Statut durant probation :** +- `status: probation` dans Registraire +- Droits limités (lecture outils communs, pas de vote) +- Cotisation suspendue (paiement après confirmation statut actif) + +**Issue possible :** +- ✅ **Confirmation statut actif** (objectifs atteints) +- ⚠️ **Prolongation probation** (3 mois supplémentaires, max 1 fois) +- ❌ **Refus** (objectifs non atteints, inactivité persistante) + +--- + +### 1.2 Les 5 Objectifs Fondamentaux + +Durant la probation, le nouveau membre doit **démontrer** : + +#### Objectif 1 : Interopérabilité Technique ⚙️ + +**Déployer les services minimaux de la fédération :** +- ✅ DNS configuré (ns1, ns2 avec AXFR) +- ✅ Services de base opérationnels (email avec DKIM/SPF/DMARC) +- ✅ Certificats SSL/TLS valides (Let's Encrypt) +- ✅ Monitoring actif (Prometheus + Node Exporter) + +**Preuve :** Tests de connectivité réussis, métriques visibles. + +--- + +#### Objectif 2 : Disponibilité & Résilience 📊 + +**Atteindre et maintenir ≥ 99% de disponibilité :** +- Measurement via monitoring partagé +- Downtime planifié annoncé 48h à l'avance (non compté) +- Incident P0/P1 toléré SI post-mortem réalisé + +**Preuve :** Métriques Prometheus sur 12 semaines. + +--- + +#### Objectif 3 : Participation Active 💬 + +**S'engager dans la communauté :** +- ✅ Présence sur Matrix (réponse < 48h aux mentions) +- ✅ Participation à ≥ 1 réunion Cercle Stratégique +- ✅ Contribution à documentation (≥ 1 amélioration wiki/runbook) + +**Preuve :** Logs Matrix, présence réunions, commits wiki. + +--- + +#### Objectif 4 : Contribution Technique 🛠️ + +**Contribuer à au moins 1 outil commun :** +- Amélioration Registraire (validation, CI/CD) +- Playbook Ansible (nouveau rôle, amélioration existant) +- Documentation technique (runbook, guide) +- Audit pair-à-pair (comme auditeur OU audité) + +**Preuve :** Pull Request merged ou audit réalisé. + +--- + +#### Objectif 5 : Alignement Valeurs 🌲 + +**Démontrer compréhension et respect des 5 valeurs :** +- Souveraineté (contrôle infra, pas de dépendance GAFAM critique) +- Liberté (standards ouverts, pas de lock-in) +- Sobriété (mesure consommation, démarche réduction) +- Solidarité (offrir support, demander support) +- Transparence (partager incidents, accepter audits) + +**Preuve :** Comportements observés, décisions prises, réactions aux incidents. + +--- + +### 1.3 Timeline Typique + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ PHASE PROBATOIRE (12 semaines) │ +└─────────────────────────────────────────────────────────────────┘ + +Semaines 1-2 │ 🚀 Démarrage + │ - Kick-off avec parrain + │ - Accès outils (Matrix readonly, wiki) + │ - Lecture documents fondateurs + │ - Planification infrastructure + +Semaines 3-6 │ ⚙️ Déploiement Technique + │ - Configuration DNS + │ - Déploiement services (email, monitoring) + │ - Tests connectivité + │ - Premier contact pairs (support technique) + +Semaines 7-10 │ 💬 Participation & Contribution + │ - Participation réunion Cercle Stratégique + │ - Contribution documentation ou code + │ - Début audits croisés (familiarisation) + │ - Offrir support technique (répondre #support) + +Semaines 11-12 │ 📋 Évaluation Finale + │ - Auto-évaluation (template fourni) + │ - Rapport parrain + │ - Décision Cercle Stratégique + │ - Si OK → Statut actif + cotisation +``` + +--- + +## SECTION 2 : RÔLE DU PARRAIN + +### 2.1 Désignation du Parrain + +**Qui peut être parrain ?** +- Membre actif depuis ≥ 6 mois +- Label Argent minimum (maturité opérationnelle) +- Disponible (≥ 4h/mois pour accompagnement) +- Volontaire (pas d'obligation) + +**Comment trouver un parrain ?** + +**Phase post-fondatrice (2026+) :** +1. Candidat cherche parrain via Matrix #general (se présente) +2. Membre actif se porte volontaire +3. Validation Cercle Stratégique (conflit d'intérêts ?) + +**Phase pilote (2025) :** +- Membres fondateurs parrainent directement + +**Si aucun volontaire après 30 jours :** +Candidature suspendue. Peut re-candidater ultérieurement. + +--- + +### 2.2 Responsabilités du Parrain + +**Le parrain n'est PAS un patron. C'est un guide.** + +#### Responsabilité 1 : Accueil & Orientation + +**Semaine 1 :** +- Réunion kick-off (1-2h, visio) + * Présentation détaillée filleul + * Visite guidée outils (Matrix, forge, wiki, Registraire) + * Clarification objectifs probation + * Réponses questions + +**Livrable :** Plan d'action personnalisé (basé sur profil filleul). + +--- + +#### Responsabilité 2 : Suivi Bimensuel + +**Fréquence :** Toutes les 2 semaines (6 points de contact durant probation). + +**Format :** Informel (appel, visio, Matrix 30-60 min). + +**Agenda type :** +1. **Progrès depuis dernier point** (15 min) + - Objectifs atteints + - Difficultés rencontrées + - Apprentissages + +2. **État actuel** (15 min) + - Disponibilité infrastructure (métriques) + - Participation Matrix/réunions + - Contributions en cours + +3. **Prochaines étapes** (15 min) + - Objectifs 2 prochaines semaines + - Besoins support technique + - Questions/blocages + +4. **Culture & Valeurs** (15 min) + - Anecdotes, partage expérience + - Clarifications sur gouvernance + - Connexions avec autres membres + +**Livrable :** Notes de suivi (versées dans journal parrain, privé). + +--- + +#### Responsabilité 3 : Support Technique + +**Le parrain facilite, il ne fait pas à la place.** + +**Support autorisé :** +- ✅ Pointeurs vers documentation (wiki, runbooks) +- ✅ Explication de concepts (DNS, DNSSEC, Ansible) +- ✅ Review configuration (pré-déploiement) +- ✅ Connexion avec expert thématique (autre membre) + +**Support interdit :** +- ❌ Configurer DNS à la place du filleul +- ❌ Écrire code/playbooks à la place +- ❌ Résoudre incidents sans implication filleul + +**Rationale :** Autonomie > Dépendance. Le filleul doit apprendre à faire, pas à déléguer. + +--- + +#### Responsabilité 4 : Observation & Évaluation + +**Le parrain évalue :** +- Progression technique (objectifs 1, 2, 4) +- Participation (objectif 3) +- Alignement valeurs (objectif 5) + +**Critères d'observation :** + +**Alignement valeurs (exemples concrets) :** +- Filleul demande conseil pour choix hébergeur → Évalue si réflexion souveraineté présente +- Filleul propose feature complexe → Évalue si sobriété considérée +- Filleul rencontre incident → Évalue si transparence (partage) ou opacité (cache) + +**Red flags (signaux alerte) :** +- Absence complète (non-réponse Matrix > 7 jours) +- Promesses non tenues répétées (annonces sans livraison) +- Attitude fermée (refuse feedback, refuse support) +- Violation valeurs (proposition dépendance GAFAM sans justification) + +**Escalade :** Si red flag persistant (2+ occurrences), parrain alerte Cercle Stratégique. + +--- + +#### Responsabilité 5 : Rédaction Rapport Final + +**Semaine 11-12 :** + +**Rapport d'évaluation (template Section 6) :** +- Résumé progression (3-5 paragraphes) +- Objectifs atteints (checklist 5 objectifs) +- Forces observées (3-5 points) +- Points d'amélioration (3-5 points) +- Recommandation finale : + * ✅ **Statut actif** (prêt, autonome, aligné) + * ⚠️ **Prolongation probation** (progrès visible mais incomplet) + * ❌ **Refus** (inactivité ou non-alignement persistant) + +**Longueur :** 2-3 pages (format Markdown ou PDF). + +**Délai :** Soumis semaine 11 (avant évaluation Cercle Stratégique). + +--- + +### 2.3 Valorisation du Parrainage + +**Le parrainage est du travail. Il doit être reconnu.** + +**Banque de temps :** +- +15 heures (créditées au parrain pour 3 mois accompagnement) +- +5 heures bonus si filleul confirmé statut actif + +**Reconnaissance publique :** +- Mention dans fiche membre filleul (Registraire) +- Remerciement lors annonce confirmation statut (Matrix) + +**Badge "Mentor" (optionnel, symbolique) :** +- Après 3 parrainages réussis +- Reconnu dans Registraire + communications + +--- + +## SECTION 3 : PROCESSUS SEMAINE PAR SEMAINE + +### Semaines 1-2 : Démarrage 🚀 + +**Objectifs :** +- Comprendre L'Alliance (valeurs, gouvernance, outils) +- Accéder aux outils communs (lecture) +- Planifier infrastructure technique + +**Actions parrain :** +- Réunion kick-off (semaine 1) +- Envoi documents clés (Charte, Règlement, Doc 5 Standards) +- Création compte Matrix (accès readonly channels publics) + +**Actions filleul :** +- Lecture documents fondateurs (Charte, Règlement, Manifeste) +- Présentation sur Matrix #general (qui, quoi, pourquoi rejoindre) +- Remplir fiche Registraire (draft, review avec parrain) +- Préparer plan infrastructure (inventaire serveurs, IP, domaines) + +**Livrable semaine 2 :** +- [ ] Fiche Registraire draft complète +- [ ] Présentation Matrix faite +- [ ] Plan infrastructure validé avec parrain + +--- + +### Semaines 3-4 : DNS & Connectivité 🌐 + +**Objectifs :** +- Configurer DNS autoritaire (ns1, ns2) +- Demander délégation zone ([slug].boreal.ca) +- Valider résolution publique + +**Actions parrain :** +- Review configuration DNS (pré-déploiement) +- Faciliter contact Cercle Opérationnel (délégation) +- Tester AXFR avec serveur du parrain (pair-to-peer) + +**Actions filleul :** +- Installer Bind9/PowerDNS sur ns1, ns2 +- Configurer zone [slug].boreal.ca +- Envoyer IPs serveurs NS au Cercle Opérationnel +- Tester résolution publique (`dig`, DNSViz) +- Configurer AXFR entre ns1 et ns2 + +**Livrable semaine 4 :** +- [ ] DNS résolvable publiquement (`dig mail.[slug].boreal.ca`) +- [ ] AXFR fonctionnel (test avec serveur parrain) +- [ ] Zone déléguée active dans parent (boreal.ca) + +**Support technique :** +Canal Matrix #support (questions DNS). Parrain facilite, autres membres peuvent répondre aussi. + +--- + +### Semaines 5-6 : Services de Base 📧 + +**Objectifs :** +- Déployer serveur email (Postfix/Dovecot) +- Configurer DKIM, SPF, DMARC +- Obtenir certificats SSL/TLS (Let's Encrypt) + +**Actions parrain :** +- Review configuration email (sécurité, anti-spam) +- Tester envoi/réception depuis email parrain +- Valider score spam (MXToolbox, Mail-Tester) + +**Actions filleul :** +- Installer Postfix (SMTP), Dovecot (IMAP) +- Configurer DKIM (génération clés, publication DNS) +- Configurer SPF, DMARC (policies DNS) +- Obtenir certificats Let's Encrypt (mail, www, cloud) +- Tester envoi email vers Gmail/Outlook (vérifier non-spam) + +**Livrable semaine 6 :** +- [ ] Email fonctionnel (envoi + réception) +- [ ] Score Mail-Tester ≥ 8/10 +- [ ] Certificats SSL/TLS valides (grade A SSL Labs) + +--- + +### Semaines 7-8 : Monitoring & Backups 📊 + +**Objectifs :** +- Déployer monitoring (Prometheus, Node Exporter, Grafana) +- Configurer backups automatisés quotidiens +- Créer status page publique + +**Actions parrain :** +- Review configuration Prometheus (scrape targets) +- Vérifier métriques exportées (disponibilité, ressources) +- Valider procédure backup (test restauration) + +**Actions filleul :** +- Installer Prometheus + Grafana +- Configurer Node Exporter sur tous serveurs +- Créer dashboards Grafana (disponibilité, CPU, RAM, disque) +- Configurer backups (borg, restic, ou rsync + GPG) +- Tester restauration (au moins 1 backup complet) +- Déployer status page (Upptime, Cachet, ou custom) + +**Livrable semaine 8 :** +- [ ] Prometheus scraping actif (métriques visibles) +- [ ] Dashboard Grafana disponibilité (public ou partagé) +- [ ] Backup quotidien configuré (logs disponibles) +- [ ] Test restauration réussi (documenté) +- [ ] Status page accessible (ex: status.[slug].boreal.ca) + +--- + +### Semaines 9-10 : Participation & Contribution 💬 + +**Objectifs :** +- Participer à réunion Cercle Stratégique +- Contribuer à documentation (wiki, runbook, ou code) +- Commencer audits croisés (familiarisation) + +**Actions parrain :** +- Inviter filleul à prochaine réunion Cercle Stratégique +- Identifier contribution adaptée au profil filleul +- Faciliter premier audit (comme audité OU auditeur) + +**Actions filleul :** +- Assister réunion Cercle Stratégique (observer gouvernance) +- Choisir contribution : + * Rédiger runbook (procédure technique) + * Améliorer doc wiki (clarification, exemples) + * Contribuer code (Registraire, Ansible, scripts) +- Participer à audit : + * Si audité : Préparer preuves (familiarisation label) + * Si auditeur : Observer audit d'un pair (shadowing) +- Répondre questions Matrix #support (offrir aide) + +**Livrable semaine 10 :** +- [ ] Participation réunion Cercle Stratégique (présence confirmée) +- [ ] Contribution wiki/code merged (Pull Request acceptée) +- [ ] Participation audit (rôle audité OU observateur) + +--- + +### Semaines 11-12 : Évaluation Finale 📋 + +**Objectifs :** +- Auto-évaluation (honnête, réflexive) +- Rapport parrain (évaluation externe) +- Décision Cercle Stratégique + +**Actions parrain :** +- Rédiger rapport évaluation (template Section 6.2) +- Réunion bilan avec filleul (feedback mutuel) +- Présenter rapport au Cercle Stratégique + +**Actions filleul :** +- Remplir auto-évaluation (template Section 6.1) +- Préparer questions/clarifications pour Cercle Stratégique +- Si nécessaire, défendre candidature (audition) + +**Livrable semaine 12 :** +- [ ] Auto-évaluation soumise +- [ ] Rapport parrain soumis +- [ ] Décision Cercle Stratégique communiquée + +**Issues possibles :** +- ✅ **Confirmation statut actif** → Fiche Registraire updated, annonce Matrix, facturation cotisation +- ⚠️ **Prolongation 3 mois** → Plan d'action correctif, continuation suivi parrain +- ❌ **Refus** → Feedback motivé, possibilité re-candidater après 6 mois + +--- + +## SECTION 4 : OBJECTIFS TECHNIQUES DÉTAILLÉS + +### 4.1 DNS Fédéré (Objectif 1a) + +**Critères d'acceptation :** + +✅ **Serveurs DNS opérationnels** +- ns1.[slug].boreal.ca et ns2.[slug].boreal.ca accessibles publiquement +- Réponse à requêtes DNS (test: `dig @ns1.[slug].boreal.ca [slug].boreal.ca SOA`) + +✅ **Zone déléguée fonctionnelle** +- Enregistrements NS dans zone parent (boreal.ca) +- Résolution publique depuis n'importe quel resolver (Google DNS, Cloudflare) + +✅ **AXFR entre pairs** +- Transfert de zone configuré entre ns1 et ns2 (test: `dig @ns2 [slug].boreal.ca AXFR`) +- Optionnel : AXFR avec serveur d'un autre membre (redondance croisée) + +✅ **Enregistrements de base** +- SOA, NS, MX, A/AAAA pour services principaux +- SPF, DKIM, DMARC pour email + +**Tests de validation :** +```bash +# Test 1: Résolution publique +dig mail.chezlepro.boreal.ca @8.8.8.8 + +# Test 2: Validation DNSSEC (si activé) +dig +dnssec chezlepro.boreal.ca @8.8.8.8 + +# Test 3: AXFR +dig @ns2.chezlepro.boreal.ca chezlepro.boreal.ca AXFR + +# Test 4: DNSViz (visuel) +https://dnsviz.net/d/chezlepro.boreal.ca/dnssec/ +``` + +--- + +### 4.2 Email Sécurisé (Objectif 1b) + +**Critères d'acceptation :** + +✅ **SMTP/IMAP opérationnels** +- Envoi email (test: envoyer à Gmail, vérifier réception) +- Réception email (test: envoyer depuis Gmail, vérifier réception) + +✅ **Sécurité configurée** +- TLS 1.2+ sur SMTP (port 587) et IMAP (port 993) +- Authentification requise (pas de relay ouvert) + +✅ **Anti-spam** +- SPF configuré (test: `dig txt chezlepro.boreal.ca`) +- DKIM configuré (test: `dig txt default._domainkey.chezlepro.boreal.ca`) +- DMARC configuré (test: `dig txt _dmarc.chezlepro.boreal.ca`) + +✅ **Délivrabilité** +- Score Mail-Tester ≥ 8/10 (https://www.mail-tester.com) +- Pas de blacklist (test: MXToolbox Blacklist Check) + +**Tests de validation :** +```bash +# Test 1: Connexion SMTP +openssl s_client -connect mail.chezlepro.boreal.ca:587 -starttls smtp + +# Test 2: Connexion IMAP +openssl s_client -connect mail.chezlepro.boreal.ca:993 + +# Test 3: Envoi test +swaks --to test@gmail.com --from admin@chezlepro.boreal.ca \ + --server mail.chezlepro.boreal.ca --auth LOGIN + +# Test 4: Vérification headers (dans Gmail) +# Afficher source email → vérifier DKIM signature, SPF pass +``` + +--- + +### 4.3 Monitoring (Objectif 2) + +**Critères d'acceptation :** + +✅ **Prometheus scraping actif** +- Node Exporter sur tous serveurs (métriques système) +- Blackbox Exporter pour probes externes (HTTP, DNS) +- Métriques accessibles (Grafana ou Prometheus UI) + +✅ **Métriques obligatoires** +- Disponibilité services (`up` metric) +- CPU, RAM, Disque (node_exporter) +- Latence HTTP (probe_duration_seconds) +- Certificats SSL expiration (probe_ssl_earliest_cert_expiry) + +✅ **Dashboards Grafana** +- Dashboard "Disponibilité" (uptime par service) +- Dashboard "Ressources" (CPU, RAM, disque par serveur) +- Optionnel : Dashboard "Réseau" (bande passante, latence) + +✅ **Status page publique** +- Accessible (ex: status.chezlepro.boreal.ca) +- Mise à jour automatique (via monitoring) +- Historique disponibilité (30 jours minimum) + +**Tests de validation :** +```bash +# Test 1: Métriques Prometheus +curl http://prometheus.chezlepro.boreal.ca:9090/api/v1/query?query=up + +# Test 2: Node Exporter +curl http://srv-compute-01.chezlepro.internal:9100/metrics | grep node_cpu + +# Test 3: Grafana dashboards +# Accéder https://grafana.chezlepro.boreal.ca +# Vérifier dashboards "Disponibilité" et "Ressources" existent + +# Test 4: Status page +curl -I https://status.chezlepro.boreal.ca +# Vérifier HTTP 200 OK +``` + +--- + +### 4.4 Backups & Restauration (Objectif 2) + +**Critères d'acceptation :** + +✅ **Backups automatisés quotidiens** +- Script/outil configuré (borg, restic, rsync+gpg) +- Planification cron ou systemd timer +- Logs de backups conservés (30 jours) + +✅ **Rétention définie** +- Minimum : 7 jours quotidiens +- Recommandé : 7 quotidiens + 4 hebdomadaires + 3 mensuels + +✅ **Chiffrement** +- Backups chiffrés (GPG, borg encryption, restic encryption) +- Clé de chiffrement stockée en sécurité (Ansible Vault, KeePass) + +✅ **Test restauration réussi** +- Au moins 1 test durant probation +- Procédure documentée (runbook) +- Temps de restauration mesuré (RTO) + +**Tests de validation :** +```bash +# Test 1: Vérifier backup quotidien a tourné +ls -lh /backup/local/daily/ | tail -7 + +# Test 2: Vérifier chiffrement +file /backup/local/daily/backup-daily-chezlepro-postgres-20251023.tar.gz.gpg +# Output attendu: GPG encrypted data + +# Test 3: Test restauration (environnement isolé) +# 1. Copier backup dans VM test +# 2. Déchiffrer: gpg -d backup-*.tar.gz.gpg | tar xzf - +# 3. Restaurer base données +# 4. Vérifier intégrité + +# Test 4: Documenter test +# Créer runbook: wiki/runbooks/test-restauration-YYYY-MM-DD.md +``` + +--- + +## SECTION 5 : OBJECTIFS PARTICIPATIFS DÉTAILLÉS + +### 5.1 Présence Matrix (Objectif 3a) + +**Critères d'acceptation :** + +✅ **Compte Matrix créé** +- Username: @[prenom] ou @[role]:matrix.[slug].boreal.ca +- Profil complété (nom, rôle, avatar) + +✅ **Channels rejoints** +- #general (annonces, discussions) +- #support (support technique peer-to-peer) +- #incidents (déclaration incidents P0/P1) +- #gouvernance (discussions propositions, amendements) + +✅ **Réactivité** +- Réponse < 48h aux mentions directes +- Pas d'obligation de réponse immédiate (respect vie personnelle) +- Absence prolongée annoncée (> 7 jours) + +✅ **Participation qualitative** +- Questions posées (n'hésite pas à demander aide) +- Réponses données (partage expertise quand possible) +- Contribution discussions (pas observateur passif) + +**Métriques observables (non contraignantes) :** +- Nombre de messages postés (indicateur activité, pas objectif en soi) +- Présence lors d'incidents P1 (solidarité) + +--- + +### 5.2 Participation Réunion (Objectif 3b) + +**Critères d'acceptation :** + +✅ **Participation à ≥ 1 réunion Cercle Stratégique durant probation** +- Présence complète (début à fin) ou justification si départ anticipé +- Participation active (questions, commentaires, vote si applicable) + +**Réunions Cercle Stratégique durant probation (trimestrielles) :** +- Si probation démarre en janvier → Réunion avril disponible +- Si probation démarre en février → Réunion avril disponible +- Si probation démarre en avril → Réunion juillet disponible + +**Si aucune réunion durant probation :** +Participation à réunion extraordinaire OU réunion Cercle Opérationnel (avec permission) compte. + +**Format participation :** +- Présentiel (rencontre annuelle) : Idéal mais non obligatoire +- Visioconférence (Jitsi/Matrix) : Standard +- Audio uniquement (téléphone) : Acceptable si problème technique + +--- + +### 5.3 Contribution Documentation (Objectif 3c) + +**Critères d'acceptation :** + +✅ **Au moins 1 contribution wiki/runbook durant probation** + +**Types de contributions acceptées :** + +**A) Rédaction runbook** +- Procédure technique pas-à-pas (ex: "Renouveler certificat Let's Encrypt") +- Longueur minimum : 1 page (500 mots) +- Format : Markdown, publié sur wiki + +**B) Amélioration documentation existante** +- Clarification passage ambigu +- Ajout exemples concrets +- Correction erreurs +- Mise à jour références obsolètes + +**C) Traduction** +- Documents anglais → français ou inverse +- Validation par pair francophone/anglophone + +**D) Post-mortem incident** +- Si incident P0/P1 durant probation +- Post-mortem compte comme contribution (double valorisation) + +**Validation :** +- Pull Request wiki acceptée (merged) +- OU Commit direct si accès écriture (membres actifs reviewent) + +**Banque de temps :** +Contribution documentation = +1 à +5 heures (selon ampleur). + +--- + +### 5.4 Contribution Technique (Objectif 4) + +**Critères d'acceptation :** + +✅ **Au moins 1 contribution technique durant probation** + +**Types de contributions acceptées :** + +**A) Amélioration Registraire** +- Ajout validation (nouveau champ, nouveau schema) +- Amélioration CI/CD (nouveau test, optimisation) +- Script utilitaire (parsing, génération rapports) + +**B) Playbook Ansible** +- Nouveau rôle (ex: role/matomo pour analytics) +- Amélioration rôle existant (idempotence, variables) +- Contribution inventaire (structure, documentation) + +**C) Outil commun** +- Amélioration forge (GitLab/Gitea config) +- Script monitoring (nouveau exporter, dashboard Grafana) +- Automatisation (backup, déploiement) + +**D) Audit pair-à-pair** +- Réaliser audit d'un autre membre (formation auditeur requise) +- OU être audité (préparer preuves, fournir accès) + +**Validation :** +- Pull Request acceptée (code review + tests passent) +- OU Audit validé par Cercle Éthique + +**Banque de temps :** +- Contribution code : +2 à +10 heures (selon complexité) +- Audit pair-à-pair : +5 heures (auditeur) ou +2 heures (audité) + +--- + +## SECTION 6 : ÉVALUATION FINALE + +### 6.1 Template Auto-Évaluation + +**À remplir par le filleul (semaine 11)** + +--- + +**AUTO-ÉVALUATION — Fin de Probation** + +**Membre :** [Nom légal] (ID: [mXXX], Slug: [slug]) +**Parrain :** [Nom parrain] (ID: [mYYY]) +**Date probation :** [YYYY-MM-DD] à [YYYY-MM-DD] +**Date auto-évaluation :** [YYYY-MM-DD] + +--- + +#### SECTION A : Objectifs Techniques + +**Objectif 1 : Interopérabilité Technique** + +- [ ] DNS configuré (ns1, ns2 avec AXFR) — ✅ Atteint / ⚠️ Partiel / ❌ Non atteint +- [ ] Services de base opérationnels (email, monitoring) +- [ ] Certificats SSL/TLS valides +- [ ] Monitoring actif (Prometheus, Grafana) + +**Commentaire :** +[Décris succès, difficultés rencontrées, solutions trouvées. 3-5 phrases.] + +--- + +**Objectif 2 : Disponibilité & Résilience** + +- [ ] Disponibilité ≥ 99% (hors maintenance planifiée) — ✅ / ⚠️ / ❌ +- [ ] Backups quotidiens configurés +- [ ] Test restauration réussi + +**Métriques :** +- Disponibilité mesurée : [XX.X]% +- Incidents P0/P1 durant probation : [N] (si applicable, lien post-mortem) +- Test restauration effectué : [Date] + +**Commentaire :** +[Incidents survenus, gestion, apprentissages. 3-5 phrases.] + +--- + +#### SECTION B : Objectifs Participatifs + +**Objectif 3 : Participation Active** + +- [ ] Présence Matrix (réactivité < 48h) — ✅ / ⚠️ / ❌ +- [ ] Participation ≥ 1 réunion Cercle Stratégique +- [ ] Contribution documentation (≥ 1) + +**Détails contributions :** +- Réunions assistées : [Liste dates] +- Contributions wiki/runbook : [Liens PR ou commits] + +**Commentaire :** +[Ressenti participation, qualité interactions, sentiment appartenance. 3-5 phrases.] + +--- + +**Objectif 4 : Contribution Technique** + +- [ ] Contribution outil commun (code, audit) — ✅ / ⚠️ / ❌ + +**Détails :** +- Type contribution : [Registraire / Ansible / Audit / Autre] +- Lien Pull Request ou rapport audit : [URL] + +**Commentaire :** +[Apprentissages techniques, difficultés, satisfaction. 3-5 phrases.] + +--- + +#### SECTION C : Alignement Valeurs + +**Objectif 5 : Démonstration alignement avec 5 valeurs cardinales** + +**Souveraineté :** +[Décris comment tu as démontré souveraineté : choix infra, évitement dépendances, etc. 2-3 phrases.] + +**Liberté :** +[Standards ouverts utilisés, formats libres, interopérabilité. 2-3 phrases.] + +**Sobriété :** +[Mesures prises pour sobriété : consommation énergétique, optimisation ressources. 2-3 phrases.] + +**Solidarité :** +[Exemples support offert/reçu, collaboration, entraide. 2-3 phrases.] + +**Transparence :** +[Partage incidents, acceptation audits, communication ouverte. 2-3 phrases.] + +--- + +#### SECTION D : Réflexion Personnelle + +**Ce qui m'a le plus marqué durant la probation :** +[1 paragraphe] + +**Ce que j'ai trouvé le plus difficile :** +[1 paragraphe] + +**Ce que j'ai appris :** +[1 paragraphe] + +**Comment je compte contribuer à L'Alliance en tant que membre actif :** +[1 paragraphe] + +**Questions ou préoccupations avant décision finale :** +[Si applicable] + +--- + +**Signature :** +[Nom], [Date] + +--- + +### 6.2 Template Rapport Parrain + +**À remplir par le parrain (semaine 11)** + +--- + +**RAPPORT D'ÉVALUATION PARRAIN — Fin de Probation** + +**Filleul :** [Nom légal] (ID: [mXXX], Slug: [slug]) +**Parrain :** [Nom parrain] (ID: [mYYY]) +**Date probation :** [YYYY-MM-DD] à [YYYY-MM-DD] +**Date rapport :** [YYYY-MM-DD] + +--- + +#### SECTION A : Résumé Progression + +[2-3 paragraphes synthétisant parcours filleul durant 12 semaines. Ton objectif mais bienveillant.] + +**Exemples de points à couvrir :** +- Motivation initiale, engagement observé +- Progression technique (rapide, graduelle, lente ?) +- Qualité interactions (réactif, proactif, distant ?) +- Autonomie acquise (débrouillardise, demande aide appropriée) + +--- + +#### SECTION B : Objectifs — Évaluation Détaillée + +**Objectif 1 : Interopérabilité Technique** + +| Critère | Statut | Commentaire | +|---------|--------|-------------| +| DNS configuré | ✅ / ⚠️ / ❌ | [1-2 phrases] | +| Services de base | ✅ / ⚠️ / ❌ | [1-2 phrases] | +| Certificats SSL/TLS | ✅ / ⚠️ / ❌ | [1-2 phrases] | +| Monitoring actif | ✅ / ⚠️ / ❌ | [1-2 phrases] | + +**Appréciation globale Objectif 1 :** ✅ Atteint / ⚠️ Partiel / ❌ Non atteint + +--- + +**Objectif 2 : Disponibilité & Résilience** + +| Critère | Statut | Commentaire | +|---------|--------|-------------| +| Disponibilité ≥ 99% | ✅ / ⚠️ / ❌ | Mesure : [XX.X]% | +| Backups quotidiens | ✅ / ⚠️ / ❌ | [1-2 phrases] | +| Test restauration | ✅ / ⚠️ / ❌ | [1-2 phrases] | + +**Appréciation globale Objectif 2 :** ✅ / ⚠️ / ❌ + +--- + +**Objectif 3 : Participation Active** + +| Critère | Statut | Commentaire | +|---------|--------|-------------| +| Présence Matrix | ✅ / ⚠️ / ❌ | [Réactivité, qualité échanges] | +| Réunion Cercle Stratégique | ✅ / ⚠️ / ❌ | Date(s) : [XXX] | +| Contribution doc | ✅ / ⚠️ / ❌ | Lien(s) : [XXX] | + +**Appréciation globale Objectif 3 :** ✅ / ⚠️ / ❌ + +--- + +**Objectif 4 : Contribution Technique** + +| Critère | Statut | Commentaire | +|---------|--------|-------------| +| Contribution outil commun | ✅ / ⚠️ / ❌ | Type : [XXX], Lien : [XXX] | + +**Appréciation globale Objectif 4 :** ✅ / ⚠️ / ❌ + +--- + +**Objectif 5 : Alignement Valeurs** + +[3-5 paragraphes évaluant alignement avec 5 valeurs. Exemples concrets obligatoires.] + +**Souveraineté :** +[Observation comportements, décisions prises, attitude vis-à-vis dépendances] + +**Liberté :** +[Choix standards ouverts, formats libres] + +**Sobriété :** +[Démarche mesure/réduction, réflexion impact] + +**Solidarité :** +[Support offert, demande aide, collaboration] + +**Transparence :** +[Partage incidents, ouverture communication] + +**Appréciation globale Objectif 5 :** ✅ Aligné / ⚠️ Partiellement / ❌ Non aligné + +--- + +#### SECTION C : Forces et Points d'Amélioration + +**Forces observées (3-5 points) :** +1. [Force 1 avec exemple concret] +2. [Force 2 avec exemple concret] +3. [Force 3 avec exemple concret] + +**Points d'amélioration (3-5 points) :** +1. [Point 1 avec suggestion constructive] +2. [Point 2 avec suggestion constructive] +3. [Point 3 avec suggestion constructive] + +--- + +#### SECTION D : Recommandation Finale + +**Synthèse :** +[2-3 paragraphes résumant évaluation globale] + +**Recommandation :** + +- [ ] ✅ **STATUT ACTIF** — Prêt, autonome, aligné avec valeurs. Recommande confirmation sans réserve. + +- [ ] ⚠️ **PROLONGATION PROBATION (3 mois)** — Progrès visibles mais objectif(s) [X, Y] incomplet(s). Plan d'action : [décrire actions correctives]. + +- [ ] ❌ **REFUS** — Objectif(s) [X, Y] non atteints ET/OU inactivité persistante ET/OU non-alignement valeurs. Justification : [décrire raisons]. + +**Justification recommandation :** +[2-3 paragraphes argumentant choix. Si prolongation ou refus, être explicite et constructif.] + +--- + +**Signature :** +[Nom Parrain], [Date] + +--- + +### 6.3 Décision Cercle Stratégique + +**Processus :** + +1. **Réception documents (semaine 11)** + - Auto-évaluation filleul + - Rapport parrain + +2. **Révision préalable (semaine 11-12)** + - Cercle Stratégique lit documents + - Questions préparées si nécessaire + +3. **Réunion décision (semaine 12)** + - Présentation synthèse (parrain, 10 min) + - Questions au filleul (si invité, 15 min) + - Délibération (huis clos, 15-30 min) + - Décision par consentement + +4. **Notification (sous 48h)** + - Email + Matrix au filleul + - Si confirmé : Annonce publique Matrix #general (félicitations) + - Si refusé : Feedback motivé privé + accompagnement si souhaité + +--- + +**Décisions possibles :** + +#### A) ✅ Confirmation Statut Actif + +**Critères :** +- 5 objectifs atteints OU 4/5 avec 1 partiel justifié +- Recommandation parrain positive +- Aucune objection valide du Cercle Stratégique + +**Actions immédiates :** +1. Mise à jour Registraire (`status: active`) +2. Accès complet outils (Matrix écriture, forge, cercles) +3. Droit de vote (Cercle Stratégique) +4. Facturation cotisation annuelle (prorata mois restants) +5. Annonce publique (Matrix #general, félicitations + mention parrain) + +**Exemple annonce :** +> 🎉 **Bienvenue à [Nom Membre] (mXXX / [slug]) comme membre actif de L'Alliance Boréale !** +> Parcours probatoire complété avec succès. Parrain : @[parrain] — Merci pour l'accompagnement ! +> Label visé : Bronze (demande audit possible dès maintenant). + +--- + +#### B) ⚠️ Prolongation Probation (3 mois) + +**Critères :** +- 3-4 objectifs atteints, 1-2 partiels avec justification +- Progrès visible mais rythme insuffisant +- Recommandation parrain : Prolongation avec plan d'action +- Consentement Cercle Stratégique + +**Conditions :** +- Maximum 1 prolongation (total 6 mois) +- Plan d'action correctif défini (objectifs précis) +- Suivi intensifié parrain (hebdomadaire au lieu de bimensuel) + +**Actions :** +1. Notification privée (email + Matrix DM) +2. Réunion filleul + parrain + représentant Cercle Stratégique (définir plan d'action) +3. Mise à jour Registraire (probation_end_date + 3 mois) +4. Communication interne (Cercle Stratégique, pas publique) + +**Après 3 mois supplémentaires :** +Nouvelle évaluation. Si objectifs toujours non atteints → Refus. + +--- + +#### C) ❌ Refus + +**Critères :** +- ≤ 2 objectifs atteints +- OU inactivité persistante (absence > 21 jours sans justification) +- OU violation valeurs cardinales (ex: proposition dépendance GAFAM critique sans justification) +- OU comportement inadapté (toxicité, refus coopération) + +**Procédure :** +1. Notification privée (email + Matrix DM) +2. Feedback motivé et constructif (pourquoi, quels manquements) +3. Possibilité recours (si désaccord sur faits, pas sur décision) auprès Cercle Éthique +4. Mise à jour Registraire (`status: exited`, raison documentée privée) + +**Possibilité re-candidater :** +Après 6 mois, si corrections apportées (ex: formation technique, changement infrastructure). + +**Pas de communication publique négative.** +L'Alliance ne publiera jamais "Membre X a échoué sa probation". Respect dignité. + +--- + +## SECTION 7 : CAS PARTICULIERS + +### 7.1 Retrait Volontaire Durant Probation + +**Le filleul peut se retirer à tout moment, sans pénalité.** + +**Procédure :** +1. Notification écrite (email retraits@alliance-boreale.ca + Matrix parrain) +2. Motif optionnel (retour d'expérience apprécié mais pas obligatoire) +3. Préavis recommandé : 7 jours (permet transition propre) + +**Conséquences :** +- Aucune cotisation due (probation = gratuite) +- Révocation accès outils (Matrix, forge, wiki) +- Mise à jour Registraire (`status: exited`, raison : "retrait volontaire probation") + +**Possibilité re-candidater :** +Aucun délai imposé. Peut re-candidater immédiatement si circonstances changent. + +--- + +### 7.2 Incident Majeur Durant Probation + +**Scénario :** Filleul cause incident P0 affectant fédération (ex: mauvaise config DNS casse résolution pour tous). + +**Réaction :** + +**1. Gestion immédiate incident (prioritaire)** +- Parrain + Cercle Opérationnel assistent résolution +- Communication transparente (Matrix #incidents) + +**2. Post-mortem obligatoire** +- Filleul rédige post-mortem (template Doc 9) +- Analyse causes racines (erreur humaine, manque formation, outil défaillant ?) + +**3. Évaluation impact sur probation** +- Incident seul ne disqualifie PAS automatiquement +- Critères évaluation : + * Transparence (incident déclaré rapidement ?) + * Collaboration (acceptation aide ?) + * Apprentissage (post-mortem réflexif ?) + * Actions préventives (mesures pour éviter récurrence ?) + +**Si incident géré de manière exemplaire :** +Peut même renforcer évaluation positive (démontre résilience, transparence, apprentissage). + +**Si incident caché ou mal géré :** +Red flag majeur → Possible refus probation (violation valeur Transparence). + +--- + +### 7.3 Absence Prolongée (Force Majeure) + +**Scénario :** Filleul absent > 14 jours durant probation (maladie, urgence familiale, etc.). + +**Procédure :** + +**1. Notification dès que possible** +- Informer parrain (Matrix DM ou email) +- Pas besoin de détails médicaux/personnels ("absent pour raison personnelle" suffit) + +**2. Suspension probation (gel timer)** +- Durée probation pausée durant absence +- Exemple : Absent 3 semaines → Probation prolongée automatiquement de 3 semaines + +**3. Reprise accompagnée** +- Réunion de reprise (parrain + filleul) +- Révision plan d'action (objectifs ajustés si nécessaire) + +**4. Évaluation finale ajustée** +- Absence justifiée ne pénalise PAS +- Évaluation basée sur période active uniquement + +--- + +### 7.4 Changement de Parrain (Si Nécessaire) + +**Motifs valides :** +- Conflit interpersonnel (incompatibilité, tensions) +- Indisponibilité parrain (maladie, surcharge, déménagement) +- Expertise inadaptée (besoin expertise différente) + +**Procédure :** +1. Discussion tripartite (filleul, parrain actuel, représentant Cercle Stratégique) +2. Recherche nouveau parrain (volontariat) +3. Transition (passation dossier, historique, plan d'action) +4. Pas de pénalité pour filleul (timer probation continue) + +**Valorisation parrain sortant :** +Banque de temps créditée prorata (ex: 2 mois accompagnement = +10h au lieu de +15h). + +--- + +## CONCLUSION + +**L'onboarding est un investissement, pas un coût.** + +Chaque heure investie par le parrain, chaque moment de doute du filleul, chaque obstacle surmonté ensemble renforce L'Alliance. + +**Nous ne cherchons pas la perfection immédiate.** Nous cherchons : +- L'engagement authentique +- La volonté d'apprendre +- L'alignement avec nos valeurs +- La capacité à demander de l'aide +- La générosité à offrir de l'aide + +**Un membre bien intégré reste longtemps. Un membre mal intégré part rapidement.** + +Investir 3 mois pour construire une relation de confiance, c'est investir pour les 5, 10, 20 années à venir. + +**Bienvenue dans la forêt. Ton parrain te guidera à travers les premiers arbres. Bientôt, tu connaîtras les chemins. Et un jour, tu guideras les suivants.** 🌲 + +--- + +## ANNEXES + +### Annexe A : Checklist Rapide Parrain + +**Semaine 1 : Démarrage** +- [ ] Réunion kick-off planifiée (2h) +- [ ] Envoi documents clés (Charte, Règlement, Doc 5) +- [ ] Accès Matrix créé (filleul) +- [ ] Présentation filleul sur #general + +**Semaines 2-10 : Suivi Bimensuel** +- [ ] Points de contact toutes les 2 semaines (6 total) +- [ ] Journal de suivi maintenu (notes privées) +- [ ] Support technique offert (facilitation, pas substitution) +- [ ] Observation alignement valeurs + +**Semaine 11-12 : Évaluation** +- [ ] Réunion bilan avec filleul +- [ ] Rédaction rapport évaluation (template Section 6.2) +- [ ] Soumission rapport au Cercle Stratégique +- [ ] Présentation synthèse (10 min) + +**Post-décision :** +- [ ] Accompagnement transition (si statut actif confirmé) +- [ ] Feedback mutuel (filleul évalue parrain, parrain évalue processus) + +--- + +### Annexe B : Ressources Onboarding + +**Documents à lire (priorité) :** +1. Document 1 : Charte Fondatrice (12 pages) +2. Document 4 : Manifeste Philosophique (10 pages) +3. Document 5 : Architecture & Standards (30 pages, référence) +4. Document 2 : Règlement Régie Interne (22 pages, consulter si questions) + +**Runbooks essentiels (wiki) :** +- Configuration DNS Bind9 (pas-à-pas) +- Déploiement Postfix/Dovecot (email sécurisé) +- Configuration Let's Encrypt (certificats SSL) +- Installation Prometheus + Grafana (monitoring) +- Backups avec Borg (automatisation) + +**Outils de travail :** +- Matrix : https://matrix.alliance-boreale.ca +- Forge : https://forge.alliance-boreale.ca +- Wiki : https://wiki.alliance-boreale.ca +- Registraire : https://registraire.alliance-boreale.ca + +--- + +### Annexe C : Exemple Concret (Parcours m003) + +**Membre :** Coop Nordique (m003 / coop-nordique) +**Parrain :** TechnoLibre (m002 / Sophie Lavoie) +**Probation :** 2025-08-01 à 2025-10-31 (12 semaines) + +**Semaine 1-2 : Démarrage** +- Kick-off : 2025-08-05 (2h visio) +- Présentation Matrix : 2025-08-06 +- Lecture documents : 2025-08-07 à 2025-08-10 +- Plan infrastructure : 2025-08-12 (2 serveurs OVH, Debian 12) + +**Semaine 3-4 : DNS** +- Installation Bind9 : 2025-08-14 +- Configuration zone coop-nordique.boreal.ca : 2025-08-16 +- Demande délégation : 2025-08-18 +- Délégation active : 2025-08-20 +- Test AXFR avec m002 : 2025-08-22 ✅ + +**Semaine 5-6 : Email** +- Installation Postfix/Dovecot : 2025-08-26 +- Configuration DKIM/SPF/DMARC : 2025-08-28 +- Test envoi/réception : 2025-08-30 +- Score Mail-Tester : 9.2/10 ✅ +- Certificats Let's Encrypt : 2025-09-02 + +**Semaine 7-8 : Monitoring** +- Installation Prometheus : 2025-09-05 +- Configuration Node Exporter : 2025-09-06 +- Dashboards Grafana : 2025-09-09 +- Status page (Upptime) : 2025-09-12 ✅ + +**Semaine 9-10 : Participation** +- Réunion Cercle Stratégique : 2025-09-15 (présence complète) ✅ +- Contribution runbook "Backup Borg" : 2025-09-20 (PR#42 merged) ✅ +- Support technique Matrix : Répondu 3 questions #support +- Audit pair (audité) : 2025-09-25 (auditeur : m001) + +**Semaine 11-12 : Évaluation** +- Auto-évaluation soumise : 2025-10-22 +- Rapport parrain soumis : 2025-10-24 +- Décision Cercle Stratégique : 2025-10-28 +- **Résultat : ✅ STATUT ACTIF confirmé** +- Annonce publique : 2025-10-29 + +**Bilan :** +- 5/5 objectifs atteints +- Disponibilité mesurée : 99.7% +- Contributions : 1 runbook, 3 réponses support, 1 audit +- Alignement valeurs : Exemplaire (choix hébergeur OVH Canada, DNSSEC activé dès semaine 4, transparence incidents) + +**Score final : 95/100 (excellent)** + +--- + +## MÉTADONNÉES + +**Document :** 08_Processus_Onboarding_Membres.md +**Version :** 1.0 +**Date de création :** 23 octobre 2025 +**Auteur :** Claude (profils #11 Gouvernance, #12 Documentaliste) +**Révision par :** Cercle Stratégique +**Statut :** À adopter +**Longueur :** ~8 500 mots (17 pages) +**Licence :** CC BY-SA 4.0 + +**Sources utilisées :** +- `00_Glossaire_et_Definitions.md` +- `02_Reglement_de_Regie_Interne.md` (Section 4 : Cycle de vie membres) +- `05_Architecture_Reference_Standards_Techniques.md` +- `14_Structure_YAML_Registraire.md` +- `devis_alliance_boreale_v2.md` + +**Prochaine révision prévue :** Avril 2026 (après premières probations phase pilote) + +--- + +**Changelog :** +- 2025-10-23 v1.0 : Création initiale Processus Onboarding + +--- + +**FIN DU PROCESSUS D'ONBOARDING** + +*"Le premier pas dans la forêt est accompagné. Les suivants seront les tiens."* + +🌲 **L'Alliance Boréale** +*Onboarding structuré, accompagnement humain, autonomie progressive.* diff --git a/docs/constitution/14_Structure_YAML_Registraire.md b/docs/constitution/14_Structure_YAML_Registraire.md new file mode 100644 index 0000000..844220c --- /dev/null +++ b/docs/constitution/14_Structure_YAML_Registraire.md @@ -0,0 +1,1356 @@ +# Document 14 : Structure YAML du Registraire +## L'Alliance Boréale — Source de Vérité Technique + +**Version:** 1.0 +**Date:** 23 octobre 2025 +**Statut:** Document technique +**Adopté par :** Cercle Opérationnel +**Licence:** CC BY-SA 4.0 + +--- + +## PRÉAMBULE + +Le Registraire est **la source de vérité unique** de L'Alliance Boréale. + +**Tout ce qui compte est dans le Registraire :** +- Membres (actifs, probation, sortis) +- Services fédérés (DNS, email, Matrix) +- Labels et scores +- Décisions de gouvernance +- Zones DNS + +**Format : YAML + Git** + +**Pourquoi YAML ?** +- ✅ Lisible par humains (contrairement à JSON) +- ✅ Éditable manuellement (pas besoin d'interface web) +- ✅ Versionnable (Git track changes) +- ✅ Validable (schemas, linters) +- ✅ Parsable par machines (Ansible, scripts) + +**Pourquoi Git ?** +- ✅ Historique complet (qui a changé quoi, quand, pourquoi) +- ✅ Pull requests (review avant merge) +- ✅ Branches (test modifications avant prod) +- ✅ Réversibilité (rollback si erreur) +- ✅ Distribution (chaque membre peut cloner) + +**Principe :** Une seule source de vérité, maintenue collectivement, auditable par tous. + +--- + +## SECTION 1 : STRUCTURE DU DÉPÔT GIT + +### 1.1 Arborescence Complète + +``` +registraire/ +├── README.md # Documentation générale +├── CONTRIBUTING.md # Guide contribution +├── LICENSE # CC BY-SA 4.0 +│ +├── schemas/ # Schémas de validation +│ ├── member.schema.json # JSON Schema fiche membre +│ ├── decision.schema.json # JSON Schema décision +│ └── label.schema.json # JSON Schema label +│ +├── membres/ # Fiches membres +│ ├── m001-chezlepro.yml # Membre 001 +│ ├── m002-technolibre.yml # Membre 002 +│ ├── m003-coop-nordique.yml # Membre 003 +│ └── ... +│ +├── gouvernance/ # Décisions & gouvernance +│ ├── decisions/ +│ │ ├── 2025-001-admission-m001.yml +│ │ ├── 2025-002-admission-m002.yml +│ │ └── 2025-042-amendement-charte.yml +│ │ +│ ├── cercles/ +│ │ ├── strategique.yml # Composition cercle +│ │ ├── operationnel.yml +│ │ └── ethique.yml +│ │ +│ └── assemblees/ +│ ├── 2025-01-ag-annuelle.yml # PV assemblée générale +│ └── 2026-01-ag-annuelle.yml +│ +├── labels/ # Labellisation +│ ├── attributions/ +│ │ ├── m001-2025-Q4.yml # Label attribué +│ │ ├── m002-2025-Q4.yml +│ │ └── ... +│ │ +│ └── audits/ +│ ├── m001-2025-Q4-rapport.yml # Rapport audit (synthèse) +│ └── ... +│ +├── dns/ # Configuration DNS +│ ├── zones/ +│ │ ├── boreal.ca.zone # Zone racine +│ │ ├── chezlepro.boreal.ca.zone # Zones membres +│ │ └── technolibre.boreal.ca.zone +│ │ +│ └── delegations/ +│ └── delegations.yml # Liste délégations actives +│ +├── incidents/ # Post-mortems +│ ├── 2025-10-incident-dns-p1.yml +│ └── 2025-11-incident-cert-p0.yml +│ +└── banque-temps/ # Transactions (si implémentée) + └── transactions-2025-Q4.yml +``` + +--- + +### 1.2 Nomenclature des Fichiers + +**Règles strictes :** + +| Type | Format | Exemple | +|------|--------|---------| +| **Membre** | `mXXX-[slug].yml` | `m001-chezlepro.yml` | +| **Décision** | `YYYY-NNN-[titre-court].yml` | `2025-042-amendement-charte.yml` | +| **Label** | `mXXX-YYYY-QN.yml` | `m001-2025-Q4.yml` | +| **Audit** | `mXXX-YYYY-QN-rapport.yml` | `m001-2025-Q4-rapport.yml` | +| **Incident** | `YYYY-MM-incident-[titre]-[prio].yml` | `2025-10-incident-dns-p1.yml` | +| **Zone DNS** | `[domain].zone` | `chezlepro.boreal.ca.zone` | + +**Avantages :** +- Tri alphabétique = tri chronologique (pour décisions, incidents) +- ID membre visible (mXXX) +- Parsing facile (scripts) + +--- + +### 1.3 Branches et Workflow Git + +**Branches :** + +``` +main → Production (fiches validées) +├── dev → Développement (intégration continue) +└── feature/* → Branches de travail (1 feature = 1 branch) + ├── feature/add-member-m004 + ├── feature/update-label-m001 + └── feature/dns-delegation-m002 +``` + +**Workflow Pull Request :** + +1. **Créer branche** : `git checkout -b feature/add-member-m004` +2. **Modifier fichier(s)** : Éditer `membres/m004-nouveau.yml` +3. **Commit** : `git commit -m "feat: Add member m004 (Nouveau OBNL)"` +4. **Push** : `git push origin feature/add-member-m004` +5. **Ouvrir Pull Request** sur Forge +6. **Review** : 1+ membre (vérification conformité) +7. **CI/CD** : Tests automatiques (yamllint, schema validation) +8. **Merge** : Si tests ✅ + review ✅ → merge dans `main` + +**Protection branche `main` :** +- Aucun push direct (seulement via PR) +- Review obligatoire (1+ personne) +- CI/CD doit passer (tests) + +--- + +## SECTION 2 : SCHÉMA FICHE MEMBRE + +### 2.1 Structure Complète (Commentée) + +**Fichier : `membres/m001-chezlepro.yml`** + +```yaml +# ============================================================================ +# FICHE MEMBRE — L'Alliance Boréale +# ============================================================================ +# ID: m001 +# Slug: chezlepro +# Nom légal: Chez le Pro Technologies Inc. +# Statut: actif +# Dernière mise à jour: 2025-10-23 +# ============================================================================ + +# ---------------------------------------------------------------------------- +# SECTION 1 : IDENTITÉ +# ---------------------------------------------------------------------------- +member_id: m001 +slug: chezlepro +status: active # active | probation | suspended | exited + +identity: + legal_name: "Chez le Pro Technologies Inc." + legal_form: corporation # corporation | coop | npo | sole_proprietorship + jurisdiction: QC # Juridiction d'enregistrement + registration_number: "1234567890" # NEQ (Québec) ou équivalent + + operating_name: "Chez le Pro" # Nom commercial (si différent) + + website: "https://chezle.pro" + + founded_date: "2018-03-15" + joined_alliance_date: "2025-01-15" + probation_end_date: "2025-04-15" # null si membre actif confirmé + + description: | + Chez le Pro offre des services d'hébergement web éthique et de + développement logiciel sur mesure pour PME québécoises. Membre + fondateur de L'Alliance Boréale. + +# ---------------------------------------------------------------------------- +# SECTION 2 : CONTACTS +# ---------------------------------------------------------------------------- +contacts: + primary: + name: "Jean Tremblay" + role: "Président" + email: "jean@chezle.pro" + phone: "+1-514-555-0100" + matrix: "@jean:matrix.chezlepro.boreal.ca" + + technical: + name: "Marie Gagnon" + role: "Directrice technique" + email: "marie@chezle.pro" + phone: "+1-514-555-0101" + matrix: "@marie:matrix.chezlepro.boreal.ca" + + security: + email: "security@chezle.pro" + pgp_key: "0x1234567890ABCDEF" + pgp_fingerprint: "1234 5678 90AB CDEF 1234 5678 90AB CDEF 1234 5678" + + legal: + name: "Sophie Lavoie" + role: "Conseillère juridique" + email: "legal@chezle.pro" + +# ---------------------------------------------------------------------------- +# SECTION 3 : INFRASTRUCTURE +# ---------------------------------------------------------------------------- +infrastructure: + hosting: + provider: "OVH Canada" + datacenter_location: "Montreal, QC, Canada" + owned: false # true = hardware propre, false = loué + + network: + ipv4_public: + - "203.0.113.10/32" + - "203.0.113.20/28" + ipv6_public: + - "2001:db8:1234::/48" + + ipv4_private: "10.1.0.0/16" # Selon Doc 5 + + asn: null # Autonomous System Number (si applicable) + + dns: + primary_ns: "ns1.chezlepro.boreal.ca" + secondary_ns: "ns2.chezlepro.boreal.ca" + + ns_ips: + ns1: "203.0.113.10" + ns2: "203.0.113.11" + + dnssec_enabled: true + dnssec_ds_records: + - "12345 8 2 1234567890ABCDEF..." # DS record pour parent + + servers: + count: 3 + summary: | + - 1x serveur compute (Proxmox) + - 1x serveur storage (ZFS) + - 1x serveur backup (dédié) + +# ---------------------------------------------------------------------------- +# SECTION 4 : SERVICES PUBLICS +# ---------------------------------------------------------------------------- +services: + email: + enabled: true + domain: "chezle.pro" + mx_records: + - priority: 10 + host: "mail.chezlepro.boreal.ca" + + protocols: + - smtp + - smtps + - imap + - imaps + + security: + dkim: true + spf: true + dmarc: true + tls_min_version: "1.2" + + web: + enabled: true + urls: + - "https://chezle.pro" + - "https://www.chezle.pro" + + technologies: + - nginx + - php-fpm + - postgresql + + cloud_storage: + enabled: true + platform: nextcloud + url: "https://cloud.chezlepro.boreal.ca" + version: "28.0.1" + + matrix: + enabled: true + homeserver_url: "https://matrix.chezlepro.boreal.ca" + federation_enabled: true + server_name: "chezlepro.boreal.ca" + + status_page: + enabled: true + url: "https://status.chezlepro.boreal.ca" + platform: "upptime" # upptime | cachet | custom + + monitoring: + prometheus_endpoint: "https://prometheus.chezlepro.boreal.ca" + grafana_url: "https://grafana.chezlepro.boreal.ca" + public_metrics: true # Métriques partagées avec Alliance + +# ---------------------------------------------------------------------------- +# SECTION 5 : STANDARDS ET CONFORMITÉ +# ---------------------------------------------------------------------------- +standards: + open_source_percentage: 85 # % de stack en logiciels libres + + protocols_supported: + - smtp + - imap + - caldav + - carddav + - webdav + - matrix + + certifications: + - name: "ISO 27001" + issued_by: "BSI Group" + valid_until: "2026-12-31" + certificate_url: "https://chezle.pro/certs/iso27001.pdf" + + compliance: + loi_25: true # Conformité Loi 25 (Québec) + rgpd: true # Conformité RGPD (EU) + pipeda: true # Conformité PIPEDA (Canada) + +# ---------------------------------------------------------------------------- +# SECTION 6 : LABEL DE PRESTIGE +# ---------------------------------------------------------------------------- +label: + current: + level: gold # bronze | silver | gold | platinum | null + score_global: 82 + scores_by_domain: + infrastructure: 85 + security: 88 + interoperability: 78 + open_source: 90 + operations: 75 + sustainability: 72 + + issued_date: "2025-10-01" + valid_until: "2026-10-01" + audited_by: "m002" # Membre auditeur + + report_url: "registraire/labels/audits/m001-2025-Q4-rapport.yml" + + history: + - level: silver + score_global: 68 + issued_date: "2025-04-01" + valid_until: "2026-04-01" + + - level: bronze + score_global: 52 + issued_date: "2025-01-15" + valid_until: "2026-01-15" + +# ---------------------------------------------------------------------------- +# SECTION 7 : PARTICIPATION & CONTRIBUTIONS +# ---------------------------------------------------------------------------- +participation: + cercles: + - name: "Cercle Stratégique" + role: "membre" + since: "2025-01-15" + + - name: "Cercle Opérationnel" + role: "président" + since: "2025-07-01" + until: "2026-01-01" + + contributions: + - type: "code" + description: "Développement Registraire YAML (validation, CI/CD)" + date: "2025-03-20" + hours: 15 + + - type: "documentation" + description: "Rédaction runbooks DNS & DNSSEC" + date: "2025-05-10" + hours: 8 + + - type: "mentoring" + description: "Parrainage membre m003 (probation)" + date: "2025-08-01" + status: "en_cours" + + banque_temps: + balance: 42 # Crédits (heures) + last_updated: "2025-10-20" + +# ---------------------------------------------------------------------------- +# SECTION 8 : MÉTADONNÉES +# ---------------------------------------------------------------------------- +metadata: + created_at: "2025-01-15T10:30:00Z" + updated_at: "2025-10-23T14:22:00Z" + updated_by: "m001" # Dernière modification par + + version: 2 # Numéro de version du schéma + + notes: | + Membre fondateur. Infrastructure solide. Contributions régulières. + Candidat potentiel Platine en 2026 si maintien niveau actuel. + + tags: + - fondateur + - hebergement + - quebec + - infrastructure-mature +``` + +--- + +### 2.2 Champs Obligatoires vs Optionnels + +**Obligatoires (validation bloquante) :** +- `member_id` +- `slug` +- `status` +- `identity.legal_name` +- `identity.legal_form` +- `identity.joined_alliance_date` +- `contacts.primary` (name, email) +- `contacts.technical.email` +- `contacts.security.email` +- `infrastructure.dns.primary_ns` +- `services.status_page.url` + +**Recommandés (warning si absent) :** +- `identity.website` +- `infrastructure.dns.dnssec_enabled` +- `services.email` (si service email offert) +- `standards.open_source_percentage` +- `label.current` (si labellisé) + +**Optionnels (sans warning) :** +- `infrastructure.network.asn` +- `standards.certifications` +- `participation.contributions` +- `metadata.notes` + +--- + +### 2.3 Valeurs Enum (Contrôlées) + +**Statut membre (`status`) :** +- `probation` : En période probatoire (3 mois) +- `active` : Membre actif confirmé +- `suspended` : Suspendu temporairement +- `exited` : Sorti de L'Alliance (volontaire ou radiation) + +**Forme légale (`identity.legal_form`) :** +- `corporation` : Entreprise incorporée +- `coop` : Coopérative +- `npo` : Organisme à but non lucratif +- `sole_proprietorship` : Travailleur autonome + +**Niveau label (`label.current.level`) :** +- `bronze` +- `silver` +- `gold` +- `platinum` +- `null` : Non labellisé + +**Type contribution (`participation.contributions.type`) :** +- `code` : Contribution code (forge) +- `documentation` : Rédaction wiki/runbooks +- `mentoring` : Parrainage nouveau membre +- `audit` : Audit pair-à-pair +- `governance` : Participation cercle +- `infrastructure` : Support technique mutuel + +--- + +## SECTION 3 : VALIDATION AUTOMATIQUE + +### 3.1 YAML Lint (Syntaxe) + +**Outil : `yamllint`** + +**Configuration : `.yamllint`** +```yaml +extends: default + +rules: + line-length: + max: 120 + level: warning + + indentation: + spaces: 2 + + comments: + min-spaces-from-content: 2 + + document-start: + present: true +``` + +**Commande :** +```bash +yamllint membres/*.yml +``` + +**Résultat attendu :** +``` +membres/m001-chezlepro.yml + 0:0 warning missing document start "---" (document-start) + +membres/m002-technolibre.yml + 0:0 warning missing document start "---" (document-start) +``` + +--- + +### 3.2 JSON Schema (Structure) + +**Schéma : `schemas/member.schema.json`** + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://registraire.alliance-boreale.ca/schemas/member.schema.json", + "title": "Alliance Boréale - Fiche Membre", + "description": "Schéma de validation pour fiche membre", + "type": "object", + + "required": [ + "member_id", + "slug", + "status", + "identity", + "contacts", + "infrastructure", + "services" + ], + + "properties": { + "member_id": { + "type": "string", + "pattern": "^m[0-9]{3}$", + "description": "ID unique membre (format: mXXX)" + }, + + "slug": { + "type": "string", + "pattern": "^[a-z0-9-]{3,20}$", + "description": "Slug textuel unique (3-20 car, minuscules)" + }, + + "status": { + "type": "string", + "enum": ["probation", "active", "suspended", "exited"] + }, + + "identity": { + "type": "object", + "required": ["legal_name", "legal_form", "joined_alliance_date"], + "properties": { + "legal_name": { "type": "string", "minLength": 3 }, + "legal_form": { + "type": "string", + "enum": ["corporation", "coop", "npo", "sole_proprietorship"] + }, + "jurisdiction": { "type": "string", "pattern": "^[A-Z]{2}$" }, + "registration_number": { "type": "string" }, + "website": { "type": "string", "format": "uri" }, + "joined_alliance_date": { "type": "string", "format": "date" }, + "description": { "type": "string" } + } + }, + + "contacts": { + "type": "object", + "required": ["primary", "technical", "security"], + "properties": { + "primary": { + "type": "object", + "required": ["name", "email"], + "properties": { + "name": { "type": "string" }, + "role": { "type": "string" }, + "email": { "type": "string", "format": "email" }, + "phone": { "type": "string" }, + "matrix": { "type": "string" } + } + }, + "technical": { + "type": "object", + "required": ["email"], + "properties": { + "name": { "type": "string" }, + "email": { "type": "string", "format": "email" } + } + }, + "security": { + "type": "object", + "required": ["email"], + "properties": { + "email": { "type": "string", "format": "email" }, + "pgp_key": { "type": "string" } + } + } + } + }, + + "infrastructure": { + "type": "object", + "required": ["dns"], + "properties": { + "dns": { + "type": "object", + "required": ["primary_ns"], + "properties": { + "primary_ns": { "type": "string", "format": "hostname" }, + "secondary_ns": { "type": "string", "format": "hostname" }, + "dnssec_enabled": { "type": "boolean" } + } + } + } + }, + + "services": { + "type": "object", + "required": ["status_page"], + "properties": { + "status_page": { + "type": "object", + "required": ["url"], + "properties": { + "enabled": { "type": "boolean" }, + "url": { "type": "string", "format": "uri" } + } + } + } + }, + + "label": { + "type": "object", + "properties": { + "current": { + "type": "object", + "required": ["level", "score_global", "issued_date", "valid_until"], + "properties": { + "level": { + "type": "string", + "enum": ["bronze", "silver", "gold", "platinum"] + }, + "score_global": { + "type": "integer", + "minimum": 0, + "maximum": 100 + }, + "scores_by_domain": { + "type": "object", + "properties": { + "infrastructure": { "type": "integer", "minimum": 0, "maximum": 100 }, + "security": { "type": "integer", "minimum": 0, "maximum": 100 }, + "interoperability": { "type": "integer", "minimum": 0, "maximum": 100 }, + "open_source": { "type": "integer", "minimum": 0, "maximum": 100 }, + "operations": { "type": "integer", "minimum": 0, "maximum": 100 }, + "sustainability": { "type": "integer", "minimum": 0, "maximum": 100 } + } + }, + "issued_date": { "type": "string", "format": "date" }, + "valid_until": { "type": "string", "format": "date" } + } + } + } + } + } +} +``` + +**Validation :** +```bash +# Outil: ajv-cli (JSON Schema validator) +ajv validate -s schemas/member.schema.json -d "membres/*.yml" +``` + +--- + +### 3.3 CI/CD Pipeline + +**Fichier : `.gitlab-ci.yml` (ou `.github/workflows/validate.yml`)** + +```yaml +stages: + - validate + - test + - deploy + +# Job 1: Validation syntaxe YAML +yaml-lint: + stage: validate + image: python:3.11-alpine + before_script: + - pip install yamllint + script: + - yamllint membres/*.yml gouvernance/**/*.yml labels/**/*.yml + only: + - merge_requests + - main + +# Job 2: Validation structure (JSON Schema) +schema-validation: + stage: validate + image: node:18-alpine + before_script: + - npm install -g ajv-cli ajv-formats + script: + - ajv validate -s schemas/member.schema.json -d "membres/*.yml" + - ajv validate -s schemas/decision.schema.json -d "gouvernance/decisions/*.yml" + - ajv validate -s schemas/label.schema.json -d "labels/attributions/*.yml" + only: + - merge_requests + - main + +# Job 3: Vérification unicité slug/ID +uniqueness-check: + stage: test + image: python:3.11-alpine + before_script: + - pip install pyyaml + script: + - python scripts/check-uniqueness.py + only: + - merge_requests + - main + +# Job 4: Génération site web statique (optionnel) +generate-website: + stage: deploy + image: python:3.11-alpine + before_script: + - pip install pyyaml jinja2 + script: + - python scripts/generate-website.py + - mkdir -p public + - cp -r website/* public/ + artifacts: + paths: + - public + only: + - main +``` + +**Script `scripts/check-uniqueness.py` :** +```python +#!/usr/bin/env python3 +"""Vérifier unicité des IDs et slugs membres.""" + +import sys +from pathlib import Path +import yaml + +def check_uniqueness(): + members_dir = Path("membres") + + ids = [] + slugs = [] + + for file in members_dir.glob("*.yml"): + with open(file) as f: + data = yaml.safe_load(f) + + member_id = data.get("member_id") + slug = data.get("slug") + + if member_id in ids: + print(f"❌ ERREUR: ID {member_id} dupliqué dans {file}") + sys.exit(1) + ids.append(member_id) + + if slug in slugs: + print(f"❌ ERREUR: Slug {slug} dupliqué dans {file}") + sys.exit(1) + slugs.append(slug) + + print(f"✅ Validation OK: {len(ids)} membres, IDs et slugs uniques") + return 0 + +if __name__ == "__main__": + sys.exit(check_uniqueness()) +``` + +--- + +## SECTION 4 : PROCESSUS DE MISE À JOUR + +### 4.1 Modification par le Membre Lui-Même + +**Cas d'usage :** Mise à jour contact technique, ajout service, etc. + +**Processus :** + +1. **Cloner le dépôt** + ```bash + git clone https://forge.boreal.ca/alliance/registraire.git + cd registraire + ``` + +2. **Créer branche** + ```bash + git checkout -b update/m001-add-matrix-service + ``` + +3. **Éditer fiche** + ```bash + vim membres/m001-chezlepro.yml + # Ajouter section services.matrix + ``` + +4. **Valider localement** + ```bash + yamllint membres/m001-chezlepro.yml + ajv validate -s schemas/member.schema.json -d membres/m001-chezlepro.yml + ``` + +5. **Commit** + ```bash + git add membres/m001-chezlepro.yml + git commit -m "feat(m001): Add Matrix federation service" + ``` + +6. **Push et Pull Request** + ```bash + git push origin update/m001-add-matrix-service + # Ouvrir PR sur forge.boreal.ca + ``` + +7. **Review + Merge** + - Cercle Opérationnel review (vérification cohérence) + - CI/CD valide (tests automatiques) + - Merge dans `main` + +**Délai typique :** 1-3 jours. + +--- + +### 4.2 Modification par Cercle Opérationnel + +**Cas d'usage :** Changement statut, attribution label, décision gouvernance. + +**Processus similaire, mais :** +- Commit signé GPG (authentification) +- Mention dans commit message : `[CERCLE-OPS]` +- Review par 2+ membres du Cercle Opérationnel + +**Exemple :** +```bash +git commit -S -m "[CERCLE-OPS] feat(m001): Promote to Gold label (Q4 2025)" +``` + +--- + +### 4.3 Modification Urgente (Incident) + +**Cas d'usage :** Révocation certificat, changement IP urgent. + +**Processus accéléré :** +- Commit direct sur `main` autorisé (exception) +- Notification Matrix #incidents immédiate +- Justification dans commit message + +**Exemple :** +```bash +git commit -m "fix(m001): Update DNS IP after datacenter migration (P1 incident)" +git push origin main +# Post dans Matrix: "🚨 Update urgent registraire m001 (migration datacenter)" +``` + +**Post-mortem :** Documentation de l'incident + amélioration du processus si nécessaire. + +--- + +## SECTION 5 : GÉNÉRATION DE VUES + +### 5.1 Site Web Public + +**Concept :** Générer site web statique à partir des YAML (lecture seule). + +**URL :** `https://registraire.alliance-boreale.ca` + +**Pages générées :** +- `/` : Liste membres actifs +- `/membres/m001` : Fiche membre détaillée (infos publiques) +- `/labels` : Tableau de bord labels +- `/decisions` : Liste décisions publiques +- `/stats` : Statistiques agrégées + +**Technologie :** Python + Jinja2, ou Jekyll, ou Hugo. + +**Script `scripts/generate-website.py` (squelette) :** +```python +#!/usr/bin/env python3 +"""Générer site web statique à partir des YAML.""" + +from pathlib import Path +import yaml +from jinja2 import Environment, FileSystemLoader + +def generate(): + # Charger tous les membres + members = [] + for file in Path("membres").glob("*.yml"): + with open(file) as f: + data = yaml.safe_load(f) + if data["status"] in ["active", "probation"]: + members.append(data) + + # Trier par joined_date + members.sort(key=lambda m: m["identity"]["joined_alliance_date"]) + + # Générer HTML + env = Environment(loader=FileSystemLoader("templates")) + template = env.get_template("index.html") + + html = template.render(members=members) + + Path("website").mkdir(exist_ok=True) + with open("website/index.html", "w") as f: + f.write(html) + + print(f"✅ Site généré: {len(members)} membres") + +if __name__ == "__main__": + generate() +``` + +**Template `templates/index.html` :** +```html + + + + + Registraire — L'Alliance Boréale + + + +
+

🌲 L'Alliance Boréale — Registraire Public

+

Fédération de services numériques éthiques

+
+ +
+
+

Membres Actifs ({{ members|length }})

+ +
+ {% for member in members %} +
+

{{ member.identity.legal_name }}

+

ID: {{ member.member_id }}

+

Slug: {{ member.slug }}

+

Statut: {{ member.status }}

+ {% if member.label.current %} +

Label: {{ member.label.current.level }} ({{ member.label.current.score_global }}/100)

+ {% endif %} +

Site web

+
+ {% endfor %} +
+
+
+ + + + +``` + +--- + +### 5.2 API REST (Optionnel) + +**Concept :** Exposer données via API REST (lecture seule). + +**URL :** `https://api.registraire.alliance-boreale.ca` + +**Endpoints :** +``` +GET /members → Liste membres actifs +GET /members/{id} → Fiche membre détaillée +GET /members/{id}/label → Label actuel +GET /labels → Tous les labels actifs +GET /decisions → Décisions publiques +GET /stats → Statistiques agrégées +``` + +**Technologie :** FastAPI (Python) ou Express (Node.js). + +**Réponse JSON (exemple) :** +```json +GET /members/m001 + +{ + "member_id": "m001", + "slug": "chezlepro", + "status": "active", + "identity": { + "legal_name": "Chez le Pro Technologies Inc.", + "website": "https://chezle.pro" + }, + "label": { + "level": "gold", + "score_global": 82, + "issued_date": "2025-10-01", + "valid_until": "2026-10-01" + } +} +``` + +**Avantages :** +- Intégration facilitée (scripts, apps) +- Versioning API (v1, v2) +- Rate limiting (prévention abus) + +--- + +## SECTION 6 : SÉCURITÉ ET PERMISSIONS + +### 6.1 Accès en Lecture (Public) + +**Qui :** Tout le monde (internet public). + +**Quoi :** +- Fiches membres (infos publiques) +- Décisions publiées +- Labels attribués +- Zones DNS publiques + +**Comment :** Git clone (HTTPS), site web, API. + +--- + +### 6.2 Accès en Écriture (Restreint) + +**Qui :** +- Membres actifs (modification de LEUR fiche uniquement) +- Cercle Opérationnel (modification toutes fiches + gouvernance) +- Cercle Éthique (modification labels) + +**Authentification :** SSH keys + GPG signing. + +**Permissions Git :** +``` +# Exemple .gitignore permissions (conceptuel, pas standard Git) +membres/m001-*.yml → Éditable par m001 + Cercle Ops +membres/m002-*.yml → Éditable par m002 + Cercle Ops +gouvernance/* → Éditable par Cercle Stratégique + Ops +labels/* → Éditable par Cercle Éthique uniquement +dns/* → Éditable par Cercle Ops uniquement +``` + +**Implémentation réelle :** Forge (GitLab/Gitea) avec roles et protected branches. + +--- + +### 6.3 Audit Trail (Traçabilité) + +**Git = Audit trail natif :** +- Chaque commit = auteur, date, message +- Signature GPG = authentification cryptographique +- Historique complet (`git log`) + +**Exemple :** +```bash +git log --oneline --graph membres/m001-chezlepro.yml + +* a3b4c5d (HEAD -> main) feat(m001): Update Matrix federation URL +* 9f8e7d6 feat(m001): Add Gold label (Q4 2025) +* 2c3d4e5 fix(m001): Correct technical contact email +* 1a2b3c4 feat: Add member m001 (Chez le Pro) +``` + +**Requêtes utiles :** +```bash +# Qui a modifié quoi ? +git log --all --author="jean@chezle.pro" + +# Quand ce champ a-t-il changé ? +git log -p -S "mail.chezlepro.boreal.ca" membres/m001-chezlepro.yml + +# Liste des commits entre deux dates +git log --since="2025-10-01" --until="2025-10-31" +``` + +--- + +## CONCLUSION + +Le Registraire YAML est **simple mais puissant** : + +✅ **Lisible** : N'importe qui peut lire un fichier YAML +✅ **Versionné** : Git track tous les changements +✅ **Validé** : Schemas + CI/CD garantissent cohérence +✅ **Auditable** : Historique complet, signatures GPG +✅ **Extensible** : Facile d'ajouter champs (rétrocompatible) +✅ **Distribué** : Chaque membre peut cloner +✅ **Machine-readable** : Scripts, Ansible, APIs + +**Ce n'est pas une base de données relationnelle complexe. C'est mieux : c'est Git.** + +La complexité ne vient pas de l'outil, mais de la rigueur des processus. Avec des conventions claires, des reviews systématiques, et des tests automatiques, le Registraire devient la colonne vertébrale informationnelle de L'Alliance. + +**Bienvenue dans le registraire boréal.** 🌲 + +--- + +## ANNEXES + +### Annexe A : Exemple Membre Complet (m002) + +**Fichier : `membres/m002-technolibre.yml`** + +```yaml +--- +member_id: m002 +slug: technolibre +status: active + +identity: + legal_name: "TechnoLibre SENC" + legal_form: coop + jurisdiction: QC + registration_number: "9876543210" + website: "https://technolibre.ca" + joined_alliance_date: "2025-02-01" + probation_end_date: null + description: | + TechnoLibre est une coopérative de développeurs offrant du développement + logiciel sur mesure et de l'hébergement souverain. Spécialisés en Odoo + et Python/Django. + +contacts: + primary: + name: "Sophie Lavoie" + role: "Présidente" + email: "sophie@technolibre.ca" + phone: "+1-418-555-0200" + matrix: "@sophie:matrix.technolibre.boreal.ca" + + technical: + name: "Marc Dubois" + role: "Lead DevOps" + email: "marc@technolibre.ca" + matrix: "@marc:matrix.technolibre.boreal.ca" + + security: + email: "security@technolibre.ca" + pgp_key: "0xABCDEF1234567890" + +infrastructure: + hosting: + provider: "OVH France" + datacenter_location: "Strasbourg, France" + owned: false + + network: + ipv4_public: + - "198.51.100.20/32" + ipv4_private: "10.2.0.0/16" + + dns: + primary_ns: "ns1.technolibre.boreal.ca" + secondary_ns: "ns2.technolibre.boreal.ca" + ns_ips: + ns1: "198.51.100.20" + ns2: "198.51.100.21" + dnssec_enabled: false + +services: + email: + enabled: true + domain: "technolibre.ca" + mx_records: + - priority: 10 + host: "mail.technolibre.boreal.ca" + protocols: [smtp, imap] + security: + dkim: true + spf: true + dmarc: true + + cloud_storage: + enabled: true + platform: nextcloud + url: "https://cloud.technolibre.boreal.ca" + + status_page: + enabled: true + url: "https://status.technolibre.boreal.ca" + platform: cachet + +standards: + open_source_percentage: 95 + protocols_supported: [smtp, imap, caldav, carddav, webdav] + compliance: + loi_25: true + rgpd: true + +label: + current: + level: silver + score_global: 70 + issued_date: "2025-06-01" + valid_until: "2026-06-01" + audited_by: "m001" + +participation: + cercles: + - name: "Cercle Stratégique" + role: "membre" + since: "2025-02-01" + +metadata: + created_at: "2025-02-01T09:00:00Z" + updated_at: "2025-10-20T11:15:00Z" + version: 2 +``` + +--- + +### Annexe B : Schéma Décision + +**Fichier : `schemas/decision.schema.json` (extrait)** + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Décision de Gouvernance", + "type": "object", + "required": ["decision_id", "date", "circle", "type", "outcome"], + "properties": { + "decision_id": { + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{3}$", + "description": "Format: YYYY-NNN" + }, + "date": { "type": "string", "format": "date" }, + "circle": { + "type": "string", + "enum": ["strategic", "operational", "ethics", "referents"] + }, + "type": { + "type": "string", + "enum": ["admission", "policy", "budget", "label", "amendment", "other"] + }, + "outcome": { + "type": "string", + "enum": ["approved", "rejected", "amended"] + } + } +} +``` + +--- + +### Annexe C : Commandes Utiles + +**Recherche membre par slug :** +```bash +grep -l "slug: chezlepro" membres/*.yml +``` + +**Liste membres actifs :** +```bash +grep -l "status: active" membres/*.yml | wc -l +``` + +**Extraction infos avec `yq` :** +```bash +# Installer: apt install yq +yq eval '.identity.legal_name' membres/m001-chezlepro.yml +# Output: Chez le Pro Technologies Inc. + +yq eval '.label.current.level' membres/m001-chezlepro.yml +# Output: gold +``` + +**Statistiques labels :** +```bash +for file in membres/*.yml; do + level=$(yq eval '.label.current.level // "none"' "$file") + echo "$level" +done | sort | uniq -c + +# Output: +# 5 gold +# 8 silver +# 3 bronze +# 2 none +``` + +--- + +## MÉTADONNÉES + +**Document :** 14_Structure_YAML_Registraire.md +**Version :** 1.0 +**Date de création :** 23 octobre 2025 +**Auteur :** Claude (profils #5 IaC, #12 Documentaliste) +**Révision par :** Cercle Opérationnel +**Statut :** À adopter par Cercle Stratégique +**Longueur :** ~6 000 mots (12 pages) +**Licence :** CC BY-SA 4.0 + +**Sources utilisées :** +- `00_Glossaire_et_Definitions.md` +- `05_Architecture_Reference_Standards_Techniques.md` +- `03_Cadre_Conformite_Label_Prestige.md` +- `devis_alliance_boreale_v2.md` + +**Prochaine révision prévue :** Octobre 2026 (après 1 an d'usage) + +--- + +**Changelog :** +- 2025-10-23 v1.0 : Création initiale Structure YAML Registraire + +--- + +**FIN DE LA STRUCTURE YAML** + +*"La donnée bien structurée est la moitié du travail accompli."* + +🌲 **L'Alliance Boréale** +*YAML + Git = Source de vérité vivante.*