services: web: image: registry.younerd.org/hoopscout/web:${APP_IMAGE_TAG:-latest} build: context: . dockerfile: Dockerfile env_file: - .env command: gunicorn config.wsgi:application --bind 0.0.0.0:8000 --workers ${GUNICORN_WORKERS:-3} --access-logfile - --error-logfile - depends_on: postgres: condition: service_healthy user: "10001:10001" volumes: - static_data:/app/staticfiles - media_data:/app/media - snapshots_incoming:/app/snapshots/incoming - snapshots_archive:/app/snapshots/archive - snapshots_failed:/app/snapshots/failed expose: - "8000" healthcheck: test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:8000/health/ || exit 1"] interval: 15s timeout: 5s retries: 8 start_period: 25s restart: unless-stopped nginx: image: registry.younerd.org/hoopscout/nginx:${NGINX_IMAGE_TAG:-latest} build: context: . dockerfile: nginx/Dockerfile depends_on: web: condition: service_healthy ports: - "80:80" volumes: - static_data:/var/www/static:ro - media_data:/var/www/media:ro read_only: true tmpfs: - /var/cache/nginx - /var/run healthcheck: test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1/health/ || exit 1"] interval: 15s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped postgres: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped scheduler: profiles: ["scheduler"] image: registry.younerd.org/hoopscout/scheduler:${APP_IMAGE_TAG:-latest} build: context: . dockerfile: Dockerfile env_file: - .env environment: SCHEDULER_ENABLED: ${SCHEDULER_ENABLED:-0} SCHEDULER_DISABLED_SLEEP_SECONDS: ${SCHEDULER_DISABLED_SLEEP_SECONDS:-300} DAILY_ORCHESTRATION_INTERVAL_SECONDS: ${DAILY_ORCHESTRATION_INTERVAL_SECONDS:-86400} command: /app/scripts/scheduler.sh depends_on: postgres: condition: service_healthy user: "10001:10001" volumes: - snapshots_incoming:/app/snapshots/incoming - snapshots_archive:/app/snapshots/archive - snapshots_failed:/app/snapshots/failed healthcheck: test: ["CMD-SHELL", "grep -qa 'scheduler.sh' /proc/1/cmdline || exit 1"] interval: 30s timeout: 5s retries: 3 start_period: 20s restart: unless-stopped volumes: postgres_data: static_data: media_data: snapshots_incoming: snapshots_archive: snapshots_failed: