Files
PlantAI-rag-new/deploy/qa-db/install_neo4j.sh
adminandClaude Fable 5 e151f675f1 feat(qa-db): QA数据库裸进程标准(deploy/qa-db五脚本+守卫去版本锁定+打包/文档/Excel同步)
- 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>
2026-09-08 17:59:53 +08:00

109 lines
5.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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