| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- #!/bin/bash
- # ============================================================
- # TenderAgent 一键部署脚本
- # 适用系统:CentOS / Rocky Linux / AlmaLinux / RHEL 系
- # 部署目录:/root/TenderAgent/docker
- # 部署服务:PostgreSQL + etcd + MinIO + Milvus + Attu
- # 访问 IP:192.168.88.100
- # ============================================================
- set -e
- BASE_DIR="/root/TenderAgent/docker"
- COMPOSE_VERSION="v5.1.3"
- SERVER_IP="192.168.88.100"
- echo "============================================================"
- echo "TenderAgent 基础服务一键部署脚本"
- echo "============================================================"
- # 1. 必须使用 root 执行
- if [ "$(id -u)" -ne 0 ]; then
- echo "错误:请使用 root 用户执行该脚本。"
- exit 1
- fi
- # 2. 检查系统包管理器
- if ! command -v yum >/dev/null 2>&1; then
- echo "错误:当前脚本仅适配 yum 系系统,例如 CentOS / Rocky Linux / AlmaLinux。"
- exit 1
- fi
- # 3. 安装基础工具
- echo "\n[1/8] 安装基础工具..."
- yum install -y wget curl yum-utils
- # 4. 配置 Docker CE yum 源
- echo "\n[2/8] 配置 Docker CE yum 源..."
- wget -q https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
- # 5. 安装 Docker
- echo "\n[3/8] 安装 Docker..."
- yum install -y docker-ce
- # 6. 启动 Docker
- echo "\n[4/8] 启动 Docker 并设置开机自启..."
- systemctl start docker
- systemctl enable docker
- # 7. 安装 Docker Compose 独立二进制
- echo "\n[5/8] 安装 Docker Compose ${COMPOSE_VERSION}..."
- if [ ! -f /usr/local/bin/docker-compose ]; then
- wget -q "https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-x86_64" -O /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose
- else
- echo "检测到 /usr/local/bin/docker-compose 已存在,跳过下载。"
- fi
- # 兼容 docker compose 命令
- if docker compose version >/dev/null 2>&1; then
- COMPOSE_CMD="docker compose"
- elif docker-compose version >/dev/null 2>&1; then
- COMPOSE_CMD="docker-compose"
- else
- echo "错误:Docker Compose 安装失败,docker compose 和 docker-compose 都不可用。"
- exit 1
- fi
- echo "当前使用 Compose 命令:${COMPOSE_CMD}"
- # 8. 创建部署目录
- echo "\n[6/8] 创建部署目录:${BASE_DIR}"
- mkdir -p "${BASE_DIR}/scripts"
- cd "${BASE_DIR}"
- # 9. 写入 .env,内容严格按照用户提供版本生成
- echo "\n[7/8] 写入 .env、docker-compose.yml、scripts/init_db.sql..."
- cat > "${BASE_DIR}/.env" <<'ENVEOF'
- # ===== 数据库(PostgreSQL)=====
- DB_HOST=localhost
- DB_PORT=5433 # 与本机已有 PG(5432) 隔离
- DB_NAME=tenderagent
- DB_USER=tenderagent_user
- DB_PASSWORD=123456
- # ===== Milvus 向量库 =====
- MILVUS_HOST=localhost
- MILVUS_PORT=19531 # 与本机已有 Milvus(19530) 隔离
- # ===== DeepSeek 大模型 =====
- DEEPSEEK_API_KEY=sk-改成你的DeepSeekKey # ← 必填
- DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
- DEEPSEEK_MODEL_CHAT=deepseek-chat
- DEEPSEEK_MODEL_CODER=deepseek-coder
- # ===== 本地模型路径 =====
- RERANKER_MODEL_PATH=./models/reranker/bge-reranker-large
- CLASSIFIER_MODEL_PATH=./models/classifier/all-MiniLM-L6-v2
- BGE_M3_MODEL_PATH=./models/embedding/bge-m3
- # ===== JWT 认证 =====
- JWT_SECRET_KEY=5f4cbfb2bd164363ca0688ae4a3c1b0078ff9bfc8f8297d0c871cc05cf3b132f
- JWT_ALGORITHM=HS256
- JWT_ACCESS_TOKEN_EXPIRE_MINUTES=10080
- # ===== Web 搜索(可选,留空则用免费的 DuckDuckGo)=====
- TAVILY_API_KEY=
- # ===== 应用配置 =====
- APP_ENV=local
- APP_DEBUG=true
- APP_HOST=0.0.0.0
- APP_PORT=8000
- LOG_LEVEL=INFO
- DEFAULT_TENANT_ID=tenant_default
- ENVEOF
- # 10. 写入 docker-compose.yml,内容严格按照用户提供版本生成
- cat > "${BASE_DIR}/docker-compose.yml" <<'YAMLEOF'
- # docker-compose.yml — TenderAgent 本地开发环境(PostgreSQL + Milvus + Attu)
- # 启动:docker compose up -d
- # 查看:docker compose ps
- services:
- # ── PostgreSQL 主数据库(对外 5433,本机 5432 已占用)──
- postgres:
- image: postgres:15-alpine
- container_name: edu_agent_postgres
- restart: unless-stopped
- environment:
- POSTGRES_DB: ${DB_NAME:-tenderagent}
- POSTGRES_USER: ${DB_USER:-tenderagent_user}
- POSTGRES_PASSWORD: ${DB_PASSWORD:-123456}
- TZ: Asia/Shanghai
- volumes:
- - postgres_data:/var/lib/postgresql/data
- # 容器首次启动时自动执行建表脚本
- - ./scripts/init_db.sql:/docker-entrypoint-initdb.d/01_init_db.sql:ro
- ports:
- # 不写 127.0.0.1,默认绑定 0.0.0.0,外部可通过 192.168.88.100:5433 访问
- - "5433:5432"
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
- interval: 10s
- timeout: 5s
- retries: 5
- # ── etcd(Milvus 元数据存储,仅 Docker 内部使用,不对外暴露端口)──
- etcd:
- image: quay.io/coreos/etcd:v3.5.14
- container_name: edu_agent_etcd
- restart: unless-stopped
- environment:
- ETCD_AUTO_COMPACTION_MODE: revision
- ETCD_AUTO_COMPACTION_RETENTION: "1000"
- ETCD_QUOTA_BACKEND_BYTES: "4294967296"
- TZ: Asia/Shanghai
- command: >
- etcd
- --advertise-client-urls=http://etcd:2379
- --listen-client-urls=http://0.0.0.0:2379
- --data-dir=/etcd
- volumes:
- - etcd_data:/etcd
- # ── MinIO(Milvus 向量文件存储,仅 Docker 内部使用,不对外暴露端口)──
- minio:
- image: minio/minio:latest
- container_name: edu_agent_minio
- restart: unless-stopped
- command: server /data
- environment:
- MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
- MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin}
- TZ: Asia/Shanghai
- volumes:
- - minio_data:/data
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
- interval: 15s
- timeout: 5s
- retries: 5
- # ── Milvus 向量数据库(对外 19531,本机 19530 已占用)──
- milvus:
- image: milvusdb/milvus:v2.4.0
- container_name: edu_agent_milvus
- restart: unless-stopped
- command: ["milvus", "run", "standalone"]
- environment:
- ETCD_ENDPOINTS: etcd:2379
- MINIO_ADDRESS: minio:9000
- MINIO_ACCESS_KEY_ID: ${MINIO_ACCESS_KEY:-minioadmin}
- MINIO_SECRET_ACCESS_KEY: ${MINIO_SECRET_KEY:-minioadmin}
- TZ: Asia/Shanghai
- volumes:
- - milvus_data:/var/lib/milvus
- ports:
- # 不写 127.0.0.1,默认绑定 0.0.0.0,外部可通过 192.168.88.100:19531 访问
- - "19531:19530"
- depends_on:
- etcd:
- condition: service_started
- minio:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
- interval: 15s
- timeout: 10s
- retries: 10
- # ── Attu(Milvus 可视化管理界面,对外 30000)──
- attu:
- image: zilliz/attu:v2.4.12
- container_name: edu_agent_attu
- restart: unless-stopped
- environment:
- # Attu 在 Docker 内部访问 Milvus,必须使用服务名 milvus:19530,不能写 localhost:19531
- MILVUS_URL: milvus:19530
- SERVER_PORT: "3000"
- TZ: Asia/Shanghai
- ports:
- # 不写 127.0.0.1,默认绑定 0.0.0.0,外部可通过 http://192.168.88.100:30000 访问
- - "30000:3000"
- depends_on:
- milvus:
- condition: service_healthy
- # ── 数据卷(持久化,重启容器数据不丢失)──
- volumes:
- postgres_data:
- etcd_data:
- minio_data:
- milvus_data:
- YAMLEOF
- # 11. 创建 PostgreSQL 初始化脚本。
- # 当前 compose 文件会挂载 ./scripts/init_db.sql,必须保证文件存在。
- cat > "${BASE_DIR}/scripts/init_db.sql" <<'SQLEOF'
- -- TenderAgent PostgreSQL 初始化脚本
- -- 当前仅保证初始化脚本文件存在,业务表可后续按项目模型补充。
- SELECT 1;
- SQLEOF
- # 12. 启动服务
- echo "\n[8/8] 启动 TenderAgent 基础服务..."
- ${COMPOSE_CMD} down >/dev/null 2>&1 || true
- ${COMPOSE_CMD} up -d
- # 13. 输出结果
- echo "\n============================================================"
- echo "TenderAgent 基础服务部署完成"
- echo "============================================================"
- echo "部署目录:${BASE_DIR}"
- echo ""
- echo "服务访问地址:"
- echo " PostgreSQL : ${SERVER_IP}:5433"
- echo " Milvus : ${SERVER_IP}:19531"
- echo " Attu : http://${SERVER_IP}:30000"
- echo ""
- echo "内部服务:"
- echo " etcd : Docker 内部访问 etcd:2379,不对外开放"
- echo " MinIO : Docker 内部访问 minio:9000,不对外开放"
- echo ""
- echo "常用命令:"
- echo " cd ${BASE_DIR}"
- echo " ${COMPOSE_CMD} ps"
- echo " ${COMPOSE_CMD} logs -f"
- echo " ${COMPOSE_CMD} down"
- echo " ${COMPOSE_CMD} down -v # 清空数据卷,慎用"
- echo ""
- echo "注意:"
- echo " 1. .env 中 DEEPSEEK_API_KEY 需要改成真实 Key。"
- echo " 2. 当前 compose 只部署 PostgreSQL、Milvus、etcd、MinIO、Attu。"
- echo " 3. DeepSeek Key 当前不会进入这些基础服务容器,后续应用容器化时再传入 app 服务。"
- echo "============================================================"
- ${COMPOSE_CMD} ps
|