Files
life-echo/api/docker-compose.yml
penghanyuan 0591e9d7c1 feat: 添加PostgreSQL支持并更新数据库配置
- 新增PostgreSQL服务支持,使用最新版17
- 更新Docker Compose配置以支持PostgreSQL和Redis
- 修改数据库连接逻辑,支持PostgreSQL和SQLite
- 更新文档以反映新的数据库配置和使用方法
- 优化数据模型,确保时间戳字段支持时区
2026-01-21 23:21:36 +01:00

168 lines
4.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
version: '3.8'
services:
# PostgreSQL 数据库(使用最新版 17
postgres:
image: postgres:17-alpine
container_name: life-echo-postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-life_echo}
volumes:
- postgres_data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
networks:
- life-echo-network
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# Redis 服务(用于会话存储和 Celery 消息队列)
redis:
image: redis:7-alpine
container_name: life-echo-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
restart: always
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- life-echo-network
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# FastAPI 应用
api:
build:
context: .
dockerfile: Dockerfile
image: life-echo-api:latest
container_name: life-echo-api-prod
ports:
- "8000:8000"
env_file:
- .env.prod
environment:
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/life_echo
- REDIS_URL=redis://redis:6379/0
restart: always
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "python", "-c", "import http.client; conn = http.client.HTTPConnection('localhost', 8000); conn.request('GET', '/health'); r = conn.getresponse(); exit(0 if r.status == 200 else 1)"]
interval: 30s
timeout: 10s
retries: 3
start_period: 15s
networks:
- life-echo-network
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# Celery Worker后台任务处理
celery-worker:
build:
context: .
dockerfile: Dockerfile
image: life-echo-api:latest
container_name: life-echo-celery-worker
command: celery -A tasks.celery_app worker --loglevel=info --concurrency=4
env_file:
- .env.prod
environment:
- DATABASE_URL=postgresql://postgres:postgres@postgres:5432/life_echo
- REDIS_URL=redis://redis:6379/0
restart: always
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
api:
condition: service_healthy
networks:
- life-echo-network
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# Celery Beat定时任务调度可选
# celery-beat:
# build:
# context: .
# dockerfile: Dockerfile
# image: life-echo-api:latest
# container_name: life-echo-celery-beat
# command: celery -A tasks.celery_app beat --loglevel=info
# env_file:
# - .env.prod
# environment:
# - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/life_echo
# - REDIS_URL=redis://redis:6379/0
# restart: always
# depends_on:
# postgres:
# condition: service_healthy
# redis:
# condition: service_healthy
# networks:
# - life-echo-network
# FlowerCelery 监控面板,可选)
# flower:
# build:
# context: .
# dockerfile: Dockerfile
# image: life-echo-api:latest
# container_name: life-echo-flower
# command: celery -A tasks.celery_app flower --port=5555
# ports:
# - "5555:5555"
# env_file:
# - .env.prod
# environment:
# - REDIS_URL=redis://redis:6379/0
# restart: always
# depends_on:
# redis:
# condition: service_healthy
# networks:
# - life-echo-network
networks:
life-echo-network:
driver: bridge
volumes:
postgres_data:
driver: local
redis_data:
driver: local