- 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>
109 lines
5.1 KiB
Bash
Executable File
109 lines
5.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# deploy/qa-db/install_neo4j.sh —— PlantAI QA 数据库裸进程标准:Neo4j Community
|
||
# 用法(需 root):
|
||
# sudo -S bash install_neo4j.sh [QA_DB_ROOT] [BOLT_PORT] [HTTP_PORT]
|
||
# QA_DB_ROOT 默认 <安装根>/qa-db(release 树中即 install 的上一级;仓库树中即仓库根)
|
||
# BOLT_PORT 默认 19888;HTTP_PORT 默认 19885
|
||
# (与 docker 共享实例 19788/19575 互不冲突,175 上容器为其他项目服务、不动)
|
||
# 产物:/opt/neo4j-community-5.15.0 + 软链 /opt/neo4j-plantai、systemd 单元 neo4j-plantai.service
|
||
# 数据目录:$QA_DB_ROOT/neo4j/data(conf 的 server.directories.data 指向它;整库替换见 replace_db.sh)
|
||
# 版本与 2026-08 容器实例 neo4j:5.15.0-community 对齐;官方 tarball,免编译;需 JDK17(宿主已有则用)
|
||
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}}"
|
||
BOLT_PORT="${2:-19888}"
|
||
HTTP_PORT="${3:-19885}"
|
||
NEO4J_VERSION="${NEO4J_VERSION:-5.15.0}"
|
||
RUN_USER="${RUN_USER:-${SUDO_USER:-xzq}}"
|
||
NEO4J_HOME="/opt/neo4j-community-$NEO4J_VERSION"
|
||
NEO4J_LINK=/opt/neo4j-plantai
|
||
UNIT=/etc/systemd/system/neo4j-plantai.service
|
||
TPL="$SCRIPT_DIR/neo4j.service"
|
||
DATA="$QA_DB_ROOT/neo4j/data"
|
||
LOGS="$QA_DB_ROOT/neo4j/logs"
|
||
|
||
[[ $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; }
|
||
command -v java >/dev/null || { echo "缺少 JDK17(apt install -y openjdk-17-jre-headless)" >&2; exit 1; }
|
||
id -u "$RUN_USER" >/dev/null 2>&1 || { echo "运行用户不存在:$RUN_USER" >&2; exit 1; }
|
||
|
||
# 1) 发行包(版本已符合则跳过;官方 tarball,免编译)
|
||
if [[ -x "$NEO4J_HOME/bin/neo4j" ]]; then
|
||
echo "[neo4j] 发行包已就绪:$NEO4J_HOME"
|
||
else
|
||
# 优先使用随包携带的本地发行包(离线/受限网络部署时从构建机 scp 到此目录)
|
||
LOCAL_TGZ="$SCRIPT_DIR/bin/neo4j-community-$NEO4J_VERSION-unix.tar.gz"
|
||
if [[ -f "$LOCAL_TGZ" ]]; then
|
||
echo "[neo4j] 使用本地发行包:$LOCAL_TGZ"
|
||
mkdir -p "$NEO4J_HOME"
|
||
tar -xzf "$LOCAL_TGZ" -C /tmp
|
||
cp -a "/tmp/neo4j-community-$NEO4J_VERSION/." "$NEO4J_HOME/"
|
||
rm -rf "/tmp/neo4j-community-$NEO4J_VERSION"
|
||
else
|
||
echo "[neo4j] 下载 neo4j-community-$NEO4J_VERSION ..."
|
||
ok=0
|
||
for u in \
|
||
"https://dist.neo4j.org/neo4j-community-$NEO4J_VERSION-unix.tar.gz" \
|
||
"https://github.com/neo4j/neo4j/releases/download/$NEO4J_VERSION/neo4j-community-$NEO4J_VERSION-unix.tar.gz" \
|
||
"https://gh-proxy.com/https://github.com/neo4j/neo4j/releases/download/$NEO4J_VERSION/neo4j-community-$NEO4J_VERSION-unix.tar.gz" \
|
||
"https://ghfast.top/https://github.com/neo4j/neo4j/releases/download/$NEO4J_VERSION/neo4j-community-$NEO4J_VERSION-unix.tar.gz"; do
|
||
if curl -fL -A "Mozilla/5.0" --connect-timeout 10 --max-time 1800 -o /tmp/neo4j.tar.gz "$u" 2>/dev/null; then
|
||
ok=1; echo "[neo4j] 下载成功:$u"; break
|
||
fi
|
||
echo "[neo4j] 下载失败,换下一源:$u"
|
||
done
|
||
if [[ $ok -eq 0 ]] && command -v docker >/dev/null 2>&1 && docker image inspect "neo4j:$NEO4J_VERSION-community" >/dev/null 2>&1; then
|
||
echo "[neo4j] 回退:从本地 docker 镜像提取发行包(只读,不动运行中的容器)"
|
||
CID=$(docker create "neo4j:$NEO4J_VERSION-community")
|
||
docker cp "$CID:/var/lib/neo4j" "$NEO4J_HOME"
|
||
docker rm "$CID" >/dev/null
|
||
ok=1
|
||
fi
|
||
[[ $ok -eq 1 ]] || { echo "所有下载源失败,请手动放置发行包到 $NEO4J_HOME 或 $LOCAL_TGZ" >&2; exit 1; }
|
||
if [[ -f /tmp/neo4j.tar.gz ]]; then
|
||
mkdir -p "$NEO4J_HOME"
|
||
tar -xzf /tmp/neo4j.tar.gz -C /tmp
|
||
cp -a "/tmp/neo4j-community-$NEO4J_VERSION/." "$NEO4J_HOME/"
|
||
rm -rf /tmp/neo4j.tar.gz "/tmp/neo4j-community-$NEO4J_VERSION"
|
||
fi
|
||
fi
|
||
fi
|
||
ln -sfn "$NEO4J_HOME" "$NEO4J_LINK"
|
||
|
||
# 2) 数据/日志目录(整库替换见 replace_db.sh;目录属主对齐运行用户)
|
||
mkdir -p "$DATA" "$LOGS"
|
||
chown -R "$RUN_USER:$RUN_USER" "$QA_DB_ROOT/neo4j"
|
||
|
||
# 3) neo4j.conf(追加覆盖项;同名键后值生效)
|
||
CONF="$NEO4J_HOME/conf/neo4j.conf"
|
||
cat >> "$CONF" <<EOF
|
||
|
||
# ==== PlantAI-rag-new 裸进程覆盖项(deploy/qa-db/install_neo4j.sh 生成)====
|
||
server.bolt.listen_address=127.0.0.1:$BOLT_PORT
|
||
server.http.listen_address=127.0.0.1:$HTTP_PORT
|
||
server.directories.data=$DATA
|
||
server.directories.logs=$LOGS
|
||
dbms.security.auth_enabled=true
|
||
server.memory.heap.initial_size=16G
|
||
server.memory.heap.max_size=32G
|
||
server.memory.pagecache.size=64G
|
||
EOF
|
||
|
||
# 4) systemd 单元(模板替换占位符)
|
||
sed -e "s|@NEO4J_HOME@|$NEO4J_HOME|g" -e "s|@RUN_USER@|$RUN_USER|g" "$TPL" > "$UNIT"
|
||
# 5) 幂等启动 + 探活(bolt 端口)
|
||
systemctl daemon-reload
|
||
systemctl enable --now neo4j-plantai.service >/dev/null 2>&1 || true
|
||
for _ in $(seq 1 90); do
|
||
if (exec 3<>"/dev/tcp/127.0.0.1/$BOLT_PORT") 2>/dev/null; then
|
||
exec 3>&- 2>/dev/null || true
|
||
echo "[neo4j] UP bolt://127.0.0.1:$BOLT_PORT (data: $DATA)"
|
||
exit 0
|
||
fi
|
||
sleep 2
|
||
done
|
||
echo "[neo4j] 启动失败:journalctl -u neo4j-plantai -n 50" >&2
|
||
exit 1
|