Vercel + Spaceship 全自动部署:8 分钟上线一个站,附 3 个坑的排查记录

0 阅读8分钟

每次做完一个小工具站,写代码那一小时挺爽,收尾那半小时很烦:建私有仓、接 Vercel、绑自定义域名、去域名商后台加 CNAME、盯着 DNS 生效、等证书签发。熟练也要 20 ~ 45 分钟,而且要在三个后台之间来回切。

这次我把这段流程整条交给了 Agent——不是给它更长的提示词,而是给它两把收得很窄的钥匙:Vercel 本地登录态 + Spaceship 的 DNS 读写权限。配完以后,一个静态站从本地代码到 https 可访问全程 7 ~ 8 分钟,人工只在手机上点了一次设备授权。

下面记录它实际跑了什么、权限怎么收、以及第一次跑几乎必踩的三个坑。

我的测试条件

  • Agent 宿主:WorkBuddy (腾讯) 5.9.3
  • 模型版本:DeepSeek-V4.1-Flash (10.17版本)(建议用这个,很强很快)
  • 环境依赖:Node v22.22.2 | Vercel CLI 65.5.0 | GitHub CLI 2.x(token scopes: repo)
  • 控制驱动与系统:Chrome 155(bsk 0.3.3 自动化驱动)| Windows 11 Pro
  • 验证标的:生产教学站 wb.tumuai.net(已经上线,欢迎体验)与 E2E 验证站 test-a010.tumuai.net(1.3KB / 1 文件)

配置好两把钥匙,8 分钟,网站直接上线。

image.png AI 写代码简单,但部署涉及东西比较多,很浪费时间。所以我这次专门测了一遍:让 AI 全自动跑完部署和域名绑定,人只负责给它权限。

image.png 图3 wb.tumuai.net 线上实际状态:HTTPS 证书自动签发,国内直连 0.4~0.9s

一、成本对比:人工手搓 vs AI 全托

先看成本差异。以前发布一个上线站,即使熟手也要在几个平台间来回切:

维度传统人工配置AI 全托闭环
总耗时20 ~ 45 分钟7 ~ 8 分钟
操作界面跨 GitHub、Vercel、Spaceship 3 个后台0 控制台点击,纯终端与 API 执行
人工介入点复制 Token、手动建仓、配 CNAME、反复刷新测 DNS仅手机扫码点 1 次设备授权
后续维护每次改版重新登录或手动配置 Webhook代码推送即自动构建(v2 部署耗时 12 秒)

省下来的不是打字时间,是跨后台切换的上下文开销。这部分正是适合交给 Agent 的:机械、步骤固定、判据明确(HTTP 200)。

二、两把钥匙:最小权限 + 可撤销

把钥匙交给 AI,底线永远只有一条:最小可用权限 + 随时可撤销。

钥匙一:Vercel 本地登录态(10 秒,不建 Token)

如果你人在电脑前,设备流登录是最省事的方案,10 秒搞定,连 Token 都不用建:

  1. 终端执行:
npm i -g vercel
vercel login
  1. 浏览器弹出授权页,手机确认一次。
  2. 登录凭据会自动保存在本地路径 %APPDATA%/com.vercel.cli/Data/auth.json。之后 Agent 跑 CLI 就可以直接认出账号身份,无需传任何密码。

为什么优先这条路:凭据留在本机,Agent 调 CLI 用的是"你已登录"这个事实,没有任何 Token 被复制进配置文件或环境变量。要收回,本地登出即可。

长期无人值守备选(Vercel API Token): 如果走 CI/CD 或完全无界面环境,前往 vercel.com/account/settings/tokens 创建 Token。 关键细节:Scope 处切勿勾选 Full Account,请选择你的 Team 下的指定单一项目,并设置 Expiration(建议 ≤ 90 天)。

image.png 图10 Vercel Token:侧栏入口 → 设置过期时间 → Scope 必须选单项目

image.png 图12 权限精确限制在单个项目内,杜绝波及其他线上服务

钥匙二:Spaceship 域名商 API Key(注意默认值是「完全访问」)

域名托管在 Spaceship(如果用 Cloudflare、腾讯云等同理,认准 DNS 记录权限)。配置步骤如下:

  1. 登录 spaceship.com,点击顶部 Launchpad。
  2. 展开 账户管理 分组,点击 API 管理器。
  3. 确认顶部总开关「API 访问」显示为 已启用。
  4. 点击 添加API密钥,填入识别名称。
  5. 核心避坑:千万不要用默认的「完全访问」!
    • 切换到 自定义访问。
    • 展开所有模块,全部关闭,仅勾选「DNS 记录」的 读取 + 写入。
  6. 创建后立刻复制 Key 与 Secret(Secret 只展示一次)。

image.png 图41 进入路径:Launchpad → 账户管理 → API 管理器

image.png 图21 系统默认停留在「完全访问」——必须手动切到自定义访问

image.png 图22 精确收敛:除了 DNS 记录的读写,其余域名转移、账单、联系人全部关掉

这一步是整个流程里唯一需要动脑的地方:默认给的是"完全访问"(能转域名、能改账单),而 Agent 真正需要的只有"读一条 DNS 记录、写一条 DNS 记录"。权限收窄之后,即使模型判断错,破坏半径也止于这条解析。

拿到后存入本地 .spaceship.env,加入 .gitignore 彻底防漏:

SPACESHIP_API_KEY=your_key_here
SPACESHIP_API_SECRET=your_secret_here
SP_DOMAIN=tumuai.net

三、执行链路:Agent 实际跑了什么

1. 触发提示词(可直接复用)

在包含源码的项目根目录中,直接向 Agent(如 WorkBuddy / Claude Code / Codex)输入这串提示词:

当前目录是静态站源码。请执行以下上线闭环:
1. 检查本地 GitHub CLI 登录状态,若就绪,自动创建私有仓库并推送当前源码;
2. 调用本地 Vercel CLI 部署生产环境,并绑定自定义域名 wb.tumuai.net;
3. 读取项目绑定的专属 CNAME 地址,使用 .spaceship.env 中的凭据调用 Spaceship REST API 写入 DNS 解析;
4. 轮询检测公网 DNS 解析状态,直到返回 HTTP 200 并打印响应耗时。
全程优先使用本地 CLI 和脚本自动化执行,遇阻断方可向我确认。

2. 实际执行步骤

发完提示词,AI 会一口气执行完这套动作,全程不到 8 分钟:

  1. 自动建仓推代码:调用 gh api 自动创建 GitHub 私有仓库并把代码推上去。
  2. 静默部署:调用 vercel deploy --prod(读本地登录态,无弹窗),8 秒构建完成。
  3. 查专属 CNAME:通过 Vercel API 绑定域名,拿到专属解析地址。
  4. 自动写 DNS 解析:调用 Spaceship API 把 CNAME 填进域名后台(这一步最省心,不用人去点)。
  5. 等解析生效:自动轮询测活,约 3 分钟证书自动签发,返回 HTTP 200。
  6. 关联自动部署:最后执行 vercel git connect 绑好 GitHub,以后本地一 push 代码,线上 12 秒自动更新。

image.png 图60 自动化运行结束后,线上静态页即时输出 GitHub、Vercel 与 DNS 三方状态

四、三个坑的排查记录

这套方案如果第一次跑,几乎 100% 会被以下三个暗坑卡住:

坑一:Spaceship API 遭 Cloudflare WAF 静默拦截(HTTP 1010)

  • 现象:Agent 编写的 Python 脚本调用 Spaceship API,Key 和 Secret 怎么对都返回拒绝。
  • 根因:Spaceship 的 API 接口前置挂了 Cloudflare 防火墙。Python urllib 或 requests 的默认 User-Agent 会直接被判定为爬虫恶意流量,拦截并丢出 Error 1010。
  • 解决办法:在请求头中必须伪装标准的现代浏览器 UA:
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")

坑二:Root Directory 缺失导致发布“空气站点”

  • 现象:本地看改好了代码,推送后 Vercel 提示部署成功,但线上访问依旧是旧页面或 404。
  • 根因:Vercel CLI 本地直推默认打包当前终端目录;但一旦接上 GitHub 自动构建,若配置中的 rootDirectory 为 null,Vercel 默认拉取仓库根目录找 index.html。如果你的前端文件放在 _deploy_site/ 或 dist/,拉取到的就是个空项目。
  • 解决办法:让 Agent 在初始化项目时显式调用一次更新:
PATCH /v9/projects/{project_id}
Content-Type: application/json

{"rootDirectory": "_deploy_site"}

坑三:免费域名 *.vercel.app 在国内直接被阻断

  • 现象:部署后用 Vercel 自动分配的二级域名访问,无限转圈直至超时。
  • 根因:*.vercel.app 泛域名在境内遭遇了不可逆的 DNS 污染拦截。
  • 解决办法:绑定自己的独立自定义域名,是国内可访问的前提。一旦换上专属独立域名并挂在 Vercel 提供的二级 CNAME 下,国内即可直通其东京等亚太 Anycast 节点。

五、几点工程上的结论

  1. 权限粒度比提示词重要:这套流程能跑通,不是因为提示词写得多好,而是因为两把钥匙都给到了"刚好够用"的粒度。单项目 Scope + DNS 读写 + 90 天过期,是这套方案能长期挂着的前提。
  2. 判据要可编程:链路终点定成「返回 HTTP 200 并打印响应耗时」,Agent 才能自己判断成功与否;否则它会在"部署成功"的提示里误判。
  3. 三个坑的本质都是默认值:WAF 认 UA、Vercel 认根目录、国内认域名。把默认值显式覆盖掉写进项目说明,第二次跑就顺了。
  4. 设备流登录 > Token:能在本机完成认证就别把 Token 落地到文件里,能少一处泄漏面。

把我这篇文章丢给AI 基本就能帮你跑通了