← 全栈开发:从入门到入土
全栈开发全栈开发:从入门到入土

发布与运营:部署、流水线、可观测性,以及回滚纪律

Zero to Depth 系列第 7 篇:2026 年部署到哪里、值得信任的 CI/CD、OpenTelemetry 可观测性,以及为什么 deploy 不等于 release。

部署CI/CDOpenTelemetry可观测性DevOpsVercel

发布一个功能只要一个下午,运营它要好几年。这种不对称是全栈开发里最没人教的部分:部署按钮是整个系列里最便宜的东西,而它周围的一切——为部署做演练的流水线、盯着部署的遥测、把你从部署里救出来的回滚——才是真正的工程所在。

2026 年的 day-2 运营由四门功课组成:代码跑在哪里、如何安全地送达、如何看清它在做什么、以及当现实和你的测试不一致时如何撤销。

2026 年部署到哪里

平台问题取决于负载的形状,2026 年诚实的地图上有四块领地:

  • Vercel —— Next.js 的精装选项:每个 PR 一个预览 URL,Fluid Compute 让 serverless 函数对 99%+ 的请求保持温热,100+ 边缘节点上平均 TTFB 约 70 ms。坑在于:免费 Hobby 套餐仅限非商业用途,Pro 是 $20/席位,而带宽超量($40/100 GB)加上图片优化和函数调用次数,正是流量波动变成账单波动的地方。
  • Netlify —— 通用选手:框架中立,内置的表单/身份/分流测试可以替你删掉一堆第三方服务,还有——对自由职业者和外包团队起决定作用的细节——免费套餐允许商用。Pro 是 $19/席位;超量更贵,$55/100 GB。
  • Cloudflare Pages/Workers —— 经济学打法:300+ PoP,免费且不限量的带宽,Workers 冷启动约 1–3 ms。一份公开的同流量对比里,Cloudflare 账单 $53,Vercel 是 $1,900。DX 没那么精致;但在带宽吃紧的规模下,这不是一个量级的竞争。
  • Railway / VPS / Docker —— 留给 serverless 做不了的事:WebSocket 枢纽、跑 30 秒的 webhook 处理器、后台队列、旁边放着数据库的长驻进程。Railway 把这套打包得很好(Postgres 和 Redis 是一等公民);一台 $5 的 VM 用一杯咖啡的价格也能做到。

决策过滤器只有一个问题:负载是什么形状?静态或内容站——放哪都行,最便宜的赢。Next.js 应用——除非带宽占大头(那就选 Cloudflare),否则 Vercel。有状态的长驻后端——Railway 或 VM。另外把逃生舱保持温热:构建在 Web 标准之上(第 5 篇),让平台永远只是一个账单条目,而不是房东。

CI/CD:值得信任的流水线

流水线是你对每一次变更做的彩排,好让生产环境永远看不到首演。2026 年的最小可行流水线,按顺序:

  1. 安装与构建 —— 可复现的安装(lockfile、锁定包管理器版本),然后跑一次完整的生产构建。在 CI 里构建不过的东西,本来也不可能构建过。
  2. 类型检查与 lint —— tsc --noEmit(在第 2 篇那个 7.0 编译器上只要几秒钟)、lint、格式检查。这道门拦住的,正是你笔记本会放过的那些问题。
  3. 测试 —— 逻辑用单元测试,赚钱的请求路径用少量集成测试。覆盖率崇拜已经过时,单位 CI 时间换来的信心才是正道。
  4. 预览部署 —— 每个 PR 一个 URL,合并前由人(和 Agent)过目。这一步改变了所有落地它的团队的协作文化:“能不能用?“从一个会议变成一个链接。
  5. 合并即部署生产 —— 而且数据库迁移跟着同一条流水线走,用第 6 篇的 expand-contract 阶段和不池化的连接串。绝不手动执行,绝不说“我待会儿再跑”。

部署应该频繁而小。diff 越大,事故越长。

可观测性:先于你的用户看到问题

监控告诉你 p99 延迟飙升了;可观测性告诉你为什么——哪个用户、哪个请求、哪个 span。2026 年,底座已经尘埃落定:OpenTelemetry——厂商中立、CNCF 治理、每个严肃的后端都支持。你用 OTel SDK 做一次埋点,让信号经过 OTel Collector(顺便擦除 PII),然后导出到 Grafana、Datadog、Honeycomb 或自建栈——全程不用改应用代码。

让它真正起效的不是三大支柱——日志、指标、链路——而是它们的关联:每一条结构化日志(Node 里用 pino,永远输出 JSON)和每一个出站 API 调用都携带当前的 trace_idspan_id。由此解锁的调试闭环:指标触发告警 → 打开慢链路 → 钻进那个具体请求的具体日志行 → 看到那一个吃掉 180 ms 的数据库 span。浏览器也在闭环里:RUM 采集 Web Vitals(尤其是 INP),Sentry 用 source map 还原你压缩后的堆栈,trace ID 从用户的点击一路传播到数据库。

按这个顺序做埋点,能回答你的问题就停:

  1. 错误 —— 未捕获异常,服务器端和浏览器端都要,打上 release 标签。
  2. 延迟 —— 按路由统计,用百分位数(平均数会说谎)。
  3. 黄金路径 —— 那两三条赚钱的链路:注册、结账、核心操作。
  4. 基于 SLO 告警,而不是凭感觉 —— 一个在燃烧时把你叫醒的错误预算,而不是一块没人看的 dashboard。

回滚纪律

任何平台上最被低估的特性:一键回滚。但更深一层的纪律是把 deployrelease 分开:

Deploy 是把代码放进生产——暗着,藏在 flag 后面,不服务任何人。Release 是把它暴露给用户——先放 10% 金丝雀,盯着错误预算,然后 50%,然后全量。出事的时候,关掉 flag 是以秒计的配置变更;回滚一次 deploy 是以分钟计的流水线运行。把每个有风险的变更都放在 flag 后面;flag 要短命,放量结束后就删掉,因为 flag 的堆积就是债务的堆积。

还要演练失败:隔三差五故意回滚一次。一条你从没走过的回滚路径,就是一条不存在的回滚路径。

成本意识:账单藏在哪里

一次能省真金白银的五分钟审计:

  • 带宽超量 —— 头号惊喜:超出套餐后每 100 GB 收 $40–55。大图片和视频会成倍放大它;用 AVIF、content-visibility 和诚实的资源预算来治(第 2 篇)。
  • 函数调用次数与时长 —— 啰嗦的客户端代码和长耗时函数是被直接计费的。
  • 按人头定价 —— 席位(Vercel/Netlify)和 MAU(第 5 篇的 Clerk)会随成功一起膨胀。要算 10 倍时的数字,而不是 1 倍时的。
  • 免费套餐陷阱 —— “免费”分成允许商用的(Netlify、Cloudflare)和仅限业余用途的(Vercel)。把客户项目部署到错的那个上面是违反服务条款,不是生活小妙招。

动手练习,然后进入第 8 篇

  1. 把一个仓库端到端接起来:PR → CI 门禁 → 预览 URL → 合并 → 生产。然后故意弄坏一个测试,看流水线拒绝放行。那声“拒绝”本身就是产品。
  2. 给一个服务加上 OpenTelemetry:自动埋点、一条带 trace 上下文的结构化日志、一个展示某路由 p95 的 Grafana 或厂商 dashboard。跟着一个慢请求从浏览器点击一路追到数据库 span。
  3. 把下一个变更放到 feature flag 后面,按 10% → 100% 放量。在 10% 时平静地回滚一次——因为你可以。

第 8 篇是长跑:作为预算的性能、作为习惯的安全、跨越数年的依赖与文档维护,以及如何在 AI Agent 承担越来越多打字工作的情况下运营这一切——同时不让自己失去方向。

guest@swangnice:~$