services: db: image: ${POSTGRES_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-db environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} PGDATA: /var/lib/postgresql/data/pgdata ports: - "${POSTGRES_PORT}:5432" volumes: - ./data/postgres:/var/lib/postgresql/data restart: unless-stopped redis: image: ${REDIS_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-redis command: redis-server --appendonly yes ports: - "${REDIS_PORT}:6379" volumes: - ./data/redis:/data restart: unless-stopped minio: image: ${MINIO_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY} ports: - "${MINIO_API_PORT}:9000" - "${MINIO_CONSOLE_PORT}:9001" volumes: - ./data/minio:/data restart: unless-stopped minio-init: image: ${MINIO_MC_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-minio-init depends_on: - minio entrypoint: /bin/sh command: - -c - > until mc alias set local "$${MINIO_ENDPOINT}" "$${MINIO_ACCESS_KEY}" "$${MINIO_SECRET_KEY}"; do sleep 1; done; mc mb -p "local/$${MINIO_BUCKET}" || true; environment: MINIO_ENDPOINT: ${MINIO_ENDPOINT} MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} MINIO_BUCKET: ${MINIO_BUCKET} restart: "no" api: image: ${API_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-api depends_on: - db - redis - minio - minio-init env_file: - ./.env.prod environment: API_HOST: 0.0.0.0 API_PORT: 8000 DB_HOST: db DB_PORT: 5432 MINIO_ENDPOINT: http://minio:9000 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 FLOWER_BASIC_AUTH: ${FLOWER_BASIC_AUTH} ports: - "${API_PORT}:8000" volumes: - ./data/app:/app/data restart: unless-stopped celery-worker: image: ${API_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-celery-worker command: - celery - -A - app.core.celery_app.celery_app - worker - --loglevel=${CELERY_LOG_LEVEL} - --concurrency=${CELERY_WORKER_CONCURRENCY} - --queues=${CELERY_WORKER_QUEUES} depends_on: - api - redis env_file: - ./.env.prod environment: DB_HOST: db DB_PORT: 5432 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 FLOWER_API_BASE_URL: http://flower:5555 volumes: - ./data/app:/app/data restart: unless-stopped celery-beat: image: ${API_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-celery-beat command: - celery - -A - app.core.celery_app.celery_app - beat - --loglevel=${CELERY_LOG_LEVEL} - --schedule=/app/data/celery/beat-schedule depends_on: - api - redis env_file: - ./.env.prod environment: DB_HOST: db DB_PORT: 5432 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 volumes: - ./data/app:/app/data restart: unless-stopped flower: image: ${API_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-flower command: - celery - -A - app.core.celery_app.celery_app - flower - --address=0.0.0.0 - --port=5555 - --persistent=False - --basic-auth=${FLOWER_BASIC_AUTH} depends_on: - redis environment: CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/1 CELERY_TIMEZONE: ${CELERY_TIMEZONE} FLOWER_BASIC_AUTH: ${FLOWER_BASIC_AUTH:-admin:change_me} ports: - "${FLOWER_PORT}:5555" restart: unless-stopped web: image: ${WEB_IMAGE} container_name: ${COMPOSE_PROJECT_NAME}-web depends_on: - api environment: NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL} NODE_ENV: production ports: - "3000:3000" restart: unless-stopped