services: db: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-enhancer} POSTGRES_USER: ${POSTGRES_USER:-enhancer} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-enhancer} 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 redis: image: redis:7-alpine command: ["redis-server", "--appendonly", "yes"] volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 api: build: ./backend command: sh -c "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn enhancer_project.wsgi:application --bind 0.0.0.0:8000" env_file: - ./backend/.env environment: DJANGO_DEBUG: ${DJANGO_DEBUG:-0} DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-change-me} DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS:-localhost,127.0.0.1,api} DJANGO_CSRF_TRUSTED_ORIGINS: ${DJANGO_CSRF_TRUSTED_ORIGINS:-http://localhost,https://localhost} DJANGO_SECURE_SSL_REDIRECT: ${DJANGO_SECURE_SSL_REDIRECT:-0} DJANGO_SESSION_COOKIE_SECURE: ${DJANGO_SESSION_COOKIE_SECURE:-0} DJANGO_CSRF_COOKIE_SECURE: ${DJANGO_CSRF_COOKIE_SECURE:-0} DJANGO_SECURE_HSTS_SECONDS: ${DJANGO_SECURE_HSTS_SECONDS:-0} DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS: ${DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS:-0} DJANGO_SECURE_HSTS_PRELOAD: ${DJANGO_SECURE_HSTS_PRELOAD:-0} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:5173,http://localhost} POSTGRES_HOST: db POSTGRES_DB: ${POSTGRES_DB:-enhancer} POSTGRES_USER: ${POSTGRES_USER:-enhancer} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-enhancer} CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0 IMAGE_SESSION_TTL_HOURS: ${IMAGE_SESSION_TTL_HOURS:-6} volumes: - media_data:/app/media depends_on: db: condition: service_healthy redis: condition: service_healthy worker: build: ./backend command: celery -A enhancer_project worker --loglevel=info env_file: - ./backend/.env environment: DJANGO_DEBUG: ${DJANGO_DEBUG:-0} DJANGO_SECRET_KEY: ${DJANGO_SECRET_KEY:-change-me} DJANGO_ALLOWED_HOSTS: ${DJANGO_ALLOWED_HOSTS:-localhost,127.0.0.1,api} DJANGO_CSRF_TRUSTED_ORIGINS: ${DJANGO_CSRF_TRUSTED_ORIGINS:-http://localhost,https://localhost} DJANGO_SECURE_SSL_REDIRECT: ${DJANGO_SECURE_SSL_REDIRECT:-0} DJANGO_SESSION_COOKIE_SECURE: ${DJANGO_SESSION_COOKIE_SECURE:-0} DJANGO_CSRF_COOKIE_SECURE: ${DJANGO_CSRF_COOKIE_SECURE:-0} DJANGO_SECURE_HSTS_SECONDS: ${DJANGO_SECURE_HSTS_SECONDS:-0} DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS: ${DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS:-0} DJANGO_SECURE_HSTS_PRELOAD: ${DJANGO_SECURE_HSTS_PRELOAD:-0} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS:-http://localhost:5173,http://localhost} POSTGRES_HOST: db POSTGRES_DB: ${POSTGRES_DB:-enhancer} POSTGRES_USER: ${POSTGRES_USER:-enhancer} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-enhancer} CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0 IMAGE_SESSION_TTL_HOURS: ${IMAGE_SESSION_TTL_HOURS:-6} volumes: - media_data:/app/media depends_on: db: condition: service_healthy redis: condition: service_healthy web: build: ./frontend depends_on: - api caddy: image: caddy:2-alpine ports: - "80:80" - "443:443" environment: CADDY_DOMAIN: ${CADDY_DOMAIN:-localhost} volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - web - api volumes: postgres_data: redis_data: media_data: caddy_data: caddy_config: