docker-compose.prod.yml 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. services:
  2. # ========== Milvus 向量库及其依赖(与 MySQL 一样在 Docker 中运行) ==========
  3. etcd:
  4. image: quay.io/coreos/etcd:v3.5.5
  5. container_name: milvus-etcd
  6. environment:
  7. - ETCD_AUTO_COMPACTION_MODE=revision
  8. - ETCD_AUTO_COMPACTION_RETENTION=1000
  9. - ETCD_QUOTA_BACKEND_BYTES=4294967296
  10. - ETCD_SNAPSHOT_COUNT=50000
  11. volumes:
  12. - etcd_data:/etcd
  13. command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
  14. healthcheck:
  15. test: ["CMD", "etcdctl", "endpoint", "health"]
  16. interval: 30s
  17. timeout: 20s
  18. retries: 3
  19. networks:
  20. - ai-cs-network
  21. restart: unless-stopped
  22. minio:
  23. image: minio/minio:RELEASE.2023-03-20T20-16-18Z
  24. container_name: milvus-minio
  25. environment:
  26. MINIO_ACCESS_KEY: minioadmin
  27. MINIO_SECRET_KEY: minioadmin
  28. volumes:
  29. - minio_data:/minio_data
  30. command: minio server /minio_data --console-address ":9001"
  31. healthcheck:
  32. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  33. interval: 30s
  34. timeout: 20s
  35. retries: 3
  36. networks:
  37. - ai-cs-network
  38. restart: unless-stopped
  39. milvus-standalone:
  40. image: milvusdb/milvus:v2.3.3
  41. container_name: milvus-standalone
  42. command: ["milvus", "run", "standalone"]
  43. environment:
  44. ETCD_ENDPOINTS: etcd:2379
  45. MINIO_ADDRESS: minio:9000
  46. volumes:
  47. - milvus_data:/var/lib/milvus
  48. ports:
  49. - "${MILVUS_PORT:-19530}:19530"
  50. depends_on:
  51. etcd:
  52. condition: service_healthy
  53. minio:
  54. condition: service_healthy
  55. healthcheck:
  56. test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
  57. interval: 30s
  58. start_period: 90s
  59. timeout: 20s
  60. retries: 5
  61. networks:
  62. - ai-cs-network
  63. restart: unless-stopped
  64. # MySQL 数据库
  65. mysql:
  66. image: mysql:8.0
  67. container_name: ai-cs-mysql
  68. environment:
  69. MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
  70. MYSQL_DATABASE: ${MYSQL_DATABASE:-ai_cs}
  71. MYSQL_USER: ${MYSQL_USER:-ai_cs_user}
  72. MYSQL_PASSWORD: ${MYSQL_PASSWORD:-ai_cs_password}
  73. ports:
  74. - "${MYSQL_PORT:-3306}:3306"
  75. volumes:
  76. - mysql_data:/var/lib/mysql
  77. command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  78. healthcheck:
  79. test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-rootpassword}"]
  80. interval: 10s
  81. timeout: 5s
  82. retries: 5
  83. start_period: 30s
  84. networks:
  85. - ai-cs-network
  86. restart: unless-stopped
  87. # 后端服务(使用预构建镜像)
  88. backend:
  89. image: ${BACKEND_IMAGE:-537yaha/ai-cs-backend:latest}
  90. container_name: ai-cs-backend
  91. environment:
  92. DB_HOST: mysql
  93. DB_PORT: 3306
  94. DB_USER: ${MYSQL_USER:-ai_cs_user}
  95. DB_PASSWORD: ${MYSQL_PASSWORD:-ai_cs_password}
  96. DB_NAME: ${MYSQL_DATABASE:-ai_cs}
  97. ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}
  98. ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin123}
  99. SERVER_HOST: 0.0.0.0
  100. SERVER_PORT: 8080
  101. GIN_MODE: ${GIN_MODE:-release}
  102. ENCRYPTION_KEY: ${ENCRYPTION_KEY:-default-key}
  103. MILVUS_HOST: milvus-standalone
  104. MILVUS_PORT: 19530
  105. ports:
  106. - "${BACKEND_PORT:-18080}:8080"
  107. volumes:
  108. - ./backend/uploads:/app/uploads
  109. depends_on:
  110. mysql:
  111. condition: service_healthy
  112. milvus-standalone:
  113. condition: service_healthy
  114. networks:
  115. - ai-cs-network
  116. restart: unless-stopped
  117. security_opt:
  118. - no-new-privileges:true
  119. cap_drop:
  120. - ALL
  121. cap_add:
  122. - NET_BIND_SERVICE
  123. read_only: true
  124. tmpfs:
  125. - /tmp
  126. - /var/tmp
  127. # 前端服务(使用预构建镜像)
  128. frontend:
  129. image: ${FRONTEND_IMAGE:-537yaha/ai-cs-frontend:latest}
  130. container_name: ai-cs-frontend
  131. environment:
  132. NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-http://localhost:8080}
  133. ports:
  134. - "${FRONTEND_PORT:-3000}:3000"
  135. depends_on:
  136. - backend
  137. networks:
  138. - ai-cs-network
  139. restart: unless-stopped
  140. security_opt:
  141. - no-new-privileges:true
  142. cap_drop:
  143. - ALL
  144. cap_add:
  145. - NET_BIND_SERVICE
  146. read_only: true # 只读文件系统(防止写入恶意文件)
  147. tmpfs:
  148. - /tmp
  149. - /var/tmp
  150. - /app/.next/cache # Next.js 需要缓存目录
  151. volumes:
  152. mysql_data:
  153. driver: local
  154. etcd_data:
  155. driver: local
  156. minio_data:
  157. driver: local
  158. milvus_data:
  159. driver: local
  160. networks:
  161. ai-cs-network:
  162. driver: bridge