# SimpleWebShell-RemoteUpdate
**Repository Path**: FasterEdge/SimpleWebShell-RemoteUpdate
## Basic Information
- **Project Name**: SimpleWebShell-RemoteUpdate
- **Description**: SimpleWebShell拓展:远程更新工具(工作流式)
- **Primary Language**: Go
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-31
- **Last Updated**: 2026-09-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
SimpleWebShell-RemoteUpdate
基于 SimpleWebShell 的非侵入式远程更新工作流
### 一、项目简介
- 独立 Go CLI,通过远端已经运行的 [SimpleWebShell](../SimpleWebShell/) HTTP API 完成应用初始化安装、版本更新、软链接切换、健康检查、自动回滚和旧版本清理。
- **非侵入式**:不修改 SimpleWebShell、不向远端安装常驻 Agent、不要求开放 SSH,只调用现有 `/post`、`/file_send`、Session 等公开接口。
- 固定版本目录与原子软链接流程,适合 Linux 边缘设备、树莓派、Jetson 和普通服务器的可审计发布。
- 密钥建议只通过 `SIMPLEWEBSHELL_KEY` 环境变量传入,避免写入配置与命令历史。
### 二、固定更新流程
```text
/
├── current -> releases/<当前版本>[/install_subdir]
├── previous -> releases/<上一版本>[/install_subdir]
├── releases/
│ ├── v1/
│ └── v2/
├── incoming/ # 上传暂存,成功解包后删除
└── .remoteupdate-app # 应用标识
```
每次 `update` 固定执行:
1. 探测 SimpleWebShell、校验密钥,可选创建隔离 Session。
2. 初始化 `releases/`、`incoming/`。
3. 流式上传发布包到 `incoming/`。
4. 本地计算 SHA-256,并在远端使用 `sha256sum` / `shasum` 二次校验。
5. 解包到新的 `releases//`,绝不覆盖当前版本目录。
6. 执行可选 `pre_switch`。
7. 保存旧链接为 `previous`,原子切换 `current`。
8. 执行可选 `post_switch` 与 `health_check`。
9. 失败时自动恢复旧链接并执行可选 `rollback`;首次安装失败则移除 `current`。
10. 清理超出保留策略的非活动旧版本。
### 三、命令
| 命令 | 作用 |
|------|------|
| `probe` | 验证 SimpleWebShell 连通性与密钥 |
| `init` | 初始化远端目录,不切换版本 |
| `install` | 首次安装;已有 `current` 时拒绝覆盖 |
| `update` | 上传、校验、安装并切换新版本 |
| `status` | 输出 current / previous / releases JSON |
| `rollback` | 回滚到 previous 或指定版本 |
| `cleanup` | 清理旧的非活动版本 |
### 四、快速开始
```bash
make build
cp remoteupdate.example.json remoteupdate.json
export SIMPLEWEBSHELL_KEY='你的SimpleWebShell密码'
./simplewebshell-remoteupdate -config remoteupdate.json probe
./simplewebshell-remoteupdate -config remoteupdate.json init
./simplewebshell-remoteupdate -config remoteupdate.json install \
-artifact ./my-service-v1.tar.gz -release v1
./simplewebshell-remoteupdate -config remoteupdate.json update \
-artifact ./my-service-v2.tar.gz -release v2
./simplewebshell-remoteupdate -config remoteupdate.json status
./simplewebshell-remoteupdate -config remoteupdate.json rollback
```
只审阅流程、不改变远端:
```bash
./simplewebshell-remoteupdate -config remoteupdate.json -dry-run update \
-artifact ./my-service-v2.tar.gz -release v2
```
> Go 标准 `flag` 规则要求全局参数(`-config`、`-dry-run`)放在子命令之前。
### 五、配置说明
```json
{
"remote": {
"url": "http://192.168.1.10:8878",
"timeout": "10m",
"session_enabled": true,
"insecure_tls": false
},
"app": {
"name": "my-service",
"root": "/opt/my-service",
"artifact_type": "tar.gz",
"install_subdir": "",
"pre_switch": "",
"post_switch": "systemctl restart my-service",
"health_check": "curl -fsS http://127.0.0.1:8080/health",
"rollback": "systemctl restart my-service"
},
"policy": {
"keep_releases": 5,
"require_health_check": true,
"disable_auto_rollback": false
}
}
```
| 配置 | 说明 |
|------|------|
| `remote.url` | 已运行的 SimpleWebShell 地址 |
| `remote.timeout` | 单次 HTTP 操作超时,默认 `10m`,需覆盖大包上传时间 |
| `remote.session_enabled` | 工作流期间创建临时 Session,结束后删除 |
| `app.root` | 远端应用绝对路径 |
| `artifact_type` | `tar.gz` / `tgz` / `tar` / `zip` / `file` |
| `app.install_subdir` | 解包后 current 指向的安全相对子目录,例如 `dist` |
| `pre_switch` | 软链接切换前命令 |
| `post_switch` | 切换后启动或重启命令 |
| `health_check` | 切换后的健康检查命令,返回非 0 触发失败 |
| `rollback` | 恢复旧链接后的服务恢复命令 |
| `keep_releases` | 保留的非活动版本数量,current/previous 永不清理 |
| `require_health_check` | 强制要求配置健康检查 |
| `disable_auto_rollback` | 默认自动回滚;设为 true 才关闭 |
`remote.key` 可以写入 JSON,但不推荐。优先使用:
```bash
export SIMPLEWEBSHELL_KEY='secret'
```
### 六、软件包与生命周期示例
**压缩包:**
```bash
tar -czf my-service-v2.tar.gz my-service config/
```
配置:
```json
{
"artifact_type": "tar.gz",
"post_switch": "systemctl restart my-service",
"health_check": "systemctl is-active --quiet my-service"
}
```
systemd 的 `ExecStart` 应直接引用稳定路径:
```ini
ExecStart=/opt/my-service/current/my-service
```
这样更新器只切换 `current`,服务配置不随版本变化。
### 七、Docker
```bash
docker build -t simplewebshell-remoteupdate:latest .
docker run --rm \
-e SIMPLEWEBSHELL_KEY="$SIMPLEWEBSHELL_KEY" \
-v "$PWD:/work" -w /work \
simplewebshell-remoteupdate:latest \
-config remoteupdate.json status
```
容器只运行本地更新 CLI,不需要特权模式;它通过网络访问远端 SimpleWebShell。
### 八、安全与适用范围
- 本工具拥有与 SimpleWebShell 密钥相同的远程命令权限,只能用于已授权设备。
- 推荐通过 VPN、内网或 HTTPS 反向代理访问 SimpleWebShell;不要把未加密 WebShell 直接暴露到公网。
- 版本号仅允许字母、数字、点、下划线、横线;远程路径统一进行 POSIX shell 单引号转义。
- `pre_switch` / `post_switch` / `health_check` / `rollback` 是管理员明确配置的可信 shell 命令。
- 软链接更新流程面向 Unix/Linux;Windows 不支持此固定软链接发布布局。
- SimpleWebShell 当前单条命令执行上限为 60 秒,因此生命周期命令应快速返回,长期进程应交给 systemd 等服务管理器。
### 九、目录结构
```text
SimpleWebShell-RemoteUpdate/
├── main.go
├── internal/
│ ├── config/ # JSON 配置与安全校验
│ ├── webshell/ # SimpleWebShell HTTP API 客户端
│ └── workflow/ # 安装、更新、切换、回滚、清理
├── remoteupdate.example.json
├── Dockerfile
├── Makefile
├── LICENSE
├── README.md
└── README_en.md
```
### 十、License
Apache License 2.0