Files
fquiz/deploy/pro-deploy/compose.yml
T
2026-05-03 13:05:26 +08:00

169 lines
4.2 KiB
YAML

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