2b2a924916
Aligne le nom du front sur celui du backend (luz-backend) et renomme les identifiants Traefik associés (routeur/service luz → luz-webapp). La règle Host(`luz.goutailler-olivier.com`) est inchangée : le site reste servi. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
97 lines
3.3 KiB
YAML
97 lines
3.3 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-*:develop),
|
|
# publiées par la CI (client/app/.gitea/workflows/images.yml) à chaque push « develop »
|
|
# (l'app n'a pas de branche « main »). 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 develop fait recréer AUSSI cette prod par Watchtower (../watchtower/), en même
|
|
# temps que dev-luz. Plus de transfert SSH ni de deploy.sh.
|
|
#
|
|
# 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:develop
|
|
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:develop
|
|
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
|