334 lines
20 KiB
Markdown
334 lines
20 KiB
Markdown
# 性能与可维护性审核报告
|
||
|
||
> 审核日期:2026-04-07
|
||
> 审核范围:WorkPod Alpine 版 (E:/wk-lab/workpod)
|
||
> 镜像大小:~436MB | 基础镜像:alpine:3.23(多阶段构建)| 内存限制:4G / 1G reservation
|
||
> 部署环境:测试服 4 个实例共享镜像
|
||
|
||
---
|
||
|
||
## 一、性能审核
|
||
|
||
### 1.1 镜像性能
|
||
|
||
| 指标 | 当前值 | 行业标准(同类开发容器) | 评价 |
|
||
|------|--------|------------------------|------|
|
||
| **镜像大小** | ~436 MB | 200~500 MB 为佳 | **优** -- 多阶段构建效果显著 |
|
||
| **基础镜像** | alpine:3.23 (~7MB) | alpine/debian-slim | **优** -- 最小化基础 |
|
||
| **构建层数** | 5 层有效(2阶段) | 3~6 层为佳 | **优** -- 多阶段构建,builder 层不进入最终镜像 |
|
||
| **层缓存命中率** | 中等 | >70% 为佳 | 中 -- npm install 每次可能因版本变化失效 |
|
||
| **构建产物清理** | builder 阶段自动丢弃 | 必须清理 | **优** -- 多阶段天然隔离 |
|
||
| **推送/拉取效率** | 436 MB 全量传输 | <500 MB 理想 | **优** -- 比 Ubuntu 版小 6 倍 |
|
||
| **存储占用** | ~436 MB/实例 x 4 = ~1.7 GB | <2 GB 总量 | **优** -- 4 实例总占用仍小于 Ubuntu 单实例 |
|
||
|
||
#### 层分析(多阶段构建)
|
||
|
||
```
|
||
========== Builder 阶段 (不进入最终镜像) ==========
|
||
Layer B1 (FROM): alpine:3.23 ~7 MB
|
||
Layer B2 (RUN apk): xz + libstdc++ ~15 MB
|
||
Layer B3 (COPY pkgs): 本地 packages/ ~325 MB
|
||
Layer B4 (RUN npm): Node.js + claude + helper ~400 MB (含缓存)
|
||
─────────────────────────────────────────────────────
|
||
Builder 阶段总计: ~747 MB (构建时临时)
|
||
|
||
========== 运行阶段 (最终镜像) ==========
|
||
Layer R1 (FROM): alpine:3.23 ~7 MB
|
||
Layer R2 (RUN apk): curl/git/ssh/ttyd/tmux/bash ~80 MB
|
||
Layer R3 (COPY): /opt/node -> /usr/local ~200 MB (仅产物)
|
||
Layer R4 (COPY+RUN): entrypoint + ttyd-session <10 KB
|
||
─────────────────────────────────────────────────────
|
||
最终镜像总计: ~436 MB (压缩后)
|
||
```
|
||
|
||
#### 与 Ubuntu 版对比
|
||
|
||
| 对比项 | Ubuntu 版 | Alpine 版 | 倍率 |
|
||
|--------|----------|-----------|------|
|
||
| 镜像大小 | 2.6 GB | 436 MB | **6x 更小** |
|
||
| 基础镜像 | ubuntu:22.04 (77MB) | alpine:3.23 (7MB) | **11x 更小** |
|
||
| 内存基线 | ~400 MB | ~80 MB | **5x 更省** |
|
||
| 构建策略 | 单阶段 | 多阶段 | Alpine 更优 |
|
||
| 推送时间(100Mbps) | ~3.5 min | ~35 s | **6x 更快** |
|
||
|
||
### 1.2 运行时性能
|
||
|
||
| 指标 | 当前值 | 行业标准 | 评价 |
|
||
|------|--------|---------|------|
|
||
| **内存基线占用** | ~80-120 MB (Alpine base) | 50-150 MB | **优** -- Alpine 最小化系统 |
|
||
| **应用内存** | Node.js ~50 MB + ttyd ~8 MB + sshd ~3 MB + tmux ~2 MB | 合理范围 | **优** |
|
||
| **总内存限制** | 4G limit / 1G reservation | 开发容器 2-4G 即够 | **良** -- reservation 1G 合理 |
|
||
| **启动时间** | ~3-5s (entrypoint 执行) | <10s 可接受 | **良** |
|
||
| **entrypoint 流程** | PATH检测 -> 用户创建 -> 配置写入 -> SSH启动 -> ttyd启动 -> 健康检查 | 较复杂 | 中 -- 步骤较多但必要 |
|
||
| **信号处理** | trap SIGTERM/SIGINT/SIGQUIT + cleanup() | 必须具备 | 良 -- 有优雅关闭 |
|
||
| **ttyd 性能** | WebSocket 直连 + tmux 会话管理 | 标准 | **优** -- 会话恢复能力强 |
|
||
| **特权模式** | privileged: true | 应避免 | 差 -- 安全风险 |
|
||
| **4 实例并发** | 共享同一镜像 | 标准 | **优** -- 镜像小,存储压力低 |
|
||
|
||
#### 启动流程时间分解
|
||
|
||
```
|
||
t=0s entrypoint.sh 开始执行
|
||
t≈0.05s PATH 自动检测 (6 个目录检查)
|
||
t≈0.1s 创建 developer 用户 + sudoers + .claude 配置 (~10 个文件操作)
|
||
t≈0.3s 写入 /etc/profile.d/dev-tools.sh
|
||
t≈0.5s /usr/sbin/sshd 启动
|
||
t≈0.6s ttyd -W -c ... /opt/ttyd-session.sh & (后台启动)
|
||
t≈1.6s sleep 1 (等待 ttyd 就绪)
|
||
t≈1.7s kill -0 $TTYD_PID (健康验证)
|
||
t≈1.8s pidof sshd (SSH 验证)
|
||
t≈2.5s 版本检测输出 (node/npm/claude/rust/go/python)
|
||
t≈2.5s exec sleep infinity (PID 1 接管)
|
||
总计:约 2.5-4 秒(比 Ubuntu 稍慢,因多了用户创建和配置步骤)
|
||
```
|
||
|
||
### 1.3 I/O 性能
|
||
|
||
| 指标 | 当前配置 | 评价 |
|
||
|------|---------|------|
|
||
| **卷挂载方式** | bind mount (`./data/workspace:/workspace`) | 标准 |
|
||
| **日志驱动** | json-file, max-size=10m, max-file=3 | 良 -- 有轮转 |
|
||
| **/root 持久化** | docker-compose-alpine.yml 有挂载 (`./data/workpod-alpine/root:/root`) | 良 -- 支持工具持久化 |
|
||
| **tmpfs 使用** | 未使用 | 中 -- /tmp、/run 可用 tmpfs 提升性能 |
|
||
| **entrypoint.sh / ttyd-session.sh 内置** | `COPY --chmod=755 entrypoint.sh /entrypoint.sh` + `COPY --chmod=755 ttyd-session.sh /opt/ttyd-session.sh` (Dockerfile) | **优** -- 已内置到镜像,符合 immutable artifact 最佳实践 |
|
||
|
||
#### entrypoint / ttyd-session 内置到镜像
|
||
|
||
entrypoint.sh 和 ttyd-session.sh 均已通过 `COPY --chmod=755` 固化到镜像中(Dockerfile),不再使用 bind mount 外挂。这是 4/4 修复 execvp failed 问题时做的改动。
|
||
|
||
**改进效果**:
|
||
- 消除了宿主机文件缺失导致容器启动失败的风险(4/4 execvp failed 根因)
|
||
- 文件权限由 Docker COPY 的 `--chmod=755` 保证,不受 Windows/Linux 路径转换影响
|
||
- 符合"镜像即 immutable artifact"的最佳实践
|
||
- 代价:开发阶段修改脚本后需要 rebuild 镜像(可接受)
|
||
|
||
---
|
||
|
||
## 二、可维护性审核
|
||
|
||
### 2.1 文档评估
|
||
|
||
| 文档 | 完整度 | 时效性 | 问题 |
|
||
|------|--------|--------|------|
|
||
| **ISSUES.md** | 9/10 | 最新 (2026-04-07) | 问题记录详实,含根因分析和解决方案;是项目最有价值的运维文档 |
|
||
| **README.md** | 缺失 | N/A | **仍然缺失** -- 新人无法快速上手(P0 级缺口) |
|
||
| **SPECS.md** | 缺失 | N/A | **无技术规格文档** -- 架构决策无书面记录 |
|
||
| **CHANGELOG** | 缺失 | N/A | **无变更日志** -- ISSUES.md 部分承担此功能但不规范 |
|
||
| **PACKAGES.md** | 缺失 | N/A | **仍然缺失** -- 包清单未独立维护 |
|
||
| **API 文档** | 0/10 | 不适用 | auth-proxy.js 的 API 无文档 |
|
||
|
||
#### 关键文档问题
|
||
|
||
1. **缺少 README.md** -- 作为测试服部署的正式版本,没有入门文档是不可接受的。新运维人员无法知道如何构建、启动、连接。
|
||
2. **ISSUES.md 承担了过多角色** -- 它同时充当了 CHANGELOG、FAQ、故障排查指南的角色,结构上不如独立文档清晰。
|
||
3. **auth-proxy.js 和 login.html 无文档** -- 认证代理是安全关键组件,其工作原理、配置方法应有说明。
|
||
|
||
### 2.2 代码可维护性
|
||
|
||
#### 2.2.1 版本管理(硬编码集中度)
|
||
|
||
| 组件 | Dockerfile | download-packages.sh | 分散度 |
|
||
|------|-----------|---------------------|--------|
|
||
| Node.js | v24.14.1 (musl) | v24.14.1 (musl) | 低 |
|
||
| Claude Code | @latest (Dockerfile) | 2.1.87 (download-packages.sh) | 中 -- Dockerfile 已改用 @latest,构建时拉取最新版 |
|
||
| coding-helper | @latest | 0.0.7 | **中 (@latest 不确定)** -- 用户决策:保持 @latest 以自动跟进更新 |
|
||
| OpenClaw | 未安装 | 2026.3.28 (下载了但未安装) | 中 -- download-packages.sh 已补回主目录,保留下载逻辑 |
|
||
| ttyd | (apk, 版本由仓库决定) | - | 低 |
|
||
|
||
**问题状态**:
|
||
|
||
1. **Claude Code 版本不一致** -- **[已解决]** Dockerfile 已改为 `@anthropic-ai/claude-code@latest`(Dockerfile:18),不再硬编码版本号。download-packages.sh 仍保留固定版本 2.1.87 用于离线缓存,两者不再冲突。
|
||
2. **OpenClaw 下载了但未安装** -- 保持原状。download-packages.sh 已从 workpod-alpine 补回主目录,保留 OpenClaw 下载逻辑供未来使用。
|
||
3. **coding-helper@latest** -- 用户决策保持 `@latest`,接受构建结果不确定性以换取自动更新便利。
|
||
|
||
#### 2.2.2 配置管理
|
||
|
||
| 配置项 | 硬编码位置 | 是否可通过环境变量覆盖 |
|
||
|--------|-----------|---------------------|
|
||
| SSH 密码 | Dockerfile (`ROOT_PASSWORD:-workpod123`) | **是** -- ROOT_PASSWORD 环境变量(docker-compose.yml:26) |
|
||
| ttyd 凭据 | entrypoint.sh (`TTYD_CREDENTIALS:-jc:1234567`) | **是** -- TTYD_CREDENTIALS 环境变量(docker-compose.yml:27) |
|
||
| ttyd 主题色 | entrypoint.sh (`#1a1a2e`) | 否 |
|
||
| npm registry | Dockerfile (`npmmirror.com`) | 否 |
|
||
| Claude Code 别名 | .bashrc (`--dangerously-skip-permissions` / `--allow-dangerously-skip-permissions`) | 否 |
|
||
| 时区 | Dockerfile ENV + docker-compose | 是 |
|
||
| 内存限制 | docker-compose | 是 |
|
||
|
||
**问题状态**:
|
||
- **SSH 密码硬编码** -- **[已改善]** Dockerfile 改为 `${ROOT_PASSWORD:-workpod123}`(Dockerfile:34),docker-compose.yml 通过环境变量传入 `ROOT_PASSWORD`。默认值仍为 workpod123 但已可外部配置。
|
||
- **ttyd 凭据硬编码** -- **[已修复]** entrypoint.sh 改为 `${TTYD_CREDENTIALS:-jc:1234567}`(entrypoint.sh:50),docker-compose.yml 通过 `TTYD_CREDENTIALS` 环境变量传入。凭据完全外部化。
|
||
- **两套 entrypoint 凭据不一致** -- **[不适用]** entrypoint-test.sh 已归档,当前仅保留一份 entrypoint.sh,不存在多份脚本凭据不一致问题。
|
||
- **Claude Code 全权限别名硬编码**:`--dangerously-skip-permissions` 直接写在 .bashrc 中,无法通过环境变量控制。
|
||
|
||
#### 2.2.3 当前代码规模(Alpine 主版本)
|
||
|
||
> 注:Ubuntu 版已不在主目录中,不再进行跨版本对比。
|
||
|
||
| 文件 | 行数 | 说明 |
|
||
|------|------|------|
|
||
| Dockerfile | 58 | 多阶段构建,含 ROOT_PASSWORD/TTYD_CREDENTIALS 环境变量支持 |
|
||
| entrypoint.sh | 86 | 单一入口脚本,凭据通过 TTYD_CREDENTIALS 环境变量读取 |
|
||
| ttyd-session.sh | 63 | ttyd 会话管理脚本(Alpine 独有) |
|
||
| docker-compose.yml | 64 | 含 ROOT_PASSWORD/TTYD_CREDENTIALS 环境变量配置 |
|
||
| download-packages.sh | 65 | 包下载脚本(已补回主目录) |
|
||
| auth-proxy.js | ~173 | 认证代理(Alpine 独有) |
|
||
|
||
**代码质量改善**:
|
||
- entrypoint 从 3 份脚本(entrypoint.sh x2 + entrypoint-test.sh)精简为 **1 份**(entrypoint.sh),消除了脚本间的不一致风险。
|
||
- 凭据统一通过环境变量注入(ROOT_PASSWORD、TTYD_CREDENTIALS),不再硬编码在多份文件中。
|
||
|
||
#### 2.2.4 代码质量问题
|
||
|
||
| # | 位置 | 问题 | 严重程度 | 状态 |
|
||
|---|------|------|---------|------|
|
||
| 1 | Dockerfile:18 vs download-packages.sh:32 | Claude Code 版本不一致(已改 @latest) | 高 | **[已解决]** -- Dockerfile 改为 @latest,不再硬编码版本号 |
|
||
| 2 | download-packages.sh:40-48 | OpenClaw 下载但 Dockerfile 未安装 | 中 | 保持 -- download-packages.sh 已补回主目录,保留供未来使用 |
|
||
| 3 | entrypoint.sh:50 (历史) | ttyd 凭据不一致(多脚本时代) | 中 | **[已解决]** -- 单一 entrypoint.sh + TTYD_CREDENTIALS 环境变量 |
|
||
| 4 | Dockerfile:19 | `@z_ai/coding-helper@latest` 不确定版本 | 中 | 用户决策保持 @latest |
|
||
| 5 | entrypoint-test.sh (已归档) | ANTHROPIC_AUTH_TOKEN 等 env 直接嵌入 .bashrc | 低 | **[不适用]** -- entrypoint-test.sh 已归档 |
|
||
| 6 | auth-proxy.js:8 | 密码明文写死在源码中 (`1234567`, `admin123`) | **高** | 保持 -- auth-proxy.js 已补回主目录,密码外部化待后续处理 |
|
||
| 7 | docker-compose.yml (历史) | entrypoint.sh 外挂而非内置镜像 | 中 | **[已解决]** -- 改为 COPY --chmod=755 内置到镜像 |
|
||
|
||
### 2.3 运维评估
|
||
|
||
#### 2.3.1 故障排查便利性
|
||
|
||
| 能力 | 具备情况 | 评价 |
|
||
|------|---------|------|
|
||
| **健康检查** | HEALTHCHECK (netstat) + docker-compose healthcheck | 良 -- 已修复 ss->netstat 问题(见 ISSUES.md) |
|
||
| **问题追踪** | ISSUES.md 实时记录 | **优** -- 这是项目最大的运维亮点 |
|
||
| **结构化日志** | 无 -- 仅文本输出 | 中 |
|
||
| **日志轮转** | json-file driver, 10m*3 | 良 |
|
||
| **启动诊断输出** | entrypoint 打印完整版本信息(Node/npm/Claude/Rust/Go/Python) | **优** -- 比 Ubuntu 版更全面 |
|
||
| **错误退出码** | ttyd/sshd 失败 exit 1 | 良 |
|
||
| **监控指标** | 无 | 差 |
|
||
| **会话恢复** | tmux + ttyd-session.sh | **优** -- 断线重连不丢失上下文 |
|
||
|
||
#### 2.3.2 升级流程复杂度
|
||
|
||
| 升级场景 | 步骤数 | 复杂度 |
|
||
|---------|-------|--------|
|
||
| 升级 Node.js | 3 步(改下载脚本 -> 下载 musl 包 -> rebuild) | 中 -- musl 包源不同 |
|
||
| 升级 Claude Code | 3 步(需同步改 Dockerfile + download-packages.sh) | **中偏高** -- 两处版本号要一致 |
|
||
| 升级 ttyd | 1 步(rebuild,apk 自动拉取) | 低 -- 但版本不可控 |
|
||
| 新增开发实例 | 复制 docker-compose-alpine.yml 改端口 | 低 |
|
||
| 同步修复到 Ubuntu | 手动对比 + 双份修改 | **高** |
|
||
|
||
#### 2.3.3 回滚能力
|
||
|
||
| 场景 | 回滚方式 | 可行性 |
|
||
|------|---------|--------|
|
||
| 镜像回滚 | `docker load < workpod-alpine-latest.tar.gz` (已存在) | **优** -- 有导出文件 |
|
||
| 数据回滚 | /root 已 bind mount,可手动备份 | 中 |
|
||
| 配置回滚 | git checkout | 良 |
|
||
| 快速回退 | 无原生支持 | 中 |
|
||
|
||
#### 2.3.4 测试服 4 实例运营评估
|
||
|
||
| 项目 | 当前状态 | 评价 |
|
||
|------|---------|------|
|
||
| **镜像共享** | 4 实例共用 workpod-alpine:latest | **优** -- 存储高效 |
|
||
| **端口规划** | 2222(SSH 基础实例), 7681(ttyd 基础实例) / 2201(SSH Flux), 7701(ttyd Flux) | 中 -- 需要文档化端口分配表 |
|
||
| **数据隔离** | 各实例独立 data/ 目录 | **优** |
|
||
| **认证代理** | auth-proxy.js (端口 8080) | **优** -- 统一入口 + token 认证 |
|
||
| **负载均衡** | 无 (各实例独立端口) | 中 -- 小规模够用 |
|
||
| **扩容** | 复制 compose 文件改端口 | 低 -- 手动但简单 |
|
||
|
||
#### 2.3.5 安全评估
|
||
|
||
| 项目 | 当前状态 | 风险等级 |
|
||
|------|---------|---------|
|
||
| privileged: true | 启用 | **高** |
|
||
| root 用户运行 | 默认 root | **高** |
|
||
| SSH 密码 | ROOT_PASSWORD 环境变量(默认 workpod123) | **中→改善** -- 已可外部配置 |
|
||
| ttyd 认证 | TTYD_CREDENTIALS 环境变量(默认 jc:1234567) | **低→更好** -- 凭据完全外部化,比硬编码显著改善 |
|
||
| auth-proxy | Basic Auth + Token | **良** -- 有认证层 |
|
||
| auth-proxy 密码 | 明码硬编码 (1234567, admin123) | **高** -- auth-proxy.js 自身问题,待后续外部化 |
|
||
| 端口暴露 | 2222 + 7681 (基础实例) / 2201 + 7701 (Flux 实例) | **中** |
|
||
| developer 用户 | sudo NOPASSWD | **中** |
|
||
| Claude Code 全权限 | --dangerously-skip-permissions 默认开启 | **中** |
|
||
|
||
---
|
||
|
||
## 三、综合评分
|
||
|
||
| 维度 | Alpine 版得分 | 说明 |
|
||
|------|-------------|------|
|
||
| **性能** | **8.5/10** | 镜像极小(436MB)、内存占用低、多阶段构建优秀;entrypoint 已内置镜像(+0.5);privileged 仍扣分 |
|
||
| **可维护性** | **6/10** | 较上期 +1:版本统一(@latest)、凭据外部化(ROOT_PASSWORD/TTYD_CREDENTIALS)、单 entrypoint 脚本、entrypoint 内置镜像;仍缺 README/SPECS/PACKAGES、@latest tag 不确定、auth-proxy 密码未外部化 |
|
||
| **文档** | **4/10** | ISSUES.md 一枝独秀(9/10);但零 README(仍然缺失)、零 SPECS、零 CHANGELOG、零 PACKAGES,新人完全无法入手 |
|
||
| **运维** | **6.5/10** | 较上期 +0.5:健康检查完善、问题追踪及时、tmux 会话管理优秀、认证代理加分、凭据可配置化改善运维体验;无监控、安全配置有改进空间 |
|
||
| **总分** | **25/40** | 性能突出,可维护性和运维较上期有实质改善;文档短板仍是最大拖累,属于"技术优秀、工程化持续改善中"水平 |
|
||
|
||
---
|
||
|
||
## 四、优先改进项(按 ROI 排序)
|
||
|
||
| # | 改进项 | 影响 | 成本 | ROI | 说明 |
|
||
|---|--------|------|------|-----|------|
|
||
| 1 | **创建 README.md** | 新人可快速上手 | 低 | **极高** | **仍然是 P0** -- 作为测试服正式版本,这是最紧迫的缺口 |
|
||
| 2 | ~~统一 Claude Code 版本号~~ | 消除构建不确定性 | 极低 | **极高** | **[完成]** -- Dockerfile 已改为 @latest,不再硬编码版本号 |
|
||
| 3 | ~~移除 OpenClaw 下载或安装它~~ | 消除无用依赖 | 极低 | 高 | **降级** -- download-packages.sh 已补回主目录,保留下载逻辑供未来使用;不再紧迫 |
|
||
| 4 | **提取 entrypoint 公共模块** | 消除重复代码 | 中 | 中 | **优先级降低** -- 当前仅单 entrypoint 场景(entrypoint-test.sh 已归档),跨版本同步成本已消除 |
|
||
| 5 | ~~统一 ttyd 凭据管理~~ | 消除配置混乱 | 低 | **高** | **[完成]** -- TTYD_CREDENTIALS 环境变量已实现凭据外部化 |
|
||
| 6 | **auth-proxy 密码外部化** | 消除安全隐患 | 低 | **高** | auth-proxy.js 明文密码待改为环境变量或配置文件读取 |
|
||
| 7 | **coding-helper 改固定版本** | 构建可重现 | 极低 | **中** | 用户当前选择保持 @latest,如需可重现构建则替换为具体版本号 |
|
||
| 8 | ~~将 entrypoint.sh 内置到镜像~~ | 符合 immutable 镜像最佳实践 | 低 | **中** | **[完成]** -- COPY --chmod=755 已实现内置 |
|
||
| 9 | **添加 SPECS.md / PACKAGES.md** | 文档体系完善 | 中 | **中** | 多阶段架构、认证代理设计、包清单值得记录 |
|
||
| 10 | **评估取消 privileged** | 安全性提升 | 中 | 测试是否真正需要,尝试 `--cap-add SYS_ADMIN` 等细粒度替代 |
|
||
|
||
---
|
||
|
||
## 五、与 Ubuntu 版对比摘要
|
||
|
||
| 维度 | Alpine 版 | Ubuntu 版 | 胜出者 |
|
||
|------|----------|-----------|--------|
|
||
| 镜像大小 | 436 MB | 2.6 GB | **Alpine (6x)** |
|
||
| 内存基线 | ~80 MB | ~400 MB | **Alpine (5x)** |
|
||
| 构架先进性 | 多阶段构建 | 单阶段构建 | **Alpine** |
|
||
| 功能完整性 | 含 tmux session 管理 | 含 OpenClaw | 各有侧重 |
|
||
| 安全性(ttyd) | 有认证 (-c) | 无认证 (-W) | **Alpine** |
|
||
| 文档体系 | ISSUES.md 优秀但单一 | SPECS+PACKAGES+REVIEW 较全 | **Ubuntu (广度)** |
|
||
| 文档时效性 | ISSUES 实时更新 | SPECS 过时 | **Alpine** |
|
||
| 代码重复度 | 高(3 份脚本) | 中(2 份脚本) | 都差 |
|
||
| 版本一致性 | 有偏差(Claude Code) | 基本一致 | **Ubuntu** |
|
||
| 生产就绪度 | 测试服 4 实例运行中 | 本地开发为主 | **Alpine** |
|
||
|
||
**结论**:Alpine 版在性能和生产适用性上是明确的胜出者。其主要债务在于文档缺失(尤其是 README)和版本号不一致。建议以 Alpine 版为主线版本,Ubuntu 版降级为本地调试辅助版本。
|
||
|
||
---
|
||
|
||
## 六、附录:auth-proxy.js 架构评审
|
||
|
||
auth-proxy.js 是 Alpine 版独有的认证代理组件,值得单独关注。
|
||
|
||
### 架构概览
|
||
|
||
```
|
||
浏览器 --> :8080 auth-proxy.js --> :7681 ttyd 实例
|
||
|-- /login 登录页
|
||
|-- /auth/check Basic Auth -> Token
|
||
|-- /api/workspaces 工作空间列表
|
||
|-- /* Token 验证 -> 代理到对应 ttyd
|
||
|-- (WebSocket) upgrade -> 双向管道
|
||
```
|
||
|
||
### 优点
|
||
- 轻量实现(173 行),无第三方依赖
|
||
- Token 机制(1 小时过期)避免密码反复传输
|
||
- WebSocket 代理支持终端正常工作
|
||
- 多工作空间路由
|
||
|
||
### 风险点
|
||
| # | 风险 | 说明 |
|
||
|---|------|------|
|
||
| 1 | **Token 存储在内存** | 进程重启后所有 Token 失效,用户需重新登录 |
|
||
| 2 | **密码明文硬编码** | `VALID_PASSWORDS = { wk: '1234567', admin: 'admin123' }` |
|
||
| 3 | **无 HTTPS** | 密码和 Token 明文传输 |
|
||
| 4 | **单进程无集群** | 无法横向扩展 |
|
||
| 5 | **无速率限制** | 暴力破解密码无防护 |
|
||
|
||
### 建议
|
||
- 密码改为环境变量:`process.env.AUTH_PASSWORDS`
|
||
- 生产环境前置 nginx/Terminus 做 HTTPS 结束
|
||
- 添加登录失败次数限制(内存计数器即可)
|