Files
jocay 76f6fe32f5 deploy: 一键更新 / 卸载脚本,安装脚本自动选择 IPv4/IPv6 站点与最新版本
- 新增 deploy/update.sh:只替换二进制并重启服务,保留配置;已是最新时跳过、不自动降级;
  重启由独立进程执行(通过 bolt 自身运行也安全),新版本起不来时自动回滚
- 新增 deploy/uninstall.sh:删除服务、二进制与备份,默认同时删除配置,--keep-config 保留
- install.sh:先试 IPv4 站点(git.jocayn.qzz.io)再试 IPv6 站点(git.draws.qzz.io),
  通过 Release API 获取最新版本,支持 SHA256SUMS 校验与 --version;
  已安装时拒绝覆盖配置(--reinstall 强制);macOS 缺少签名时补 ad-hoc 签名
- .gitattributes 强制 *.sh 使用 LF
- README / CLAUDE.md 更新部署说明与发布流程

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 10:46:21 +08:00

95 lines
3.3 KiB
Bash

#!/bin/sh
# bolt 卸载脚本(POSIX sh,需 root;Linux 使用 systemd,macOS 使用 launchd)
#
# 用法(在目标设备上):
# IPv4: curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/uninstall.sh | sudo sh
# IPv6: curl -fsSL https://git.draws.qzz.io/jocay/bolt/raw/branch/main/deploy/uninstall.sh | sudo sh
# 保留配置: ... | sudo sh -s -- --keep-config
#
# 选项:
# --keep-config 保留配置(Linux: /etc/bolt.env;macOS: /Library/Application Support/bolt 与 /var/log/bolt)
#
# 注意:如果是通过 bolt 自己执行本脚本,最后停止服务时连接会断开,这是正常现象。
set -eu
BIN_PATH=/usr/local/bin/bolt
LABEL=io.jocay.bolt
KEEP_CONFIG=0
while [ $# -gt 0 ]; do
case "$1" in
--keep-config) KEEP_CONFIG=1; shift ;;
*) echo "未知参数: $1"; echo "用法见脚本头部注释"; exit 1 ;;
esac
done
say() { printf '\033[1;32m[bolt]\033[0m %s\n' "$*"; }
die() { printf '\033[1;31m[bolt] 错误:\033[0m %s\n' "$*"; exit 1; }
[ "$(id -u)" -eq 0 ] || die "需要 root 权限(请用 sudo 运行)"
# 二进制及更新脚本留下的备份(正在运行的进程不受影响,最后再停服务)
rm_bins() {
for f in "$BIN_PATH" "$BIN_PATH.bak" "$BIN_PATH.new" "$BIN_PATH.rollback" "$BIN_PATH".v*.bak; do
if [ -e "$f" ]; then
rm -f "$f"
say "已删除 $f"
fi
done
rm -rf /tmp/bolt-update.* /tmp/bolt-upgrade 2>/dev/null || true
}
case "$(uname -s)" in
Linux)
UNIT=/etc/systemd/system/bolt.service
HAS_SYSTEMD=0
command -v systemctl >/dev/null 2>&1 && HAS_SYSTEMD=1
if [ "$HAS_SYSTEMD" -eq 1 ]; then
systemctl disable bolt >/dev/null 2>&1 && say "已取消开机自启" || true
fi
rm_bins
if [ -e "$UNIT" ] || [ -d "$UNIT.d" ]; then
rm -rf "$UNIT" "$UNIT.d"
say "已删除服务单元 $UNIT"
fi
if [ "$KEEP_CONFIG" -eq 0 ]; then
if [ -e /etc/bolt.env ]; then
rm -f /etc/bolt.env
say "已删除配置 /etc/bolt.env"
fi
else
[ -e /etc/bolt.env ] && say "保留配置 /etc/bolt.env"
fi
say "卸载完成,正在停止服务…"
if [ "$HAS_SYSTEMD" -eq 1 ]; then
systemctl daemon-reload || true
systemctl stop bolt >/dev/null 2>&1 || true
systemctl reset-failed bolt >/dev/null 2>&1 || true
fi
pkill -x bolt 2>/dev/null || true
;;
Darwin)
AUTO_PLIST="/Library/LaunchDaemons/$LABEL.plist"
PLIST_DIR="/Library/Application Support/bolt"
rm_bins
if [ -e "$AUTO_PLIST" ]; then
rm -f "$AUTO_PLIST"
say "已删除开机配置 $AUTO_PLIST"
fi
if [ "$KEEP_CONFIG" -eq 0 ]; then
for d in "$PLIST_DIR" /var/log/bolt; do
if [ -e "$d" ]; then
rm -rf "$d"
say "已删除 $d"
fi
done
else
say "保留配置 $PLIST_DIR 与日志 /var/log/bolt"
fi
say "卸载完成,正在停止服务…"
launchctl bootout "system/$LABEL" 2>/dev/null || true
launchctl disable "system/$LABEL" 2>/dev/null || true
;;
*) die "不支持的操作系统: $(uname -s)" ;;
esac