对话档案 D07 · 阿里云域名与 Cloudflare 隧道迁移(11-10)
一句话:一次教科书级的「先评估、再设计、留决策点」的迁移,把每天漂移的免费隧道换成了
cag.quest;但同一个会话后半段又被塞进一整轮功能大改,71M token 里至少一半是替这次「混装」付的账。
一、这段对话怎么走的
| 阶段 | 用户要求 | 产出 | 卡点 |
|---|---|---|---|
| 可行性评估 | 新买 cag.quest(阿里云,一年),想用 Cloudflare Tunnel 替掉 natapp;先估可行性、再设计、需要决策的留预案 | 读完交接白皮书,确认 cloudflared 未安装、natapp 现状、域名可解析,给出 CNAME → <uuid>.cfargotunnel.com 的架构与三个待决策点 | 无,这一段是全程最顺的 |
| 安装与建隧道 | 按方案执行 | ops/bin/cloudflared.exe(约 55MB)、cloudflared tunnel create kaoyan、ops/cf/config.yml、verify-tunnel.mjs | Windows 上不能读系统根证书池;httpHostHeader 不能写死 127.0.0.1:3000,否则 portal 反代下 Next 的 basePath 根路径 308 自循环 |
| 授权登录 | 打开浏览器完成 Cloudflare 授权 | 首轮走浏览器 OAuth | 用户网速慢,授权页在超时后才打开,Authorize 按钮已失效;两轮都卡在这里 |
| 改走 API 令牌 | 「突然成功了,你可以继续了」 | ops/cf/api-bootstrap.mjs + bootstrap.ps1,用 API Token 建隧道、写 DNS,绕开浏览器交互 | 脚本 .ps1 里中文注释被 PowerShell 5.1 按 GBK 读,破坏字符串终止符,最终全部 ASCII 化 |
| 计划任务化 | 让隧道常驻,不随会话回收 | 计划任务 KaoyanTunnel + launch.ps1 -Name tunnel 分支 | S4U / Logon / Boot 触发器全部 0x80070005,免提权只能 InteractiveToken + TimeTrigger 重复 |
| DNS 切换 | 正式切流 | ops/cf/cutover-state.json 记录切换时刻 2026-11-10T21:24:08,rollback.ps1 留回退 | 隐藏控制台输出缓冲写满会阻塞 cloudflared 建连,必须 *> 重定向到文件 |
| 延迟评估 | 「这种方式会比之前的方式卡顿很多,是合理的吗」 | 定位为出口节点绕行 CF 边缘,给出改指 LAX 的方案(0 成本)供选 | 用户权衡后选择「接受现状」 |
| 功能大改(第二阶段) | 开放公网后补注册登录、个人主页、公告与报障、贴图减量、美术统一、数据库重构、新手引导 | 门户作为认证网关,反代注入 X-User-* + X-Portal-Secret;node:sqlite WAL + scrypt 会话;笔记公私分离 | 会话上下文两次触顶,靠 6.6 万字、14.4 万字的两份摘要续命 |
二、用户的关键原话
原话一(首条,整段迁移的规格书)
「我新买了一个域名,通过阿里云:cag.quest。它在接下来的一年属于我。我想通过这个域名,把我之前任务里制作的内网穿透代替掉,这样可以用更稳定的域名,不需要在操心那些刷新的问题。我初步的预案是通过配置 Cloudflare 的 Tunnel 来实现这一点。目前还是空白状态,没有安装任何东西。你估计这个方案的可行性,然后先设计完善好方案,然后进行尝试。需要进行决策的部分可以做好预案等我决策后再操作。」
点评:五句话给全了「资产(域名 + 有效期)、目标(替代内网穿透)、动机(不想再操心刷新)、初始方案(Cloudflare Tunnel)、当前状态(空白)、执行协议(先评估、再设计、后尝试、决策点等拍板)」。这是全部 4 篇里指令质量最高的一条,也是唯一一条自带「不许擅自动手」约束的。
原话二(授权卡死时)
「我的网速很慢,链接这个网页授权的时候总是在超时之后才打开,然后再点 anthorize 就没用了。」
点评:典型的「现象 + 触发条件」,但缺复现路径。AI 第一反应是「再等等、换个浏览器」,方向偏了。
原话三(同一条故障的第二轮,用户自己给出了根因)
「好像不是你等的时间不够长,而是他这个网站,对请求超时的网页就不再继续监听 authorize 按钮了。」
点评:这条是全篇最漂亮的一次协作。AI 在猜「网络慢」,用户直接指出「页面超时后前端解绑了事件监听」——这是前端实现层面的判断。一句话把排查从「重试」推进到「换通道(API Token)」,省掉了后面可能的三四轮无效尝试。
原话四(接受延迟现状)
「接受现状吧。有几个新问题:公网一旦放开,风险随之到来。为主页新建注册和登陆功能,设计个人主页,允许修改个人信息……」
点评:「接受现状吧」四个字是很好的收束习惯——不纠缠已评估过的次优解。但紧接着一口气抛出七项需求,把迁移会话变成了功能会话,这是 71M token 的结构性原因。
三、成本与效率
| 指标 | 数值 | 折算 |
|---|---|---|
| 总 token | 71,668,033 | 输入 71,306,448 / 输出 361,585,输入:输出 ≈ 197:1 |
| 用户消息 | 21 条 | 单条均 3,412,764,约 341 万 |
| 工具调用 | 563 次 | 单条消息均 26.8 次;API 请求 537 次,约每 1.05 次工具调用一次请求 |
| 时长 | 约 5 小时 57 分 | 从 17:06 工作区建立到 23:03 前后 |
197:1 的输入输出比是这组数据里最值得盯的一项:模型写出来的字只有 36 万,读进去的是 7130 万。这不是「AI 话多」,而是「同一份 13 万 token 级别的上下文被反复重读」。563 次工具调用里,大量是 curl 探测、Get-ScheduledTask 查询、日志尾部读取——每一项都便宜,但每一项都要把整段历史再送一遍。
会话中途出现两份超长摘要(6.6 万字与 14.4 万字),说明上下文至少触顶两次。摘要是有效的续命手段,但它也意味着:前面已经付过钱的细节,被压缩成一段概述后,AI 只能靠这段概述工作——后续任何需要原始细节的判断,都得重新探测,再付一次钱。
四、曲折点与评判
1. 授权卡死两轮,靠用户给出根因才转向(★★★★)
浏览器 OAuth 在慢网下天然脆弱:页面超时 -> 前端不再监听按钮 -> 用户以为「还没加载完」继续等。AI 前两轮都在「等更久 / 换浏览器」这个错误维度上打转。真正的解法是换通道:API Token 建隧道、API 写 DNS,全程无交互。这段最终落成 api-bootstrap.mjs,是可复用的资产;但它是被用户推着才出现的。
2. 迁移与功能大改混装在一个会话(★★)
前半段是架构迁移(约 30 次工具调用量级),后半段是注册登录、公告系统、笔记公私分离、全套美术统一。两件事共享的只有「门户」这个对象,上下文却完全叠加:改一个按钮颜色时,前面 5 万 token 的隧道排障记录仍在每次请求里被重读。这是 71M 的直接来源。
3. 延迟问题给出了选项,但没有给量化预期(★★★)
用户问「卡顿很多是合理的吗」,得到的回答是机制解释加两个方案。缺的是一句可判定的预期值:免费隧道改 CF 后 P95 大概是多少毫秒、多少算正常、多少算异常。没有这个锚点,用户只能凭手感说「接受现状」——这个决定是对的,但它不是被数据支撑的。
五、提示词与流程改进
改进一:迁移验收后立刻切会话
反例:迁移成功后在同一条会话里继续提七项功能需求,导致上下文从 3 万涨到 13 万并被压缩两次。
正例:迁移验收(cag.quest 公网 200 + KaoyanTunnel 任务 Running + 旧 natapp 任务已停)→ 写回 MEMORY.md → 新开会话,只带白皮书和一句「门户已挂在 cag.quest 后面,现在做注册登录」。
改进二:交互式授权一开始就准备无头方案
反例:慢网环境下赌浏览器 OAuth,连试两轮。
正例:
优先用 API Token 无交互建隧道;只有 Token 权限不足时才回退浏览器授权,且授权前先测一次
curl -m 5 https://dash.cloudflare.com的耗时,超过 3 秒直接走 Token。
改进三:延迟类问题先要锚点
反例:
这种方式会比之前的方式卡顿很多,是合理的吗
正例:
首页首字节现在约 X ms、之前 natapp 约 Y ms。可接受上限 800ms,超过就按你给的方案改指 LAX 边缘;改完给我三个地区的实测值。
六、可复用结论
- 迁移类任务的正确顺序是「评估 → 方案 → 决策点 → 执行」,这条指令模板可以直接复用,它挡掉了绝大部分返工。
- 凡是需要人在浏览器里点一下的环节,在慢网或远程环境里都要准备 API 等价路径,否则一次超时就能吃掉两轮对话。
- 一个会话只装一件事。71M token 不是迁移贵,是迁移的上下文陪着功能开发重读了 500 多遍。