SSH vs code-server 对比表
纯 SSH 接力指 OpenSSH 会话(可经跳板),终端内编辑或按需 LocalForward/RemoteForward 暴露本地服务。code-server 把编辑器 UI 放在 HTTPS 后,经长连接 WebSocket 把指令流回 Mac 上进程。无论走 22 还是 443,内核调度与 codesign 争用仍在同一台机器上。
| 维度 | 纯 SSH 接力 | code-server(浏览器) |
|---|---|---|
| 主通道 | SSH 会话 + 可选 TCP 转发 | 前置 TLS(常见 443),到 Node 进程的 WebSocket |
| 端口故事 | 每人多条本机回环端口,共享机易撞端口除非命名空间化 | 对外常单一监听;预览/语言服务仍要按用户划分高端口段 |
| 权限隔离 | 自然映射到 Unix 多账户,可配合 ForceCommand 等 |
边缘令牌/SSO 不够,仍需 OS 级多用户或隔离 $HOME,否则扩展可读同伴磁盘令牌 |
| 并发冲突 | 负载与 flock 失败较直观,终端变慢会自我限速 |
语言服务与扩展宿主叠 RAM/CPU,可能静默抖动到阈值才暴露 |
| 延迟敏感 | 击键路径薄,高 RTT 相对可忍 | 对抖动敏感,需稳定 WebSocket 与代理缓冲策略 |
| 弱网恢复 | tmux、ControlMaster 模式成熟 |
刷新可能丢扩展状态,依赖自动保存与工作区信任策略 |
端口、权限与单机并发
SSH 习惯把调试 API 绑在 127.0.0.1 再选择性转发;失败模式是两人选了同一本地端口。code-server 把编辑器进程树收拢,但各工作区仍会起语言服务、预览与测试 runner,Runbook 里应写明每用户端口段(例如 A 用 31xxx,B 用 32xxx)。
权限不要退化成「人人都 admin 因为 Xcode」。优先多 Unix 账户 + 共享产物目录用组与 umask 027;CI 身份与个人登录钥匙串分离。浏览器认证是传输面,不是主机多租户。
并发冲突表现为他人触发模拟器时 UI 测试飘红、或签名脚本 flock 超时。公证、大归档、GPU 任务应写入独占日历或带标签的 CI 车道;规则一再被打破时,应横向加租用节点而非再堆隧道。多 Runner 与标签路由可参考 merge queue 与 Runner 矩阵。
决策矩阵(if / then)
当作迭代零工作表:若多行指向「拆池」,应视为第二台租用构建机或独立 CI 交互车道的预算信号,而不是在同一台 Mac 上继续叠入口形态。
| 你观察到的信号 | 倾向选择 | 备注 |
|---|---|---|
| 外包机不能装 SSH 客户端或托管密钥 | SSO 后的 code-server | 短效令牌 + 每席位独立 home |
| 每人稳定 TCP 转发 >5 条 | SSH + 小型边缘反代 | 用单一 TLS 虚拟主机收敛开发 API;见 TLS 入口决策矩阵 |
| 策略禁止对未知二进制开放公网 443 | 仅 SSH | 经跳板出审计日志;供应链评审后再上 Web IDE |
| 同仓库频繁结对交接 | 受控的 code-server 工作区 URL | 仍要分支锁与 Code Review,浏览器不替代 Git 纪律 |
| 夜间 CI 已持续打满 CPU | 拆池 | 交互席位迁到另一节点;入口形态次要 |
可执行阈值与反向代理注意
下列为单台池化 Apple Silicon、2~4 人共用的起步护栏;按核数与磁盘等级上调。
- 交互并发: 同时 code-server 进程默认≤2;仅当编译中位空闲内存持续 >8 GiB 才考虑第三席。
- 自动化并发: 与人并行时,打满编译的 CI/Runner 任务保持 1~2 路,其余入队。
- SSH keepalive:
ServerAliveInterval 30、ServerAliveCountMax 4、ControlPersist 10m;常断 Wi-Fi 可提到 30m。 - HTTP/WebSocket idle: 上游 idle 与最长链接步骤对齐,常见 2700~7200 s,避免 TLS 终止层在长链接中途掐会话。
- 扩展宿主: 服务器侧禁用未用内置扩展;每席扩展宿主 RSS 目标 <1.5 GiB 再扩容人头。
反向代理(不写具体商号): 在 code-server 前终止 TLS,透传 Upgrade 与 Connection 以支持 WebSocket;编辑器路由关闭响应体缓冲;HTTP 与 WebSocket 的 idle 超时同量级对齐。若边缘还有一层 CDN/七层网络,确认 HTTP/2 合并不会剥掉上游依赖的逐跳头。SSH 侧优先 TCP 直通,避免中间件把 SSH 误当 HTTP 解析。
# 环境级旋钮示例(路径自定;建议专用 Unix 用户运行)
export PASSWORD="" # 生产优先令牌文件 + SSO,而非明文
export HOST=127.0.0.1
export PORT=8443 # 环回绑定;TLS 在最前层终止
# 可选:扩展预热期限制新会话
# export CODE_SERVER_SESSION_LIMIT=2
延迟与冲突验收清单
每条网络路径(直连、VPN、跳板、浏览器)各跑一遍;编译期间记录 RTT 与抖动。
- RTT: 以 SSH 为主日常开发时,中位 RTT 目标 ≤80 ms;code-server 在抖动低时可略放宽。
- 编辑器体感: 扩展空闲时击键到屏幕 p95 视觉延迟 <150 ms,否则减扩展或挪席位。
- 端口碰撞: 周五压测后对共享 dev 端口段脚本扫描
LISTEN,用户间零重叠。 - 恢复演练: 强制断开后,SSH 与浏览器路径均在 <120 s 内回到可编辑态且无需轮换密钥。
FAQ
Q:code-server 能消除 SSH 端口冲突吗?
只是转移:对外监听收敛,仍要账户/端口段/队列;自动化仍常用 22。
Q:何时默认 SSH?
CLI/tmux 文化、禁 Web IDE、RTT 已低、希望组件最少;仅不可直连时加跳板。
Q:TLS 前 idle 怎么设?
覆盖重任务 p95 时长(常 45~120 分钟),WebSocket 与 HTTP idle 对齐,避免链接器跑时掉编辑器。
Q:单机构多少浏览器席该加节点?
两席重型语言服务 + 一路饱和编译预警;三席交互 IDE 建议拆第二台租用机或专用 CI 车道。