Project Retrospective

Nekotori Publish

一套「Agent 输入提示词,即刻获得公网域名」的静态站点发布系统 · 项目实现与历程总结

项目概览

Nekotori Publish 让任何人(尤其是 AI Agent)提交一份静态资源 —— 单个 HTML 文件或一个 zip 包 —— 即可在约一分钟内获得形如 https://<hash>.nekotori.eu.org 的公网专属域名。系统由三个部分组成:本地 Go 部署服务、标准 MCP 服务器、产品发布页。

3核心组件
8HTTP 接口
3MCP 工具
~60s域名全通耗时

系统架构

Agent / 用户提示词 / API / MCP
MCP 服务器stdio · 3 个工具
Go 部署服务:17439 · token 鉴权
上游 Pages API直传 + DNS
公网域名<hash>.nekotori.eu.org
Backend
pages-deployer(Go,零框架)

监听 17439 端口。负责解析上传、zip 处理、项目创建、资源直传、自定义域名注册、DNS CNAME 自动化、状态跟踪与本地持久化(state.json)。纯标准库 + blake3。

MCP
nekotori-publish(Node,单文件分发)

标准 MCP stdio 服务器,暴露 deploy_static_site / get_deployment_status / delete_deployment 三个工具。经 esbuild 打包为 746KB 无依赖脚本,可由任意 Agent 通过 URL 自行安装。

Frontend
产品发布页

单文件深色主题落地页:中央标题、一句描述、可复制的 Agent 安装提示词、token 获取悬浮窗。本身即由本系统部署上线。

接口设计

接口说明
POST /deploymultipart 上传 html/zip;可选 hash(原地更新)与 label;返回 hash、正式域名、域名状态
GET /status/{hash}部署阶段(deploy/success)、域名证书状态(pending/active)、文件数与时间戳
DELETE /deployments/{hash}解绑域名、清理 DNS、删除项目与本地记录
GET /projects · DELETE /projects/{name}项目列表与按名删除
GET /install-mcpAgent 可读的 MCP 安装描述文件(配置模板 + 工具清单 + 步骤)
GET /mcp-server.js打包好的 MCP 服务器脚本,免安装直接 node 运行
GET /health公开健康检查

除 health / install-mcp / mcp-server.js 外,所有接口需携带 X-Deployer-Token(或 Bearer)鉴权,token 存于服务端配置文件。

实现历程

Phase 01 · 起点

容器模板部署排障

项目始于一个容器化 Worker 模板的部署失败:先是依赖未安装导致打包错误,随后镜像构建报 unknown flag: --load。定位为 Docker 缺少 buildx 插件,安装后成功部署;随后完成 Worker 改名、自定义域名绑定与容器应用重命名(期间处理了 Durable Object 与容器应用的绑定冲突)。

Phase 02 · 逆向协议

从零实现 Pages 直传

用 Go 重写发布流程时,第一个版本的接口返回 404 —— 官方文档的旧协议已过时。直接从本机 wrangler 4.x 的打包产物中逆向出真实流程:upload-token 换 JWT → check-missing 查缺失 → JSON 批量上传 → upsert-hashes → multipart 创建部署。首个成功部署返回 500,最终定位根因:文件哈希算法不是想当然的 sha256,而是 blake3(base64(内容)+扩展名) 截取 32 位 hex。修正后全链路打通。

Phase 03 · 域名自动化

hash 化与双凭证体系

引入 12 位随机 hash 作为项目名,并为每个部署绑定 <hash>.nekotori.eu.org。发现 wrangler OAuth 默认 scope 无 DNS 写权限,CNAME 无法自动创建 —— 遂设计双凭证通道:Pages 操作走 OAuth(自动刷新并写回),DNS 记录走专用最小权限 token。期间还解决了 eu.org 公共后缀导致的 zone 误判、Pages 项目删除前必须先解绑域名等约束。

Phase 04 · 开放接入

鉴权、反代与 MCP

为服务加入 token 鉴权(配置文件 + 环境变量 + 双 header 兼容);通过 nginx 反代暴露到公网;实现标准 MCP 服务器并打包为单文件,配合 /install-mcp 描述文件实现「Agent 自助安装」。用户只需一句提示词 + 一个 token。

Phase 05 · 体验打磨

发布页与细节隐藏

制作深色主题发布页(渐变标题、动态光斑、复制交互、token 获取悬浮窗)。应用户要求对用户侧彻底隐藏上游细节:响应中移除 pages.dev 域名、错误信息脱敏(不再暴露上游 URL 与账号 ID)、页面去除品牌提及、邮箱改为 base64 + JS 解码填充以绕过自动混淆并防爬。

关键技术点

Hash
blake3 内容寻址

上游按内容哈希去重:相同文件跨项目免重传。哈希为 blake3(base64(content) + ext) 的前 32 个 hex 字符,扩展名参与运算。

Auth
OAuth 自动续期

复用本机 CLI 登录态,token 临期自动 refresh 并原子写回配置文件,与 CLI 工具共享会话、互不干扰;DNS 走独立最小权限 token。

Security
多层防护

zip-slip 路径穿越防护、25MB 单文件与 20000 文件数上限、请求体大小限制、服务自身 token 鉴权、响应脱敏(不泄露上游 URL/账号 ID/内部路径)。

Lifecycle
完整生命周期

部署 → 状态(阶段 + 证书)→ 原地更新(同 hash)→ 删除(域名解绑 + DNS 清理 + 项目删除 + 本地记录清理),本地 state.json 原子持久化。

成果