28 KiB
28 KiB
Document 14 : Structure YAML du Registraire
L'Alliance Boréale — Source de Vérité Unique
Version : 1.0
Date : 20 octobre 2025
Statut : Production
Auteur : L'Alliance Boréale
📋 Table des matières
- Philosophie du Registraire
- Architecture des Fichiers
- Schéma : Fiche Membre (partner.yml)
- Schéma : Allocations Réseau (network/allocations.yml)
- Schéma : Labels et Conformité (labels/)
- Schéma : Gouvernance (governance/)
- Schéma : Topologie VPN (network/topology.yml)
- Processus de Mise à Jour
- Validation et Intégrité
- Exemples Complets
1. Philosophie du Registraire
1.1 Principes fondateurs
Le Registraire de L'Alliance Boréale est la source de vérité unique pour :
- L'identité de chaque membre
- Les allocations réseau (/16 par membre)
- Les niveaux de label et dates d'expiration
- La topologie VPN et tunnels peer-to-peer
- Les décisions de gouvernance et audits
1.2 Caractéristiques clés
| Caractéristique | Description |
|---|---|
| Lisibilité | YAML humain ET machine |
| Versionnement | Git avec signatures PGP |
| Transparence | Public par défaut (sauf secrets) |
| Décentralisation | Miroirs chez chaque membre |
| Automatisation | Consommable par Ansible/scripts |
1.3 Localisation
registry.alliance-boreale.ca/
├── README.md
├── members/ # Fiches individuelles
├── network/ # Allocations IP et VPN
├── labels/ # Historique des labels
├── governance/ # Décisions et cercles
└── schemas/ # Validation JSONSchema
URL publique : https://registry.alliance-boreale.ca
Dépôt Git : git@forge.alliance-boreale.ca:alliance/registry.git
2. Architecture des Fichiers
2.1 Arborescence complète
registry.alliance-boreale.ca/
│
├── members/
│ ├── czp-001-chezlepro.yml # Chezlepro inc.
│ ├── nul-002-nuagelibre.yml # Nuage Libre
│ ├── tli-003-technolibre.yml # TechnoLibre
│ └── ...
│
├── network/
│ ├── allocations.yml # Blocs /16 par membre
│ ├── topology.yml # Tunnels VPN déclarés
│ └── dns-zones.yml # Zones DNS fédérées
│
├── labels/
│ ├── 2025-Q1.yml # Labels attribués Q1 2025
│ ├── 2025-Q2.yml
│ └── history/
│ └── czp-001-label-history.yml # Historique Chezlepro
│
├── governance/
│ ├── circles.yml # Composition des cercles
│ ├── decisions/
│ │ ├── 2025-001-admission-nuagelibre.yml
│ │ └── 2025-002-allocation-10.1.0.0.yml
│ └── resolutions/
│ └── 2025-R01-constitution-pilote.yml
│
└── schemas/
├── member-schema.json # Validation fiches membres
├── network-schema.json
└── label-schema.json
2.2 Conventions de nommage
| Élément | Format | Exemple |
|---|---|---|
| ID Membre | [aaa]-[nnn] |
czp-001 |
| Fichier Membre | [id]-[shortname].yml |
czp-001-chezlepro.yml |
| Bloc Réseau | 10.[N].0.0/16 |
10.0.0.0/16 |
| Décision | YYYY-[NNN]-[titre].yml |
2025-001-admission.yml |
3. Schéma : Fiche Membre (partner.yml)
3.1 Schéma complet
# members/czp-001-chezlepro.yml
# ═══════════════════════════════════════════════════════
# IDENTITÉ
# ═══════════════════════════════════════════════════════
id: czp-001
status: active # active | probation | suspended | exited
shortname: chezlepro
legal:
name: "Chezlepro inc."
type: corporation # corporation | cooperative | npo | sole_proprietorship
jurisdiction: QC
registration_number: "1234567890 QC"
founded: 2018-03-15
headquarters:
city: "Saint-Bruno-de-Montarville"
province: "Québec"
country: "Canada"
# ═══════════════════════════════════════════════════════
# CONTACTS
# ═══════════════════════════════════════════════════════
contacts:
legal:
email: legal@chezlepro.ca
pgp: "0xABCD1234"
security:
email: security@chezlepro.ca
pgp: "0xEF567890"
phone: "+1-450-555-0100"
noc: # Network Operations Center
email: noc@chezlepro.ca
phone: "+1-450-555-0101"
oncall: "https://status.chezlepro.ca/oncall"
privacy:
email: privacy@chezlepro.ca
officer: "Daniel Laroche"
# ═══════════════════════════════════════════════════════
# ADHÉSION
# ═══════════════════════════════════════════════════════
membership:
joined: 2025-01-15
probation_end: 2025-04-15
sponsor: null # Membre fondateur
founding_member: true
roles:
- "Membre fondateur"
- "Gardien temporaire"
- "Coordinateur technique"
# ═══════════════════════════════════════════════════════
# LABEL DE CONFORMITÉ
# ═══════════════════════════════════════════════════════
label:
level: gold # bronze | silver | gold | platinum
score: 88
issued: 2025-10-12
valid_until: 2026-10-12
auditor: nul-002 # Audité par Nuage Libre
domains:
governance: 5
security: 5
privacy: 4
interoperability: 5
operations: 5
sustainability: 4
# ═══════════════════════════════════════════════════════
# RÉSEAU & DNS
# ═══════════════════════════════════════════════════════
network:
ipv4_block: 10.0.0.0/16
segments:
management: 10.0.0.0/24
platform: 10.0.1.0/24
public_dns: 10.0.2.0/24
tenant_infra: 10.0.10.0/23
reserved: 10.0.20.0/22
expansion: 10.0.128.0/17
gateway: 10.0.0.1
dns:
primary: 10.0.2.10
secondary: 10.0.2.11
public_nameservers:
- name: ns1.chezlepro.ca
ipv4: 203.0.113.10
ipv6: 2001:db8:czp::10
- name: ns2.chezlepro.ca
ipv4: 203.0.113.11
ipv6: 2001:db8:czp::11
asn: null # Optionnel si BGP
# ═══════════════════════════════════════════════════════
# VPN & FÉDÉRATION
# ═══════════════════════════════════════════════════════
vpn:
topology: selective # complete | regional | selective
wireguard:
public_key: "AbCdEf1234567890+GhIjKlMnOpQrStUvWxYz="
endpoint: vpn.chezlepro.ca:51820
allowed_ips:
- 10.0.0.0/16
tunnels:
- peer_id: nul-002
subnet: 10.200.0.0/30
status: active
established: 2025-02-20
- peer_id: tli-003
subnet: 10.200.0.4/30
status: active
established: 2025-03-10
# ═══════════════════════════════════════════════════════
# SERVICES OFFERTS
# ═══════════════════════════════════════════════════════
services:
dns:
enabled: true
role: primary
zones:
- chezlepro.ca
- alliance-boreale.ca # Zone fédérée
email:
enabled: true
domains:
- chezlepro.ca
mx_records:
- mx1.chezlepro.ca (priority 10)
- mx2.chezlepro.ca (priority 20)
identity:
enabled: true
provider: keycloak
url: https://id.chezlepro.ca
realms:
- boreal # Realm fédéré
- chezlepro # Realm interne
federation_metadata: https://id.chezlepro.ca/realms/boreal/.well-known/openid-configuration
files:
enabled: true
platform: nextcloud
url: https://nuage.chezlepro.ca
federation: true
forge:
enabled: true
platform: forgejo
url: https://forge.chezlepro.ca
federation: true
monitoring:
enabled: true
platform: prometheus-grafana
public_status: https://status.chezlepro.ca
federation_metrics: https://metrics.chezlepro.ca/federated
# ═══════════════════════════════════════════════════════
# URLS PUBLIQUES
# ═══════════════════════════════════════════════════════
public_urls:
website: https://chezlepro.ca
status: https://status.chezlepro.ca
policies: https://chezlepro.ca/policies
privacy_policy: https://chezlepro.ca/policies/privacy
security_policy: https://chezlepro.ca/policies/security
sustainability: https://chezlepro.ca/sustainability
federation_metadata: https://id.chezlepro.ca/.well-known/openid-configuration
# ═══════════════════════════════════════════════════════
# VALEURS & ENGAGEMENTS
# ═══════════════════════════════════════════════════════
values:
open_source: true
local_hosting: true
privacy_first: true
sustainability: true
libre_software: true
software_stack:
os: "Debian 12"
virtualization: "Proxmox VE 8"
storage: "Ceph Quincy"
orchestration: "Ansible"
monitoring: "Prometheus + Grafana"
dns: "PowerDNS"
identity: "Keycloak"
# ═══════════════════════════════════════════════════════
# CONTRIBUTIONS À L'ALLIANCE
# ═══════════════════════════════════════════════════════
contributions:
timebank_balance: 42 # Crédits banque de temps
audits_performed:
- member_id: nul-002
date: 2025-09-15
level: silver
- member_id: tli-003
date: 2025-08-20
level: bronze
tools_contributed:
- name: ansible-role-powerdns
repo: https://forge.alliance-boreale.ca/tools/ansible-powerdns
license: MIT
- name: monitoring-dashboard-boreal
repo: https://forge.alliance-boreale.ca/tools/grafana-boreal
license: AGPL-3.0
documentation:
- title: "Guide DNS Fédéré"
url: https://docs.alliance-boreale.ca/dns-federe
- title: "Template Proxmox SDN"
url: https://docs.alliance-boreale.ca/proxmox-sdn
# ═══════════════════════════════════════════════════════
# MÉTADONNÉES
# ═══════════════════════════════════════════════════════
metadata:
created: 2025-01-15T10:00:00Z
updated: 2025-10-12T14:30:00Z
schema_version: "1.0"
signatures:
- signer: "Daniel Laroche (Chezlepro)"
pgp: "0xABCD1234"
date: 2025-10-12
signature: "-----BEGIN PGP SIGNATURE-----..."
4. Schéma : Allocations Réseau
4.1 Fichier global (network/allocations.yml)
# network/allocations.yml
# ═══════════════════════════════════════════════════════
# ALLOCATIONS IPv4 (/16 par membre)
# ═══════════════════════════════════════════════════════
allocations:
- member_id: czp-001
block: 10.0.0.0/16
assigned: 2025-01-15
status: active
notes: "Membre fondateur - Chezlepro inc."
- member_id: nul-002
block: 10.1.0.0/16
assigned: 2025-02-20
status: active
notes: "Nuage Libre - Québec"
- member_id: tli-003
block: 10.2.0.0/16
assigned: 2025-03-10
status: active
notes: "TechnoLibre - Saguenay"
# Blocs réservés pour croissance
reserved:
- block: 10.3.0.0/16
reserved_for: future_member
- block: 10.4.0.0/16
reserved_for: future_member
- block: 10.255.0.0/16
reserved_for: infrastructure_shared
# ═══════════════════════════════════════════════════════
# RÈGLES D'ALLOCATION
# ═══════════════════════════════════════════════════════
allocation_policy:
block_size: /16
range_start: 10.0.0.0/16
range_end: 10.254.0.0/16
sequential: true
segments_standard:
management: /24
platform: /24
public_dns: /24
tenant_infra: /23
reserved: /22
expansion: /17
5. Schéma : Labels et Conformité
5.1 Labels trimestriels (labels/2025-Q4.yml)
# labels/2025-Q4.yml
# ═══════════════════════════════════════════════════════
# LABELS ATTRIBUÉS - Q4 2025
# ═══════════════════════════════════════════════════════
quarter: 2025-Q4
issued_date: 2025-10-01
expires_date: 2026-10-01
labels:
- member_id: czp-001
member_name: "Chezlepro inc."
level: gold
score: 88
issued: 2025-10-12
valid_until: 2026-10-12
auditor: nul-002
scores:
governance: 5
security: 5
privacy: 4
interoperability: 5
operations: 5
sustainability: 4
notes: "Excellent. Recommandation pour Platine en 2026."
- member_id: nul-002
member_name: "Nuage Libre"
level: silver
score: 72
issued: 2025-09-15
valid_until: 2026-09-15
auditor: czp-001
scores:
governance: 4
security: 4
privacy: 5
interoperability: 4
operations: 3
sustainability: 4
notes: "Solide. Plan d'amélioration pour Or en cours."
- member_id: tli-003
member_name: "TechnoLibre"
level: bronze
score: 63
issued: 2025-08-20
valid_until: 2026-08-20
auditor: czp-001
scores:
governance: 3
security: 3
privacy: 4
interoperability: 4
operations: 3
sustainability: 3
notes: "Conforme. Progression vers Argent planifiée."
# ═══════════════════════════════════════════════════════
# STATISTIQUES
# ═══════════════════════════════════════════════════════
statistics:
total_members: 3
platinum: 0
gold: 1
silver: 1
bronze: 1
average_score: 74.3
5.2 Historique individuel (labels/history/czp-001-label-history.yml)
# labels/history/czp-001-label-history.yml
member_id: czp-001
member_name: "Chezlepro inc."
history:
- quarter: 2025-Q4
level: gold
score: 88
issued: 2025-10-12
auditor: nul-002
progression: +3 # Progression depuis dernier audit
- quarter: 2025-Q2
level: gold
score: 85
issued: 2025-04-15
auditor: external
progression: "initial"
trends:
governance: stable
security: stable
privacy: improving
interoperability: stable
operations: stable
sustainability: improving
6. Schéma : Gouvernance
6.1 Composition des cercles (governance/circles.yml)
# governance/circles.yml
# ═══════════════════════════════════════════════════════
# CERCLES SOCIOCRATIQUES
# ═══════════════════════════════════════════════════════
version: "1.0"
updated: 2025-10-12
cercle_strategique:
mandate: "Vision, orientation, admission nouveaux membres"
term_months: 12
decision_mode: consentement
members:
- member_id: czp-001
role: "Président & Fondateur"
joined: 2025-01-15
term_end: 2026-01-15
- member_id: nul-002
role: "Membre permanent"
joined: 2025-02-20
term_end: 2026-02-20
- member_id: tli-003
role: "Membre permanent"
joined: 2025-03-10
term_end: 2026-03-10
next_meeting: 2025-11-15T14:00:00Z
meeting_frequency: quarterly
cercle_operationnel:
mandate: "Coordination technique, infrastructure, outils communs"
term_months: 6
decision_mode: consentement_avec_vote_majoritaire
members:
- member_id: czp-001
role: "Coordinateur technique"
term_end: 2026-04-15
- member_id: nul-002
role: "Responsable DNS"
term_end: 2026-04-15
- member_id: tli-003
role: "Responsable VPN/Réseau"
term_end: 2026-04-15
next_meeting: 2025-11-01T10:00:00Z
meeting_frequency: monthly
cercle_ethique_conformite:
mandate: "Label, audits, arbitrages, communication publique"
term_months: 24
decision_mode: consentement_renforce
members:
- member_id: czp-001
role: "Président comité éthique"
term_end: 2027-01-15
- member_id: nul-002
role: "Auditeur principal"
term_end: 2027-02-20
next_meeting: 2025-11-08T13:00:00Z
meeting_frequency: biweekly
6.2 Décisions (governance/decisions/2025-001-admission-nuagelibre.yml)
# governance/decisions/2025-001-admission-nuagelibre.yml
decision_id: 2025-001
type: admission
title: "Admission de Nuage Libre comme membre"
proposed_by:
member_id: czp-001
date: 2025-02-10
proposal:
subject: "Admission de Nuage Libre (Québec)"
justification: |
Nuage Libre remplit tous les critères:
- Hébergeur local québécois
- 100% logiciels libres
- Valeurs alignées
- Infrastructure compatible
requested_block: 10.1.0.0/16
probation_period: 90_days
discussion_period:
start: 2025-02-10
end: 2025-02-24
comments: 3
vote:
method: consentement
date: 2025-02-20
result: adopted
votes:
- member_id: czp-001
vote: consent
comment: "Excellent partenaire"
- member_id: tli-003
vote: consent
comment: "Infrastructure solide"
decision:
status: adopted
implemented: 2025-02-20
notes: "Allocation 10.1.0.0/16 effectuée. Probation jusqu'au 2025-05-20."
signatures:
- member_id: czp-001
role: "Président Cercle Stratégique"
date: 2025-02-20
pgp_signature: "-----BEGIN PGP SIGNATURE-----..."
7. Schéma : Topologie VPN
7.1 Tunnels déclarés (network/topology.yml)
# network/topology.yml
# ═══════════════════════════════════════════════════════
# TOPOLOGIE VPN PEER-TO-PEER
# ═══════════════════════════════════════════════════════
version: "1.0"
updated: 2025-10-12
tunnels:
- tunnel_id: t001
peers:
- member_id: czp-001
endpoint: vpn.chezlepro.ca:51820
public_key: "AbCdEf1234567890+GhIjKlMnOpQrStUvWxYz="
- member_id: nul-002
endpoint: vpn.nuagelibre.ca:51820
public_key: "ZyXwVuTsRqPoNmLkJiHgFeDcBa0987654321+="
subnet: 10.200.0.0/30
czp_ip: 10.200.0.1
nul_ip: 10.200.0.2
status: active
established: 2025-02-20
last_seen: 2025-10-12T14:25:00Z
metrics:
latency_ms: 12
packet_loss: 0.01
bandwidth_mbps: 1000
- tunnel_id: t002
peers:
- member_id: czp-001
endpoint: vpn.chezlepro.ca:51820
public_key: "AbCdEf1234567890+GhIjKlMnOpQrStUvWxYz="
- member_id: tli-003
endpoint: vpn.technolibre.org:51820
public_key: "1234567890AbCdEfGhIjKlMnOpQrStUvWxYz+="
subnet: 10.200.0.4/30
czp_ip: 10.200.0.5
tli_ip: 10.200.0.6
status: active
established: 2025-03-10
last_seen: 2025-10-12T14:26:00Z
metrics:
latency_ms: 25
packet_loss: 0.02
bandwidth_mbps: 500
- tunnel_id: t003
peers:
- member_id: nul-002
endpoint: vpn.nuagelibre.ca:51821
public_key: "ZyXwVuTsRqPoNmLkJiHgFeDcBa0987654321+="
- member_id: tli-003
endpoint: vpn.technolibre.org:51821
public_key: "1234567890AbCdEfGhIjKlMnOpQrStUvWxYz+="
subnet: 10.200.0.8/30
nul_ip: 10.200.0.9
tli_ip: 10.200.0.10
status: active
established: 2025-04-05
last_seen: 2025-10-12T14:27:00Z
metrics:
latency_ms: 18
packet_loss: 0.00
bandwidth_mbps: 750
# ═══════════════════════════════════════════════════════
# STATISTIQUES RÉSEAU
# ═══════════════════════════════════════════════════════
statistics:
total_tunnels: 3
active_tunnels: 3
total_members: 3
full_mesh: true
average_latency_ms: 18.3
average_packet_loss: 0.01
8. Processus de Mise à Jour
8.1 Workflow Git
# Modification d'une fiche membre
cd registry.alliance-boreale.ca
git checkout -b update-czp-001-label
# Éditer la fiche
vim members/czp-001-chezlepro.yml
# Valider avec schema
yamllint members/czp-001-chezlepro.yml
jsonschema -i members/czp-001-chezlepro.yml schemas/member-schema.json
# Commit signé PGP
git add members/czp-001-chezlepro.yml
git commit -S -m "Update: Chezlepro label Gold → Platinum
- Score: 88 → 92
- Sustainability: 4 → 5
- Valid until: 2026-10-12
Audited by: nul-002
Signed-off-by: Daniel Laroche <daniel@chezlepro.ca>"
# Push et merge request
git push origin update-czp-001-label
8.2 Validation automatique
# .gitlab-ci.yml
stages:
- validate
- publish
validate_yaml:
stage: validate
script:
- yamllint members/*.yml
- yamllint network/*.yml
- yamllint labels/*.yml
- python3 validate-schemas.py
only:
- merge_requests
validate_signatures:
stage: validate
script:
- ./scripts/verify-pgp-signatures.sh
only:
- merge_requests
publish_registry:
stage: publish
script:
- rsync -av . registry.alliance-boreale.ca:/var/www/registry/
- ./scripts/generate-static-site.sh
only:
- main
9. Validation et Intégrité
9.1 JSONSchema pour validation
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Alliance Boréale Member Schema",
"type": "object",
"required": ["id", "status", "legal", "contacts", "network"],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z]{3}-[0-9]{3}$"
},
"status": {
"type": "string",
"enum": ["active", "probation", "suspended", "exited"]
},
"legal": {
"type": "object",
"required": ["name", "type", "jurisdiction"],
"properties": {
"name": {"type": "string"},
"type": {
"type": "string",
"enum": ["corporation", "cooperative", "npo", "sole_proprietorship"]
}
}
},
"network": {
"type": "object",
"required": ["ipv4_block"],
"properties": {
"ipv4_block": {
"type": "string",
"pattern": "^10\\.[0-9]{1,3}\\.0\\.0/16$"
}
}
}
}
}
9.2 Signatures PGP
Chaque modification critique doit être signée :
# Signer un commit
git commit -S -m "Critical: Update member czp-001"
# Vérifier les signatures
git log --show-signature
# Vérifier l'intégrité du registre
./scripts/verify-registry-integrity.sh
10. Exemples Complets
10.1 Scénario : Nouveau membre
# members/abc-004-nouveau.yml
id: abc-004
status: probation
shortname: nouveau
legal:
name: "Nouveau Hébergeur Coop"
type: cooperative
jurisdiction: QC
registration_number: "9876543210 QC"
founded: 2023-06-01
contacts:
legal:
email: legal@nouveau.coop
security:
email: security@nouveau.coop
noc:
email: noc@nouveau.coop
membership:
joined: 2025-10-20
probation_end: 2026-01-20
sponsor: czp-001
label:
level: null # Pas encore évalué
score: null
network:
ipv4_block: 10.3.0.0/16
gateway: 10.3.0.1
dns:
primary: 10.3.2.10
secondary: 10.3.2.11
vpn:
topology: selective
wireguard:
public_key: "NewPublicKey123456789+="
endpoint: vpn.nouveau.coop:51820
tunnels: [] # Aucun tunnel établi encore
services:
dns:
enabled: false # En configuration
email:
enabled: true
identity:
enabled: false # Planifié
public_urls:
website: https://nouveau.coop
status: https://status.nouveau.coop
values:
open_source: true
local_hosting: true
privacy_first: true
sustainability: true
contributions:
timebank_balance: 0
audits_performed: []
tools_contributed: []
metadata:
created: 2025-10-20T09:00:00Z
updated: 2025-10-20T09:00:00Z
schema_version: "1.0"
10.2 Commande d'allocation réseau
#!/bin/bash
# scripts/allocate-network.sh
MEMBER_ID="abc-004"
MEMBER_NAME="Nouveau Hébergeur Coop"
# Trouver le prochain /16 disponible
NEXT_BLOCK=$(python3 scripts/find-next-block.py)
echo "Allocating: $NEXT_BLOCK to $MEMBER_ID"
# Créer l'entrée dans allocations.yml
cat >> network/allocations.yml <<EOF
- member_id: $MEMBER_ID
block: $NEXT_BLOCK
assigned: $(date -I)
status: active
notes: "$MEMBER_NAME"
EOF
# Commit
git add network/allocations.yml
git commit -S -m "Allocate $NEXT_BLOCK to $MEMBER_ID"
echo "✅ Network allocated: $NEXT_BLOCK"
📝 Notes Importantes
Sécurité
- ⚠️ Jamais de clés privées dans le registre
- ⚠️ Jamais de mots de passe ou secrets
- ✅ Seulement clés publiques (WireGuard, PGP)
- ✅ Signatures PGP pour traçabilité
Miroirs
- Chaque membre maintient une copie locale
- Synchronisation horaire via
git pull - Fallback si registraire principal inaccessible
Évolution
- Schema versioning (
schema_version: "1.0") - Migration scripts pour changements majeurs
- Rétrocompatibilité garantie 12 mois
🎯 Checklist d'Intégration
Pour un nouveau membre :
- Créer fiche
members/xxx-###-nom.yml - Allouer bloc /16 dans
network/allocations.yml - Générer clés WireGuard publiques
- Configurer DNS primaire/secondaire
- Établir tunnels VPN avec pairs
- Publier métadonnées de fédération
- Audit initial (probation)
- Attribution label Bronze minimum
- Validation par Cercle Stratégique
- Commit signé + merge
Version : 1.0
Maintenu par : L'Alliance Boréale - Cercle Opérationnel
Licence : CC-BY-SA 4.0
Contact : registry@alliance-boreale.ca
« Le Registraire est notre mémoire collective. »
— L'Alliance Boréale