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 |
| 2 | dispatch 无 session | 401 | ✅ AuthGuard 拦截 |
| 3 | internal events 无 HMAC | 401 missing_hmac | ✅ |
| 4 | internal events 错 HMAC | 401 invalid_hmac | ✅ timing-safe 比对生效 |
| 5 | internal 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*)