alliance-boreale/docs/constitution/05_Architecture_Reference_Standards_Techniques.md

1872 lines
50 KiB
Markdown
Raw Normal View History

# 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 = <clé_privée_m001>
Address = 10.100.1.1/32
ListenPort = 51820
[Peer]
# m002
PublicKey = <clé_publique_m002>
AllowedIPs = 10.100.2.1/32, 10.2.0.0/16
Endpoint = m002.example.com:51820
PersistentKeepalive = 25
```
**Sur m002 :**
```ini
[Interface]
PrivateKey = <clé_privée_m002>
Address = 10.100.2.1/32
ListenPort = 51820
[Peer]
# m001
PublicKey = <clé_publique_m001>
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 <IP_publique_m001>
ns2.boreal.ca. A <IP_publique_m002>
ns3.boreal.ca. A <IP_publique_m003>
```
---
#### 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 <IP_m001>
ns2 A <IP_m002>
ns3 A <IP_m003>
; Outils communs L'Alliance
registraire A <IP_tool_server>
forge A <IP_tool_server>
wiki A <IP_tool_server>
matrix A <IP_tool_server>
; 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 <hash>
```
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 <domain>"
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.*