Files
parenthese/docker-compose.yml
T
IliesAllaliandClaude Opus 5.5 a91474f0e6 fix(docker): 120 s de marge au healthcheck de l'API au premier lancement
Les migrations Prisma passent avant que l'API réponde. Avec 30 s, le conteneur
web, qui attend une API saine, abandonnait au premier docker compose up
(signalé sur r/GenealogieFR le 11/10).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 20:38:04 +02:00

81 lines
3.1 KiB
YAML

# Parenthèse auto-hébergé : base PostgreSQL, API, front servi par nginx.
# Configuration dans le fichier .env à la racine (copiez .env.example).
# docker compose up -d démarrer
# docker compose logs -f api suivre l'API
# docker compose down arrêter (les volumes db-data et media sont conservés)
# bash tools/docker-smoke.sh vérifier l'installation
# Les images de l'API et du front sont publiées sur ghcr.io (version choisie par PARENTHESE_VERSION,
# `latest` par défaut) : ce fichier et le .env suffisent, sans le code. Si l'image est introuvable,
# compose la construit depuis les sources (dépôt cloné) ; `--build` force cette construction.
name: parenthese
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER:-parenthese}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Renseignez POSTGRES_PASSWORD dans .env}
POSTGRES_DB: ${POSTGRES_DB:-parenthese}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-parenthese} -d ${POSTGRES_DB:-parenthese}"]
interval: 5s
timeout: 5s
retries: 12
api:
image: ghcr.io/iliesallali/parenthese-api:${PARENTHESE_VERSION:-latest}
build: ./backend
restart: unless-stopped
depends_on:
db:
condition: service_healthy
# Tout le .env passe à l'API (JWT_SECRET, CORS_ORIGIN, durées de session).
env_file: .env
# Ces valeurs sont imposées par le déploiement Docker et priment sur le .env.
environment:
NODE_ENV: production
PORT: "4000"
DATABASE_URL: postgresql://${POSTGRES_USER:-parenthese}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-parenthese}
MEDIA_STORAGE_PATH: /app/storage/media
volumes:
- media:/app/storage/media
# Au démarrage, l'image applique les migrations Prisma en attente puis lance le serveur
# (CMD de backend/Dockerfile).
healthcheck:
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:4000/health').then((r) => process.exit(r.ok ? 0 : 1)).catch(() => process.exit(1))"]
interval: 15s
timeout: 5s
retries: 5
# Premier lancement : les migrations passent avant que l'API réponde, 30 s ne suffisaient pas
# et le conteneur web, qui attend une API prête, abandonnait (signalé sur Reddit le 11/10).
start_period: 120s
web:
image: ghcr.io/iliesallali/parenthese-web:${PARENTHESE_VERSION:-latest}
build:
context: .
dockerfile: Dockerfile.web
restart: unless-stopped
depends_on:
api:
# nginx résout l'adresse de `api` une seule fois, à son démarrage : il attend une API prête,
# et redémarre quand le conteneur api est recréé (mise à jour), sinon il garderait l'ancienne adresse.
condition: service_healthy
restart: true
ports:
- "${WEB_PORT:-80}:80"
healthcheck:
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1/"]
interval: 15s
timeout: 5s
retries: 3
start_period: 5s
volumes:
db-data:
media: