feat(bonsai): la prod tire l'image publiée par la CI au lieu de la recompiler

Le service api clonait le dépôt et compilait le JAR sur le serveur à chaque
« docker compose build » (Dockerfile.api + secret ssh_key + CACHEBUST). La prod
rebuildait donc ce que la CI avait déjà buildé, sans garantie que les deux
partent du même commit — et aucune image publiée n'atteignait jamais la prod.

Elle tire maintenant …/bonsai-api:main et porte le label watchtower.enable : le
redéploiement suit tout seul chaque merge sur main, comme pour Luz. Le webapp,
lui, continue d'être buildé depuis les sources — d'où le secret ssh_key conservé.

Prérequis : de quoi tirer les images privées de l'org Bonsai. Le PAT de Watchtower
n'a aujourd'hui le scope read:package que sur Luz ; sans extension à Bonsai, le
pull échoue en silence (/v1/update répond 200, la prod ne bouge pas).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-01 14:01:47 +02:00
parent 23ce5c86e1
commit 30887c066b
4 changed files with 54 additions and 38 deletions
+18 -7
View File
@@ -20,14 +20,24 @@ services:
networks:
- bonsai-net
# Image tirée du registre Gitea, publiée par la CI du dépôt Bonsai-api
# (.gitea/workflows/images.yml) à chaque push sur main. Le tag « main » suit la
# tête de cette branche ; « sha-<court> » permet d'épingler un commit précis en
# cas de rollback.
#
# Avant, ce service clonait le dépôt et compilait le JAR sur le serveur à chaque
# « docker compose build » (Dockerfile.api + secret ssh_key + CACHEBUST) : la prod
# rebuildait ce que la CI avait déjà buildé, et rien ne garantissait que les deux
# partaient du même commit. Le redéploiement est désormais automatique — le label
# watchtower.enable ci-dessous fait recréer ce conteneur dès que la CI publie une
# nouvelle image.
#
# Prérequis : le serveur doit pouvoir tirer les images privées de l'org Bonsai —
# soit via un « docker login git.goutailler-olivier.com » (root), soit via les
# REPO_USER/REPO_PASS de la stack Watchtower, dont le PAT doit avoir le scope
# read:package sur l'org Bonsai (et pas seulement sur Luz).
api:
build:
context: .
dockerfile: Dockerfile.api
secrets:
- ssh_key
args:
CACHEBUST: ${CACHEBUST:-stable}
image: git.goutailler-olivier.com/bonsai/bonsai-api:main
container_name: bonsai-api
restart: unless-stopped
depends_on:
@@ -47,6 +57,7 @@ services:
- bonsai-net
- proxy
labels:
- com.centurylinklabs.watchtower.enable=true
- traefik.enable=true
- traefik.http.routers.bonsai-api.rule=Host(`bonsai.goutailler-olivier.com`) && PathPrefix(`/api`)
- traefik.http.routers.bonsai-api.entrypoints=websecure