[infra] Forge auto-hébergée et chaîne d'intégration opérationnelles #11

Closed
opened 2026-09-01 07:11:34 +00:00 by g2-admin · 2 comments
Owner

Exigence couverte

ENF-09 reproductibilité, ENF-11 chaîne d'approvisionnement, ENF-16 exploitabilité

Épreuve servie

EC03 · CI/CD et qualité

Ce qu'on veut obtenir

Une forge auto-hébergée sur le serveur du groupe, avec sa chaîne d'intégration,
pour que le code, les tickets et les exécutions de tests vivent au même endroit
et près de la cible de déploiement. Le choix est justifié dans la fiche ADR-005.

Critères d'acceptation

  • Forgejo joignable en HTTPS, inscriptions fermées, consultation interdite sans authentification
  • Un compte par membre du groupe, mot de passe à changer à la première connexion
  • Git par SSH fonctionnel, clé déclarée dans chaque compte
  • Runner Actions enregistré et capable d'exécuter une tâche de bout en bout
  • Sauvegarde quotidienne planifiée et essai de restauration produit
  • Surface réseau réduite aux seuls ports nécessaires
  • Manuels d'exploitation dans le dépôt : docs/FORGE.md et docs/runbooks/forge.md

Le miroir sortant hors du serveur sort de ce ticket : il est repris côté cloud avec la réplication de la forge sur Azure, ticket ouvert par Gabriel.

Comment on le vérifie

Commande   docker compose -f /opt/g2-forge/docker-compose.yml ps
           ss -lntp | grep -v 127.0.0.1
Preuve     journal d'exécution du workflow de contrôle, en commentaire
Manuel     docs/RUNBOOK-forge.md

Manuel d'exploitation à mettre à jour

docs/runbooks/forge.md pour les gestes, docs/FORGE.md pour l'installation, la sécurité et le journal

Risque et retour arrière

Le socket Docker monté dans le runner équivaut à un accès root sur l'hôte.
Risque assumé et documenté, borné par la fermeture des inscriptions et le
caractère privé des dépôts. Déclencheur de réévaluation : l'ouverture de la
forge à un compte extérieur au groupe.

Retour arrière : docker compose down puis restauration de l'archive la plus
récente de /opt/g2-forge/backups/.

### Exigence couverte ENF-09 reproductibilité, ENF-11 chaîne d'approvisionnement, ENF-16 exploitabilité ### Épreuve servie EC03 · CI/CD et qualité ### Ce qu'on veut obtenir Une forge auto-hébergée sur le serveur du groupe, avec sa chaîne d'intégration, pour que le code, les tickets et les exécutions de tests vivent au même endroit et près de la cible de déploiement. Le choix est justifié dans la fiche ADR-005. ### Critères d'acceptation - [x] Forgejo joignable en HTTPS, inscriptions fermées, consultation interdite sans authentification - [x] Un compte par membre du groupe, mot de passe à changer à la première connexion - [x] Git par SSH fonctionnel, clé déclarée dans chaque compte - [x] Runner Actions enregistré et capable d'exécuter une tâche de bout en bout - [x] Sauvegarde quotidienne planifiée et essai de restauration produit - [x] Surface réseau réduite aux seuls ports nécessaires - [x] Manuels d'exploitation dans le dépôt : `docs/FORGE.md` et `docs/runbooks/forge.md` Le miroir sortant hors du serveur sort de ce ticket : il est repris côté cloud avec la réplication de la forge sur Azure, ticket ouvert par Gabriel. ### Comment on le vérifie ``` Commande docker compose -f /opt/g2-forge/docker-compose.yml ps ss -lntp | grep -v 127.0.0.1 Preuve journal d'exécution du workflow de contrôle, en commentaire Manuel docs/RUNBOOK-forge.md ``` ### Manuel d'exploitation à mettre à jour `docs/runbooks/forge.md` pour les gestes, `docs/FORGE.md` pour l'installation, la sécurité et le journal ### Risque et retour arrière Le socket Docker monté dans le runner équivaut à un accès root sur l'hôte. Risque assumé et documenté, borné par la fermeture des inscriptions et le caractère privé des dépôts. Déclencheur de réévaluation : l'ouverture de la forge à un compte extérieur au groupe. Retour arrière : `docker compose down` puis restauration de l'archive la plus récente de `/opt/g2-forge/backups/`.
Author
Owner

Preuve d'exécution, relevée le 01/09/2026 à 07:11

$ hostname && systemd-detect-virt
ml-stagiaire-02
lxc

$ docker compose -f /opt/g2-forge/docker-compose.yml ps --format '{{.Name}} {{.Status}}'
g2-forge-proxy  Up 20 hours
g2-forge-runner  Up 19 hours
g2-forgejo  Up 20 hours (healthy)

$ ss -lntp | grep -v 127.0.0.1   # surface exposée
*:22           users:(("sshd",pid=137,fd=3),("systemd",pid=1,fd=64))
*:2222         users:(("gitea",pid=7452,fd=11))
*:34383        users:(("forgejo-runner",pid=41989,fd=3))
*:43831        users:(("forgejo-runner",pid=41989,fd=6))
*:443          users:(("caddy",pid=7513,fd=7))

$ curl -sk -o /dev/null -w '%{http_code}' https://10.105.200.41/
200

$ curl -s -o /dev/null -w '%{http_code}' http://10.105.200.41:3000/   # doit être injoignable
000
000  refusé, correct

$ ls -1 /opt/g2-forge/backups/
dump-20260831.zip
dump-test.zip

$ docker logs g2-forge-runner | tail -3
time="2026-08-31T12:34:51Z" level=info msg="runner: g2-runner-01, with version: v6.4.0, with labels: [docker ubuntu-24.04], declared successfully"
time="2026-08-31T12:34:51Z" level=info msg="[poller 1] launched"
time="2026-08-31T12:34:51Z" level=info msg="[poller 0] launched"

Exécution de bout en bout de la chaîne

Le dépôt g2/smoke-test a servi de contrôle. Journal du runner :

[/preuve] 🚀  Start image=node:22-bookworm
[/preuve]   🐳  docker create image=node:22-bookworm network="host"
[/preuve] ⭐ Run Main echo "runner operationnel"
[/preuve]   | runner operationnel
[/preuve]   ✅  Success - Main echo "runner operationnel"
[/preuve] 🏁  Job succeeded

Deux écarts relevés pendant l'installation

Docker Compose n'était pas préinstallé, contrairement au cadrage de lancement.
Installé depuis les dépôts Ubuntu en 2.40.3. Les autres groupes ont probablement le même manque.

Aucun conteneur ne démarre en réseau bridge sur cette machine. L'hôte est un
conteneur LXC non privilégié où runc ne peut pas écrire les sysctls réseau
appliqués par défaut. Même docker run hello-world échoue. Seul --network host
fonctionne, ce que la pile utilise en attendant. Détail et correctif hyperviseur
dans docs/CONSTAT-plateforme.md, à remonter au formateur.

Ce qui reste ouvert

Le miroir sortant vers un dépôt hors du serveur. Tant qu'il n'existe pas, la règle
"poussez sur un dépôt distant" du cadrage n'est pas tenue, et une perte du conteneur
effacerait le projet. Seul critère d'acceptation encore décoché.

### Preuve d'exécution, relevée le 01/09/2026 à 07:11 ``` $ hostname && systemd-detect-virt ml-stagiaire-02 lxc $ docker compose -f /opt/g2-forge/docker-compose.yml ps --format '{{.Name}} {{.Status}}' g2-forge-proxy Up 20 hours g2-forge-runner Up 19 hours g2-forgejo Up 20 hours (healthy) $ ss -lntp | grep -v 127.0.0.1 # surface exposée *:22 users:(("sshd",pid=137,fd=3),("systemd",pid=1,fd=64)) *:2222 users:(("gitea",pid=7452,fd=11)) *:34383 users:(("forgejo-runner",pid=41989,fd=3)) *:43831 users:(("forgejo-runner",pid=41989,fd=6)) *:443 users:(("caddy",pid=7513,fd=7)) $ curl -sk -o /dev/null -w '%{http_code}' https://10.105.200.41/ 200 $ curl -s -o /dev/null -w '%{http_code}' http://10.105.200.41:3000/ # doit être injoignable 000 000 refusé, correct $ ls -1 /opt/g2-forge/backups/ dump-20260831.zip dump-test.zip $ docker logs g2-forge-runner | tail -3 time="2026-08-31T12:34:51Z" level=info msg="runner: g2-runner-01, with version: v6.4.0, with labels: [docker ubuntu-24.04], declared successfully" time="2026-08-31T12:34:51Z" level=info msg="[poller 1] launched" time="2026-08-31T12:34:51Z" level=info msg="[poller 0] launched" ``` ### Exécution de bout en bout de la chaîne Le dépôt `g2/smoke-test` a servi de contrôle. Journal du runner : ``` [/preuve] 🚀 Start image=node:22-bookworm [/preuve] 🐳 docker create image=node:22-bookworm network="host" [/preuve] ⭐ Run Main echo "runner operationnel" [/preuve] | runner operationnel [/preuve] ✅ Success - Main echo "runner operationnel" [/preuve] 🏁 Job succeeded ``` ### Deux écarts relevés pendant l'installation **Docker Compose n'était pas préinstallé**, contrairement au cadrage de lancement. Installé depuis les dépôts Ubuntu en 2.40.3. Les autres groupes ont probablement le même manque. **Aucun conteneur ne démarre en réseau bridge sur cette machine.** L'hôte est un conteneur LXC non privilégié où `runc` ne peut pas écrire les sysctls réseau appliqués par défaut. Même `docker run hello-world` échoue. Seul `--network host` fonctionne, ce que la pile utilise en attendant. Détail et correctif hyperviseur dans `docs/CONSTAT-plateforme.md`, à remonter au formateur. ### Ce qui reste ouvert Le miroir sortant vers un dépôt hors du serveur. Tant qu'il n'existe pas, la règle "poussez sur un dépôt distant" du cadrage n'est pas tenue, et une perte du conteneur effacerait le projet. Seul critère d'acceptation encore décoché.
florian added this to the EnerVision project 2026-09-01 09:29:39 +00:00
Owner

Sept critères sur sept. Les manuels sont dans le dépôt, docs/FORGE.md pour l'installation, la sécurité et le journal du 31 août, docs/runbooks/forge.md pour les gestes.

Le miroir sortant sort de ce ticket : il est repris côté cloud avec la réplication de la forge sur Azure, ticket ouvert par Gabriel.

Deux choses restent ouvertes et sont écrites comme telles dans FORGE.md plutôt que passées sous silence. Le durcissement SSH n'est pas fait, et le journal du 1er septembre montre treize connexions root par mot de passe qu'aucune personne ne peut revendiquer : l'ENF-15 n'est pas tenue. Et la restauration n'a jamais été jouée chronomètre en main, la ligne de preuve est prête dans le manuel.

Au passage, les références d'exigences de ce ticket étaient fausses depuis le premier jour, ENF-08, ENF-10 et ENF-12 au lieu de ENF-09, ENF-11 et ENF-16. Corrigées.

Sept critères sur sept. Les manuels sont dans le dépôt, `docs/FORGE.md` pour l'installation, la sécurité et le journal du 31 août, `docs/runbooks/forge.md` pour les gestes. Le miroir sortant sort de ce ticket : il est repris côté cloud avec la réplication de la forge sur Azure, ticket ouvert par Gabriel. Deux choses restent ouvertes et sont écrites comme telles dans `FORGE.md` plutôt que passées sous silence. Le durcissement SSH n'est pas fait, et le journal du 1er septembre montre treize connexions root par mot de passe qu'aucune personne ne peut revendiquer : l'ENF-15 n'est pas tenue. Et la restauration n'a jamais été jouée chronomètre en main, la ligne de preuve est prête dans le manuel. Au passage, les références d'exigences de ce ticket étaient fausses depuis le premier jour, ENF-08, ENF-10 et ENF-12 au lieu de ENF-09, ENF-11 et ENF-16. Corrigées.
Sign in to join this conversation.
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
g2/enervision#11
No description provided.