version: '3.8' services: # MySQL 8.0 数据库 mysql: image: mysql:8.0 container_name: aguzhitou-mysql-dev environment: MYSQL_ROOT_PASSWORD: 1qazse42W3 MYSQL_DATABASE: aguzhitou MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci TZ: Asia/Shanghai volumes: - mysql_dev_data:/var/lib/mysql # 注:移除 init-scripts,使用 Prisma db push 创建表结构 ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1qazse42W3"] interval: 10s timeout: 5s retries: 5 start_period: 30s restart: always networks: - aguzhitou-dev-network command: > --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --innodb_buffer_pool_size=256M # Redis 7 缓存 redis: image: redis:7-alpine container_name: aguzhitou-redis-dev volumes: - redis_dev_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 restart: always networks: - aguzhitou-dev-network # 后端应用 - 开发模式(热重载) app: image: node:20-alpine container_name: aguzhitou-app-dev working_dir: /app environment: NODE_ENV: development PORT: 3000 DATABASE_URL: mysql://root:1qazse42W3@mysql:3306/aguzhitou REDIS_URL: redis://redis:6379 JWT_SECRET: aguzhitou-dev-secret-key-2024-development-only JWT_EXPIRES_IN: 7d LOG_LEVEL: debug ports: - "3000:3000" volumes: # 挂载源代码(关键:实现代码同步) - ./src:/app/src:ro - ./prisma:/app/prisma:ro - ./package.json:/app/package.json:ro - ./tsconfig.json:/app/tsconfig.json:ro - ./logs:/app/logs # 不覆盖 node_modules - app_dev_node_modules:/app/node_modules - app_dev_dist:/app/dist depends_on: mysql: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - aguzhitou-dev-network command: > sh -c " echo '[Dev] Installing system dependencies...' && apk add --no-cache openssl && echo '[Dev] Installing dependencies...' && npm install && npx prisma generate && echo '[Dev] Creating database tables...' && npx prisma db push --accept-data-loss && echo '[Dev] Starting with hot reload...' && npx tsx watch src/app.ts " # 使用 tsx watch 实现热重载 volumes: mysql_dev_data: driver: local redis_dev_data: driver: local app_dev_node_modules: driver: local app_dev_dist: driver: local networks: aguzhitou-dev-network: driver: bridge