[运维] 接入内网 searxng + 清理启动脚本 + 修 log-trim 权限
搜索接口:
- duckduckgo_search.py / ZhipuSearchAPI.py 切换到内网 searxng (原 43.251.225.121 / 134.122.191.214 已失效)
启动脚本清理:
- 删除废弃 backend/ 目录 (与 chat_web_backend/ 编译产物 jar MD5 相同,仅是改名副本)
- 删除 start_all.sh 与 langchain-chat/{start,stop,stop_quick,shutdown_all,restart}.sh (被 scripts/*-restart.sh 覆盖)
- 删除 chat_web_backend/{start,test_mysql}.sh
修复:
- scripts/backend-restart.sh 对齐当前实际在跑的 chat_web_backend.jar (profile=dev)
- scripts/log-trim-daemon.sh 把 LOCK 移到 /tmp 按用户命名,修复非首次用户跑时的 Permission denied
新增:
- scripts/start-all.sh:一键启动入口,串联 mysql/redis/milvus/langchain/backend/frontend,含端口自检
- chat_web_backend/application-local.yml.archived:原 backend/ 下 yj profile 覆盖配置的归档备份
其他:
- .gitignore 忽略 scripts/pptist-deploy/PPTist/ (323M 第三方源码树)
This commit is contained in:
@@ -1,13 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
# 须用 bash 执行;若误用 sh/dash 会自动改用 bash 再跑一遍
|
||||
[ -n "${BASH_VERSION:-}" ] || exec /usr/bin/env bash "$0" ${1+"$@"}
|
||||
# 重启 Java 后端 chat_web_yj.jar(与 start_all.sh 一致)
|
||||
# 重启 Java 后端 chat_web_backend.jar(源码 mvn 编译产物,profile=dev)
|
||||
# 日志:gangyan/logs/backend.log
|
||||
# 勿在此加 -Dspring.datasource*:与 application-local.yml 打架易连错库。
|
||||
# 若 jar 未重打、内嵌 yml 仍是远程库,必须依赖 backend/application-local.yml(含完整 spring 数据源)。
|
||||
# 注:backend/chat_web_yj.jar(同一 jar 的改名副本)及其 application-local.yml 覆盖配置已于 2026-04-20 归档删除。
|
||||
set -u
|
||||
source "$(cd "$(dirname "$0")" && pwd)/common-restart.sh"
|
||||
# 默认 backend.log;若曾被 root 创建导致当前用户不可写,则改用同目录 backend-<用户>.log(仍在 gangyan/logs 下)
|
||||
# 默认 backend.log;若曾被 root 创建导致当前用户不可写,则改用同目录 backend-<用户>.log
|
||||
LOG_FILE="$LOG_DIR/backend.log"
|
||||
if ! ( umask 022; : >>"$LOG_FILE" ) 2>/dev/null; then
|
||||
ALT="$LOG_DIR/backend-$(id -un).log"
|
||||
@@ -25,34 +24,41 @@ fi
|
||||
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
|
||||
export PATH="$JAVA_HOME/bin:$PATH"
|
||||
|
||||
log_tee "======== 停止 chat_web_yj.jar ========"
|
||||
pkill -f "chat_web_yj.jar" 2>/dev/null && log_tee "已发送停止信号" || log_tee "未找到运行中的进程"
|
||||
sleep 2
|
||||
BACKEND_DIR="$GANGYAN_ROOT/chat_web_backend"
|
||||
JAR_REL="target/chat_web_backend.jar"
|
||||
|
||||
log_tee "======== 启动 chat_web_yj.jar ========"
|
||||
cd "$GANGYAN_ROOT/backend"
|
||||
LOCAL_CFG="$GANGYAN_ROOT/backend/application-local.yml"
|
||||
EXTRA_JAVA_ARGS=()
|
||||
if [ -f "$LOCAL_CFG" ]; then
|
||||
log_tee "加载本地配置: $LOCAL_CFG"
|
||||
EXTRA_JAVA_ARGS=(-Dspring.config.additional-location="file:${LOCAL_CFG}")
|
||||
if [ ! -f "$BACKEND_DIR/$JAR_REL" ]; then
|
||||
log_tee "错误: 未找到 $BACKEND_DIR/$JAR_REL。先执行 chat_web_backend/compile.sh 编译。"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_tee "======== 停止 chat_web_backend.jar ========"
|
||||
pkill -f "target/chat_web_backend.jar" 2>/dev/null && log_tee "已发送停止信号" || log_tee "未找到运行中的进程"
|
||||
sleep 2
|
||||
# 端口兜底(非 hawei 启的旧进程 lsof 可能看不到,用 ss 探测)
|
||||
if ss -tln 2>/dev/null | grep -qE ':8099[[:space:]]'; then
|
||||
log_tee "8099 仍被占用,再等 3 秒..."
|
||||
sleep 3
|
||||
fi
|
||||
|
||||
log_tee "======== 启动 chat_web_backend.jar (profile=dev) ========"
|
||||
cd "$BACKEND_DIR"
|
||||
nohup java -jar \
|
||||
-Xms512m -Xmx2048m \
|
||||
"${EXTRA_JAVA_ARGS[@]}" \
|
||||
-Dspring.profiles.active=yj \
|
||||
chat_web_yj.jar >> "$LOG_FILE" 2>&1 &
|
||||
"$JAR_REL" \
|
||||
--spring.profiles.active=dev >> "$LOG_FILE" 2>&1 &
|
||||
STARTED_PID=$!
|
||||
log_tee "已后台启动,PID=$STARTED_PID"
|
||||
log_tee "Java 标准输出/错误写入: $LOG_FILE"
|
||||
sleep 3
|
||||
if kill -0 "$STARTED_PID" 2>/dev/null; then
|
||||
if command -v ss >/dev/null 2>&1 && ss -tln 2>/dev/null | grep -q ':8099'; then
|
||||
log_tee "自检: 进程存活且 8099 已监听(后端已就绪或即将就绪)"
|
||||
if ss -tln 2>/dev/null | grep -qE ':8099[[:space:]]'; then
|
||||
log_tee "自检: 进程存活且 8099 已监听"
|
||||
else
|
||||
log_tee "自检: 进程存活,但 8099 尚未监听(可能仍在启动;若 10 秒后仍无,请 tail 上面日志路径)"
|
||||
log_tee "自检: 进程存活,但 8099 尚未监听(可能仍在启动;10 秒后若仍无请 tail $LOG_FILE)"
|
||||
fi
|
||||
else
|
||||
log_tee "自检失败: 进程已退出。请查看日志末尾:"
|
||||
log_tee "自检失败: 进程已退出。最近日志:"
|
||||
tail -n 40 "$LOG_FILE" 2>/dev/null | while IFS= read -r line || [ -n "$line" ]; do log_line "$line"; done
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -31,7 +31,8 @@ fi
|
||||
|
||||
MAX_BYTES=$((MAX_MB * 1024 * 1024))
|
||||
TMP="${FILE}.trimtmp.$$"
|
||||
LOCK="${FILE}.trimlock"
|
||||
# LOCK 放 /tmp 并按用户命名,避免不同用户启动时 .trimlock owner 错配导致 Permission denied
|
||||
LOCK="/tmp/gangyan-trim-$(basename "$FILE").$(id -un).lock"
|
||||
|
||||
mkdir -p "$(dirname "$FILE")"
|
||||
touch "$FILE" 2>/dev/null || true
|
||||
|
||||
83
scripts/start-all.sh
Executable file
83
scripts/start-all.sh
Executable file
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
# 须用 bash 执行;若误用 sh/dash 会自动改用 bash 再跑一遍
|
||||
[ -n "${BASH_VERSION:-}" ] || exec /usr/bin/env bash "$0" ${1+"$@"}
|
||||
# 一键启动全部 gangyan 服务:基础设施 -> 后端 -> 前端。
|
||||
# 每一步直接 source 已有的 *-restart.sh,保持单一事实来源。
|
||||
# 日志:gangyan/logs/start-all.log
|
||||
set -u
|
||||
source "$(cd "$(dirname "$0")" && pwd)/common-restart.sh"
|
||||
LOG_FILE="$LOG_DIR/start-all.log"
|
||||
|
||||
run_step() {
|
||||
local label="$1" script="$2"
|
||||
log_tee "━━━━━━━━ ${label} ━━━━━━━━"
|
||||
if [ ! -x "$SCRIPT_DIR/$script" ]; then
|
||||
log_tee "跳过: $script 不存在或不可执行"
|
||||
return 0
|
||||
fi
|
||||
bash "$SCRIPT_DIR/$script" 2>&1 | tee -a "$LOG_FILE"
|
||||
local rc=${PIPESTATUS[0]}
|
||||
[ "$rc" -eq 0 ] || log_tee "警告: $script 返回 $rc"
|
||||
return 0
|
||||
}
|
||||
|
||||
port_check() {
|
||||
local port="$1" name="$2"
|
||||
if ss -tln 2>/dev/null | grep -qE ":${port}[[:space:]]"; then
|
||||
log_tee " [OK] ${name} :${port}"
|
||||
else
|
||||
log_tee " [!!] ${name} :${port} 未监听"
|
||||
fi
|
||||
}
|
||||
|
||||
log_tee "╔══════════════════════════════════════╗"
|
||||
log_tee "║ gangyan 全量启动 $(date '+%F %H:%M:%S') ║"
|
||||
log_tee "╚══════════════════════════════════════╝"
|
||||
|
||||
# 1) 基础设施(Docker 容器:MySQL / Redis / Milvus)
|
||||
run_step "[1/5] MySQL" mysql-restart.sh
|
||||
run_step "[2/5] Redis" redis-restart.sh
|
||||
run_step "[3/5] Milvus" milvus-restart.sh
|
||||
|
||||
# 2) 应用层(langchain-chat 会顺带起 pdf-convert-service + log-trim daemon)
|
||||
run_step "[4/6] langchain-chat + pdf-convert + log-trim" langchain-restart.sh
|
||||
run_step "[5/6] Java 后端" backend-restart.sh
|
||||
run_step "[6/6] 前端 vite" frontend-restart.sh
|
||||
|
||||
# 3) 辅助进程状态(excalidraw-ai / pptist-ai 当前以 screen -dmS 管理,非脚本化;本脚本仅做健康检查)
|
||||
log_tee "━━━━━━━━ 辅助进程检查 ━━━━━━━━"
|
||||
if pgrep -f 'excalidraw-ai-proxy\.py' >/dev/null; then
|
||||
log_tee " [OK] excalidraw-ai-proxy.py (screen -dmS aiproxy)"
|
||||
else
|
||||
log_tee " [!!] excalidraw-ai-proxy.py 未运行。手动启: screen -dmS aiproxy bash -c 'cd $GANGYAN_ROOT/scripts && /opt/software/miniconda3/envs/langchain-chat/bin/python excalidraw-ai-proxy.py'"
|
||||
fi
|
||||
if pgrep -f 'pptist-ai-backend\.py' >/dev/null; then
|
||||
log_tee " [OK] pptist-ai-backend.py (screen -dmS pptist-ai)"
|
||||
else
|
||||
log_tee " [!!] pptist-ai-backend.py 未运行。手动启: screen -dmS pptist-ai bash -c 'cd $GANGYAN_ROOT/scripts && /opt/software/miniconda3/envs/langchain-chat/bin/python pptist-ai-backend.py'"
|
||||
fi
|
||||
|
||||
# 4) 系统级 tools-nginx(systemd 管理,不在本脚本中重启)
|
||||
if systemctl is-active --quiet nginx 2>/dev/null; then
|
||||
log_tee " [OK] nginx (systemd, tools-nginx.conf -> :18000)"
|
||||
else
|
||||
log_tee " [!!] nginx 未运行。sudo systemctl start nginx"
|
||||
fi
|
||||
|
||||
# 5) 端口自检
|
||||
log_tee "━━━━━━━━ 端口自检(等 5 秒) ━━━━━━━━"
|
||||
sleep 5
|
||||
port_check 3306 "MySQL (3306 映射)"
|
||||
port_check 33306 "MySQL (33306 映射)"
|
||||
port_check 6379 "Redis"
|
||||
port_check 19530 "Milvus gRPC"
|
||||
port_check 9091 "Milvus HTTP"
|
||||
port_check 7861 "langchain-chat API"
|
||||
port_check 6006 "pdf-convert-service"
|
||||
port_check 8099 "Java 后端"
|
||||
port_check 3000 "vite 前端"
|
||||
port_check 18000 "tools-nginx (工具集合)"
|
||||
|
||||
log_tee ""
|
||||
log_tee "完成。完整日志: $LOG_FILE"
|
||||
log_tee "访问: http://<server-ip>:3000/metalinfo"
|
||||
Reference in New Issue
Block a user