2026-03-12 16:41:45 +08:00
name : social-app-prod
services :
2026-03-17 14:12:44 +08:00
redis :
image : redis:7-alpine
container_name : social-prod-redis
restart : unless-stopped
environment :
- REDIS_PASSWORD=${SOCIAL_REDIS__PASSWORD}
command : >
sh -c 'test -n "$$REDIS_PASSWORD" && exec redis-server --appendonly yes --dir /data --requirepass "$$REDIS_PASSWORD" || (echo "REDIS_PASSWORD is required" >&2; exit 1)'
volumes :
- redis_data:/data
healthcheck :
test :
[
"CMD" ,
"sh" ,
"-c" ,
'if [ -n "$$REDIS_PASSWORD" ]; then redis-cli -a "$$REDIS_PASSWORD" ping; else redis-cli ping; fi' ,
]
interval : 5s
timeout : 3s
retries : 10
2026-03-12 16:41:45 +08:00
2026-03-17 14:12:44 +08:00
web :
image : ${SOCIAL_BACKEND_IMAGE:-social-app-backend:prod}
container_name : social-prod-web
restart : unless-stopped
env_file :
- ./.env.prod
environment :
- PYTHONPATH=/app/backend/src
- PYTHONDONTWRITEBYTECODE=1
- SOCIAL_RUNTIME__SERVICE_NAME=web
- SOCIAL_RUNTIME__ENVIRONMENT=${SOCIAL_RUNTIME__ENVIRONMENT:-prod}
- SOCIAL_REDIS__HOST=redis
- SOCIAL_REDIS__PORT=6379
command : >
2026-03-23 17:57:24 +08:00
sh -c 'uv run uvicorn app:app --host ${SOCIAL_WEB__HOST:-0.0.0.0} --port ${SOCIAL_WEB__PORT:-5775} --workers ${SOCIAL_WEB__WORKERS:-2} --log-level $(printf "%s" "${SOCIAL_RUNTIME__LOG_LEVEL:-info}" | tr "[:upper:]" "[:lower:]")'
2026-03-17 14:12:44 +08:00
ports :
- "127.0.0.1:${SOCIAL_WEB__PORT:-5775}:${SOCIAL_WEB__PORT:-5775}"
depends_on :
redis :
condition : service_healthy
volumes :
- ../logs:/app/logs
- ./static/releases:/app/deploy/static/releases:ro
healthcheck :
test :
[
"CMD" ,
"python" ,
"-c" ,
"import os,sys,urllib.request;port=os.getenv('SOCIAL_WEB__PORT','5775');u=f'http://127.0.0.1:{port}/health';sys.exit(0 if urllib.request.urlopen(u, timeout=3).getcode() < 500 else 1)" ,
]
interval : 15s
timeout : 5s
retries : 10
2026-03-12 16:41:45 +08:00
2026-03-20 01:30:34 +08:00
worker-agent :
2026-03-17 14:12:44 +08:00
image : ${SOCIAL_BACKEND_IMAGE:-social-app-backend:prod}
2026-03-20 01:30:34 +08:00
container_name : social-prod-worker-agent
2026-03-17 14:12:44 +08:00
restart : unless-stopped
env_file :
- ./.env.prod
environment :
- PYTHONPATH=/app/backend/src
- PYTHONDONTWRITEBYTECODE=1
2026-03-20 01:30:34 +08:00
- SOCIAL_RUNTIME__SERVICE_NAME=worker-agent
2026-03-17 14:12:44 +08:00
- SOCIAL_RUNTIME__ENVIRONMENT=${SOCIAL_RUNTIME__ENVIRONMENT:-prod}
- SOCIAL_REDIS__HOST=redis
- SOCIAL_REDIS__PORT=6379
command : >
2026-03-23 17:57:24 +08:00
sh -c 'uv run taskiq worker core.taskiq.app:worker_agent_broker core.agentscope.runtime.tasks --workers ${SOCIAL_WORKER__GROUPS__AGENT__CONCURRENCY:-2}'
2026-03-17 14:12:44 +08:00
depends_on :
redis :
condition : service_healthy
volumes :
- ../logs:/app/logs
- ./static/releases:/app/deploy/static/releases:ro
2026-03-12 16:41:45 +08:00
2026-03-20 01:30:34 +08:00
worker-automation :
2026-03-17 14:12:44 +08:00
image : ${SOCIAL_BACKEND_IMAGE:-social-app-backend:prod}
2026-03-20 01:30:34 +08:00
container_name : social-prod-worker-automation
2026-03-17 14:12:44 +08:00
restart : unless-stopped
env_file :
- ./.env.prod
environment :
- PYTHONPATH=/app/backend/src
- PYTHONDONTWRITEBYTECODE=1
2026-03-20 01:30:34 +08:00
- SOCIAL_RUNTIME__SERVICE_NAME=worker-automation
2026-03-17 14:12:44 +08:00
- SOCIAL_RUNTIME__ENVIRONMENT=${SOCIAL_RUNTIME__ENVIRONMENT:-prod}
- SOCIAL_REDIS__HOST=redis
- SOCIAL_REDIS__PORT=6379
command : >
2026-03-23 17:57:24 +08:00
sh -c 'uv run taskiq worker core.taskiq.app:worker_automation_broker core.agentscope.runtime.tasks --workers ${SOCIAL_WORKER__GROUPS__AUTOMATION__CONCURRENCY:-1}'
2026-03-17 14:12:44 +08:00
depends_on :
redis :
condition : service_healthy
volumes :
- ../logs:/app/logs
- ./static/releases:/app/deploy/static/releases:ro
2026-03-12 16:41:45 +08:00
2026-03-20 01:30:34 +08:00
scheduler :
2026-03-17 14:12:44 +08:00
image : ${SOCIAL_BACKEND_IMAGE:-social-app-backend:prod}
2026-03-20 01:30:34 +08:00
container_name : social-prod-scheduler
2026-03-17 14:12:44 +08:00
restart : unless-stopped
env_file :
- ./.env.prod
environment :
- PYTHONPATH=/app/backend/src
- PYTHONDONTWRITEBYTECODE=1
2026-03-20 01:30:34 +08:00
- SOCIAL_RUNTIME__SERVICE_NAME=scheduler
2026-03-17 14:12:44 +08:00
- SOCIAL_RUNTIME__ENVIRONMENT=${SOCIAL_RUNTIME__ENVIRONMENT:-prod}
- SOCIAL_REDIS__HOST=redis
- SOCIAL_REDIS__PORT=6379
2026-03-23 17:57:24 +08:00
command : uv run python -m core.runtime.cli automation-scheduler
2026-03-17 14:12:44 +08:00
depends_on :
redis :
condition : service_healthy
volumes :
- ../logs:/app/logs
- ./static/releases:/app/deploy/static/releases:ro
2026-03-12 16:41:45 +08:00
2026-03-17 14:12:44 +08:00
init-job :
image : ${SOCIAL_BACKEND_IMAGE:-social-app-backend:prod}
container_name : social-prod-init-job
restart : "no"
env_file :
- ./.env.prod
environment :
- PYTHONPATH=/app/backend/src
- PYTHONDONTWRITEBYTECODE=1
- SOCIAL_RUNTIME__SERVICE_NAME=init-job
- SOCIAL_RUNTIME__ENVIRONMENT=${SOCIAL_RUNTIME__ENVIRONMENT:-prod}
- SOCIAL_REDIS__HOST=redis
- SOCIAL_REDIS__PORT=6379
2026-03-23 17:57:24 +08:00
command : uv run python -m core.runtime.cli bootstrap
2026-03-17 14:12:44 +08:00
depends_on :
redis :
condition : service_healthy
volumes :
- ../logs:/app/logs
- ./static/releases:/app/deploy/static/releases:ro
profiles :
- job
2026-03-12 16:41:45 +08:00
volumes :
2026-03-17 14:12:44 +08:00
redis_data :