version: '3.8' services: # MySQL 数据库 mysql: image: mysql:8.0 container_name: ipam-mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-ipam2024 MYSQL_DATABASE: ${MYSQL_DATABASE:-ipam} MYSQL_USER: ${MYSQL_USER:-ipam} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-ipam2024} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 # Redis 缓存 & Celery Broker redis: image: redis:7-alpine container_name: ipam-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # FastAPI 后端服务 backend: build: context: ./backend dockerfile: Dockerfile container_name: ipam-backend ports: - "8000:8000" environment: - DATABASE_URL=mysql+pymysql://${MYSQL_USER:-ipam}:${MYSQL_PASSWORD:-ipam2024}@mysql:3306/${MYSQL_DATABASE:-ipam} - 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: mysql: condition: service_healthy redis: condition: service_healthy restart: unless-stopped # Celery Worker - 扫描任务执行 celery-worker: build: context: ./backend dockerfile: Dockerfile container_name: ipam-celery-worker command: celery -A app.tasks.celery_app worker --loglevel=info --concurrency=4 environment: - DATABASE_URL=mysql+pymysql://${MYSQL_USER:-ipam}:${MYSQL_PASSWORD:-ipam2024}@mysql:3306/${MYSQL_DATABASE:-ipam} - 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: mysql: condition: service_healthy redis: condition: service_healthy restart: unless-stopped # Celery Beat - 定时任务调度 celery-beat: build: context: ./backend dockerfile: Dockerfile container_name: ipam-celery-beat command: celery -A app.tasks.celery_app beat --loglevel=info environment: - DATABASE_URL=mysql+pymysql://${MYSQL_USER:-ipam}:${MYSQL_PASSWORD:-ipam2024}@mysql:3306/${MYSQL_DATABASE:-ipam} - 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: mysql: condition: service_healthy redis: condition: service_healthy restart: unless-stopped volumes: mysql_data: redis_data: