services: release: build: context: . target: build command: sh scripts/release.sh restart: "no" env_file: - .env depends_on: db: condition: service_healthy volumes: - uploads:/app/storage/uploads networks: - briefing app: build: context: . target: runner restart: unless-stopped env_file: - .env depends_on: release: condition: service_completed_successfully expose: - "3000" volumes: - uploads:/app/storage/uploads healthcheck: test: ["CMD-SHELL", "node -e \"fetch('http://localhost:3000/api/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\""] interval: 30s timeout: 10s retries: 5 start_period: 30s networks: - briefing db: image: postgres:16 restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-briefing} POSTGRES_USER: ${POSTGRES_USER:-briefing} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-briefing} -d ${POSTGRES_DB:-briefing}"] interval: 10s timeout: 5s retries: 5 volumes: - pgdata:/var/lib/postgresql/data networks: - briefing caddy: image: caddy:2-alpine restart: unless-stopped depends_on: app: condition: service_healthy env_file: - .env ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config networks: - briefing volumes: pgdata: uploads: caddy_data: caddy_config: networks: briefing: driver: bridge