feat: 新增 systemd 持久化部署(deploy/ztools2.service + install-systemd.sh)

systemd 管理 zTools2 后端实现开机自启 + 崩溃自动重启:
- deploy/ztools2.service 模板(Restart=on-failure,after mysql)
- deploy/install-systemd.sh 自动检测 .venv 或系统 uvicorn,填充路径安装
- README 补持久化部署章节
This commit is contained in:
2026-07-27 13:52:23 +08:00
parent aa08a1cf60
commit 29c5462734
3 changed files with 94 additions and 0 deletions

56
deploy/install-systemd.sh Executable file
View File

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
# 安装 systemd 服务,实现 zTools2 持久化部署(开机自启 + 崩溃自动重启)。
#
# 做的事:
# 1. 用实际路径填充 deploy/ztools2.service 模板,写入 /etc/systemd/system/
# 2. 停掉旧方式start.sh 启动的 uvicorn避免端口冲突
# 3. systemctl daemon-reload + enable + start
#
# 用法:./deploy/install-systemd.sh
# 卸载systemctl disable --now ztools2 && rm /etc/systemd/system/ztools2.service && systemctl daemon-reload
set -euo pipefail
cd "$(dirname "$0")/.."
ROOT="$(pwd)"
# 解析 uvicorn 可执行路径:优先 .venvsetup.sh 标准),回退系统 python -m uvicorn
if [[ -x "$ROOT/.venv/bin/uvicorn" ]]; then
UVICORN="$ROOT/.venv/bin/uvicorn"
PYBIN="$ROOT/.venv/bin/python"
elif command -v uvicorn >/dev/null 2>&1; then
UVICORN="$(command -v uvicorn)"
PYBIN="$(command -v python3)"
else
echo "未找到 uvicorn请先运行 ./setup.sh建 .venv或 pip install uvicorn" >&2
exit 1
fi
[[ -f "$ROOT/config.yaml" ]] || { echo "未找到 config.yaml请先运行 ./setup.sh" >&2; exit 1; }
UNIT_SRC="$ROOT/deploy/ztools2.service"
UNIT_DST="/etc/systemd/system/ztools2.service"
echo "==> 生成 systemd unit路径 $ROOTuvicorn=$UVICORN"
# 同时填充 ROOT 与 UVICORNPYBIN 备用ExecStart 用 UVICORN 直接启动)
sudo sed -e "s|__ZTOOLS2_DIR__|$ROOT|g" -e "s|__UVICORN__|$UVICORN|g" "$UNIT_SRC" > /tmp/ztools2.service
sudo mv /tmp/ztools2.service "$UNIT_DST"
sudo chmod 644 "$UNIT_DST"
echo "==> 停止旧方式start.sh 启动的进程,若有)"
./stop.sh >/dev/null 2>&1 || true
echo "==> 启用并启动 ztools2 服务"
sudo systemctl daemon-reload
sudo systemctl enable ztools2
sudo systemctl restart ztools2
sleep 2
if systemctl is-active --quiet ztools2; then
echo "✓ ztools2 已启动并设为开机自启"
echo " 状态systemctl status ztools2"
echo " 日志journalctl -u ztools2 -f"
echo " 停止sudo systemctl stop ztools2"
echo " 重启sudo systemctl restart ztools2"
else
echo "✗ ztools2 启动失败查看日志journalctl -u ztools2 -n 50" >&2
exit 1
fi