93e7abfc574ff48d2bba135fae8ad44ec2aabf04
Trois correctifs issus d'une même soirée de panne. 1. Runner hors du control-plane (03_cicd.yml) `capacity: 1` ne borne que CHAQUE runner, pas le cluster : avec deux runners, deux builds lourds tournent en parallèle. Le 2026-08-26 ils ont saturé pi1 (charge 7,38 sur 15 min, 5,7 Go/8), le démon Docker a cessé de répondre et les DEUX jobs sont morts à la même seconde — 19:49:27, runs #152 et #154, `context deadline exceeded` sur docker.sock. pi1 porte l'apiserver et l'ingress. Même famille que 2026-07-23 et 2026-08-15. Le parallélisme tombe à 1 (pi3 seul), assumé : le runner du Mac (label `laptop`) absorbe les jobs lourds et va ~10× plus vite — mesuré sur kadans, 184 s contre 1 065 s sur pi3 et 1 915 s sur pi1. 2. Résolution de la forge figée (03_cicd.yml, group_vars/all/gitea.yml) Les hôtes à runner résolvent `.lab` via un Pi-hole, puis retombent sur les nameservers IPv6 du routeur, qui répondent NXDOMAIN — réponse valide, donc retenue. D'où des pulls qui échouent par intermittence pendant que `getent hosts` réussit. `extra_hosts` + `--add-host` court-circuitent le DNS. L'IP est dérivée de l'inventaire (premier hôte du groupe `gitea`) plutôt qu'écrite en dur. Vérifié que c'est équivalent : le registre répond 401 sur /v2/ via .202 comme via .201, le svclb Traefik écoutant sur 443 de chaque nœud. ⚠ Ça ne couvre PAS le namespace réseau de buildkit, qui n'hérite d'aucun des deux — corrigé séparément côté cms (pull côté démon, build sans `--pull`). 3. Cache Redis du bouncer coupé (roles/crowdsec) `redisCacheUnreachableBlock: false` n'est pas honoré par le plugin : redis-0 étant 0/1, TOUTES les requêtes externes prenaient un 403 alors que `cscli decisions list` était vide. Logs Traefik : `isBanned:false redis:unreachable` → 403. Le cache mémoire suffit — en mode `stream` les décisions viennent de la LAPI de toute façon. ⚠ NE PAS « réparer » Redis en `--save ""` : il sert aussi kadans-jobs (DB 1, file de jobs) et telegram-gateway (DB 0, sessions d'auth 24 h). Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Merge pull request 'fix(iac): pin cloudflare provider + lockfile, trust homelab CA in gitea provider' (#12) from arcodange/iac-provider-fixes into main
Arcodange Factory
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'rough':true } }%%
flowchart
prepare_hd>HD setup]
prepare_pg>PG Setup]
prepare_gitea>Gitea Setup]
origin_repo[[original repositories]]
github_repo_m[[gitea mirrors]]
gitlab_repo_m[[gitea mirrors]]
origin_repo -. mirrored .->gitlab_repo_m
origin_repo -. mirrored .->github_repo_m
tofu.state -. manages providers/go-gitea .- origin_repo
tofu.state -. manages providers/gitlabhq/gitlab .- gitlab_repo_m
tofu.state -. manages providers/integrations/github .- github_repo_m
subgraph Home
subgraph pi1
runner[/gitea runners\]
subgraph small HD
backup_data
end
end
subgraph pi2
PG[(Postgres)]
subgraph Gitea
origin_repo
end
subgraph HD
PG_data
Gitea_data
end
end
subgraph pi3
subgraph ai
ollama
end
end
subgraph "master (macbook pro)"
ansible{{ansible control-node}}
tofu{{opentofu control-node}}
subgraph ansible_scripts
direction TB
prepare_hd --> prepare_pg --> prepare_gitea
end
end
end
subgraph Internet
subgraph Gitlab
subgraph Group Arcodange
gitlab_repo_m
end
end
subgraph Github
subgraph Organization Arcodange
github_repo_m
end
end
subgraph GCP
subgraph project arcodange
subgraph gs://arcodange-tf
tofu.state
end
end
end
end
tofu == plan/apply ==> tofu.state
ansible == deploy ==> HD
ansible == deploy ==> PG
ansible == deploy ==> Gitea
ansible --- ansible_scripts
classDef done fill:gold,stroke:indigo,stroke-width:4px,color:blue;
class prepare_hd,nodeId2 done;
Documentation
- 📚
doc/— ADR (décisions d'architecture) + runbooks. - 🚀 Runbook : mettre en service une nouvelle application web — dépôt Gitea, base de données, Vault, chart Helm, Terraform, CI, ArgoCD.
🏹💻🪽
Languages
HCL
31.9%
Mermaid
28.4%
Python
15.5%
Dockerfile
9.4%
Jinja
6.8%
Other
8%