đ DĂ©ploiement â
Cette page explique comment les services passent du dĂ©pĂŽt Infrastructure, public, aux serveurs. Tout ce que dĂ©ploie Ansible y est dĂ©crit, et un changement passe toujours par une pull request vĂ©rifiĂ©e par lâintĂ©gration continue avant dâĂȘtre appliquĂ©. Ce site a son propre dĂ©pĂŽt et sa propre publication (voir Ce site).
đ Organisation du dĂ©pĂŽt â
| Dossier | Contenu |
|---|---|
services/<service>/ | Un dossier par service : playbook deploy.yml, fichier compose.yml, configurations et modÚles copiés |
hosts/ | Playbooks propres aux hĂŽtes : compte dâautomatisation, rĂ©plication, mises Ă jour |
dns/ | Un playbook par zone DNS Cloudflare (voir DNS) |
inventory/ | HĂŽtes, un groupe par service indiquant lâhĂŽte qui le porte, rĂ©glages propres Ă chaque hĂŽte |
roles/ | RÎles partagés : compose_service, zitadel_applications |
opentofu/zitadel/ | Applications OIDC de Zitadel (voir Architecture) |
vault/ | Sous-module privé contenant les secrets chiffrés (voir Sécurité) |
site.yml | Importe le playbook de chaque service, Traefik en premier |
Les dossiers et groupes portent le nom de la fonction du service (authentification, deploiement, etatâŠ), pas celui du logiciel : remplacer un logiciel ne change pas lâorganisation.
Lâinventaire associe chaque service Ă un hĂŽte. DĂ©placer un service revient Ă changer son groupe dans inventory/hosts.yml ; les faits propres Ă un hĂŽte (dossier racine des services, rĂ©seau du proxy, noms DNS) sont dans ses variables dâhĂŽte, jamais dans les playbooks.
đ§± RĂŽle compose_service â
Chaque service Docker Compose est dĂ©ployĂ© par le mĂȘme rĂŽle, roles/compose_service. Le playbook dâun service se limite Ă lui passer des paramĂštres. Le rĂŽle :
- crĂ©e le dossier du service sous la racine des services de lâhĂŽte (les permissions ne sont posĂ©es quâĂ la crĂ©ation : les dossiers existants de TrueNAS gardent leurs ACL) ;
- copie
compose.ymlet les fichiers de configuration, rend les modÚles Jinja ; - écrit le fichier
.env(lisible par son seul propriĂ©taire) avec les variables et secrets du service, dont lâutilisateur et le groupe sous lesquels tournent les conteneurs ; - crĂ©e Ă lâavance les fichiers montĂ©s dans les conteneurs, sinon Docker crĂ©erait un dossier Ă leur place, ainsi que les rĂ©seaux externes dĂ©clarĂ©s ;
- dĂ©marre la pile : les conteneurs ne sont recréés que si leur image ou leur configuration change, et redĂ©marrĂ©s quand un fichier de configuration change (sauf pour les fichiers que le service recharge lui-mĂȘme) ;
- fait pointer les enregistrements DNS du service vers lâhĂŽte, en public ou en privĂ© (voir DNS).
Le rĂŽle signale aussi un rĂ©seau existant qui ne correspond plus Ă sa dĂ©claration, sans jamais le recrĂ©er de lui-mĂȘme : recrĂ©er un rĂ©seau dĂ©connecterait tous ses conteneurs.
Un seul service Ă©chappe au rĂŽle : le coffre de signature de Xila (OpenBao), qui gĂšre lui-mĂȘme son certificat et doit rester descellĂ©.
Le rÎle est testé par Molecule sur une pile de test locale : création, idempotence, redémarrage quand un fichier change.
đ ïž Outils â
Les versions des outils sont figées : Python, Ansible, ansible-lint et yamllint par uv (pyproject.toml, uv.lock), OpenTofu par mise (mise.toml), les collections Ansible dans requirements.yml. Les commandes courantes sont des tùches mise :
mise install && mise run setup # outils et collections
mise preview site.yml --limit bruxelles # ce qui changerait (--check --diff), sans rien changer
mise deploy services/<service>/deploy.yml # déployer un service
mise deploy site.yml --limit bruxelles # tous les services dâun hĂŽte
mise lint # yamllint, ansible-lint, docker compose config
mise test # scénarios Molecule des rÎlesLes zones DNS ne sont pas appliquées par site.yml : chacune a son propre playbook, lancé séparément.
Les playbooks lisent leurs secrets dans un coffre chiffré, dont le mot de passe reste dans le trousseau du systÚme (voir Sécurité).
â IntĂ©gration continue â
Chaque pull request et chaque push sur main lancent des vĂ©rifications sur GitHub Actions. LâintĂ©gration continue nâa pas accĂšs aux secrets : les playbooks sont analysĂ©s avec des fichiers de coffre vides, ce qui oblige chaque playbook Ă rester lisible sans eux.
| Vérification | Contenu |
|---|---|
| yamllint, ansible-lint | Style YAML, bonnes pratiques Ansible (modules complets, changed_when, gestionnairesâŠ) |
| Compose | docker compose config sur chaque service, avec des valeurs factices pour les variables |
| Molecule | RÎles compose_service et zitadel_applications exécutés sur des piles de test |
| OpenTofu | Formatage et validation de la configuration Zitadel |
| Routes Traefik | Les routes de Bruxelles sont rendues puis chargĂ©es dans un vrai Traefik : chaque routeur doit ĂȘtre actif et conforme |
| Supervision | La supervision est dĂ©marrĂ©e avec des mĂ©triques dâexemple : les rĂšgles dâalerte doivent se dĂ©clencher comme prĂ©vu |
| Protection | CrowdSec et Traefik sont démarrés ensemble : une adresse bannie est refusée, le réseau local et le VPN passent toujours |
Une vérification unique, exigée par les rÚgles de la branche main, attend le succÚs de toutes les autres.
đ Mises Ă jour â
Chaque image Docker est figĂ©e sur une version exacte : jamais latest, jamais dâimage sans Ă©tiquette. Dependabot ouvre chaque lundi une pull request groupĂ©e par Ă©cosystĂšme (images Docker Compose, actions GitHub, outils Python). Elle passe par les mĂȘmes vĂ©rifications que tout autre changement. Les collections Ansible, la version de Python et lâextension CrowdSec de Traefik, que Dependabot ne suit pas, sont mises Ă jour Ă la main.
đĄïž Principes de sĂ©curitĂ© du dĂ©ploiement â
- Branche protégée :
mainnâaccepte que des pull requests dont lâintĂ©gration continue est passĂ©e, fusionnĂ©es en un seul commit. - Aperçu avant application :
mise previewmontre les changements (--check --diff) avant tout dĂ©ploiement rĂ©el. - Configuration dĂ©crite dans le dĂ©pĂŽt : ce que dĂ©ploie Ansible vient du dĂ©pĂŽt ; ce quâAnsible ne peut pas rĂ©gler lui-mĂȘme (interface TrueNAS notamment), il le vĂ©rifie et indique les Ă©tapes Ă faire.
- Ports publiĂ©s sous contrĂŽle : le dĂ©ploiement de Traefik vĂ©rifie quâaucun autre conteneur nâoccupe les ports web et, sur Bruxelles, liste les ports publiĂ©s qui ne sont pas attendus (voir SĂ©curitĂ©).
- Compte dĂ©diĂ© : Ansible se connecte avec un compte dâautomatisation Ă clĂ© SSH, distinct des comptes personnels (voir SĂ©curitĂ©).
đ€ Semaphore â
Semaphore est une interface web pour lancer les playbooks depuis Bruxelles, sans passer par lâordinateur portable. Son service est fusionnĂ© dans le dĂ©pĂŽt ; sa mise en service est Ă venir (voir la feuille de route).
- Il est privé : accessible uniquement depuis le réseau local ou le VPN.
- Il clone le dépÎt public, et le sous-module des secrets avec un accÚs en lecture seule limité à ce seul dépÎt.
- Il se connecte aux hĂŽtes avec sa propre clĂ© SSH, autorisĂ©e sur le compte dâautomatisation comme celle de lâordinateur portable.
- Chaque playbook a deux modÚles de tùche : un aperçu (
--check --diff) et une exĂ©cution, lancĂ©s Ă la main. - Le provisionnement de Zitadel (OpenTofu) reste lancĂ© depuis lâordinateur portable.
đ Ce site â
Ce site est construit avec VitePress dans le dĂ©pĂŽt Infrastructure_website, indĂ©pendant du dĂ©pĂŽt Infrastructure : aucun dĂ©ploiement Ansible nâest nĂ©cessaire pour le mettre Ă jour. AprĂšs chaque fusion sur main, GitHub Actions le construit et le publie sur GitHub Pages ; la publication peut aussi ĂȘtre lancĂ©e Ă la main depuis lâonglet Actions du dĂ©pĂŽt.
Pour proposer une modification, créer une branche, puis, depuis la racine du dépÎt :
npm ci # dépendances
npm run docs:dev # serveur local, qui affiche lâadresse Ă ouvrir
npm run check # vĂ©rification Prettier, puis construction du sitenpm run docs:build puis npm run docs:preview montrent le rĂ©sultat de production. Les sources sont dans src ; une nouvelle page de documentation sâajoute Ă src/documentation/index.md et Ă la barre latĂ©rale de .vitepress/config.mts. Ouvrir ensuite une pull request vers main.