From 9f93e04577d7d9b04755a895bd872b153b3d705d Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Thu, 8 Oct 2026 10:16:11 +0200 Subject: [PATCH 1/4] =?UTF-8?q?feat(iac)=20:=20le=20jeton=20cf=5Farcodange?= =?UTF-8?q?=5Fcms=5Ftoken=20peut=20=C3=A9crire=20les=20r=C3=A8gles=20du=20?= =?UTF-8?q?WAF=20de=20la=20zone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La règle forge_registre_ferme (cms/cloudflare/waf.tf, cloudflare_ruleset de phase http_request_firewall_custom) ferme le registre de la forge sur le nom public. Gratuit (5 règles au forfait Free). Ajouter le nom remplace le jeton (replace_triggered_by) : le secret Gitea CLOUDFLARE_API_TOKEN de cms et Vault suivent dans le même apply. Co-Authored-By: Claude Opus 5.5 --- iac/cloudflare.tf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/iac/cloudflare.tf b/iac/cloudflare.tf index a879fc4..13d52fa 100644 --- a/iac/cloudflare.tf +++ b/iac/cloudflare.tf @@ -72,6 +72,11 @@ module "cf_arcodange_cms_token" { "zone:DNS Write", "account:Cloudflare Tunnel Write", "account:Turnstile Sites Write", + # 2026-10-08 — la règle `forge_registre_ferme` (cms/cloudflare/waf.tf) : un + # `cloudflare_ruleset` de phase `http_request_firewall_custom` sur la zone. + # Gratuit (5 règles personnalisées au forfait Free). ⚠ Changer un nom ici + # REMPLACE le jeton (replace_triggered_by) : le secret Gitea de cms et Vault suivent. + "zone:Zone WAF Write", ] } } -- 2.54.0 From ef746730371811c965079c2bcadb92c162a85ee8 Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Thu, 8 Oct 2026 10:20:55 +0200 Subject: [PATCH 2/4] =?UTF-8?q?fix(ci)=20:=20l'IaC=20de=20factory=20tourne?= =?UTF-8?q?=20de=20nouveau=20=E2=80=94=20OpenTofu=20dans=20le=20conteneur?= =?UTF-8?q?=20du=20job,=20et=20un=20mode=20=C2=AB=20plan=20=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dflook/terraform-apply est une action CONTENEUR ; depuis 93e7abf (2026-08-26) les conteneurs de job reçoivent --add-host, et Docker refuse de lancer le conteneur de l'action dans le réseau du job (« conflicting options: custom host-to-IP mapping and the network mode », run 10014 sur pi3). Le dernier apply réussi datait du 2026-07-24 (pi1). OpenTofu s'installe désormais par opentofu/setup-opentofu (JavaScript) et tourne dans ubuntu-latest-ca. Un dispatch peut demander mode=plan pour lire le plan sans rien appliquer ; un push applique comme avant. Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/iac.yaml | 42 ++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/.gitea/workflows/iac.yaml b/.gitea/workflows/iac.yaml index bf09ea5..7fbc0e4 100644 --- a/.gitea/workflows/iac.yaml +++ b/.gitea/workflows/iac.yaml @@ -3,7 +3,13 @@ name: IAC on: #[push,pull_request] - workflow_dispatch: {} + workflow_dispatch: + inputs: + mode: + description: "plan : montrer ce qui changerait, sans rien appliquer ; apply : appliquer" + type: choice + options: [apply, plan] + default: apply push: &tofuPaths paths: - 'iac/*.tf' @@ -60,12 +66,30 @@ jobs: - uses: actions/checkout@v4 - name: prepare vault self signed cert run: echo -n "${{ secrets.HOMELAB_CA_CERT }}" | base64 -d > $VAULT_CACERT - - name: terraform apply - uses: dflook/terraform-apply@v1 - env: - # the apply runs in dflook's container, which doesn't trust the homelab CA; - # hand the gitea provider the CA cert the step above wrote to the workspace - TF_VAR_gitea_cacert_file: "${{ github.workspace }}/homelab.pem" + # ⚠ PLUS DE `dflook/terraform-apply` (2026-10-08) : c'est une action CONTENEUR, et + # depuis 93e7abf (2026-08-26) les conteneurs de job reçoivent `--add-host` (résolution + # figée de la forge, 03_cicd.yml). Docker refuse alors de lancer le conteneur de + # l'action dans le réseau du job : « conflicting options: custom host-to-IP mapping + # and the network mode » — le dernier apply réussi datait du 2026-07-24 (pi1). + # OpenTofu tourne donc DANS le conteneur du job (ubuntu-latest-ca, qui connaît la CA + # du homelab), installé par une action JavaScript. + - name: install OpenTofu + uses: opentofu/setup-opentofu@v1 with: - path: iac - auto_approve: true \ No newline at end of file + tofu_version: ${{ env.OPENTOFU_VERSION }} + tofu_wrapper: false + - name: tofu init + working-directory: iac + run: tofu init -input=false + - name: tofu plan + working-directory: iac + env: + TF_VAR_gitea_cacert_file: "${{ github.workspace }}/homelab.pem" + run: tofu plan -input=false -out=plan.tfplan + # Un `push` (sans entrée) applique, comme avant ; un dispatch en `plan` s'arrête ici. + - name: tofu apply + if: ${{ github.event_name != 'workflow_dispatch' || inputs.mode != 'plan' }} + working-directory: iac + env: + TF_VAR_gitea_cacert_file: "${{ github.workspace }}/homelab.pem" + run: tofu apply -input=false plan.tfplan -- 2.54.0 From 41641e56ad087be293be23f2773c5f2295b6fc99 Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Thu, 8 Oct 2026 10:33:01 +0200 Subject: [PATCH 3/4] =?UTF-8?q?fix(ci)=20:=20l'IaC=20de=20factory=20tourne?= =?UTF-8?q?=20aussi=20sur=20le=20runner=20du=20Mac=20=E2=80=94=20r=C3=A9so?= =?UTF-8?q?lution=20fig=C3=A9e=20des=20noms=20du=20lab=20dans=20le=20job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le runner du laptop ne résout pas *.arcodange.lab dans ses conteneurs de job (curl sort en 6 sur webapp.arcodange.lab pendant le passage OIDC, run 10015) ; les runners des pi le font par --add-host. Le job pose la même résolution (ingress 192.168.1.201) seulement si elle manque. Co-Authored-By: Claude Opus 5.5 --- .gitea/workflows/iac.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.gitea/workflows/iac.yaml b/.gitea/workflows/iac.yaml index 7fbc0e4..e5a3b76 100644 --- a/.gitea/workflows/iac.yaml +++ b/.gitea/workflows/iac.yaml @@ -46,6 +46,14 @@ jobs: outputs: gitea_vault_jwt: ${{steps.gitea_vault_jwt.outputs.id_token}} steps: + # Le runner du Mac (laptop) ne résout pas les noms *.arcodange.lab dans ses conteneurs de + # job (curl sort en 6 sur webapp.arcodange.lab, run 10015) ; les runners des pi le font par + # --add-host. On pose la même résolution figée vers l'ingress du lab, seulement si elle manque. + - name: résoudre les noms du lab + run: | + for h in webapp.arcodange.lab vault.arcodange.lab gitea.arcodange.lab; do + getent hosts "$h" >/dev/null || echo "192.168.1.201 $h" >> /etc/hosts + done - name: Auth with gitea for vault id: gitea_vault_jwt @@ -62,6 +70,14 @@ jobs: TERRAFORM_VAULT_AUTH_JWT: ${{ needs.gitea_vault_auth.outputs.gitea_vault_jwt }} VAULT_CACERT: "${{ github.workspace }}/homelab.pem" steps: + # Le runner du Mac (laptop) ne résout pas les noms *.arcodange.lab dans ses conteneurs de + # job (curl sort en 6 sur webapp.arcodange.lab, run 10015) ; les runners des pi le font par + # --add-host. On pose la même résolution figée vers l'ingress du lab, seulement si elle manque. + - name: résoudre les noms du lab + run: | + for h in webapp.arcodange.lab vault.arcodange.lab gitea.arcodange.lab; do + getent hosts "$h" >/dev/null || echo "192.168.1.201 $h" >> /etc/hosts + done - *vault_step - uses: actions/checkout@v4 - name: prepare vault self signed cert -- 2.54.0 From 6a859d942a4aa85ab422e69d8a4da5ed0ec68ff6 Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Thu, 8 Oct 2026 10:38:16 +0200 Subject: [PATCH 4/4] =?UTF-8?q?Revert=20"fix(ci)=20:=20l'IaC=20de=20factor?= =?UTF-8?q?y=20tourne=20aussi=20sur=20le=20runner=20du=20Mac=20=E2=80=94?= =?UTF-8?q?=20r=C3=A9solution=20fig=C3=A9e=20des=20noms=20du=20lab=20dans?= =?UTF-8?q?=20le=20job"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 41641e56ad087be293be23f2773c5f2295b6fc99. --- .gitea/workflows/iac.yaml | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/.gitea/workflows/iac.yaml b/.gitea/workflows/iac.yaml index e5a3b76..7fbc0e4 100644 --- a/.gitea/workflows/iac.yaml +++ b/.gitea/workflows/iac.yaml @@ -46,14 +46,6 @@ jobs: outputs: gitea_vault_jwt: ${{steps.gitea_vault_jwt.outputs.id_token}} steps: - # Le runner du Mac (laptop) ne résout pas les noms *.arcodange.lab dans ses conteneurs de - # job (curl sort en 6 sur webapp.arcodange.lab, run 10015) ; les runners des pi le font par - # --add-host. On pose la même résolution figée vers l'ingress du lab, seulement si elle manque. - - name: résoudre les noms du lab - run: | - for h in webapp.arcodange.lab vault.arcodange.lab gitea.arcodange.lab; do - getent hosts "$h" >/dev/null || echo "192.168.1.201 $h" >> /etc/hosts - done - name: Auth with gitea for vault id: gitea_vault_jwt @@ -70,14 +62,6 @@ jobs: TERRAFORM_VAULT_AUTH_JWT: ${{ needs.gitea_vault_auth.outputs.gitea_vault_jwt }} VAULT_CACERT: "${{ github.workspace }}/homelab.pem" steps: - # Le runner du Mac (laptop) ne résout pas les noms *.arcodange.lab dans ses conteneurs de - # job (curl sort en 6 sur webapp.arcodange.lab, run 10015) ; les runners des pi le font par - # --add-host. On pose la même résolution figée vers l'ingress du lab, seulement si elle manque. - - name: résoudre les noms du lab - run: | - for h in webapp.arcodange.lab vault.arcodange.lab gitea.arcodange.lab; do - getent hosts "$h" >/dev/null || echo "192.168.1.201 $h" >> /etc/hosts - done - *vault_step - uses: actions/checkout@v4 - name: prepare vault self signed cert -- 2.54.0