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>
This commit is contained in:
jocay
2026-10-18 10:46:21 +08:00
parent 84653bec61
commit 76f6fe32f5
6 changed files with 499 additions and 72 deletions
+41 -40
View File
@@ -139,34 +139,56 @@ python3 docs/bolt_http_test.py # HTTP 端到端(含 Mcp-Session-Id、/files
- Linux / macOS(完整功能:进程组杀、信号处理)
- Windows(基础功能:`cmd /C`、`taskkill /T` 杀进程树、Ctrl+C 清理退出)
## 在其他设备上部署(最快方式)
一键脚本支持 Linux(systemd)和 macOS(launchd),自动识别 amd64 / arm64;Apple Silicon 即使在 Rosetta 终端中也优先选择 arm64。安装需要 root 权限。
## 在其他设备上部署(一键脚本)
默认下载 `v0.1.0` 的 `bolt-<平台>-<架构>` 附件,例如 `bolt-linux-amd64`、`bolt-darwin-arm64`。对应附件需要事先发布到 Gitea Release;可通过 `BOLT_VERSION` 指定版本,或通过 `BOLT_DL_URL` / `--binary` 指定其他来源。
脚本支持 Linux(systemd)和 macOS(launchd),自动识别 amd64 / arm64(Apple Silicon 即使在 Rosetta 终端中也优先选择 arm64),需要 root 权限。仓库公开,无需令牌;IPv4 网络用 `git.jocayn.qzz.io`,IPv6 网络用 `git.draws.qzz.io`(脚本下载二进制时也会自动先试 IPv4 站点、再试 IPv6 站点)。
| 操作 | IPv4 | IPv6 |
|---|---|---|
| 安装 | `curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/install.sh \| sudo sh -s -- --http 0.0.0.0:8080 --token 你的令牌` | `curl -fsSL https://git.draws.qzz.io/jocay/bolt/raw/branch/main/deploy/install.sh \| sudo sh -s -- --http 0.0.0.0:8080 --token 你的令牌` |
| 更新 | `curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/update.sh \| sudo sh` | `curl -fsSL https://git.draws.qzz.io/jocay/bolt/raw/branch/main/deploy/update.sh \| sudo sh` |
| 卸载 | `curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/uninstall.sh \| sudo sh` | `curl -fsSL https://git.draws.qzz.io/jocay/bolt/raw/branch/main/deploy/uninstall.sh \| sudo sh` |
- **安装**(`install.sh`):下载 Release 上最新版本的 `bolt-<平台>-<架构>` 附件(有 `SHA256SUMS` 附件时自动校验)→ 装到 `/usr/local/bin` → 写配置与服务 → 开机自启 → 启动。已安装的设备会拒绝执行,避免按新参数重写配置时丢掉令牌;确实要重装加 `--reinstall`。
- **更新**(`update.sh`):只替换二进制并重启服务,**保留现有配置**;已是最新版本时直接跳过,不会自动降级。新版本服务起不来时自动回滚到旧版本(旧版本备份在 `/usr/local/bin/bolt.bak`)。重启由独立进程完成,所以通过 bolt 自身执行更新也安全(只是本次调用的连接会断开)。
- `--version v0.2.0` 安装指定版本,`--binary ./bolt` 使用本地二进制,`--force` 同版本也重装
- **卸载**(`uninstall.sh`):停止并删除服务、二进制和备份;默认同时删除配置与日志,加 `--keep-config` 保留。
- 环境变量:`BOLT_GIT_HOST` 指定下载站点,`BOLT_VERSION` 指定版本,`BOLT_DL_URL` 直接指定二进制地址,`BOLT_DL_TOKEN` 用于私有仓库下载。
传参写在 `sh -s --` 之后,例如:
```bash
# 1. 下载并执行安装脚本(私有仓库下载附件需先 export 下载令牌)
export BOLT_DL_TOKEN=你的Gitea令牌
curl -fsSL -H "Authorization: token $BOLT_DL_TOKEN" https://git.draws.qzz.io/jocay/bolt/raw/branch/main/deploy/install.sh -o install.sh
sudo BOLT_DL_TOKEN="$BOLT_DL_TOKEN" sh install.sh --http 127.0.0.1:8080
# 2. 完成(脚本自动:下载二进制 → 装到 /usr/local/bin → 写 /etc/bolt.env 与
# systemd 单元 → 开机自启 → 启动服务)。看状态:
systemctl status bolt
curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/install.sh | sudo sh -s -- \
--http 0.0.0.0:8080 --token 你的令牌 --allow "git,docker" --file-root /srv/data
curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/update.sh | sudo sh -s -- --version v0.2.0
curl -fsSL https://git.jocayn.qzz.io/jocay/bolt/raw/branch/main/deploy/uninstall.sh | sudo sh -s -- --keep-config
```
### macOS arm64(Apple Silicon)
安装参数(全部可选):
在 Mac 上运行上面的安装命令,脚本会下载 `bolt-darwin-arm64`,安装到 `/usr/local/bin/bolt`,并创建以 root 运行的 launchd 系统服务 `io.jocay.bolt`。
| 参数 | 含义 |
|---|---|
| `--http <addr>` | 监听地址,默认 `127.0.0.1:8080`;对外用 `0.0.0.0:8080` |
| `--token <t>` | Bearer 认证令牌(公网必填) |
| `--allow <a,b>` / `--deny <a,b>` | 命令白/黑名单 |
| `--timeout-ms <n>` | 默认命令超时 |
| `--file-root <d1,d2>` | 文件功能允许访问的目录(配置 `--allow` 时必填,否则文件功能禁用) |
| `--max-upload <n>` | `PUT /files` 单次上传上限(默认 2G) |
| `--binary <路径或URL>` | 跳过 Release 下载,用本地二进制(如 `scp` 过去的)或指定 URL |
| `--version <tag>` | 安装指定版本(默认最新) |
| `--reinstall` | 已安装时按本次参数重写配置 |
| `--no-start` / `--no-enable` | 只安装不启动 / 不设开机自启 |
`v0.1.0` Release 提供 `bolt-darwin-arm64` 附件。也可以将该二进制下载或拷到 Mac 后安装:
### 发布新版本
```bash
sudo sh deploy/install.sh --binary ./bolt-darwin-arm64 --http 127.0.0.1:8080 --token 你的令牌
```
在 Gitea 上新建 Release(tag 如 `v0.2.0`),上传附件 `bolt-linux-amd64`、`bolt-darwin-arm64`(以及需要的其他平台)和 `SHA256SUMS`(`sha256sum bolt-* > SHA256SUMS`)。脚本按 `/api/v1/repos/jocay/bolt/releases/latest` 识别最新版本,发布后各设备执行更新命令即可。
配置保存在 `/Library/Application Support/bolt/io.jocay.bolt.plist`,包含监听地址、认证令牌、命令规则和超时。启用开机自启时,脚本还会复制配置到 `/Library/LaunchDaemons/io.jocay.bolt.plist`。两份配置均仅 root 可读写;更改参数建议重新运行安装脚本,以保持一致。
Linux 附件建议用 `cargo zigbuild --release --target x86_64-unknown-linux-gnu.2.28` 编译(只依赖 glibc 2.28,Debian 10 及以上都能运行);macOS 附件用 `cargo zigbuild --release --target aarch64-apple-darwin` 交叉编译,脚本安装时会在缺少签名时自动补 ad-hoc 签名。
### macOS(launchd)
脚本会创建以 root 运行的 launchd 系统服务 `io.jocay.bolt`。配置保存在 `/Library/Application Support/bolt/io.jocay.bolt.plist`,包含监听地址、认证令牌、命令规则和超时;启用开机自启时,脚本还会复制到 `/Library/LaunchDaemons/io.jocay.bolt.plist`。两份配置均仅 root 可读写。
`--no-enable` 只保留手动启动配置,取消本服务的开机配置,仍可立即启动;`--no-start` 本次不加载服务,已运行的本服务也会卸载,下次开机是否启动由 `--no-enable` 决定。两个参数可一起使用。
@@ -183,28 +205,7 @@ sudo launchctl bootstrap system '/Library/Application Support/bolt/io.jocay.bolt
sudo tail -f /var/log/bolt/stdout.log /var/log/bolt/stderr.log
```
macOS 服务的工作目录为 `/var/root`,PATH 包含 `/opt/homebrew/bin` 和 `/opt/homebrew/sbin`,不会加载个人 shell 配置。认证下载使用 `BOLT_DL_TOKEN`,HTTP 服务认证使用 `--token`,两者独立。
该附件交叉编译为 `aarch64-apple-darwin`,最低目标系统为 macOS 11.0,未进行 Mac 实机运行验证。SHA-256:
```text
39274c7d1f965ae924ee51d4e9e4d8a260a84d083971cd50dc6ce645245cc4b8 bolt-darwin-arm64
```
常用安装参数(全部可选):
| 参数 | 含义 |
|---|---|
| `--http <addr>` | 监听地址,默认 `127.0.0.1:8080`;对外用 `0.0.0.0:8080` |
| `--token <t>` | Bearer 认证令牌(公网必填) |
| `--allow <a,b>` / `--deny <a,b>` | 命令白/黑名单 |
| `--timeout-ms <n>` | 默认命令超时 |
| `--file-root <d1,d2>` | 文件功能允许访问的目录(配置 `--allow` 时必填,否则文件功能禁用) |
| `--max-upload <n>` | `PUT /files` 单次上传上限(默认 2G) |
| `--binary <路径或URL>` | 跳过下载,用本地已拷贝的二进制(如 `scp` 过去的) |
| `--no-start` / `--no-enable` | 只安装不启动 / 不设开机自启 |
注意:仓库是私有时,Release 附件下载需要认证 —— `export BOLT_DL_TOKEN=你的令牌` 后再跑脚本;若目标设备与开发机同网,直接 `scp root@开发机:/usr/local/bin/bolt ./bolt` 后用 `--binary ./bolt` 最省事。也可以把仓库设公开,附件即可匿名下载。
macOS 服务的工作目录为 `/var/root`,PATH 包含 `/opt/homebrew/bin` 和 `/opt/homebrew/sbin`,不会加载个人 shell 配置。
## systemd 服务部署(手动)