舰队

Docker生产管理CLI+MCP服务器
 ](https://www.npmjs.com/package/@matthesketh/fleet) ](https://nodejs.org)  
在单个服务器上管理Docker Compose应用程序——systemd编排、nginx路由、年龄加密密钥、健康监控、依赖性跟踪、Git工作流和用于AI辅助操作的MCP服务器。
文档 -- --
______________________________________________________________________
建筑
graph TD
CLI["fleet CLI"]
TUI["TUI Dashboard"]
MCP["MCP Server"]
BOT["fleet-bot (Go)"]
CLI --> Core
TUI --> Core
MCP --> Core
BOT -->|"via MCP"| Core
subgraph Core["Core Modules"]
Registry["Registry"]
Docker["Docker Compose"]
Systemd["systemd"]
Nginx["nginx"]
Secrets["Secrets Vault"]
Health["Health Checks"]
Git["Git / GitHub"]
Deps["Dependency Monitor"]
end
Docker --> Containers["Containers"]
Systemd --> Services["systemd Services"]
Nginx --> Proxy["Reverse Proxy"]
Secrets --> Vault["vault/*.age"]
Secrets --> Runtime["/run/fleet-secrets"]
Health --> Alerts["Telegram / iMessage"]每个Docker Compose应用程序都注册了其编写路径、域、端口和容器名称。Fleet生成systemd单位,以便应用程序在启动时以正确的顺序启动。秘密在静止时用加密 年龄 并在启动时解密为tmpfs。
安装
npm install -g @matthesketh/fleet主要特点
部署和管理应用程序 -- fleet deploy 在一个命令中注册、构建和启动应用程序。控制服务 start, stop, restart,以及 logs.
加密的秘密 --具有自动备份、预密封验证、漂移检测和原子回滚功能的年龄加密保管库。启动时解密为tmpfs——机密永远不会触及磁盘。
Nginx路由 --使用以下命令生成代理、SPA或Next.js服务器块 fleet nginx add.自动配置测试和重新加载。
健康监测 --三层检查(systemd+容器+HTTP) fleet healthThe watchdog 命令在cron上运行,并在失败时发送警报。
依赖关系扫描 --检测所有注册应用程序中的过时包、CVE(通过OSV)、Docker映像更新和运行时EOL。
Git工作流 --将应用程序安装到GitHub,从CLI管理分支、PR和版本。
交互式仪表盘 --裸奔 fleet 启动具有实时状态的全屏TUI。
请参阅 CLI参考 查看完整的命令列表。
秘密流
graph LR
Import["fleet secrets import"]
Set["fleet secrets set"]
Import --> Encrypt["age encrypt"]
Set --> Encrypt
Encrypt --> Vault["vault/*.age"]
Vault -->|"boot / fleet secrets unseal"| Decrypt["age decrypt"]
Decrypt --> Runtime["/run/fleet-secrets (tmpfs)"]
Runtime -->|"env_file / secrets"| Containers["Docker Containers"]
Runtime -->|"fleet secrets seal"| Encrypt
Vault -.->|"drift detection"| Runtime秘密被单独导入或设置,随年龄加密,并存储在保险库中。在引导(或手动)时,它们被解密为Docker容器引用的tmpfs挂载。密封将运行时更改写回vault。漂移检测将vault与运行时进行比较,以捕获未保存的更改。
每次秘密轮换(v1.6)
每个秘密都携带元数据(lastRotated, provider, strategy)因此,舰队知道什么时候会变质,以及如何安全地轮换。
fleet secrets ages [] # what's stale, who owns it, when last rotated
fleet secrets ages --motd # MOTD-formatted summary
fleet secrets motd-init # install /etc/update-motd.d/99-fleet-secrets
fleet secrets rotate [] # interactive walkthrough, [--dry-run] [--no-restart]
fleet secrets rollback # restore latest snapshot, [--to ]
fleet secrets snapshots # list available snapshots
fleet secrets rotate-key # legacy: rotate the AGE master key旋转策略(从秘密名称自动检测,请参阅 src/core/secrets-providers.ts):
| 策略 | 示例 | 行为 |
|---|---|---|
immediate | STRIPE_SECRET_KEY, GITHUB_TOKEN, OPENAI_API_KEY | 替换旧模具 |
dual-mode | JWT_SECRET, NEXTAUTH_SECRET, SESSION_SECRET | 新成为主要, 老保持为 _PREVIOUS 因此,现有的用户会话在宽限期内保持有效(您的应用程序必须同时读取这两个数据以进行验证) |
at-rest-key | ENCRYPTION_KEY, FIELD_ENCRYPTION_KEY | 拒绝,除非 --data-migrated 已通过(您必须先重新加密存储的数据) |
user-issued | USER_API_TOKEN, CUSTOMER_API_KEYS | 拒绝-在应用程序内按用户轮换 |
每次旋转时的安全轨道:
- 旋转前快照
vault/.snapshots/-.env.age(原子复制+重命名) - 隐藏输入提示;新值从未完全响应(仅
prefix…suffix (N chars)确认) - 根据提供程序正则表达式进行格式验证(捕获粘贴拼写错误)
- 熵检查拒绝占位符(
changeme,password,所有字符相同,\ # interactive: retention/size/level
fleet logs setup --all # bulk default (7d / 100MB / info) fleet logs status [] # per-container size, driver, policy applied fleet logs prune # vacuum journald + truncate runaway json-file logs fleet logs --since 30m --grep err --level warn # filtered tail
`fleet logs setup` 写 `/.fleet/logging.override.yml` 使用json文件驱动程序选项进行旋转。要激活,请在编写启动命令(或舰队的systemd单元)中包含覆盖。
MCP工具——所有代币都是保守的,默认值很小 `truncated` 旗帜:
- `fleet_logs_recent(app, lines=50, level=warn, sinceMinutes=15)` --有界尾
- `fleet_logs_summary(app, sinceMinutes=60)` --计数+前10条不同的错误消息
- `fleet_logs_search(app, query, sinceMinutes=60, maxResults=20)` --有界grep
- `fleet_logs_status(app?)` --驾驶员+每个集装箱的尺寸
- `fleet_egress_snapshot(app)` --出境目的地+违规行为
### 出口观察(v1.6)
fleet egress observe # snapshot current outbound flows via nsenter+ss fleet egress show # show config + allowlist fleet egress allow # add to allowlist (supports *.host wildcards)
v1是 **仅观察** --它从不阻止数据包,因此没有破坏应用程序的风险。通过以下方式读取每个容器的网络命名空间 `nsenter` 因此,它看到了真正的容器出口(而不仅仅是主机侧的NAT流)。反向将远程IP解析为主机名。RFC1918目的地不算作违规。
`enforce` 模式(通过nftables进行实际默认拒绝)被推迟到未来阶段——根据设计,它要求操作员明确地升级一个影子清理应用程序,从不自动升级。
## 部署流程
graph TD Deploy["fleet deploy app-dir"] Deploy --> Register{"Already\nregistered?"} Register -->|No| Add["Register app"] Register -->|Yes| Build Add --> Build["docker compose build"] Build --> Start{"Service\nrunning?"} Start -->|No| StartSvc["systemctl start"] Start -->|Yes| Restart["systemctl restart"] StartSvc --> Healthy["App deployed"] Restart --> Healthy
## 启动刷新
在每次启动systemd(包括重新启动)时,Fleet都会从GitHub中提取最新代码,并在启动容器之前根据需要重建映像。该流程完全是故障安全的:任何步骤的任何故障(脏工作树、无远程、获取错误、非快进合并、构建失败或900秒的挂钟超时)都会被记录下来,并转化为普通故障 `docker compose up` 与现有图像。容器将始终启动。
**新命令**
|命令|描述|
|---------|-------------|
| `fleet boot-start ` |入口点systemd现在调用(`ExecStart`).然后运行刷新 `docker compose up`。通常不用手操作。 |
| `fleet rollback ` |重新标记 `:fleet-previous` → `:latest` 并重新启动服务。Fleet在每次构建之前自动标记上一个图像。 |
| `fleet patch-systemd` |重写 `ExecStart` 在所有要使用的已安装单元文件中 `fleet boot-start`,套 `TimeoutStartSec=900`,并将原件备份到 `
.service.bak`. |
| `fleet patch-systemd --rollback` |恢复全部 `.bak` 单元文件和运行 `daemon-reload`. |
**紧急停止开关**
要完全禁用启动刷新,请执行以下操作 `systemctl start` 直接进入 `docker compose up`:
sudo touch /etc/fleet/no-auto-refresh
删除文件以重新启用。
**注册表字段: `lastBuiltCommit`**
注册表中的每个应用程序都存储上次构建的Git提交。舰队启动了这个 `fleet deploy` 以及每次成功的启动刷新构建。启动刷新跳过 `docker compose build` 当HEAD已经匹配此值时,在没有代码更改的情况下保持快速启动。
**升级后的首次启动**
任何带有 `lastBuiltCommit` unset将在升级到此版本后首次启动时触发完全重建。预计这些应用程序的首次启动时间会更长。
**回收逃生口**
|形势|行动|
|-----------|--------|
|一个应用程序在构建后出现异常| `fleet rollback ` |
|注册表损坏|自动加载 `.bak` 下次阅读|
|启动行为存在广泛问题| `sudo touch /etc/fleet/no-auto-refresh` |
|最坏情况——还原所有单元文件| `fleet patch-systemd --rollback` |
## MCP服务器
Fleet通过 [模型上下文协议](https://modelcontextprotocol.io/) 用于人工智能辅助服务器管理。跑 `fleet mcp` 要启动stdio服务器,或将其安装到Claude Code中:
sudo fleet install-mcp
工具涵盖了整个表面区域:应用程序生命周期、秘密、nginx、Git、健康检查和依赖关系监控。请参阅 [MCP文件](https://fleet.hesketh.pro/mcp/) 查看完整的工具列表。
## 舰队机器人
Go伴侣机器人(`bot/`)它通过Telegram或iMessage提供远程服务器管理。它运行Claude Code会话,可以访问车队的MCP工具进行免提操作。
请参阅 [bot文档](https://fleet.hesketh.pro/bot/setup/) 有关设置说明。
## 自我更新
当 `fleet`的TUI发布它做了一个非阻塞 `git fetch` 反对 `origin/develop`。如果本地回购落后,则标题下会出现一个横幅:
↑ Update available: 3 commits ahead — feat: ... Press U to install.
按压 `U` 跑 `git pull --ff-only` 然后 `npm run build` (如果工作树很脏,则拒绝)。新的二进制文件将在下一个版本中上线 `fleet …` 调用。对于长时间运行的TUI会话,每30分钟进行一次复查。
## 测试
npm test # unit + mocked tests (1106 passing) FLEET_INTEGRATION=1 npm test # also runs boot-refresh integration tests (1156 passing, 0 skipped)
集 `FLEET_INTEGRATION=1` 选择进入真正的systemd/docker集成测试。在CI中默认跳过。
## 发展
git clone https://github.com/wrxck/fleet.git cd fleet npm install npm test # vitest npm run build # compile TypeScript to dist/ npm run dev # run with tsx (no build needed)
## 许可证
麻省理工学院