- deploy/qa-db/: qdrant/neo4j systemd 裸进程安装脚本+unit模板+整库替换(replace_db.sh) * 数据双制品模型: <部署根>/qa-db 与 install 分开传输, 支持频繁整库替换 * 免编译(官方静态二进制/tarball)+本地 bin/ 离线分发+国内镜像回退 * 端口 27433/27434+19888/19885(127.0.0.1), 175 docker 容器(27333/19788)为其他项目共享不动 - backend_guard.py: 移除精确计数相等校验(数据库会整库替换/持续更新, 不得锁死版本) 保留身份校验(release/collection/kb_version/标签/关系类型), 计数仅随 health 返回 - qa/scripts/start.sh: reranker 模型路径回退(install/models/bge-reranker-base) - build_all.sh: qa-db 脚本+reranker 模型入包; .gitignore: qa-db/bin 离线载体 - DEPLOY_FLOW.md: §0/§5.0/§5.0b/§6.0b/§7 QA 数据库裸进程标准 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
93 lines
4.2 KiB
Bash
Executable File
93 lines
4.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# deploy/qa-db/install_qdrant.sh —— PlantAI QA 数据库裸进程标准:Qdrant
|
||
# 用法(需 root):
|
||
# sudo -S bash install_qdrant.sh [QA_DB_ROOT] [HTTP_PORT] [GRPC_PORT]
|
||
# QA_DB_ROOT 默认 <安装根>/qa-db(release 树中即 install 的上一级;仓库树中即仓库根)
|
||
# HTTP_PORT 默认 27433;GRPC_PORT 默认 27434
|
||
# (与 docker 共享实例 27333/27334 互不冲突,175 上容器为其他项目服务、不动)
|
||
# 产物:/usr/local/bin/qdrant、/etc/qdrant/config.yaml、systemd 单元 qdrant-plantai.service
|
||
# 数据目录:$QA_DB_ROOT/qdrant/storage(整库替换见 replace_db.sh)
|
||
# 版本默认 v1.18.3(与 2026-08 容器实例 qdrant/qdrant:latest 对齐)
|
||
set -euo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
INSTALL_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||
QA_DB_ROOT="${1:-${QA_DB_ROOT:-$INSTALL_ROOT/qa-db}}"
|
||
HTTP_PORT="${2:-27433}"
|
||
GRPC_PORT="${3:-27434}"
|
||
QDRANT_VERSION="${QDRANT_VERSION:-v1.18.3}"
|
||
RUN_USER="${RUN_USER:-${SUDO_USER:-xzq}}"
|
||
BIN=/usr/local/bin/qdrant
|
||
CONF=/etc/qdrant/config.yaml
|
||
UNIT=/etc/systemd/system/qdrant-plantai.service
|
||
STORAGE="$QA_DB_ROOT/qdrant/storage"
|
||
TPL="$SCRIPT_DIR/qdrant.service"
|
||
|
||
[[ $EUID -eq 0 ]] || { echo "需要 root:sudo -S bash $0 $*" >&2; exit 1; }
|
||
command -v curl >/dev/null || { echo "缺少 curl(apt install -y curl)" >&2; exit 1; }
|
||
id -u "$RUN_USER" >/dev/null 2>&1 || { echo "运行用户不存在:$RUN_USER" >&2; exit 1; }
|
||
|
||
# 1) 二进制(版本已符合则跳过;官方静态二进制,免编译)
|
||
if [[ -x "$BIN" ]] && "$BIN" --version 2>/dev/null | grep -q "$QDRANT_VERSION"; then
|
||
echo "[qdrant] 二进制已就绪:$("$BIN" --version 2>&1 | head -1)"
|
||
else
|
||
# 优先使用随包携带的本地二进制(离线/受限网络部署时从构建机 scp 到此目录)
|
||
LOCAL_BIN="$SCRIPT_DIR/bin/qdrant"
|
||
if [[ -x "$LOCAL_BIN" ]] && "$LOCAL_BIN" --version 2>/dev/null | grep -q "$QDRANT_VERSION"; then
|
||
echo "[qdrant] 使用本地二进制:$LOCAL_BIN"
|
||
install -m 0755 "$LOCAL_BIN" "$BIN"
|
||
else
|
||
echo "[qdrant] 下载 qdrant $QDRANT_VERSION ..."
|
||
URLS=(
|
||
"https://github.com/qdrant/qdrant/releases/download/$QDRANT_VERSION/qdrant-x86_64-unknown-linux-gnu.tar.gz"
|
||
"https://gh-proxy.com/https://github.com/qdrant/qdrant/releases/download/$QDRANT_VERSION/qdrant-x86_64-unknown-linux-gnu.tar.gz"
|
||
"https://ghfast.top/https://github.com/qdrant/qdrant/releases/download/$QDRANT_VERSION/qdrant-x86_64-unknown-linux-gnu.tar.gz"
|
||
)
|
||
ok=0
|
||
for u in "${URLS[@]}"; do
|
||
if curl -fL --connect-timeout 10 --max-time 300 -o /tmp/qdrant.tar.gz "$u" 2>/dev/null; then
|
||
ok=1; echo "[qdrant] 下载成功:$u"; break
|
||
fi
|
||
echo "[qdrant] 下载失败,换下一源:$u"
|
||
done
|
||
[[ $ok -eq 1 ]] || { echo "所有下载源失败,请手动放置二进制到 $BIN 或 $LOCAL_BIN" >&2; exit 1; }
|
||
tar -xzf /tmp/qdrant.tar.gz -C /tmp
|
||
install -m 0755 /tmp/qdrant "$BIN"
|
||
rm -f /tmp/qdrant.tar.gz /tmp/qdrant
|
||
"$BIN" --version | head -1
|
||
fi
|
||
fi
|
||
|
||
# 2) 数据目录 + 配置(config 由本脚本参数生成,不手改)
|
||
mkdir -p "$STORAGE" /etc/qdrant
|
||
cat > "$CONF" <<EOF
|
||
# PlantAI-rag-new Qdrant 裸进程配置(由 deploy/qa-db/install_qdrant.sh 生成,勿手改)
|
||
storage:
|
||
storage_path: $STORAGE
|
||
snapshots_path: $STORAGE/snapshots
|
||
service:
|
||
host: 127.0.0.1
|
||
http_port: $HTTP_PORT
|
||
grpc_port: $GRPC_PORT
|
||
enable_tls: false
|
||
telemetry_disabled: true
|
||
EOF
|
||
# 数据目录属主对齐运行用户(快照恢复时文件由 qdrant 进程自己创建)
|
||
chown -R "$RUN_USER:$RUN_USER" "$QA_DB_ROOT/qdrant"
|
||
|
||
# 3) systemd 单元(模板替换占位符)
|
||
sed -e "s|@HTTP_PORT@|$HTTP_PORT|g" -e "s|@BIN@|$BIN|g" -e "s|@CONF@|$CONF|g" -e "s|@RUN_USER@|$RUN_USER|g" -e "s|@QA_DB_ROOT@|$QA_DB_ROOT|g" "$TPL" > "$UNIT"
|
||
|
||
# 4) 幂等启动 + 探活
|
||
systemctl daemon-reload
|
||
systemctl enable --now qdrant-plantai.service >/dev/null 2>&1 || true
|
||
for _ in $(seq 1 30); do
|
||
if curl -sf --max-time 2 "http://127.0.0.1:$HTTP_PORT/collections" >/dev/null 2>&1; then
|
||
echo "[qdrant] UP http://127.0.0.1:$HTTP_PORT (storage: $STORAGE)"
|
||
exit 0
|
||
fi
|
||
sleep 2
|
||
done
|
||
echo "[qdrant] 启动失败:journalctl -u qdrant-plantai -n 50" >&2
|
||
exit 1
|