5558c206a0
La prod servait encore a70e0e4 (25/07) alors que main en etait a 79 commits plus loin : les stacks luz et dev-luz epinglaient « :develop », un tag que la CI de l'app ne pousse plus depuis qu'elle ne se declenche que sur main (images.yml publie sha-<court>, main et latest). Rien ne le signalait : Watchtower repondait bien 200 a /v1/update, ne trouvait aucune image plus recente pour « :develop » et ne recreait donc rien. Seule la verification post-deploiement de la CI a fini par le dire. Les quatre images (backend + webapp, prod et dev-luz) visent desormais « :main ». Les en-tetes des deux stacks rappellent que ce tag doit rester celui que publie images.yml, changer l'un imposant de changer l'autre. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
106 lines
4.0 KiB
YAML
106 lines
4.0 KiB
YAML
# Stack de PRODUCTION Luz — luz.goutailler-olivier.com
|
|
#
|
|
# Frontend : https://luz.goutailler-olivier.com → webapp (nginx :80)
|
|
# Backend : https://luz.goutailler-olivier.com/api → backend Spring (:8080)
|
|
#
|
|
# Images tirées du registre Gitea (git.goutailler-olivier.com/luz/luz-*:main),
|
|
# publiées par la CI (client/app/.gitea/workflows/images.yml) à chaque push « main »
|
|
# — c'est-à-dire à chaque mise en production. Prod et dev-luz partagent donc la MÊME
|
|
# image ; ce qui les sépare : ici la base est PERSISTANTE et sans profil « dev » (voir
|
|
# plus bas), côté dev-luz elle est réinitialisée à chaque démarrage. Le redéploiement
|
|
# est automatique : les conteneurs portent le label watchtower.enable=true, donc chaque
|
|
# push main fait recréer AUSSI cette prod par Watchtower (../watchtower/), en même
|
|
# temps que dev-luz. Plus de transfert SSH ni de deploy.sh.
|
|
#
|
|
# ⚠️ Le tag suivi ici doit rester celui que la CI publie. L'app a d'abord publié
|
|
# « :develop » (elle n'avait pas de branche main), puis est passée à « :main ». Ces
|
|
# stacks étant restées sur « :develop », plus rien n'a poussé ce tag : Watchtower
|
|
# répondait 200 à /v1/update mais ne trouvait aucune image plus récente, et la prod
|
|
# est restée figée sur le dernier build develop (a70e0e4, 25/07) pendant que main
|
|
# avançait de 79 commits — sans la moindre erreur visible côté CI hors la
|
|
# vérification post-déploiement. Changer le tag de publication dans images.yml
|
|
# impose donc de changer ce tag ici, dans le même mouvement.
|
|
#
|
|
# Prérequis : le serveur (root) doit être « docker login git.goutailler-olivier.com »
|
|
# une fois, sinon Watchtower ne peut pas tirer les images privées de l'org luz.
|
|
#
|
|
# PAS de profil « dev » : Flyway applique les migrations, la base est PERSISTANTE
|
|
# (bind sous ${DATA_PATH}/luz/db_data), les données ne sont jamais réinitialisées.
|
|
#
|
|
# Prérequis serveur : Traefik v3 + réseau externe « proxy » (voir ../traefik/),
|
|
# DNS A « luz » → serveur.
|
|
name: luz
|
|
|
|
services:
|
|
db:
|
|
image: postgres:17
|
|
container_name: luz-db
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: luz
|
|
POSTGRES_USER: luz
|
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
|
TZ: Europe/Paris
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U luz -d luz"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
volumes:
|
|
- ${DATA_PATH:-~/Applications/data}/luz/db_data:/var/lib/postgresql/data
|
|
networks:
|
|
- luz-net
|
|
|
|
backend:
|
|
image: git.goutailler-olivier.com/luz/luz-backend:main
|
|
container_name: luz-backend
|
|
restart: unless-stopped
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
environment:
|
|
DB_HOST: db
|
|
DB_PORT: 5432
|
|
DB_NAME: luz
|
|
DB_USER: luz
|
|
DB_PASSWORD: ${DB_PASSWORD}
|
|
JWT_SECRET: ${JWT_SECRET}
|
|
TZ: Europe/Paris
|
|
networks:
|
|
- luz-net
|
|
- proxy
|
|
labels:
|
|
- com.centurylinklabs.watchtower.enable=true
|
|
- traefik.enable=true
|
|
- traefik.http.routers.luz-backend.rule=Host(`luz.goutailler-olivier.com`) && PathPrefix(`/api`)
|
|
- traefik.http.routers.luz-backend.entrypoints=websecure
|
|
- traefik.http.routers.luz-backend.tls.certresolver=le
|
|
- traefik.http.services.luz-backend.loadbalancer.server.port=8080
|
|
- traefik.docker.network=proxy
|
|
|
|
webapp:
|
|
image: git.goutailler-olivier.com/luz/luz-webapp:main
|
|
container_name: luz-webapp
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- backend
|
|
environment:
|
|
TZ: Europe/Paris
|
|
networks:
|
|
- proxy
|
|
labels:
|
|
- com.centurylinklabs.watchtower.enable=true
|
|
- traefik.enable=true
|
|
- traefik.http.routers.luz-webapp.rule=Host(`luz.goutailler-olivier.com`)
|
|
- traefik.http.routers.luz-webapp.entrypoints=websecure
|
|
- traefik.http.routers.luz-webapp.tls.certresolver=le
|
|
- traefik.http.services.luz-webapp.loadbalancer.server.port=80
|
|
- traefik.docker.network=proxy
|
|
|
|
networks:
|
|
luz-net:
|
|
driver: bridge
|
|
proxy:
|
|
external: true
|
|
name: proxy
|