#!/bin/bash # Scout Agent 更新脚本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 读取当前版本 get_current_version() { if [[ -f "VERSION" ]]; then cat VERSION | tr -d '[:space:]' else echo "unknown" fi } VERSION=$(get_current_version) echo -e "${BLUE}╔═══════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ 🧭 Scout Agent 更新工具 ║${NC}" echo -e "${BLUE}╚═══════════════════════════════════════════════════════════╝${NC}" echo "" echo -e "${GREEN}当前版本:${NC} v${VERSION}" echo "" # 检查 Git if ! command -v git &> /dev/null; then echo -e "${RED}错误:${NC} Git 未安装" exit 1 fi # 检查是否在 Git 仓库中 if [[ ! -d ".git" ]]; then echo -e "${RED}错误:${NC} 当前目录不是 Git 仓库" echo -e "${YELLOW}提示:${NC} 请先使用 install.sh 安装 Scout Agent" exit 1 fi # 检查远程更新 echo -e "${BLUE}检查远程更新...${NC}" git fetch origin # 获取本地和远程的提交数 LOCAL=$(git rev-parse @) REMOTE=$(git rev-parse @{u}) if [[ $LOCAL == $REMOTE ]]; then echo -e "${GREEN}✓ 已经是最新版本${NC}" echo "" exit 0 fi # 显示将要更新的提交 echo "" echo -e "${YELLOW}即将更新以下提交:${NC}" git log --oneline $LOCAL..$REMOTE echo "" # 询问是否继续 read -p "是否继续更新? (y/n) " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then echo -e "${YELLOW}更新已取消${NC}" exit 0 fi # 提前激活 conda 环境(scout stop 需要 scout 命令可用,内部会做 WAL checkpoint + 安全备份) if command -v conda &> /dev/null; then eval "$(conda shell.bash hook)" conda activate scout 2>/dev/null || true fi # 停止当前运行的服务 echo "" echo -e "${BLUE}停止 Scout Agent 服务...${NC}" # ★ 修复 2026-08-27:必须用 scout stop(内部先做 WAL checkpoint + 一致性备份), # 禁止直接 pkill —— 直接杀进程会绕过备份,且 WAL 中未 checkpoint 的数据可能丢失 if pgrep -f "scout.cli" > /dev/null; then if command -v scout > /dev/null 2>&1; then scout stop || true else pkill -f "scout.cli" sleep 2 fi echo -e "${GREEN}✓ 服务已停止(数据库已自动安全备份)${NC}" else echo -e "${YELLOW}服务未运行${NC}" fi # 备份当前配置 echo "" echo -e "${BLUE}备份配置文件...${NC}" if [[ -f ".env" ]]; then cp .env .env.backup.$(date +%Y%m%d_%H%M%S) echo -e "${GREEN}✓ .env 已备份${NC}" fi # 拉取更新 echo "" echo -e "${BLUE}拉取最新代码...${NC}" git pull origin main # 读取新版本 NEW_VERSION=$(get_current_version) echo -e "${GREEN}✓ 代码已更新${NC}" echo -e " v${VERSION} → ${GREEN}v${NEW_VERSION}${NC}" # 更新依赖 echo "" echo -e "${BLUE}更新 Python 依赖...${NC}" # (conda 环境已在脚本开头激活,此处无需重复) if [[ -f "requirements.txt" ]]; then pip install -r requirements.txt -q echo -e "${GREEN}✓ 依赖已更新${NC}" fi # 更新嵌入模型(如果有新版本) echo "" echo -e "${BLUE}检查嵌入配置...${NC}" echo -e "${GREEN}✓ 默认纯文本检索(如需向量检索请按 README 配置)${NC}" # 重启服务 echo "" echo -e "${BLUE}重启 Scout Agent 服务...${NC}" if [[ -f "run.sh" ]]; then nohup bash run.sh --web > /tmp/scout-server.log 2>&1 & sleep 3 if pgrep -f "scout.cli" > /dev/null; then echo -e "${GREEN}✓ 服务已启动${NC}" echo -e " 访问: http://localhost:8848" else echo -e "${RED}✗ 服务启动失败${NC}" echo -e "${YELLOW}查看日志:${NC} tail -f /tmp/scout-server.log" fi fi echo "" echo -e "${GREEN}╔═══════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ 🎉 更新完成! ║${NC}" echo -e "${GREEN}╚═══════════════════════════════════════════════════════════╝${NC}" echo "" echo -e "${BLUE}新版本:${NC} v${NEW_VERSION}" echo "" echo -e "${YELLOW}更新日志:${NC}" git log --oneline -5 echo ""