docker-compose.prod.yml 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. services:
  2. # MySQL 数据库
  3. mysql:
  4. image: mysql:8.0
  5. container_name: ai-cs-mysql
  6. environment:
  7. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
  8. MYSQL_DATABASE: ${MYSQL_DATABASE:-ai_cs}
  9. MYSQL_USER: ${MYSQL_USER:-ai_cs_user}
  10. MYSQL_PASSWORD: ${MYSQL_PASSWORD:-ai_cs_password}
  11. ports:
  12. - "${MYSQL_PORT:-3306}:3306"
  13. volumes:
  14. - mysql_data:/var/lib/mysql
  15. command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  16. healthcheck:
  17. test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-rootpassword}"]
  18. interval: 10s
  19. timeout: 5s
  20. retries: 5
  21. start_period: 30s
  22. networks:
  23. - ai-cs-network
  24. restart: unless-stopped
  25. security_opt:
  26. - no-new-privileges:true
  27. cap_drop:
  28. - ALL
  29. cap_add:
  30. - CHOWN
  31. - DAC_OVERRIDE
  32. - FOWNER
  33. resources:
  34. limits:
  35. cpus: '2.0'
  36. memory: 2G
  37. reservations:
  38. cpus: '0.5'
  39. memory: 512M
  40. # 后端服务(使用预构建镜像)
  41. backend:
  42. image: ${BACKEND_IMAGE:-537yaha/ai-cs-backend:latest}
  43. container_name: ai-cs-backend
  44. environment:
  45. DB_HOST: mysql
  46. DB_PORT: 3306
  47. DB_USER: ${MYSQL_USER:-ai_cs_user}
  48. DB_PASSWORD: ${MYSQL_PASSWORD:-ai_cs_password}
  49. DB_NAME: ${MYSQL_DATABASE:-ai_cs}
  50. ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
  51. ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}
  52. SERVER_HOST: 0.0.0.0
  53. SERVER_PORT: 8080
  54. GIN_MODE: ${GIN_MODE:-release}
  55. ENCRYPTION_KEY: ${ENCRYPTION_KEY:-default-key}
  56. ports:
  57. - "${BACKEND_PORT:-18080}:8080"
  58. volumes:
  59. - ./backend/uploads:/app/uploads
  60. depends_on:
  61. mysql:
  62. condition: service_healthy
  63. networks:
  64. - ai-cs-network
  65. restart: unless-stopped
  66. security_opt:
  67. - no-new-privileges:true
  68. cap_drop:
  69. - ALL
  70. cap_add:
  71. - NET_BIND_SERVICE
  72. read_only: true
  73. tmpfs:
  74. - /tmp
  75. - /var/tmp
  76. resources:
  77. limits:
  78. cpus: '2.0'
  79. memory: 2G
  80. reservations:
  81. cpus: '0.5'
  82. memory: 512M
  83. # 前端服务(使用预构建镜像)
  84. frontend:
  85. image: ${FRONTEND_IMAGE:-537yaha/ai-cs-frontend:latest}
  86. container_name: ai-cs-frontend
  87. environment:
  88. NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-http://localhost:8080}
  89. ports:
  90. - "${FRONTEND_PORT:-3000}:3000"
  91. depends_on:
  92. - backend
  93. networks:
  94. - ai-cs-network
  95. restart: unless-stopped
  96. security_opt:
  97. - no-new-privileges:true
  98. cap_drop:
  99. - ALL
  100. cap_add:
  101. - NET_BIND_SERVICE
  102. read_only: true # 只读文件系统(防止写入恶意文件)
  103. tmpfs:
  104. - /tmp
  105. - /var/tmp
  106. - /app/.next/cache # Next.js 需要缓存目录
  107. resources:
  108. limits:
  109. cpus: '2.0'
  110. memory: 2G
  111. reservations:
  112. cpus: '0.5'
  113. memory: 512M
  114. volumes:
  115. mysql_data:
  116. driver: local
  117. networks:
  118. ai-cs-network:
  119. driver: bridge