Skip to Content
SpikesS3-S4 · Remote macmini

Spike S3 + S4 · 远程 macmini 私有化路径端到端

状态:✅ 通过(2026-05-18)

环境

  • 远端机器 vibe-zlyan:Apple M4 Mac mini · 16GB · macOS 26.3 · zlyan 用户(非 admin)
  • 网络:Tailscale tailnet(开发者 100.64.3.43 ↔ macmini 100.101.167.99)
  • 主 API:本地 Tailscale node 100.64.3.43:3000(监听 0.0.0.0)

S3 · 远程 BoxLite microVM

障碍 + 解法

  • zlyan 非 admin,brew 装不了 → 改用 uv(Rust 单 binary,curl 安装到 ~/.local/bin,无 sudo)
  • 系统 Python 3.9.6 不满足 boxlite ≥ 3.10 → uv python install 3.13 用户级装 Python 3.13.13
  • 隔离环境:uv venv ~/boxlite-spike-venv --python 3.13 && uv pip install boxlite

完整 lifecycle 验证

import asyncio, boxlite async def main(): b = boxlite.Boxlite.default() box = await b.create(boxlite.BoxOptions(image="alpine:latest", auto_remove=True)) await box.start() exec1 = await box.exec("uname", args=["-a"]) kernel = "".join([c async for c in exec1.stdout()]).strip() # ... await b.remove(box.id, force=True)

实测结果

host : Apple M4 Mac mini (zlyans-Mac-mini-2) box.id : cdm7hFubUBB2 kernel : Linux boxlite 6.12.76 #1 SMP Tue Mar 10 13:28:56 CET 2026 aarch64 Linux arch : aarch64 shell pipe : 'HELLO' list_info : 1 个 running box after remove : 0 个 box

结论:M4 macmini 用 Hypervisor.framework 跑 BoxLite microVM 与本机 (S2.c) 完全等效—— 独立 Linux 6.12.76 内核 + aarch64 + 完整 lifecycle + 干净清理。

→ 印证 design.md D2:私有化路径在主流 Apple Silicon Mac mini 上原生可跑, 不必先架 Linux VPS(开发者 / 小型客户 demo 场景)。

S4 · 容器 → 主 API HMAC callback 防火墙穿透

拓扑

[macmini sandbox container] curl http://100.64.3.43:3000/internal/tasks/.../events ← Tailscale 100.x 网内 [本地主 API · NestJS · port 3000 · 0.0.0.0]

5 个场景实测

#场景期望实测
1健康检查(基础连通)200✅ HTTP 200 · 26ms
2dispatch 无 session401✅ AuthGuard 拦截
3internal events 无 HMAC401 missing_hmac
4internal events 错 HMAC401 invalid_hmac✅ timing-safe 比对生效
5internal events 正确 HMAC通过验签 → 进 service✅ FK violation 500(数据完整性正确,因为 task_id 不存在)

第 5 步验证最关键——远端 Python 计算的 HMAC 与本地 Node API 计算结果一致

# 远端 macmini hmac.new(secret, body, hashlib.sha256).hexdigest() # 与本地 Node createHmac(...) 结果完全一致 → 验签通过

网络性能

  • Tailscale 直连:26ms 健康检查 RTT
  • HMAC 计算 + 验签 + service 调用:65ms

足以支撑 task-runner 实时 callback 需求。

这两个 spike 对 POC 的影响

1. 私有化路径”硬件门槛”消失

原本以为私有化要”先架 Linux VPS”才能跑 spike。现在确认任意 Apple Silicon Mac mini 就能跑 —— 大幅降低私有化 PoC demo 准备成本。

2. Tailscale 是天然的 callback 通道

不需要 cloudflared / ngrok 公网暴露——开发者机和容器跑机都在 tailnet 内即可。callback path 0 配置

3. 非 admin 用户也能跑(uv > brew)

zlyan 是非 admin 用户但完整跑通了——意味着客户私有化部署不需要 root:用户级 uv + Python venv + boxlite Python SDK 即可。

对 design.md 的补强

D2(私有化用 BoxLite):补充”M4 macmini 是 PoC demo 推荐硬件” → D6(HMAC callback):补充”跨网段(Tailscale tailnet)实测 RTT 26ms,可用”

未覆盖

  • ✗ microVM 内部网络出口(box 内 curl 主 API)——本次 spike 是从 macmini host 发的,没测 microVM 网络
  • ✗ 真长任务跨网段稳定性(长 SSE 连接、HTTPS keep-alive 等)—— §7 真跑时观察

清理

# 一行命令清干净 ssh vibe-zlyan 'rm -rf ~/boxlite-spike-venv ~/.local/share/uv ~/.local/bin/uv ~/.local/bin/uvx'

(如果之后还要用 uv 装其他东西就不删 ~/.local/bin/uv*)