README.zh.md
Rama main · réplica de lectura del repositorio original.
<div align="center">
# aibox
**零依赖、纯 bash 的 AI 编码工具模块管理器。**
[](https://github.com/lichengwu/aibox/releases)
[](LICENSE)
[](https://github.com/lichengwu/aibox/actions/workflows/lint.yml)
[](https://www.gnu.org/software/bash/)
[](#环境要求)
[安装](#安装) · [快速上手](#快速上手) · [CLI 语法](#cli-语法) · [模块列表](#模块) · [English](README.md)
</div>
`aibox` 把你部署的每个自托管工具 —— GitLab、Dify、Clash 代理池 —— 都当作一个
**模块**:一个目录自带 `install / uninstall / update / svc` 钩子,由一个约 3.4k 行的
单文件 CLI 统一调度。零运行时依赖、无包管理器、macOS 自带的 bash 3.2 即可运行。
## 特性
- **统一语法** —— 一切都是 `aibox <动词> <模块>`:install / update / uninstall /
check / upgrade / status / purge。一个心智模型,没有子命令家族。
- **预检门控的安装** —— 依赖、磁盘、域名、docker 守护进程可达性、共享服务就绪度
全部在动手前探测;坏网络自动尝试备选路由(直连 / clash / 镜像)。
- **下载源池** —— 每个下载族(GitHub raw/releases/API、docker.io、npm、ghcr、
node-dist)并发竞速、按实测吞吐排序、逐源故障转移。健康网络零开销。
- **Docker 源选择器** —— docker.io / ghcr.io 的流量(镜像拉取和升级版本解析)
走统一严格优先级:官方/默认地址优先,其次本地已有地址(daemon 自己配置的
registry-mirrors + 用户 knob),超时/不可用才启用实测验证过的加速池
(docker.io 十家 + ghcr 两家),测速排序。排名带 TTL 缓存且自愈 —— 死源跳过、
复活重新参选,`dockerpool.cache` 跨运行共享。
- **内置镜像加速** —— GitHub / docker.io / npm 镜像按你机器上的真实下载排序,
不是拍脑袋。校验门控:镜像返回坏包体会被丢弃并换下一个源。
- **带回滚点的阶梯升级** —— `aibox upgrade <module>` 无需 aibox 发版即可升级部署的上游版本:
健康门 + **验证过的自动回滚**(退出码 10 = 已回滚,20 = 需人工干预)、记录回滚点
(`--rollback` 回退、`--history` 看历史)、共享 PG 消费者升级前自动快照(`--no-backup` 跳过)。
GitLab 官方的必经停靠点规则已自动化(多跳路径计算、每跳最新 patch、跳间就绪门)。
- **本地优先的仪表板** —— `aibox status` 从本地元数据渲染状态(✓ ok /
⚠ starting / ○ stopped)、端点、凭据、端口监听;异步探测永不阻塞视图。
每个模块块头部是部署的**应用版本**(npm 包 / 镜像 tag / 内核 tag;aibox
封装脚本版本沉在暗色尾行)——总览、详情、模块富视图统一同一套 keyline 模板。
- **逐模块离线帮助** —— `aibox <module> --help` 渲染动作表(来自模块自己的
`usage:` 映射);`aibox <module> <action> --help` 渲染单个动作。
- **默认安全** —— 每个破坏性动词都有交互确认(卸载先确认、再确认是否删数据;
purge 先确认、再确认是否停容器);脚本场景无 `--yes` 一律拒绝并 exit 2。
- **残留清理** —— `aibox autoclean` 扫描并清除卸载钩子遗留物(卷、`/etc` 目录、
服务单元、二进制),aibox 本身卸载后也能清理。
## 环境要求
- **macOS 或 Linux**,bash 3.2+(macOS 自带版本即可)。
- `curl`。Docker 仅容器部署型模块需要(预检会告诉你)。
- 其余零运行时依赖;不需要 jq/python。
## 安装
```bash
curl -fsSL https://raw.githubusercontent.com/lichengwu/aibox/main/install.sh | bash
```
raw.githubusercontent.com 被墙的网络(国内常见)加镜像前缀 —— 引导脚本自身的所有
下载也是直连+镜像竞速的:
```bash
curl -fsSL https://gh-proxy.com/https://raw.githubusercontent.com/lichengwu/aibox/main/install.sh | bash
```
安装到 `~/.local/bin/aibox`(PATH 自动处理)。
可选的 `curl | bash` 校验:
```bash
AIBOX_SHA256=<hex> curl -fsSL …/install.sh | bash # 钉住精确二进制
AIBOX_VERIFY=1 curl -fsSL …/install.sh | bash # 校验 release 的 SHA256SUMS
```
安装相关的旋钮(全部可选,单次生效):
```bash
AIBOX_PM_TIMEOUT=1200 aibox install pi-web # 限制包管理器自动安装时长(默认 600s;0 = 不限)
AIBOX_NO_AUTO_DEPS=1 aibox install new-api # 完全禁用自动安装(服务依赖 + 软件包)
AIBOX_STRICT_SERVICES=1 aibox install new-api # 服务依赖未启动时以非零退出
AIBOX_SYSTEM_BIN_DIRS=/usr/local/bin aibox … # 候选的「在 PATH 中」系统目录
```
bin 目录的选定顺序是固定的(管理器与引导脚本用同一套规则):显式 `AIBOX_BIN_DIR`
→ `~/.local/bin` 已在 `PATH` 中(不动既有部署)→ `PATH` 中可写的系统目录(部署主机:
`/usr/local/bin`,装完即可用)→ 兜底 `~/.local/bin`。
装任何东西之前,可用 `aibox check self` 查看环境(出口路由、docker、node/npm、磁盘)。
## 校验(下载即校验)
每次安装都会按 `modules.SHA256SUMS` 校验下载到的每个模块文件:
```bash
aibox install new-api # 自动校验
AIBOX_VERIFY=0 aibox install new-api # 显式跳过(会提示未校验)
```
校验不通过会指出具体文件并中止安装;清单缺失(旧分支 / 普通镜像 / 主机无 `shasum`)时
只提示"未校验",不会静默通过。CLI 自身的引导脚本仍支持可选的
`curl … | AIBOX_SHA256=<hex> bash`。
## 快速上手
```bash
aibox install pi-web # 预检门控的模块安装
aibox pi-web start # 服务生命周期:start / stop / restart / status / logs
aibox status # 全部模块:应用版本、状态、端点、凭据、端口
```
部署共享的 PostgreSQL + Redis 基座,再装一个消费它的模块:
```bash
aibox install base # 共享 PG18 + Redis7(每个模块独立数据库)
aibox base create postgres dify
aibox install dify
aibox dify start
```
共享基座自身也可版本化、可备份、可升级回滚:
```bash
aibox base dump # 全集群 pg_dumpall + Redis 快照(安全网)
aibox base upgrade --check # 当前镜像 pin + 已记录的回滚点
aibox base upgrade --pg postgres:19 # 先备份 → 换 pin → 就绪门 → 失败回滚 pin
aibox base upgrade --rollback # 回到记录的 pin
aibox base create redis <module> # 为该模块分配独立 Redis 逻辑库(已开启鉴权)
```
## CLI 语法
一个语法:**`aibox <动词> <模块>`** —— "self" 也是一个模块(管理器本身)。
### 管理器动词(模块生命周期)
```text
aibox install <module> [flags] 预检门控安装(--skip-checks 跳过)
aibox uninstall <module>|self 先确认卸载、再确认是否删数据(--purge 预答
"删";--yes 为脚本场景跳过确认)
aibox update <module>|self|--all 刷新模块脚本(仓库钉住的版本底线)
aibox upgrade <module> [flags] 升级部署的上游版本(dockerhub/github-release
解析、健康门、验证过的自动回滚、gitlab 阶梯多跳)。
--check 计划 · --rollback 回记录的回滚点 ·
--history 历史 · --no-backup 跳过共享 PG 快照。
update ≠ upgrade:脚本版本 vs 上游应用版本
aibox check <module>|self 预检演练;self = 环境检查
aibox status [--available] 总览(已安装模块)/ 目录
aibox status <module> 单模块详情 + 健康探测(头部显示应用版本)
aibox dashboard htop 式实时视图(默认 2s 刷新、键盘驱动):modules · containers ·
upgrades · residue 四个 pane;--once | --json | --pane P | --interval N
aibox autoclean [<module>...|self] 残留扫描/清理(默认 dry-run;--apply 先确认、
再问是否停运行中容器)
aibox proxy {show|set|on|off|…} 静态出口代理配置(全局)
aibox <verb> --help 该动词的用法与选项 · 等价:aibox help <verb>
aibox --no-proxy <command> 单条命令绕过代理
```
退出码对自动化稳定:`1` 运行错误 · `2` 用法错误/被拒绝 · `3` 依赖缺失 ·
`4` 预检失败 · `10` 升级已回滚 · `20` 需人工干预(模块钩子另有 `30` 未就绪、
`40` 锁冲突、`50` 用户取消 —— 见 [module-spec §Exit codes](docs/module-spec.md))。
### 模块动词(透传到模块的 svc.sh)
```text
aibox <module> <action> [args] 如 aibox pi-web start · aibox clash select <节点>
aibox <module> --help 动作表(离线,来自模块的 usage: 映射)
aibox <module> <action> --help 单个动作的用法(参数 + 描述)
```
每个服务模块实现同一套标准动作 —— `start / stop / restart / status / logs`、
`status`(富视图:容器、健康、端点、凭据、端口监听)与 `doctor`(依赖 + docker
守护进程 + 自报状态 + 声明端口监听;退出 `0` 健康 / `3` 缺依赖 / `30` 未就绪)——
再加自己的领域动作(`base create postgres <db>`、`gitlab credentials`、
`clash select <节点>`…)。分发型模块(openmaic、windmill)把生命周期动词映射到
自己 CLI 的写法,因此 `aibox <module> start` 在任何模块上都可用。
### 端口与端点
> **注意:aibox 部署的服务端口与上游默认值不一定一致。**
> 内部端口注册表防止跨模块端口冲突 —— 例如 new-api 用 **30300**(上游默认 3000)、
> GitLab 用 **8929**、dify 用 **8088**。profile 会进一步派生端口
> (`--profile prod` 把 base 挪到 35177/36336)。
随时查看实际端口和端点:
```bash
aibox status # 版本 + 端口表 + 每个已安装模块的监听状态
aibox status <module> # 单模块应用版本 + 端点 + 健康
aibox dashboard # 实时视图(htop 式):q 退出 · Tab 切 pane · ↑↓ 选择 · d 详情
# / 过滤 · s 排序 · p 暂停 · + / - 刷新间隔 · r 立即重采样 · ? 帮助
# 只读:绝不 start/stop/清理(写操作仍用显式命令)
aibox <module> status # 同上,来自模块本身
```
## 模块
| 模块 | 部署什么 | 文档 |
| --- | --- | --- |
| [`base`](tools/base/) | 共享 PostgreSQL 18 + Redis 7;每模块独立库 | [README](tools/base/README.md) |
| [`clash`](tools/clash/) | Clash 订阅代理池(mihomo 内核,自动测速/故障转移) | [README](tools/clash/README.md) |
| [`dify`](tools/dify/) | [Dify](https://github.com/langgenius/dify) LLM 应用构建器 | [README](tools/dify/README.md) |
| [`gitlab`](tools/gitlab/) | [GitLab CE](https://gitlab.com/gitlab-org/gitlab) omnibus(阶梯升级) | [README](tools/gitlab/README.md) |
| [`jumpserver`](tools/jumpserver/) | [JumpServer](https://github.com/jumpserver/jumpserver) 堡垒机 / PAM(docker compose) | [README](tools/jumpserver/README.md) |
| [`new-api`](tools/new-api/) | [New API](https://github.com/QuantumNous/new-api) LLM 网关 | [README](tools/new-api/README.md) |
| [`pi-web`](tools/pi-web/) | [@agegr/pi-web](https://github.com/agegr/pi-web) launchd/systemd 服务 | [README](tools/pi-web/README.md) |
| [`openmaic`](tools/openmaic/) | [OpenMAIC](https://github.com/THU-MAIC/OpenMAIC) 部署主机运维 CLI | [README](tools/openmaic/README.md) |
| [`windmill`](tools/windmill/) | [Windmill](https://github.com/windmill-labs/windmill) 自托管运维 CLI | [README](tools/windmill/README.md) |
| [`xiaozhi`](tools/xiaozhi/) | [Xiaozhi ESP32 服务端](https://github.com/xinnan-tech/xiaozhi-esp32-server) | [README](tools/xiaozhi/README.md) |
> **范围说明**:`windmill` 与 `openmaic` 模块在仓库内捆绑了完整的自托管运维
> CLI(各数千行)——它们是这些运维工具的源头而非第三方副本。核心管理器本身是
> `bin/aibox`(单文件 —— curl|bash 一行安装的部署约束)。
## 进阶
<details>
<summary><b>出口代理</b>(aibox proxy on/off/set、clash 托管)</summary>
`aibox proxy set <url>` 存储静态代理供所有 aibox 下载使用;`aibox clash on`
把出口切到本地托管的 mihomo。`set` 之后立刻做站点连通性验证,带直连对照,
判定不会出现假阳性。详见 [clash README](tools/clash/README.md)。
</details>
<details>
<summary><b>下载源池</b>(镜像加速的工作原理)</summary>
每个下载族维护候选池。安装时用真实资产的**有界部分下载**并发竞速候选、
按实测 bytes/sec 排序、失败逐源转移。完成的包体先校验再接受(gzip 完整性 +
可执行 + 版本钉住);坏镜像被丢弃而非致命。实战案例见
[tools/clash/README](tools/clash/README.md)。
**Docker 源选择器**(规范 §Docker source selector)是 docker 专属实例,
镜像拉取与 dockerhub 版本解析共用同一状态(`$AIBOX_HOME/dockerpool.cache`,
TTL 600s)。优先级严格:官方路由 → 本地已有地址(daemon 自身 registry-mirrors
自动发现 + `AIBOX_DOCKER_MIRROR` 用户 knob)→ 实测验证加速池(`docker.1ms.run
hub.rat.dev docker.1panel.live hub.1panel.dev proxy.vvvv.ee
docker.m.daocloud.io hub3.nat.tf hub4.nat.tf docker.367231.xyz docker.apiba.cn`;
ghcr:`ghcr.nju.edu.cn ghcr.1ms.run`)。已判定死亡的官方路由在 TTL 内跳过
(不重复付超时税);全部失败则失效重解析(自愈)。`AIBOX_DOCKER_POOL="m1 m2"`
可覆盖(`direct` 关闭)。这就是让 `aibox upgrade <dockerhub 模块>` 在
hub.docker.com 被墙的网络下依然可用的机制。
</details>
<details>
<summary><b>开发新模块</b>(脚手架 + 验证器 + 规范)</summary>
```bash
scripts/new-module.sh mytool # 生成合规骨架
scripts/validate-module.sh mytool # 一致性门禁(CI 跑 --all)
```
契约见 [`docs/module-spec.md`](docs/module-spec.md)(规范):module.yaml 模式
(ports/checks/usage/includes/upgrade)、钩子规则、预检契约、残留地图、出口码、
交互门。参考实现:[`tools/gitlab/`](tools/gitlab/)。
</details>
<details>
<summary><b>设计取舍</b></summary>
- **单文件主 CLI**(约 3.4k 行):curl|bash 一行安装的约束。内部分区组织。
- **纯 bash、零依赖**:在 macOS 原生 bash 3.2 上运行;坑日志(AGENTS.md)把
每个平台陷阱变成 CI 断言。
- **注册表 = `tools/*/module.yaml`**:加模块=建目录;无需中心注册表。
- **本地优先仪表板**:默认视图零网络;版本探测异步。
</details>
## 贡献
欢迎 PR。先读 [`AGENTS.md`](AGENTS.md) —— bash 编码规范、坑日志(带最小复现的
平台陷阱)、模块规范入口。Conventional Commits;每次发版遵循
[changelog 标准](CHANGELOG.md)。
### 测试
```bash
bats tests/*.bats # 快速套件:无需 docker/网络,几秒钟
tests/docker/run.sh # 可复现:门禁 + 快速套件(root 与非 root 各一遍)
tests/docker/run.sh --integration # 追加 docker 支撑的 E2E 套件(用宿主 daemon)
```
[`tests/CASES.md`](tests/CASES.md) 把每一个记录过的 bug(坑日志、changelog 修复、
线上抓到的)映射到锁住它的测试 —— 每修一个 bug 就加一行。
## 许可证
[MIT](LICENSE)