Fix install.sh venv robustness + batch install API error reporting

install.sh: detect incomplete venv (missing activate), auto-install
python3-venv and retry instead of silently failing.

servers.py batch install: preserve server_name on exception, detect
"Status: FAILED" in stdout, return error details when stderr is empty,
increase SSH timeout to 180s.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Your Name
2026-05-27 00:53:00 +08:00
parent 69056491a7
commit 869f64ac18
2 changed files with 25 additions and 7 deletions
+11 -6
View File
@@ -445,28 +445,33 @@ async def batch_install_agent(
async def _install_one(sid: int):
async with sem:
server_name = ""
try:
server = await service.get_server(sid)
if not server:
return BatchAgentResultItem(server_id=sid, server_name="", success=False, error="服务器不存在")
server_name = server.name
api_key = server.agent_api_key or settings.API_KEY
if not api_key:
return BatchAgentResultItem(server_id=sid, server_name=server.name, success=False, error="请先生成 Agent API Key")
return BatchAgentResultItem(server_id=sid, server_name=server_name, success=False, error="请先生成 Agent API Key")
install_cmd = (
f"TMP=$(mktemp) && curl -fsSL {shlex.quote(base_url)}/agent/install.sh -o \"$TMP\" && bash \"$TMP\" -- "
f"--url {shlex.quote(base_url)} --key {shlex.quote(api_key)} "
f"--id {sid} --port {shlex.quote(str(server.agent_port or 8601))}"
f"; RC=$?; rm -f \"$TMP\"; exit $RC"
)
r = await exec_ssh_command(server, install_cmd, timeout=120)
r = await exec_ssh_command(server, install_cmd, timeout=180)
ok = r["exit_code"] == 0
# Also detect install.sh reporting FAILED in stdout
if ok and "Status: FAILED" in r.get("stdout", ""):
ok = False
return BatchAgentResultItem(
server_id=sid, server_name=server.name, success=ok,
stdout=r["stdout"][:1000] if ok else "",
error=r["stderr"][:300] if not ok else "",
server_id=sid, server_name=server_name, success=ok,
stdout=r["stdout"][:2000] if ok else r["stdout"][:1000],
error="" if ok else (r.get("stderr", "")[:500] or f"安装失败 (exit {r['exit_code']}), 查看stdout"),
)
except Exception as e:
return BatchAgentResultItem(server_id=sid, server_name="", success=False, error=str(e)[:200])
return BatchAgentResultItem(server_id=sid, server_name=server_name, success=False, error=str(e)[:300])
items = await asyncio.gather(*[_install_one(sid) for sid in payload.server_ids])
results = list(items)
+14 -1
View File
@@ -67,8 +67,21 @@ echo " Using: $PYTHON ($($PYTHON --version 2>&1))"
# 2. Create dir + venv
echo "[2/5] Create venv..."
mkdir -p "$INSTALL_DIR"
if [ ! -d "$VENV_DIR" ]; then
if [ ! -f "$VENV_DIR/bin/activate" ]; then
"$PYTHON" -m venv "$VENV_DIR"
# venv creation silently fails when python3-venv is missing (dir exists but no activate)
if [ ! -f "$VENV_DIR/bin/activate" ]; then
echo " venv incomplete — installing python3-venv..."
apt-get update -qq && apt-get install -y -qq "python$( "$PYTHON" -c 'import sys;print(f"{sys.version_info.major}.{sys.version_info.minor}")' )-venv" 2>/dev/null \
|| apt-get install -y -qq python3-venv 2>/dev/null \
|| { echo "ERROR: Cannot install python3-venv. Run: apt install python3-venv"; exit 1; }
rm -rf "$VENV_DIR"
"$PYTHON" -m venv "$VENV_DIR"
if [ ! -f "$VENV_DIR/bin/activate" ]; then
echo "ERROR: venv creation failed even after installing python3-venv"
exit 1
fi
fi
fi
# shellcheck disable=SC1091
source "$VENV_DIR/bin/activate"