docker-compose.prod.yml 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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"
  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}
  70. MYSQL_DATABASE: ${DB_NAME}
  71. MYSQL_USER: ${DB_USER}
  72. MYSQL_PASSWORD: ${DB_PASSWORD}
  73. ports:
  74. - "${MYSQL_PORT}: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}"]
  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}
  90. env_file:
  91. - ./.env
  92. container_name: ai-cs-backend
  93. environment:
  94. DB_HOST: ${DB_HOST}
  95. DB_PORT: ${DB_PORT}
  96. DB_USER: ${DB_USER}
  97. DB_PASSWORD: ${DB_PASSWORD}
  98. DB_NAME: ${DB_NAME}
  99. ADMIN_USERNAME: ${ADMIN_USERNAME}
  100. ADMIN_PASSWORD: ${ADMIN_PASSWORD}
  101. SERVER_HOST: ${SERVER_HOST}
  102. SERVER_PORT: ${SERVER_PORT}
  103. GIN_MODE: ${GIN_MODE}
  104. ENCRYPTION_KEY: ${ENCRYPTION_KEY}
  105. SERPER_MCP_URL: ${SERPER_MCP_URL}
  106. SERPER_API_KEY: ${SERPER_API_KEY}
  107. MILVUS_HOST: ${MILVUS_HOST}
  108. MILVUS_PORT: ${MILVUS_PORT}
  109. MILVUS_USERNAME: ${MILVUS_USERNAME}
  110. MILVUS_PASSWORD: ${MILVUS_PASSWORD}
  111. MILVUS_DISABLED: ${MILVUS_DISABLED}
  112. VECTOR_STORE_DISABLED: ${VECTOR_STORE_DISABLED}
  113. MILVUS_REQUIRED: ${MILVUS_REQUIRED}
  114. ports:
  115. - "${BACKEND_PORT}:${SERVER_PORT}"
  116. volumes:
  117. - ./backend/uploads:/app/uploads
  118. - ./.env:/app/.env:ro
  119. depends_on:
  120. mysql:
  121. condition: service_healthy
  122. milvus-standalone:
  123. condition: service_healthy
  124. networks:
  125. - ai-cs-network
  126. restart: unless-stopped
  127. security_opt:
  128. - no-new-privileges:true
  129. cap_drop:
  130. - ALL
  131. cap_add:
  132. - NET_BIND_SERVICE
  133. read_only: true
  134. tmpfs:
  135. - /tmp
  136. - /var/tmp
  137. # 前端服务(使用预构建镜像)
  138. frontend:
  139. image: ${FRONTEND_IMAGE}
  140. container_name: ai-cs-frontend
  141. environment:
  142. NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL}
  143. NEXT_PUBLIC_BACKEND_HOST: ${NEXT_PUBLIC_BACKEND_HOST}
  144. NEXT_PUBLIC_BACKEND_PORT: ${NEXT_PUBLIC_BACKEND_PORT}
  145. NEXT_PUBLIC_MATOMO_CONTAINER_URL: ${NEXT_PUBLIC_MATOMO_CONTAINER_URL}
  146. ports:
  147. - "${FRONTEND_PORT}:3000"
  148. depends_on:
  149. - backend
  150. networks:
  151. - ai-cs-network
  152. restart: unless-stopped
  153. security_opt:
  154. - no-new-privileges:true
  155. cap_drop:
  156. - ALL
  157. cap_add:
  158. - NET_BIND_SERVICE
  159. read_only: true # 只读文件系统(防止写入恶意文件)
  160. tmpfs:
  161. - /tmp
  162. - /var/tmp
  163. - /app/.next/cache # Next.js 需要缓存目录
  164. volumes:
  165. mysql_data:
  166. driver: local
  167. etcd_data:
  168. driver: local
  169. minio_data:
  170. driver: local
  171. milvus_data:
  172. driver: local
  173. networks:
  174. ai-cs-network:
  175. driver: bridge