tenderagent.sh 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #!/bin/bash
  2. # ============================================================
  3. # TenderAgent 一键部署脚本
  4. # 适用系统:CentOS / Rocky Linux / AlmaLinux / RHEL 系
  5. # 部署目录:/root/TenderAgent/docker
  6. # 部署服务:PostgreSQL + etcd + MinIO + Milvus + Attu
  7. # 访问 IP:192.168.88.100
  8. # ============================================================
  9. set -e
  10. BASE_DIR="/root/TenderAgent/docker"
  11. COMPOSE_VERSION="v5.1.3"
  12. SERVER_IP="192.168.88.100"
  13. echo "============================================================"
  14. echo "TenderAgent 基础服务一键部署脚本"
  15. echo "============================================================"
  16. # 1. 必须使用 root 执行
  17. if [ "$(id -u)" -ne 0 ]; then
  18. echo "错误:请使用 root 用户执行该脚本。"
  19. exit 1
  20. fi
  21. # 2. 检查系统包管理器
  22. if ! command -v yum >/dev/null 2>&1; then
  23. echo "错误:当前脚本仅适配 yum 系系统,例如 CentOS / Rocky Linux / AlmaLinux。"
  24. exit 1
  25. fi
  26. # 3. 安装基础工具
  27. echo "\n[1/8] 安装基础工具..."
  28. yum install -y wget curl yum-utils
  29. # 4. 配置 Docker CE yum 源
  30. echo "\n[2/8] 配置 Docker CE yum 源..."
  31. wget -q https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  32. # 5. 安装 Docker
  33. echo "\n[3/8] 安装 Docker..."
  34. yum install -y docker-ce
  35. # 6. 启动 Docker
  36. echo "\n[4/8] 启动 Docker 并设置开机自启..."
  37. systemctl start docker
  38. systemctl enable docker
  39. # 7. 安装 Docker Compose 独立二进制
  40. echo "\n[5/8] 安装 Docker Compose ${COMPOSE_VERSION}..."
  41. if [ ! -f /usr/local/bin/docker-compose ]; then
  42. wget -q "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-x86_64" -O /usr/local/bin/docker-compose
  43. chmod +x /usr/local/bin/docker-compose
  44. else
  45. echo "检测到 /usr/local/bin/docker-compose 已存在,跳过下载。"
  46. fi
  47. # 兼容 docker compose 命令
  48. if docker compose version >/dev/null 2>&1; then
  49. COMPOSE_CMD="docker compose"
  50. elif docker-compose version >/dev/null 2>&1; then
  51. COMPOSE_CMD="docker-compose"
  52. else
  53. echo "错误:Docker Compose 安装失败,docker compose 和 docker-compose 都不可用。"
  54. exit 1
  55. fi
  56. echo "当前使用 Compose 命令:${COMPOSE_CMD}"
  57. # 8. 创建部署目录
  58. echo "\n[6/8] 创建部署目录:${BASE_DIR}"
  59. mkdir -p "${BASE_DIR}/scripts"
  60. cd "${BASE_DIR}"
  61. # 9. 写入 .env,内容严格按照用户提供版本生成
  62. echo "\n[7/8] 写入 .env、docker-compose.yml、scripts/init_db.sql..."
  63. cat > "${BASE_DIR}/.env" <<'ENVEOF'
  64. # ===== 数据库(PostgreSQL)=====
  65. DB_HOST=localhost
  66. DB_PORT=5433 # 与本机已有 PG(5432) 隔离
  67. DB_NAME=tenderagent
  68. DB_USER=tenderagent_user
  69. DB_PASSWORD=123456
  70. # ===== Milvus 向量库 =====
  71. MILVUS_HOST=localhost
  72. MILVUS_PORT=19531 # 与本机已有 Milvus(19530) 隔离
  73. # ===== DeepSeek 大模型 =====
  74. DEEPSEEK_API_KEY=sk-改成你的DeepSeekKey # ← 必填
  75. DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
  76. DEEPSEEK_MODEL_CHAT=deepseek-chat
  77. DEEPSEEK_MODEL_CODER=deepseek-coder
  78. # ===== 本地模型路径 =====
  79. RERANKER_MODEL_PATH=./models/reranker/bge-reranker-large
  80. CLASSIFIER_MODEL_PATH=./models/classifier/all-MiniLM-L6-v2
  81. BGE_M3_MODEL_PATH=./models/embedding/bge-m3
  82. # ===== JWT 认证 =====
  83. JWT_SECRET_KEY=5f4cbfb2bd164363ca0688ae4a3c1b0078ff9bfc8f8297d0c871cc05cf3b132f
  84. JWT_ALGORITHM=HS256
  85. JWT_ACCESS_TOKEN_EXPIRE_MINUTES=10080
  86. # ===== Web 搜索(可选,留空则用免费的 DuckDuckGo)=====
  87. TAVILY_API_KEY=
  88. # ===== 应用配置 =====
  89. APP_ENV=local
  90. APP_DEBUG=true
  91. APP_HOST=0.0.0.0
  92. APP_PORT=8000
  93. LOG_LEVEL=INFO
  94. DEFAULT_TENANT_ID=tenant_default
  95. ENVEOF
  96. # 10. 写入 docker-compose.yml,内容严格按照用户提供版本生成
  97. cat > "${BASE_DIR}/docker-compose.yml" <<'YAMLEOF'
  98. # docker-compose.yml — TenderAgent 本地开发环境(PostgreSQL + Milvus + Attu)
  99. # 启动:docker compose up -d
  100. # 查看:docker compose ps
  101. services:
  102. # ── PostgreSQL 主数据库(对外 5433,本机 5432 已占用)──
  103. postgres:
  104. image: postgres:15-alpine
  105. container_name: edu_agent_postgres
  106. restart: unless-stopped
  107. environment:
  108. POSTGRES_DB: ${DB_NAME:-tenderagent}
  109. POSTGRES_USER: ${DB_USER:-tenderagent_user}
  110. POSTGRES_PASSWORD: ${DB_PASSWORD:-123456}
  111. TZ: Asia/Shanghai
  112. volumes:
  113. - postgres_data:/var/lib/postgresql/data
  114. # 容器首次启动时自动执行建表脚本
  115. - ./scripts/init_db.sql:/docker-entrypoint-initdb.d/01_init_db.sql:ro
  116. ports:
  117. # 不写 127.0.0.1,默认绑定 0.0.0.0,外部可通过 192.168.88.100:5433 访问
  118. - "5433:5432"
  119. healthcheck:
  120. test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
  121. interval: 10s
  122. timeout: 5s
  123. retries: 5
  124. # ── etcd(Milvus 元数据存储,仅 Docker 内部使用,不对外暴露端口)──
  125. etcd:
  126. image: quay.io/coreos/etcd:v3.5.14
  127. container_name: edu_agent_etcd
  128. restart: unless-stopped
  129. environment:
  130. ETCD_AUTO_COMPACTION_MODE: revision
  131. ETCD_AUTO_COMPACTION_RETENTION: "1000"
  132. ETCD_QUOTA_BACKEND_BYTES: "4294967296"
  133. TZ: Asia/Shanghai
  134. command: >
  135. etcd
  136. --advertise-client-urls=http://etcd:2379
  137. --listen-client-urls=http://0.0.0.0:2379
  138. --data-dir=/etcd
  139. volumes:
  140. - etcd_data:/etcd
  141. # ── MinIO(Milvus 向量文件存储,仅 Docker 内部使用,不对外暴露端口)──
  142. minio:
  143. image: minio/minio:latest
  144. container_name: edu_agent_minio
  145. restart: unless-stopped
  146. command: server /data
  147. environment:
  148. MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
  149. MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin}
  150. TZ: Asia/Shanghai
  151. volumes:
  152. - minio_data:/data
  153. healthcheck:
  154. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  155. interval: 15s
  156. timeout: 5s
  157. retries: 5
  158. # ── Milvus 向量数据库(对外 19531,本机 19530 已占用)──
  159. milvus:
  160. image: milvusdb/milvus:v2.4.0
  161. container_name: edu_agent_milvus
  162. restart: unless-stopped
  163. command: ["milvus", "run", "standalone"]
  164. environment:
  165. ETCD_ENDPOINTS: etcd:2379
  166. MINIO_ADDRESS: minio:9000
  167. MINIO_ACCESS_KEY_ID: ${MINIO_ACCESS_KEY:-minioadmin}
  168. MINIO_SECRET_ACCESS_KEY: ${MINIO_SECRET_KEY:-minioadmin}
  169. TZ: Asia/Shanghai
  170. volumes:
  171. - milvus_data:/var/lib/milvus
  172. ports:
  173. # 不写 127.0.0.1,默认绑定 0.0.0.0,外部可通过 192.168.88.100:19531 访问
  174. - "19531:19530"
  175. depends_on:
  176. etcd:
  177. condition: service_started
  178. minio:
  179. condition: service_healthy
  180. healthcheck:
  181. test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
  182. interval: 15s
  183. timeout: 10s
  184. retries: 10
  185. # ── Attu(Milvus 可视化管理界面,对外 30000)──
  186. attu:
  187. image: zilliz/attu:v2.4.12
  188. container_name: edu_agent_attu
  189. restart: unless-stopped
  190. environment:
  191. # Attu 在 Docker 内部访问 Milvus,必须使用服务名 milvus:19530,不能写 localhost:19531
  192. MILVUS_URL: milvus:19530
  193. SERVER_PORT: "3000"
  194. TZ: Asia/Shanghai
  195. ports:
  196. # 不写 127.0.0.1,默认绑定 0.0.0.0,外部可通过 http://192.168.88.100:30000 访问
  197. - "30000:3000"
  198. depends_on:
  199. milvus:
  200. condition: service_healthy
  201. # ── 数据卷(持久化,重启容器数据不丢失)──
  202. volumes:
  203. postgres_data:
  204. etcd_data:
  205. minio_data:
  206. milvus_data:
  207. YAMLEOF
  208. # 11. 创建 PostgreSQL 初始化脚本。
  209. # 当前 compose 文件会挂载 ./scripts/init_db.sql,必须保证文件存在。
  210. cat > "${BASE_DIR}/scripts/init_db.sql" <<'SQLEOF'
  211. -- TenderAgent PostgreSQL 初始化脚本
  212. -- 当前仅保证初始化脚本文件存在,业务表可后续按项目模型补充。
  213. SELECT 1;
  214. SQLEOF
  215. # 12. 启动服务
  216. echo "\n[8/8] 启动 TenderAgent 基础服务..."
  217. ${COMPOSE_CMD} down >/dev/null 2>&1 || true
  218. ${COMPOSE_CMD} up -d
  219. # 13. 输出结果
  220. echo "\n============================================================"
  221. echo "TenderAgent 基础服务部署完成"
  222. echo "============================================================"
  223. echo "部署目录:${BASE_DIR}"
  224. echo ""
  225. echo "服务访问地址:"
  226. echo " PostgreSQL : ${SERVER_IP}:5433"
  227. echo " Milvus : ${SERVER_IP}:19531"
  228. echo " Attu : http://${SERVER_IP}:30000"
  229. echo ""
  230. echo "内部服务:"
  231. echo " etcd : Docker 内部访问 etcd:2379,不对外开放"
  232. echo " MinIO : Docker 内部访问 minio:9000,不对外开放"
  233. echo ""
  234. echo "常用命令:"
  235. echo " cd ${BASE_DIR}"
  236. echo " ${COMPOSE_CMD} ps"
  237. echo " ${COMPOSE_CMD} logs -f"
  238. echo " ${COMPOSE_CMD} down"
  239. echo " ${COMPOSE_CMD} down -v # 清空数据卷,慎用"
  240. echo ""
  241. echo "注意:"
  242. echo " 1. .env 中 DEEPSEEK_API_KEY 需要改成真实 Key。"
  243. echo " 2. 当前 compose 只部署 PostgreSQL、Milvus、etcd、MinIO、Attu。"
  244. echo " 3. DeepSeek Key 当前不会进入这些基础服务容器,后续应用容器化时再传入 app 服务。"
  245. echo "============================================================"
  246. ${COMPOSE_CMD} ps