x-default-logging: &default-logging driver: json-file options: max-size: "10m" max-file: "3" services: web: build: context: . dockerfile: frontend/Dockerfile.prod ports: - "80:80" depends_on: - api - minio logging: *default-logging restart: unless-stopped api: build: context: ./backend dockerfile: Dockerfile env_file: - ./backend/.env.production environment: - DATABASE_URL=postgresql+asyncpg://techmatch:${POSTGRES_PASSWORD:-change-me}@postgres:5432/techmatch - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/1 - CELERY_RESULT_BACKEND=redis://redis:6379/2 - MINIO_ENDPOINT=minio:9000 - MINIO_PUBLIC_ENDPOINT=${PUBLIC_HOST:-134.175.219.205} depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_started volumes: - app_data:/app/data logging: *default-logging restart: unless-stopped worker: build: context: ./backend dockerfile: Dockerfile command: sh -c "python -m app.db_migrations && celery -A app.workers.celery_app worker --loglevel=info -Q ai_extract,ai_ocr,ai_parse,ai_deep,ai_match,reports,celery --concurrency=${CELERY_WORKER_CONCURRENCY:-1} --prefetch-multiplier=1 --max-tasks-per-child=50" env_file: - ./backend/.env.production environment: - DATABASE_URL=postgresql+asyncpg://techmatch:${POSTGRES_PASSWORD:-change-me}@postgres:5432/techmatch - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/1 - CELERY_RESULT_BACKEND=redis://redis:6379/2 - MINIO_ENDPOINT=minio:9000 - MINIO_PUBLIC_ENDPOINT=${PUBLIC_HOST:-134.175.219.205} depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_started volumes: - app_data:/app/data logging: *default-logging restart: unless-stopped postgres: image: postgres:16-alpine environment: - POSTGRES_USER=techmatch - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-change-me} - POSTGRES_DB=techmatch volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U techmatch"] interval: 5s timeout: 5s retries: 10 logging: *default-logging restart: unless-stopped redis: image: redis:7-alpine volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 10 logging: *default-logging restart: unless-stopped minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: - MINIO_ROOT_USER=${MINIO_ACCESS_KEY:-minioadmin} - MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY:-change-me-minio-password} volumes: - minio_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 5s retries: 10 logging: *default-logging restart: unless-stopped volumes: app_data: postgres_data: redis_data: minio_data: