8efa725753
Remplace les images locales « localhost/luz-*:latest » (ex-deploy.sh SSH, supprimé) par « git.goutailler-olivier.com/luz/luz-*:latest » et ajoute le label com.centurylinklabs.watchtower.enable=true sur backend et webapp. La prod suit désormais le tag :latest (publié par la CI sur push main), séparée de dev-luz (:develop). Met à jour le bandeau de tête en conséquence. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
95 lines
3.1 KiB
YAML
95 lines
3.1 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-*:latest),
|
|
# publiées par la CI (client/app/.gitea/workflows/images.yml) UNIQUEMENT sur un push
|
|
# « main » — d'où la séparation avec dev-luz (qui suit le tag « develop »). Le
|
|
# redéploiement est automatique : les conteneurs portent le label
|
|
# watchtower.enable=true, donc Watchtower (../watchtower/) tire la nouvelle image et
|
|
# les recrée. 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:latest
|
|
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:latest
|
|
container_name: luz
|
|
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.rule=Host(`luz.goutailler-olivier.com`)
|
|
- traefik.http.routers.luz.entrypoints=websecure
|
|
- traefik.http.routers.luz.tls.certresolver=le
|
|
- traefik.http.services.luz.loadbalancer.server.port=80
|
|
- traefik.docker.network=proxy
|
|
|
|
networks:
|
|
luz-net:
|
|
driver: bridge
|
|
proxy:
|
|
external: true
|
|
name: proxy
|