一、 安装UV工具
使用官方安装脚本在 Linux 系统上安装 uv(一个极速的 Python 包和项目管理工具)。这是最快捷的方式,无需预先安装 Python 或其他依赖,脚本会自动下载预编译的二进制文件并配置环境变量。
1、执行安装命令
打开终端,运行以下命令:
bash
curl -LsSf https://astral.sh/uv/install.sh | sh
如果系统中没有 curl,可以使用 wget:
bash
wget -qO- https://astral.sh/uv/install.sh | sh
2、刷新环境变量
安装完成后,为了让系统识别 uv 命令,你需要重启终端,或者手动刷新当前 shell 的配置:
bash
# 如果你使用的是 bash
source ~/.bashrc
# 如果你使用的是 zsh
source ~/.zshrc
注意:脚本通常会将 uv 安装在 ~/.cargo/bin/ 或 ~/.local/bin/ 目录下,并自动尝试将其添加到 PATH 中。如果重启终端后仍提示命令未找到,请手动将安装目录加入 PATH。
3、验证安装
输入以下命令检查是否安装成功及查看版本:
bash
uv --version
二、Hermes生成的脚本
脚本内容如下,大家根据自己的实际场景与需求自行调整吧😆
bash
#!/bin/bash
# ============================================================
# Hermes Agent 全新重装脚本 (v0.10.0 -> v0.20.0)
# 自包含、可后台运行、带回滚逻辑
# 用法: bash /root/backups/reinstall_hermes.sh
# 日志: /root/backups/reinstall_hermes.log
# ============================================================
set -u
LOG=/root/backups/reinstall_hermes.log
exec > >(tee -a "$LOG") 2>&1
echo "====================================="
echo "[$(date)] 开始 Hermes 全新重装 (v0.20.0)"
echo "====================================="
CODE_DIR=/opt/hermes-agent
BACKUP_DIR=/opt/hermes-agent.bak.v0.10
VENV_OK=/opt/hermes-agent/.venv/bin/python
SRV=hermes-gateway.service
cd /root
# ---------- 0. 前置检查 ----------
echo "[1/6] 前置检查..."
if [ ! -f /root/backups/hermes-0.10.0-preupgrade-2026xxxx.zip ]; then
echo "✗ 备份 zip 不存在,中止。"
exit 1
fi
command -v git >/dev/null || { echo "✗ git 不存在"; exit 1; }
/opt/hermes-agent/.venv/bin/uv --version >/dev/null 2>&1 || { echo "✗ uv 不可用"; exit 1; }
echo "✓ 前置检查通过"
# ---------- 1. 停服务 ----------
echo "[2/6] 停止网关服务 $SRV ..."
systemctl stop "$SRV" 2>&1 || echo " (stop 返回非零,继续)"
# 等待进程退出
for i in 1 2 3 4 5; do
if ! pgrep -f "hermes_cli.main gateway" >/dev/null 2>&1; then
break
fi
sleep 2
done
echo "✓ 网关已停止"
# ---------- 2. 备份旧代码目录(回滚点) ----------
echo "[3/6] 备份当前代码目录 → $BACKUP_DIR ..."
if [ -d "$BACKUP_DIR" ]; then
rm -rf "$BACKUP_DIR"
fi
mv "$CODE_DIR" "$BACKUP_DIR" 2>&1
echo "✓ 旧目录已备份到 $BACKUP_DIR"
# ---------- 3. 全新 git clone ----------
echo "[4/6] git clone v0.20.0 → $CODE_DIR ..."
git clone --depth 1 --branch v2026.8.3 https://github.com/NousResearch/hermes-agent.git "$CODE_DIR" 2>&1
if [ $? -ne 0 ] || [ ! -f "$CODE_DIR/pyproject.toml" ]; then
echo "✗ git clone 失败,尝试回滚..."
rm -rf "$CODE_DIR"
mv "$BACKUP_DIR" "$CODE_DIR"
echo "已回滚到原目录。"
systemctl start "$SRV"
exit 1
fi
echo "✓ 源码克隆成功"
# ---------- 4. 建 venv + 装依赖 ----------
echo "[5/6] 创建 venv 并安装依赖 (all+feishu+messaging)..."
cd "$CODE_DIR"
# 重要: 此时 .venv 已被 mv 到 BACKUP_DIR, 用旧 venv 的 uv 或系统 uv
UV_BIN=""
for cand in "/opt/hermes-agent.bak.v0.10/.venv/bin/uv" "$(command -v uv 2>/dev/null)"; do
if [ -n "$cand" ] && [ -x "$cand" ]; then
UV_BIN="$cand"
break
fi
done
if [ -z "$UV_BIN" ]; then
echo "✗ 找不到可用的 uv。回滚。"
rm -rf "$CODE_DIR"; mv "$BACKUP_DIR" "$CODE_DIR"
systemctl start "$SRV" 2>/dev/null
exit 1
fi
echo "使用 uv: $UV_BIN"
PY_INTERP=/opt/aiext/bin/python3.12
[ -x "$PY_INTERP" ] || PY_INTERP=python3.12
"$UV_BIN" venv .venv --python "$PY_INTERP" 2>&1
if [ $? -ne 0 ]; then
echo "✗ venv 创建失败。回滚。"
systemctl start "$SRV" 2>/dev/null
rm -rf "$CODE_DIR"; mv "$BACKUP_DIR" "$CODE_DIR"
exit 1
fi
# 安装依赖 (优先 uv sync 用 lock 保持一致性; 失败则回退 uv pip install)
"$UV_BIN" sync --extra all --extra feishu --extra messaging 2>&1
INSTALL_RC=$?
if [ $INSTALL_RC -ne 0 ]; then
echo " (uv sync 失败,回退到 uv pip install)..."
"$UV_BIN" pip install --python .venv/bin/python -e ".[all,feishu,messaging]" 2>&1
INSTALL_RC=$?
fi
if [ $INSTALL_RC -ne 0 ]; then
echo "✗ 依赖安装失败(rc=$INSTALL_RC)。回滚。"
rm -rf "$CODE_DIR"; mv "$BACKUP_DIR" "$CODE_DIR"
systemctl start "$SRV" 2>/dev/null
exit 1
fi
echo "✓ 依赖安装完成"
# ---------- 5. 验证新版本 ----------
echo "[6/6] 验证新版本..."
if [ ! -x "$VENV_OK" ]; then
echo "✗ 新 venv python 不存在。回滚。"
rm -rf "$CODE_DIR"; mv "$BACKUP_DIR" "$CODE_DIR"
systemctl start "$SRV" 2>/dev/null
exit 1
fi
NEW_VER=$("$VENV_OK" -m hermes_cli.__init__ 2>/dev/null || "$VENV_OK" -c "import hermes_cli; print('ok')" 2>&1)
echo "新版本探测输出: $NEW_VER"
VER=$("$VENV_OK" -m pip show hermes-agent 2>/dev/null | grep -i "^Version" || echo "unknown")
echo "安装版本: $VER"
# 即使版本显示不完美,只要 venv 正常且能 import 就继续
"$VENV_OK" -c "import hermes_cli, run_agent" 2>&1 && echo "✓ 核心模块可导入" || { echo "✗ 核心模块导入失败,回滚"; rm -rf "$CODE_DIR"; mv "$BACKUP_DIR" "$CODE_DIR"; systemctl start "$SRV"; exit 1; }
# ---------- 6. 启动网关 ----------
echo "启动网关服务..."
systemctl daemon-reload 2>&1
systemctl enable "$SRV" 2>&1
systemctl start "$SRV" 2>&1
sleep 5
if systemctl is-active --quiet "$SRV"; then
echo "✓ 网关已启动 (systemd 显示 active)"
else
echo "⚠ 网关启动状态非 active,检查日志:"
journalctl -u "$SRV" --no-pager -n 30 2>&1 | tail -30
echo "⚠ 注意: 服务启动失败。可通过 systemctl status $SRV 查看。如需回滚:"
echo " systemctl stop $SRV; rm -rf /opt/hermes-agent; mv /opt/hermes-agent.bak.v0.10 /opt/hermes-agent; systemctl start $SRV"
fi
echo "====================================="
echo "[$(date)] 重装流程结束"
echo " 新版: /opt/hermes-agent (v0.20.0 预期)"
echo " 旧版备份: /opt/hermes-agent.bak.v0.10"
echo " 日志: $LOG"
echo "====================================="