forgejo : verifier l'etat du compte, ne pas faire confiance au drapeau

Toute l'API rendait 403 — ni 401, ni message de droits : jeton valide, identite reconnue,
requete rejetee. La cause etait `must-change-password` sur le compte d'administration.

Le role passait DEJA `--must-change-password=false`, corrige le 2026-08-23 sur la premiere
forge de patient 0. Forgejo 16 a ignore l'option : le compte de la forge du SITE est ne
avec le drapeau pose malgre elle. La correction d'il y a deux jours ne protegeait plus
rien, et rien ne le disait.

Le role ne demande donc plus a la creation de bien se comporter : il CONSTATE l'etat voulu
et le retablit, par une tache idempotente sans effet quand la creation a tenu parole.

Le genome vit desormais sur la forge du site : six depots, 606 commits, chaque tete
confrontee entre le poste et la forge — identique. L'ancienne forge reste comme second
remote : « une famille, pas un maitre ».

42 preuves vertes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-25 13:33:10 -04:00
parent 43666cff6e
commit b60946f19f
2 changed files with 57 additions and 0 deletions

View file

@ -1,5 +1,34 @@
# CHANGELOG — Set-OPS
## 2026-08-25 — Le génome vit sur la forge du SITE
Six dépôts, 606 commits, chaque tête confrontée entre le poste et la forge : **identique**.
Le génome ne dépend plus d'un écosystème pour se reproduire.
L'ancienne forge de patient 0 devient un second remote, nommé `patient0` — elle n'est pas
remplacée. Le README de patient 0 exige que le génome vive en **au moins trois endroits
sans coordination** : *« n'importe quel survivant réamorce les autres. Une famille, pas un
maître. »* La forge du site en fait un quatrième.
### On vérifie l'état, on ne fait pas confiance au drapeau
Toute l'API de la forge rendait **403**. Ni 401, ni un message de droits : jeton valide,
identité reconnue, requête rejetée. On cherche un scope, une politique, une capacité — et
la cause est un drapeau sur le compte, `must-change-password`.
Le rôle passait pourtant **déjà** `--must-change-password=false`, corrigé le 2026-08-23
sur la première forge de patient 0. **Forgejo 16 a ignoré l'option** : le compte est né
avec le drapeau posé malgré elle. La correction d'il y a deux jours ne protégeait plus
rien, et rien ne le disait.
D'où la forme du remède : le rôle ne demande plus à la création de bien se comporter, il
**constate l'état voulu et le rétablit** — une tâche idempotente, sans effet quand la
création a tenu parole. C'est la même leçon que le `changed=` d'Ansible qui ne prouve pas
un service : *vérifier l'état, pas l'intention*.
Le jeton d'amorçage est créé localement par la CLI : un mot de passe d'administrateur n'a
pas à circuler pour créer six dépôts.
## 2026-08-25 — Un SITE a bien un plan
J'ai passé la journée à répéter qu'un SITE n'est pas un plan. **C'était faux**, et le

View file

@ -323,6 +323,34 @@
GITEA_WORK_DIR: "{{ serveur_forgejo_data }}"
no_log: true
# ON VERIFIE L'ETAT, ON NE FAIT PAS CONFIANCE AU DRAPEAU (2026-08-25).
#
# La creation passe deja `--must-change-password=false` — corrige le 2026-08-23, sur la
# premiere forge de patient 0. **Forgejo 16 l'a ignore** : le compte de la forge du SITE
# est ne avec le drapeau POSE malgre l'option.
#
# La panne qui en resulte n'accuse rien de juste : toute requete d'API rend **403**, pas
# 401. Le jeton est valide, l'identite reconnue, la requete rejetee quand meme — on
# cherche un scope, un droit, une politique, et la cause est un drapeau sur le compte.
#
# D'ou cette tache : elle ne demande pas a la creation de bien se comporter, elle CONSTATE
# l'etat voulu et le retablit. Idempotente, et sans effet quand la creation a tenu parole.
- name: Le compte d'administration ne doit exiger aucun changement de mot de passe
ansible.builtin.command:
cmd: >-
{{ serveur_forgejo_binaire }} admin user must-change-password --unset
{{ serveur_forgejo_admin_user }}
--config {{ serveur_forgejo_config }}
become: true
become_user: "{{ serveur_forgejo_utilisateur }}"
environment:
FORGEJO_WORK_DIR: "{{ serveur_forgejo_data }}"
register: forgejo_mcp
changed_when: "'Updated 1 users' in (forgejo_mcp.stdout | default(''))"
failed_when:
- forgejo_mcp.rc != 0
- "'not found' not in (forgejo_mcp.stderr | default(''))"
- name: Configurer la source OAuth2 SSO (Keycloak, idempotent)
ansible.builtin.shell:
executable: /bin/bash