version: '3.8' services: # ===================== # 数据库服务 # ===================== postgres: image: pgvector/pgvector:pg15 container_name: tradmate-postgres environment: POSTGRES_DB: tradmate POSTGRES_USER: tradmate POSTGRES_PASSWORD: ${DB_PASSWORD:-tradmate} volumes: - postgres_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U tradmate"] interval: 5s timeout: 5s retries: 5 networks: - tradmate-network redis: image: redis:7-alpine container_name: tradmate-redis command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 networks: - tradmate-network # ===================== # 后端服务 # ===================== backend: build: context: ./backend dockerfile: Dockerfile container_name: tradmate-backend env_file: - ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://tradmate:tradmate@postgres:5432/tradmate - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/1 - CELERY_RESULT_BACKEND=redis://redis:6379/2 ports: - "8000:8000" volumes: - ./backend:/app - uploads_data:/app/uploads depends_on: postgres: condition: service_healthy redis: condition: service_healthy command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload networks: - tradmate-network # ===================== # Celery 任务队列 # ===================== celery-worker: build: context: ./backend dockerfile: Dockerfile container_name: tradmate-celery-worker env_file: - ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://tradmate:tradmate@postgres:5432/tradmate - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/1 - CELERY_RESULT_BACKEND=redis://redis:6379/2 volumes: - ./backend:/app depends_on: - redis - postgres command: celery -A app.celery_app worker --loglevel=info --concurrency=4 networks: - tradmate-network celery-beat: build: context: ./backend dockerfile: Dockerfile container_name: tradmate-celery-beat env_file: - ./backend/.env environment: - DATABASE_URL=postgresql+asyncpg://tradmate:tradmate@postgres:5432/tradmate - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/1 volumes: - ./backend:/app depends_on: - redis - postgres command: celery -A app.celery_app beat --loglevel=info networks: - tradmate-network # ===================== # 前端服务 - 管理后台 # ===================== admin-frontend: build: context: ./admin-frontend dockerfile: Dockerfile container_name: tradmate-admin ports: - "5173:5173" volumes: - ./admin-frontend:/app - /app/node_modules environment: - VITE_API_BASE_URL=/api/v1 depends_on: - backend command: npm run dev -- --host 0.0.0.0 networks: - tradmate-network # ===================== # 前端服务 - 用户工作台 # ===================== user-frontend: build: context: ./user-frontend dockerfile: Dockerfile container_name: tradmate-user ports: - "5174:5174" volumes: - ./user-frontend:/app - /app/node_modules environment: - VITE_API_BASE_URL=/api/v1 depends_on: - backend command: npm run dev -- --host 0.0.0.0 networks: - tradmate-network # ===================== # 前端服务 - 移动端 H5 # ===================== uni-app: build: context: ./uni-app dockerfile: Dockerfile container_name: tradmate-uniapp ports: - "3000:3000" volumes: - ./uni-app:/app - /app/node_modules environment: - VITE_API_BASE_URL=/api/v1 depends_on: - backend command: npm run dev:h5 -- --host 0.0.0.0 networks: - tradmate-network # ===================== # Nginx 反向代理 # ===================== nginx: image: nginx:alpine container_name: tradmate-nginx ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/ssl:/etc/nginx/ssl:ro depends_on: - backend - admin-frontend - user-frontend - uni-app networks: - tradmate-network volumes: postgres_data: redis_data: uploads_data: networks: tradmate-network: driver: bridge