x-common-env: &common-env DATABASE_URL: postgresql://mpr_user:mpr_pass@postgres:5432/mpr REDIS_URL: redis://redis:6379/0 DJANGO_SETTINGS_MODULE: mpr.settings DEBUG: 1 GRPC_HOST: grpc GRPC_PORT: 50051 S3_ENDPOINT_URL: http://minio:9000 S3_BUCKET_IN: mpr-media-in S3_BUCKET_OUT: mpr-media-out AWS_ACCESS_KEY_ID: minioadmin AWS_SECRET_ACCESS_KEY: minioadmin AWS_REGION: us-east-1 x-healthcheck-defaults: &healthcheck-defaults interval: 5s timeout: 5s retries: 5 services: # ============================================================================= # Infrastructure # ============================================================================= postgres: image: postgres:15-alpine environment: POSTGRES_DB: mpr POSTGRES_USER: mpr_user POSTGRES_PASSWORD: mpr_pass ports: - "5436:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: <<: *healthcheck-defaults test: ["CMD-SHELL", "pg_isready -U mpr_user -d mpr"] redis: image: redis:7-alpine ports: - "6381:6379" volumes: - redis-data:/data healthcheck: <<: *healthcheck-defaults test: ["CMD", "redis-cli", "ping"] minio: image: minio/minio command: ["server", "/data", "--console-address", ":9001"] ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin volumes: - minio-data:/data healthcheck: <<: *healthcheck-defaults test: ["CMD", "mc", "ready", "local"] minio-init: image: minio/mc depends_on: minio: condition: service_healthy entrypoint: ["/bin/sh", "-c"] command: - | mc alias set local http://minio:9000 minioadmin minioadmin mc mb --ignore-existing local/mpr-media-in mc mb --ignore-existing local/mpr-media-out mc anonymous set download local/mpr-media-in mc anonymous set download local/mpr-media-out nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - django - fastapi - timeline - minio # ============================================================================= # Application Services # ============================================================================= django: build: context: .. dockerfile: ctrl/Dockerfile command: > bash -c "python manage.py migrate && python manage.py loadbuiltins || true && python manage.py runserver 0.0.0.0:8701" ports: - "8701:8701" environment: <<: *common-env volumes: - ..:/app depends_on: postgres: condition: service_healthy redis: condition: service_healthy fastapi: build: context: .. dockerfile: ctrl/Dockerfile command: uvicorn api.main:app --host 0.0.0.0 --port 8702 --reload ports: - "8702:8702" environment: <<: *common-env volumes: - ..:/app depends_on: postgres: condition: service_healthy redis: condition: service_healthy grpc: build: context: .. dockerfile: ctrl/Dockerfile command: python -m rpc.server ports: - "50052:50051" environment: <<: *common-env GRPC_PORT: 50051 GRPC_MAX_WORKERS: 10 volumes: - ..:/app depends_on: postgres: condition: service_healthy redis: condition: service_healthy celery: build: context: .. dockerfile: ctrl/Dockerfile command: celery -A mpr worker -l info -Q transcode -c 2 environment: <<: *common-env MPR_EXECUTOR: local volumes: - ..:/app depends_on: postgres: condition: service_healthy redis: condition: service_healthy grpc: condition: service_started timeline: build: context: ../ui/timeline dockerfile: Dockerfile ports: - "5173:5173" environment: VITE_ALLOWED_HOSTS: ${VITE_ALLOWED_HOSTS:-} volumes: - ../ui/timeline/src:/app/src volumes: postgres-data: redis-data: minio-data: networks: default: name: mpr name: mpr