<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on CHEN 的博客</title>
        <link>https://blog.chen-api.cloud/posts/</link>
        <description>Recent content in Posts on CHEN 的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 26 May 2026 15:20:00 +0800</lastBuildDate><atom:link href="https://blog.chen-api.cloud/posts/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>把 Understand-Anything 折腾进 Codex 之后，我得到了一件美丽废物</title>
            <link>https://blog.chen-api.cloud/posts/understand-anything-beautiful-trash/</link>
            <pubDate>Tue, 26 May 2026 15:20:00 +0800</pubDate>
            <guid>https://blog.chen-api.cloud/posts/understand-anything-beautiful-trash/</guid>
            <description>&lt;p&gt;最近我看到一个叫 &lt;code&gt;Understand-Anything&lt;/code&gt; 的 GitHub 项目，星数很高，第一眼看上去就属于那种“好像很强”的东西。&lt;/p&gt;&#xA;&lt;p&gt;我当时的直觉很简单：既然这么多人点星，而且项目名字也很直接，那大概率是个能快速帮助我理解代码库、梳理系统结构、减少上手成本的工具。于是我干脆把它整进了 Codex，作为一个 skill 来试。&lt;/p&gt;&#xA;&lt;p&gt;结果折腾完一圈，产出看起来挺华丽：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;知识图谱&lt;/li&gt;&#xA;&lt;li&gt;新人指南&lt;/li&gt;&#xA;&lt;li&gt;后端项目理解摘要&lt;/li&gt;&#xA;&lt;li&gt;一套像模像样的“系统认知结果”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;但真正落地时，我的感受只有一句话：&lt;/p&gt;&#xA;&lt;p&gt;这是个美丽废物。&lt;/p&gt;&#xA;&lt;p&gt;这篇文章记录一下这次尝试的全过程，也顺便谈谈我对这类“看起来很牛的理解型工具”的一点判断。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一understand-anything-是什么&#34;&gt;一、Understand-Anything 是什么&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Understand-Anything&lt;/code&gt; 从名字上就很有野心，它的目标并不是只看某一类文档，也不是只做一个简单摘要器，而是试图借助大模型能力，把一个复杂对象“解释清楚”。&lt;/p&gt;&#xA;&lt;p&gt;从项目定位来看，这类工具通常会强调几件事：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;输入一份代码库、文档集或系统资料&lt;/li&gt;&#xA;&lt;li&gt;自动抽取关键结构&lt;/li&gt;&#xA;&lt;li&gt;生成模块关系&lt;/li&gt;&#xA;&lt;li&gt;输出知识图谱、架构理解、上手指南之类的结果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果说普通摘要工具解决的是“把一段内容缩短”，那这类项目想解决的是另一个更大的问题：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;能不能让一个新人，快速建立对复杂系统的整体认知？&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;这也是为什么它很容易吸引人。因为这个命题本身太诱人了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;面对陌生项目时，大家都想要一份高质量的导览图&lt;/li&gt;&#xA;&lt;li&gt;面对复杂后端时，谁都希望有一个能自动生成的上手说明&lt;/li&gt;&#xA;&lt;li&gt;面对遗留系统时，任何“帮我理解”的工具都会天然有吸引力&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;所以它受欢迎，并不奇怪。&lt;/p&gt;&#xA;&lt;h2 id=&#34;二为什么我会想把它接进-codex&#34;&gt;二、为什么我会想把它接进 Codex&#xA;&lt;/h2&gt;&lt;p&gt;我真正感兴趣的不是单独跑一下这个项目，而是把它并进自己的工作流里。&lt;/p&gt;&#xA;&lt;p&gt;因为如果它真有用，那最理想的落地方式并不是“偶尔单独打开一次”，而是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;把它接进 Codex&lt;/li&gt;&#xA;&lt;li&gt;作为一个 skill 使用&lt;/li&gt;&#xA;&lt;li&gt;在需要理解新项目时直接调用&lt;/li&gt;&#xA;&lt;li&gt;自动产出结构化认知结果&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这个想法听起来非常合理，甚至有点高级。&lt;/p&gt;&#xA;&lt;p&gt;如果这条路走通，理论上会得到一个相当诱人的工作流：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;把项目喂进去&lt;/li&gt;&#xA;&lt;li&gt;自动生成系统概览&lt;/li&gt;&#xA;&lt;li&gt;自动梳理模块关系&lt;/li&gt;&#xA;&lt;li&gt;自动输出新人指南&lt;/li&gt;&#xA;&lt;li&gt;后面再由我自己做精修和验证&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;从纸面上看，这几乎就是“理解型 AI 工具”的理想形态。&lt;/p&gt;&#xA;&lt;p&gt;于是我就真的开始做了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;三为了它我不只是试了一下而是认真折腾了&#34;&gt;三、为了它，我不只是试了一下，而是认真折腾了&#xA;&lt;/h2&gt;&lt;p&gt;这次我没有停留在“看一眼 README”这种程度，而是确实把它落到了自己的使用环境里。&lt;/p&gt;&#xA;&lt;p&gt;我做了几件很具体的事：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;把项目整到 Codex 里，作为 skill 使用&lt;/li&gt;&#xA;&lt;li&gt;拿它去理解一个后端项目&lt;/li&gt;&#xA;&lt;li&gt;让它输出知识图谱和新人指南&lt;/li&gt;&#xA;&lt;li&gt;为了效果更好，还专门把模型切到了 &lt;code&gt;gpt-5.5 high&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这一步其实已经不是“随便试玩”了，而是一次有明确预期的正式试用。&lt;/p&gt;&#xA;&lt;p&gt;更直接一点说，我愿意为它投入成本，是因为我真的想验证：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;它到底能不能把“理解系统”这件事，从一种高消耗脑力活，变成一种可复用流程。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;而这次试用成本也不算低。&lt;/p&gt;&#xA;&lt;p&gt;我最后看了一下消耗，光这次尝试就用了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;模式：&lt;code&gt;gpt-5.5 high&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;时间：前后折腾了两个多小时&lt;/li&gt;&#xA;&lt;li&gt;Token：&lt;code&gt;2.89M&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这已经不是“玩一玩”的级别了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;四它产出的东西确实一眼看上去很厉害&#34;&gt;四、它产出的东西，确实一眼看上去很厉害&#xA;&lt;/h2&gt;&lt;p&gt;必须承认，这类工具最擅长的一件事，就是制造“理解已经发生”的感觉。&lt;/p&gt;&#xA;&lt;p&gt;它输出的内容非常容易给人留下好印象：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;知识图谱看起来结构分明&lt;/li&gt;&#xA;&lt;li&gt;模块关系像是被梳理清楚了&lt;/li&gt;&#xA;&lt;li&gt;新人指南看起来也像那么回事&lt;/li&gt;&#xA;&lt;li&gt;文字组织通常比随手写的笔记更规整&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果只是把结果截图给别人看，很容易收获一句：&lt;/p&gt;&#xA;&lt;p&gt;“这个东西好强。”&lt;/p&gt;&#xA;&lt;p&gt;这就是它最有迷惑性的地方。&lt;/p&gt;&#xA;&lt;p&gt;它不是完全没产出，恰恰相反，它太会产出“像成果的成果”了。&lt;/p&gt;&#xA;&lt;p&gt;这些内容在视觉上、结构上、叙述上，都很容易让人产生一种认知错觉：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;既然已经有图谱、有模块说明、有新人指南，那我是不是已经理解这个系统了？&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;但真正的问题在于，形式上的完整，不等于工作上的有效。&lt;/p&gt;&#xA;&lt;h2 id=&#34;五问题不是它做不出内容而是这些内容对我没有实际作用&#34;&gt;五、问题不是它做不出内容，而是这些内容对我没有实际作用&#xA;&lt;/h2&gt;&lt;p&gt;当我真正回到自己的目标上时，问题就暴露出来了。&lt;/p&gt;&#xA;&lt;p&gt;我想要的不是一个看起来完整的“理解结果”，而是下面这些更具体的东西：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;我接下来应该先看哪几个文件&lt;/li&gt;&#xA;&lt;li&gt;哪个模块才是系统的核心控制流&lt;/li&gt;&#xA;&lt;li&gt;一个请求从入口到落库到底怎么走&lt;/li&gt;&#xA;&lt;li&gt;哪些地方最容易改坏&lt;/li&gt;&#xA;&lt;li&gt;如果我要加一个功能，第一刀应该切在哪里&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;但这类工具最终给我的，更多是“高层抽象认知”，而不是“可直接拿来干活的路径”。&lt;/p&gt;&#xA;&lt;p&gt;说得更直白一点：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;它很会帮你整理“像全局视角的东西”&lt;/li&gt;&#xA;&lt;li&gt;但不太擅长帮你找到“下一步到底该动哪儿”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;而在真实开发里，后者往往比前者更重要。&lt;/p&gt;&#xA;&lt;p&gt;因为大多数时候，我不是缺一张看上去很漂亮的系统地图，而是缺一个能让我今天下午就动手改代码的判断依据。&lt;/p&gt;&#xA;&lt;h2 id=&#34;六知识图谱和新人指南为什么会沦为美丽废物&#34;&gt;六、知识图谱和新人指南为什么会沦为美丽废物&#xA;&lt;/h2&gt;&lt;p&gt;我后来反复想了一下，为什么这次结果会让我这么失望。&lt;/p&gt;&#xA;&lt;p&gt;结论并不是“它完全没价值”，而是：&lt;/p&gt;&#xA;&lt;p&gt;它产出的价值，更偏展示型、归纳型，而不是行动型。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-它容易停在正确但无用的层面&#34;&gt;1. 它容易停在正确但无用的层面&#xA;&lt;/h3&gt;&lt;p&gt;比如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;把项目分成几个模块&lt;/li&gt;&#xA;&lt;li&gt;概括每个模块负责什么&lt;/li&gt;&#xA;&lt;li&gt;总结系统的整体职责&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这些话很可能都没错，但也正因为太“没错”，所以很难直接指导行动。&lt;/p&gt;&#xA;&lt;p&gt;一个新人真正需要的，往往不是“模块 A 负责用户管理”，而是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;模块 A 的入口文件在哪&lt;/li&gt;&#xA;&lt;li&gt;初始化顺序是什么&lt;/li&gt;&#xA;&lt;li&gt;调用链上游下游分别是谁&lt;/li&gt;&#xA;&lt;li&gt;改这里会不会影响鉴权、缓存或数据库&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这两者之间有巨大差异。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-它会给你已经理解的幻觉&#34;&gt;2. 它会给你“已经理解”的幻觉&#xA;&lt;/h3&gt;&lt;p&gt;这是我觉得最危险的一点。&lt;/p&gt;&#xA;&lt;p&gt;有了知识图谱、新人指南、总览说明之后，人很容易对自己的理解程度产生误判。&lt;/p&gt;&#xA;&lt;p&gt;你会觉得：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;结构我看过了&lt;/li&gt;&#xA;&lt;li&gt;模块我知道了&lt;/li&gt;&#xA;&lt;li&gt;系统图我也有了&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;但真等你去改第一段代码时，依然会发现自己还是得：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;回到源码&lt;/li&gt;&#xA;&lt;li&gt;跟踪调用链&lt;/li&gt;&#xA;&lt;li&gt;看日志&lt;/li&gt;&#xA;&lt;li&gt;打断点&lt;/li&gt;&#xA;&lt;li&gt;手动验证&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;也就是说，那些漂亮产出并没有真正替代掉最核心的理解过程。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-它更像管理视角的材料不像工程视角的工具&#34;&gt;3. 它更像管理视角的材料，不像工程视角的工具&#xA;&lt;/h3&gt;&lt;p&gt;很多这类内容，如果拿去做汇报、做入门展示、做高层概览，其实并不差。&lt;/p&gt;&#xA;&lt;p&gt;但如果你的目标是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;排障&lt;/li&gt;&#xA;&lt;li&gt;加功能&lt;/li&gt;&#xA;&lt;li&gt;改逻辑&lt;/li&gt;&#xA;&lt;li&gt;理清耦合点&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;那它的帮助就会明显下降。&lt;/p&gt;&#xA;&lt;p&gt;我后来越来越觉得，这类工具天然更擅长生成：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;看起来很像文档成果的东西&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;而不是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;真正能减少工程试错成本的东西&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;七这次最让我不爽的不是它没用而是我认真投入之后发现它还是没用&#34;&gt;七、这次最让我不爽的，不是它没用，而是我认真投入之后发现它还是没用&#xA;&lt;/h2&gt;&lt;p&gt;如果只是简单试一下然后发现一般，我可能都不会专门写这篇文章。&lt;/p&gt;&#xA;&lt;p&gt;但这次让我真正想记一笔的点在于：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;我不是轻飘飘点开看了一眼&lt;/li&gt;&#xA;&lt;li&gt;我是真的把它接进了自己的流程&lt;/li&gt;&#xA;&lt;li&gt;我还专门换了更强的模型和更高的推理档位&lt;/li&gt;&#xA;&lt;li&gt;我花了两个多小时&lt;/li&gt;&#xA;&lt;li&gt;我消耗了 &lt;code&gt;2.89M&lt;/code&gt; token&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;最后得到的却不是“这个工具还不错，但需要打磨”，而是：&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;它非常会展示自己在工作，但没有真正帮我把事情做成。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;这是一种很典型的 AI 使用挫败感。&lt;/p&gt;&#xA;&lt;p&gt;因为它不像传统软件那样明确报错，也不像脚本那样直接失败。它给你的恰恰是一个“看起来已经很努力”的结果。&lt;/p&gt;&#xA;&lt;p&gt;问题在于，努力不等于有效。&lt;/p&gt;&#xA;&lt;h2 id=&#34;八最后我还是把它删了&#34;&gt;八、最后我还是把它删了&#xA;&lt;/h2&gt;&lt;p&gt;折腾完之后，我没有选择“先留着以后再看”，而是直接删掉。&lt;/p&gt;&#xA;&lt;p&gt;原因其实很简单：&lt;/p&gt;&#xA;&lt;p&gt;一个工具如果不能进入日常工作流，就算它偶尔能产出一些漂亮材料，也不值得长期占据我的注意力。&lt;/p&gt;&#xA;&lt;p&gt;尤其是在 AI 工具越来越多的环境里，真正稀缺的不是“看起来很强的东西”，而是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;能稳定节省时间的东西&lt;/li&gt;&#xA;&lt;li&gt;能直接提升判断质量的东西&lt;/li&gt;&#xA;&lt;li&gt;能真正减少手工试错的东西&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果一个工具做不到这些，那即便它有很多星、很多人夸、很多截图效果很好，最终也只是一个陈列品。&lt;/p&gt;&#xA;&lt;h2 id=&#34;九这次尝试给我的提醒不要太迷信大众眼光&#34;&gt;九、这次尝试给我的提醒：不要太迷信大众眼光&#xA;&lt;/h2&gt;&lt;p&gt;这件事对我最大的提醒，不是某个具体项目值不值得用，而是一个更普遍的判断：&lt;/p&gt;&#xA;&lt;p&gt;不要太迷信大众的眼光。&lt;/p&gt;&#xA;&lt;p&gt;GitHub 星数高，说明它有传播性、话题性、展示性，甚至说明它确实抓住了一个大家都在痛的需求。&lt;/p&gt;&#xA;&lt;p&gt;但这些都不等于：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;它适合我的工作流&lt;/li&gt;&#xA;&lt;li&gt;它能解决我的具体问题&lt;/li&gt;&#xA;&lt;li&gt;它值得我长期保留&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;大众筛选出来的，很多时候只是“值得你看一眼”的项目。&lt;/p&gt;&#xA;&lt;p&gt;至于它是不是“值得你真正接入自己的系统”，只能靠自己动手试。&lt;/p&gt;&#xA;&lt;h2 id=&#34;十最后的结论很土但大概率也最可靠&#34;&gt;十、最后的结论很土，但大概率也最可靠&#xA;&lt;/h2&gt;&lt;p&gt;这次折腾到最后，我反而得到了一个一点都不新潮、但非常可靠的结论：&lt;/p&gt;&#xA;&lt;p&gt;多动手，多实践。&lt;/p&gt;&#xA;&lt;p&gt;看到一个很火的项目，最好的处理方式不是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先相信它&lt;/li&gt;&#xA;&lt;li&gt;先神化它&lt;/li&gt;&#xA;&lt;li&gt;先把别人给它的评价当成自己的判断&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;而是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;自己装起来&lt;/li&gt;&#xA;&lt;li&gt;自己接进真实场景&lt;/li&gt;&#xA;&lt;li&gt;自己为它付出一点时间和成本&lt;/li&gt;&#xA;&lt;li&gt;再根据实际产出做判断&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;如果有用，就留下；&#xA;如果没用，就尽快删掉。&lt;/p&gt;&#xA;&lt;p&gt;这次 &lt;code&gt;Understand-Anything&lt;/code&gt; 对我来说，就是后者。&lt;/p&gt;&#xA;&lt;p&gt;它不是什么灾难项目，也不是骗人的东西。&lt;/p&gt;&#xA;&lt;p&gt;它只是一个典型的、看起来很厉害、讲起来也很高级、演示起来很漂亮，但放进我真实工作流之后没有产出实际价值的工具。&lt;/p&gt;&#xA;&lt;p&gt;说到底，还是那句话：&lt;/p&gt;&#xA;&lt;p&gt;别太迷信大众的眼光，自己试过才知道。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>从申请服务器到搭建 sub2api 中转站：一份完整实践记录</title>
            <link>https://blog.chen-api.cloud/posts/sub2api-relay-setup-notes/</link>
            <pubDate>Tue, 26 May 2026 13:25:00 +0800</pubDate>
            <guid>https://blog.chen-api.cloud/posts/sub2api-relay-setup-notes/</guid>
            <description>&lt;p&gt;这篇文章记录一下我从零准备一台服务器，到最终把 &lt;code&gt;sub2api&lt;/code&gt; 跑起来并作为反代中转站使用的完整过程。&lt;/p&gt;&#xA;&lt;p&gt;整个过程并不是单点安装某个程序，而是一条完整链路：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;先选服务器&lt;/li&gt;&#xA;&lt;li&gt;再选域名&lt;/li&gt;&#xA;&lt;li&gt;配好基础网络出口&lt;/li&gt;&#xA;&lt;li&gt;然后部署 &lt;code&gt;sub2api&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;再接上 &lt;code&gt;Nginx&lt;/code&gt; 和 &lt;code&gt;HTTPS&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;最后完成账号绑定和实际可用验证&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果把这件事拆开看，每一步都不算复杂；但如果第一次做，很容易卡在某一个细节上，比如域名解析、反向代理、证书签发或者出口网络。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一先做服务器比价最后选择新加坡轻量云&#34;&gt;一、先做服务器比价，最后选择新加坡轻量云&#xA;&lt;/h2&gt;&lt;p&gt;在真正动手之前，第一步其实不是安装软件，而是先挑服务器。&lt;/p&gt;&#xA;&lt;p&gt;我当时的思路很明确：这台机器主要是跑一个轻量级中转服务，不是数据库重负载场景，也不是需要高性能计算的业务，所以重点不是极限性能，而是下面几项：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;价格是否足够低&lt;/li&gt;&#xA;&lt;li&gt;海外线路是否相对稳定&lt;/li&gt;&#xA;&lt;li&gt;带宽和流量是否够用&lt;/li&gt;&#xA;&lt;li&gt;系统镜像是否方便直接上 Ubuntu&lt;/li&gt;&#xA;&lt;li&gt;控制台和安全组是否省心&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这一类场景里，常见可选项一般会包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;腾讯云轻量应用服务器&lt;/li&gt;&#xA;&lt;li&gt;阿里云轻量应用服务器&lt;/li&gt;&#xA;&lt;li&gt;部分海外 VPS 厂商&lt;/li&gt;&#xA;&lt;li&gt;传统云服务器标准实例&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果只是部署 &lt;code&gt;sub2api&lt;/code&gt; 这种中小型服务，轻量服务器通常比传统 CVM / ECS 更合适，因为：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;价格更直接&lt;/li&gt;&#xA;&lt;li&gt;自带公网 IP&lt;/li&gt;&#xA;&lt;li&gt;管理界面简单&lt;/li&gt;&#xA;&lt;li&gt;比较适合个人项目或中小流量工具站&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;综合权衡之后，我最后选择了腾讯云新加坡区域的轻量云服务器。&lt;/p&gt;&#xA;&lt;p&gt;这个选择背后的考虑大致有三点：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;新加坡区域在亚洲访问延迟相对更友好&lt;/li&gt;&#xA;&lt;li&gt;对个人用途来说，价格和稳定性比较平衡&lt;/li&gt;&#xA;&lt;li&gt;后续配域名、Nginx 和证书都很常规，资料比较多&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;系统方面，直接选择 Ubuntu 就够了。后续所有部署动作基本都围绕下面这些组件展开：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;apt&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;systemd&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;certbot&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;tailscale&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;二域名不需要贵但最好专业好记能长期用&#34;&gt;二、域名不需要贵，但最好专业、好记、能长期用&#xA;&lt;/h2&gt;&lt;p&gt;服务器确定之后，下一步就是域名。&lt;/p&gt;&#xA;&lt;p&gt;我当时没有去买特别昂贵或者过于花哨的后缀，而是选择了一个 &lt;code&gt;cloud&lt;/code&gt; 结尾的域名。原因很现实：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;价格便宜&lt;/li&gt;&#xA;&lt;li&gt;可选空间相对多&lt;/li&gt;&#xA;&lt;li&gt;看起来比很多冷门后缀更正式&lt;/li&gt;&#xA;&lt;li&gt;用在技术服务和工具站上违和感小&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;对个人项目来说，域名最重要的不是“看起来很高级”，而是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;便于记忆&lt;/li&gt;&#xA;&lt;li&gt;不容易输错&lt;/li&gt;&#xA;&lt;li&gt;适合长期续费&lt;/li&gt;&#xA;&lt;li&gt;作为主域名时不显得太随意&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;最后我用这个域名同时承载了不同用途：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;主服务走主域名&lt;/li&gt;&#xA;&lt;li&gt;博客走子域名&lt;/li&gt;&#xA;&lt;li&gt;后续不同组件都可以拆分到不同子域名下&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这种方式的好处是结构清晰，后续扩展也方便。&lt;/p&gt;&#xA;&lt;h2 id=&#34;三先把流量出口问题想清楚用-tailscale-把本机作为出口&#34;&gt;三、先把流量出口问题想清楚：用 Tailscale 把本机作为出口&#xA;&lt;/h2&gt;&lt;p&gt;部署 &lt;code&gt;sub2api&lt;/code&gt; 这种服务时，一个非常实际的问题是：服务运行在服务器上，但某些访问链路未必适合直接走服务器本地网络。&lt;/p&gt;&#xA;&lt;p&gt;所以我当时的处理思路是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;在服务器上安装 &lt;code&gt;Tailscale&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;把自己的本地设备加入同一个 tailnet&lt;/li&gt;&#xA;&lt;li&gt;让本机作为出口节点&lt;/li&gt;&#xA;&lt;li&gt;使服务器的相关流量通过本机出口转发&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这么做的核心价值，不在于“更酷”，而在于网络路径可控。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-tailscale-的角色&#34;&gt;1. Tailscale 的角色&#xA;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Tailscale&lt;/code&gt; 本质上是一个基于 WireGuard 的组网方案。它的优点是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;安装简单&lt;/li&gt;&#xA;&lt;li&gt;节点互联快&lt;/li&gt;&#xA;&lt;li&gt;不需要自己维护传统 VPN&lt;/li&gt;&#xA;&lt;li&gt;可以很方便地指定出口节点&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这类方案特别适合：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;个人多设备协同&lt;/li&gt;&#xA;&lt;li&gt;家里电脑和云服务器互通&lt;/li&gt;&#xA;&lt;li&gt;临时把一台设备当作统一出口&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-典型操作思路&#34;&gt;2. 典型操作思路&#xA;&lt;/h3&gt;&lt;p&gt;这一部分大致会包含下面几个动作：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;在本机安装 &lt;code&gt;Tailscale&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;在云服务器安装 &lt;code&gt;Tailscale&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;登录同一个账号或组织网络&lt;/li&gt;&#xA;&lt;li&gt;在本机开启 exit node 能力&lt;/li&gt;&#xA;&lt;li&gt;在服务器侧指定该 exit node&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;从结果上说，就是服务器虽然部署在云端，但某些流量可以按你的规划经由本机网络出去。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-这一步为什么重要&#34;&gt;3. 这一步为什么重要&#xA;&lt;/h3&gt;&lt;p&gt;很多人搭服务时，默认认为“服务器能联网就够了”。但实际一旦进入真实使用，网络出口路径、可访问性、登录状态和上游连接稳定性都会影响最终可用性。&lt;/p&gt;&#xA;&lt;p&gt;所以我认为，&lt;code&gt;Tailscale + exit node&lt;/code&gt; 并不是额外花活，而是这类中转服务里非常实用的一环。&lt;/p&gt;&#xA;&lt;h2 id=&#34;四账号准备把环境准备和服务部署分开看&#34;&gt;四、账号准备：把环境准备和服务部署分开看&#xA;&lt;/h2&gt;&lt;p&gt;这一步我更愿意把它理解为“账号环境准备”，而不是部署本身的一部分。&lt;/p&gt;&#xA;&lt;p&gt;因为从工程角度看，服务器、域名、代理、证书、服务进程，这些都是基础设施问题；而账号登录、订阅状态、客户端绑定，则更接近上游服务接入问题。&lt;/p&gt;&#xA;&lt;p&gt;我这里不展开写过细的支付或区域性操作细节，只保留思路层面的经验：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;尽量把账号环境准备和服务器部署分开处理&lt;/li&gt;&#xA;&lt;li&gt;优先保证账号本身状态正常可登录&lt;/li&gt;&#xA;&lt;li&gt;再去做后面的 OAuth 绑定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这样做的好处是排障更清楚。否则一旦失败，你很难判断问题到底出在：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;服务器网络&lt;/li&gt;&#xA;&lt;li&gt;反向代理&lt;/li&gt;&#xA;&lt;li&gt;HTTPS&lt;/li&gt;&#xA;&lt;li&gt;OAuth 回调&lt;/li&gt;&#xA;&lt;li&gt;还是账号自身状态&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;五正式部署-sub2api先让服务能跑起来&#34;&gt;五、正式部署 sub2api：先让服务能跑起来&#xA;&lt;/h2&gt;&lt;p&gt;当服务器、域名和网络出口都准备好之后，就可以进入真正的服务部署阶段。&lt;/p&gt;&#xA;&lt;p&gt;这一部分的目标不是先追求“最优雅”，而是先让 &lt;code&gt;sub2api&lt;/code&gt; 在服务器上稳定跑起来。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-基础环境准备&#34;&gt;1. 基础环境准备&#xA;&lt;/h3&gt;&lt;p&gt;最常规的准备动作一般包括：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;更新系统软件包&lt;/li&gt;&#xA;&lt;li&gt;安装 Git、Nginx 等基础依赖&lt;/li&gt;&#xA;&lt;li&gt;准备运行目录&lt;/li&gt;&#xA;&lt;li&gt;规划监听端口&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果服务本身有独立的启动方式，还需要考虑：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;二进制部署&lt;/li&gt;&#xA;&lt;li&gt;Docker 部署&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;systemd&lt;/code&gt; 托管&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;从长期维护角度看，我更偏向把服务交给 &lt;code&gt;systemd&lt;/code&gt; 或容器托管，而不是单纯用一个前台命令挂着。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-先本地端口可访问再接入反代&#34;&gt;2. 先本地端口可访问，再接入反代&#xA;&lt;/h3&gt;&lt;p&gt;这一类服务的正确调试顺序通常是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;先确认程序在本机端口已经成功启动&lt;/li&gt;&#xA;&lt;li&gt;再用 &lt;code&gt;curl http://127.0.0.1:端口&lt;/code&gt; 验证是否有响应&lt;/li&gt;&#xA;&lt;li&gt;最后才挂到 &lt;code&gt;Nginx&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;如果一上来就把所有东西混在一起，很容易出现：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;服务本身没起来&lt;/li&gt;&#xA;&lt;li&gt;Nginx 也没配对&lt;/li&gt;&#xA;&lt;li&gt;证书还没签&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;然后排障就会变得很乱。&lt;/p&gt;&#xA;&lt;h2 id=&#34;六nginx-反代把服务挂到域名上&#34;&gt;六、Nginx 反代：把服务挂到域名上&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sub2api&lt;/code&gt; 真正对外可用，关键还是靠 &lt;code&gt;Nginx&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;常见结构就是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;上游应用监听本地端口，例如 &lt;code&gt;127.0.0.1:3000&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Nginx&lt;/code&gt; 对外监听 &lt;code&gt;80&lt;/code&gt; 和 &lt;code&gt;443&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;外部流量先到 &lt;code&gt;Nginx&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;再由 &lt;code&gt;Nginx&lt;/code&gt; 转发给 &lt;code&gt;sub2api&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;一个典型的反代思路会像这样：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;chen-api.cloud&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;proxy_pass&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;http://127.0.0.1:3000&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;Host&lt;/span&gt; $host;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;X-Real-IP&lt;/span&gt; $remote_addr;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;X-Forwarded-Proto&lt;/span&gt; $scheme;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里的关键不是把配置背下来，而是理解这几个事实：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;应用服务尽量只监听本地&lt;/li&gt;&#xA;&lt;li&gt;公网入口统一交给 &lt;code&gt;Nginx&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;反代时要把请求头带完整&lt;/li&gt;&#xA;&lt;li&gt;后面签 HTTPS 会更顺&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;七https-证书是上线的必要条件不是可选项&#34;&gt;七、HTTPS 证书是上线的必要条件，不是可选项&#xA;&lt;/h2&gt;&lt;p&gt;当 HTTP 反代已经打通之后，下一步就应该立刻上 HTTPS。&lt;/p&gt;&#xA;&lt;p&gt;这一步通常会用 &lt;code&gt;certbot + nginx&lt;/code&gt; 组合完成。它的好处是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;配置直接&lt;/li&gt;&#xA;&lt;li&gt;自动改 Nginx&lt;/li&gt;&#xA;&lt;li&gt;自动续期方便&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;只要满足下面几个条件，一般就可以顺利签证书：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;域名已经正确解析到服务器公网 IP&lt;/li&gt;&#xA;&lt;li&gt;安全组放通了 &lt;code&gt;80&lt;/code&gt; 和 &lt;code&gt;443&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Nginx&lt;/code&gt; 对该域名的 &lt;code&gt;server_name&lt;/code&gt; 配置正确&lt;/li&gt;&#xA;&lt;li&gt;外部可以通过 HTTP 正常访问到站点&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;完成后，服务会从：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;http://chen-api.cloud&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;变成：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;https://chen-api.cloud&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这不仅是为了浏览器地址栏更好看，更重要的是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;OAuth 回调通常更依赖稳定的 HTTPS 环境&lt;/li&gt;&#xA;&lt;li&gt;中转服务对安全链路要求更高&lt;/li&gt;&#xA;&lt;li&gt;长期使用时也更规范&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;八登录-sub2api-后通过-oauth-绑定上游账号&#34;&gt;八、登录 sub2api 后，通过 OAuth 绑定上游账号&#xA;&lt;/h2&gt;&lt;p&gt;当反代和 HTTPS 都打通之后，才真正进入“业务可用”阶段。&lt;/p&gt;&#xA;&lt;p&gt;这时一般会做下面几件事：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;打开 &lt;code&gt;sub2api&lt;/code&gt; 的管理界面&lt;/li&gt;&#xA;&lt;li&gt;登录后台&lt;/li&gt;&#xA;&lt;li&gt;找到账号绑定或授权入口&lt;/li&gt;&#xA;&lt;li&gt;通过 OAuth 流程绑定 GPT 账号&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这一部分最重要的其实不是“点哪个按钮”，而是确保下面三个前置条件已经成立：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;站点已经能被公网稳定访问&lt;/li&gt;&#xA;&lt;li&gt;HTTPS 正常&lt;/li&gt;&#xA;&lt;li&gt;回调链路没有被错误代理或拦截&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果 OAuth 绑定异常，大概率优先排查这些问题：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;域名是否正确&lt;/li&gt;&#xA;&lt;li&gt;证书是否正常&lt;/li&gt;&#xA;&lt;li&gt;Nginx 是否正确转发头信息&lt;/li&gt;&#xA;&lt;li&gt;服务端日志里有没有回调报错&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;九整套链路里最容易出问题的地方&#34;&gt;九、整套链路里最容易出问题的地方&#xA;&lt;/h2&gt;&lt;p&gt;回头看，这一套流程真正容易卡住的地方并不只在安装服务本身，而是在几个看似琐碎的环节：&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-域名解析没生效&#34;&gt;1. 域名解析没生效&#xA;&lt;/h3&gt;&lt;p&gt;很多“站点打不开”的问题，其实不是程序没跑，而是域名还没指到服务器。&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-服务没起来就开始配-nginx&#34;&gt;2. 服务没起来就开始配 Nginx&#xA;&lt;/h3&gt;&lt;p&gt;正确顺序应该始终是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;先跑服务&lt;/li&gt;&#xA;&lt;li&gt;再测本地端口&lt;/li&gt;&#xA;&lt;li&gt;再接反代&lt;/li&gt;&#xA;&lt;li&gt;再签证书&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;3-https-没配置完整&#34;&gt;3. HTTPS 没配置完整&#xA;&lt;/h3&gt;&lt;p&gt;证书签发成功，不代表整个 HTTPS 链路一定完全可用。还要看：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Nginx 是否正确加载证书&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;443&lt;/code&gt; 是否放行&lt;/li&gt;&#xA;&lt;li&gt;回调链路是否仍然走错地址&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;4-把账号问题误判成部署问题&#34;&gt;4. 把账号问题误判成部署问题&#xA;&lt;/h3&gt;&lt;p&gt;如果上游账号本身状态不对，哪怕服务器、Nginx、证书全都正确，也依然会表现成“服务不可用”。&lt;/p&gt;&#xA;&lt;p&gt;所以部署和账号准备必须分开排查。&lt;/p&gt;&#xA;&lt;h2 id=&#34;十最后的结构其实很清晰&#34;&gt;十、最后的结构其实很清晰&#xA;&lt;/h2&gt;&lt;p&gt;等整条链路走通之后，这套架构本身并不复杂：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;一台海外 Ubuntu 服务器&lt;/li&gt;&#xA;&lt;li&gt;一个正式域名&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Tailscale&lt;/code&gt; 作为可控网络出口方案&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;sub2api&lt;/code&gt; 作为核心服务&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Nginx&lt;/code&gt; 负责公网入口与反向代理&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Let&#39;s Encrypt&lt;/code&gt; 负责 HTTPS&lt;/li&gt;&#xA;&lt;li&gt;OAuth 完成上游账号绑定&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;从结果上说，这已经是一套足够个人长期使用的中转服务结构。&lt;/p&gt;&#xA;&lt;p&gt;它未必是唯一方案，也不一定是最“高级”的方案，但对个人部署来说，胜在：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;成本可控&lt;/li&gt;&#xA;&lt;li&gt;结构清晰&lt;/li&gt;&#xA;&lt;li&gt;易于维护&lt;/li&gt;&#xA;&lt;li&gt;扩展方便&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;十一如果让我再做一次我会坚持这个顺序&#34;&gt;十一、如果让我再做一次，我会坚持这个顺序&#xA;&lt;/h2&gt;&lt;p&gt;最后总结一下，如果让我重新从零做一遍，我仍然会按这个顺序来：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;先选服务器和区域&lt;/li&gt;&#xA;&lt;li&gt;再买域名并规划子域名&lt;/li&gt;&#xA;&lt;li&gt;先解决网络出口问题&lt;/li&gt;&#xA;&lt;li&gt;再部署 &lt;code&gt;sub2api&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;然后配置 &lt;code&gt;Nginx&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;最后接 HTTPS 和 OAuth&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;因为只有按这个顺序，排障成本才最低。&lt;/p&gt;&#xA;&lt;p&gt;很多时候，真正节省时间的不是命令敲得有多快，而是步骤顺序有没有走对。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>从 0 到上线：我如何搭建自己的 Hugo 博客</title>
            <link>https://blog.chen-api.cloud/posts/from-zero-to-hugo-blog/</link>
            <pubDate>Tue, 26 May 2026 13:05:00 +0800</pubDate>
            <guid>https://blog.chen-api.cloud/posts/from-zero-to-hugo-blog/</guid>
            <description>&lt;p&gt;这篇笔记记录了我从一台空白 Ubuntu 服务器开始，搭建并发布自己 Hugo 博客的全过程。&lt;/p&gt;&#xA;&lt;p&gt;这次没有走现成面板，也没有用一键脚本，而是一步一步把域名、Nginx、HTTPS、Hugo 和主题都接起来。中间踩了不少坑，但也因此把整个链路摸清了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;一准备工作&#34;&gt;一、准备工作&#xA;&lt;/h2&gt;&lt;p&gt;开始之前，服务器上已经跑着一个现有站点 &lt;code&gt;sub2api&lt;/code&gt;，域名是 &lt;code&gt;chen-api.cloud&lt;/code&gt;。因此这次部署博客时，有一个约束条件很明确：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;不能影响现有的 &lt;code&gt;sub2api&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;博客要部署到新子域名 &lt;code&gt;blog.chen-api.cloud&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这个前提决定了后面的 Nginx 配置不能覆盖原站点，只能新增一个独立 &lt;code&gt;server&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;二先把-hugo-站点跑起来&#34;&gt;二、先把 Hugo 站点跑起来&#xA;&lt;/h2&gt;&lt;p&gt;一开始最先遇到的是两个典型问题。&lt;/p&gt;&#xA;&lt;p&gt;第一个问题是命令本身输错了。我先输入了大写的 &lt;code&gt;HUGO&lt;/code&gt;，系统直接报错：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HUGO: command not found&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后来确认应该使用小写命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第二个问题是配置文件 &lt;code&gt;config.toml&lt;/code&gt; 写坏了。因为我最开始用 heredoc 写文件时，把 &lt;code&gt;EOF&lt;/code&gt; 缩进了，结果它真的被写进了文件里，Hugo 解析时报错：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unmarshal failed: toml: expected character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修正之后，最小配置大概是这样：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://blog.chen-api.cloud/&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;locale&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CHEN 的博客&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里最大的教训是：如果不熟悉 shell heredoc，短文件直接用 &lt;code&gt;printf&lt;/code&gt; 或者 &lt;code&gt;nano&lt;/code&gt; 会稳很多。&lt;/p&gt;&#xA;&lt;h2 id=&#34;三给博客准备最小内容&#34;&gt;三、给博客准备最小内容&#xA;&lt;/h2&gt;&lt;p&gt;为了先验证整条发布链路，我没有一开始就上复杂主题，而是先做了一个最小首页。&lt;/p&gt;&#xA;&lt;p&gt;最早的问题并不是 Nginx，而是 Hugo 内容文件 &lt;code&gt;_index.md&lt;/code&gt; 写坏了。比如：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;YAML 头信息没有正确闭合&lt;/li&gt;&#xA;&lt;li&gt;每行前面多了空格&lt;/li&gt;&#xA;&lt;li&gt;文件末尾多写了一行 &lt;code&gt;EOF&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这会导致 Hugo 报错：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;EOF looking &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; end YAML front matter delimiter&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修正之后，一个最小可用首页类似这样：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;title: &amp;#34;首页&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;这是我的 Hugo 博客，已经部署成功。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;等 Hugo 能正常构建出 &lt;code&gt;index.html&lt;/code&gt; 之后，才适合继续往下接 Nginx。&lt;/p&gt;&#xA;&lt;h2 id=&#34;四nginx-配置必须与现有业务并存&#34;&gt;四、Nginx 配置必须与现有业务并存&#xA;&lt;/h2&gt;&lt;p&gt;由于服务器上已经有 &lt;code&gt;sub2api&lt;/code&gt;，部署前先检查了当前站点配置：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;sites-enabled&lt;/code&gt; 里已有 &lt;code&gt;sub2api&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;它处理的是 &lt;code&gt;chen-api.cloud&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;没有占用 &lt;code&gt;blog.chen-api.cloud&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这说明博客可以安全新增一个站点，而不必修改原服务。&lt;/p&gt;&#xA;&lt;p&gt;博客对应的 Nginx 配置逻辑非常简单：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;server&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;listen&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;[::]:80&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;server_name&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;blog.chen-api.cloud&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;root&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/var/www/blog&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;index&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;index.html&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;location&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;try_files&lt;/span&gt; $uri $uri/ &lt;span style=&#34;color:#e6db74&#34;&gt;/index.html&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里有个关键判断过程。当时博客域名第一次访问并不是 &lt;code&gt;404&lt;/code&gt;，而是：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl: &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;6&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Could not resolve host: blog.chen-api.cloud&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这说明问题根本不在 Nginx，而在 DNS。&lt;/p&gt;&#xA;&lt;h2 id=&#34;五域名解析是最容易忽略的一步&#34;&gt;五、域名解析是最容易忽略的一步&#xA;&lt;/h2&gt;&lt;p&gt;之后用 &lt;code&gt;nslookup&lt;/code&gt; 检查，发现子域名一开始是 &lt;code&gt;NXDOMAIN&lt;/code&gt;，也就是根本没有这条记录。&lt;/p&gt;&#xA;&lt;p&gt;必须先去 DNS 后台添加：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;类型：&lt;code&gt;A&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;主机记录：&lt;code&gt;blog&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;记录值：服务器公网 IP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;等 DNS 生效之后，再次检查：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nslookup blog.chen-api.cloud&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;已经能正确解析到服务器 IP，这时候再访问 HTTP，才真正走到了 Nginx。&lt;/p&gt;&#xA;&lt;h2 id=&#34;六403-的根因不是权限而是没生成首页&#34;&gt;六、403 的根因不是权限，而是没生成首页&#xA;&lt;/h2&gt;&lt;p&gt;DNS 生效之后，博客域名开始返回 &lt;code&gt;403 Forbidden&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这一步很容易误判成目录权限问题，但实际排查后发现根因是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/var/www/blog&lt;/code&gt; 目录里没有 &lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Hugo 因为内容文件错误，根本没有生成首页&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;也就是说，&lt;code&gt;403&lt;/code&gt; 只是结果，真正的问题还是构建失败。&lt;/p&gt;&#xA;&lt;p&gt;这次部署最大的经验之一就是：先看生成目录里有没有实际产物，再怀疑 Nginx。&lt;/p&gt;&#xA;&lt;h2 id=&#34;七https-比部署本身更顺利&#34;&gt;七、HTTPS 比部署本身更顺利&#xA;&lt;/h2&gt;&lt;p&gt;当 &lt;code&gt;http://blog.chen-api.cloud&lt;/code&gt; 能返回 &lt;code&gt;200 OK&lt;/code&gt; 后，HTTPS 基本就是顺水推舟了。&lt;/p&gt;&#xA;&lt;p&gt;直接使用 &lt;code&gt;certbot --nginx&lt;/code&gt; 申请并挂载证书。过程中系统提示这个域名已经存在证书，于是选择了“重新安装已有证书”，而不是重新签发。&lt;/p&gt;&#xA;&lt;p&gt;最终验证结果：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;https://blog.chen-api.cloud&lt;/code&gt; 返回 &lt;code&gt;200 OK&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;certbot.timer&lt;/code&gt; 已启用&lt;/li&gt;&#xA;&lt;li&gt;证书会自动续期&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;到这里，博客已经算正式上线。&lt;/p&gt;&#xA;&lt;h2 id=&#34;八换主题时又踩到了-hugo-版本坑&#34;&gt;八、换主题时又踩到了 Hugo 版本坑&#xA;&lt;/h2&gt;&lt;p&gt;博客最初虽然可用，但只是一个临时首页，不像正式博客。后来我选择切换到 &lt;code&gt;Hugo Theme Stack&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;主题装上之后，新的问题出现了：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hash&amp;#34;&lt;/span&gt; not defined&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;排查后发现并不是主题坏了，而是服务器自带 Hugo 版本太旧：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;当前版本：&lt;code&gt;0.92.2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Stack&lt;/code&gt; 主题最低要求：&lt;code&gt;0.157.0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;所以必须升级 Hugo。&lt;/p&gt;&#xA;&lt;h2 id=&#34;九普通版-hugo-还不够必须用-extended&#34;&gt;九、普通版 Hugo 还不够，必须用 extended&#xA;&lt;/h2&gt;&lt;p&gt;升级到新版本之后，构建又报了另一个错误：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TOCSS: failed to transform &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/scss/style.scss&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这说明我虽然把 Hugo 升级了，但装的是普通版，不是 &lt;code&gt;extended&lt;/code&gt; 版。&lt;/p&gt;&#xA;&lt;p&gt;而 &lt;code&gt;Stack&lt;/code&gt; 主题会编译 SCSS，因此必须安装官方 &lt;code&gt;extended&lt;/code&gt; 版本。&lt;/p&gt;&#xA;&lt;p&gt;替换完成后，最终版本变成：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo v0.161.1+extended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这一步，主题才真正构建成功，博客首页也切换成了卡片式布局。&lt;/p&gt;&#xA;&lt;h2 id=&#34;十最终结果&#34;&gt;十、最终结果&#xA;&lt;/h2&gt;&lt;p&gt;现在这套博客已经具备了基础可用状态：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;域名：&lt;code&gt;blog.chen-api.cloud&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Web 服务：&lt;code&gt;Nginx&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;证书：&lt;code&gt;Let&#39;s Encrypt&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;博客引擎：&lt;code&gt;Hugo&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;主题：&lt;code&gt;Stack&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;自动续期：&lt;code&gt;certbot.timer&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;而且整个过程没有影响服务器上原来的 &lt;code&gt;sub2api&lt;/code&gt; 服务。&lt;/p&gt;&#xA;&lt;h2 id=&#34;十一这次部署里最有价值的几个经验&#34;&gt;十一、这次部署里最有价值的几个经验&#xA;&lt;/h2&gt;&lt;p&gt;最后总结几条我这次最有体感的经验：&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-不要过早怀疑-nginx&#34;&gt;1. 不要过早怀疑 Nginx&#xA;&lt;/h3&gt;&lt;p&gt;访问异常不一定是 Nginx 配错了，也可能是：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DNS 没生效&lt;/li&gt;&#xA;&lt;li&gt;Hugo 没生成文件&lt;/li&gt;&#xA;&lt;li&gt;内容文件格式写坏&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-heredoc-对新手并不友好&#34;&gt;2. heredoc 对新手并不友好&#xA;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF&lt;/code&gt; 看起来方便，但实际非常容易因为缩进、结尾位置或者误输入，把 &lt;code&gt;EOF&lt;/code&gt; 写进文件里。&lt;/p&gt;&#xA;&lt;p&gt;短配置更推荐：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;printf&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;nano&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;3-主题和-hugo-版本必须一起看&#34;&gt;3. 主题和 Hugo 版本必须一起看&#xA;&lt;/h3&gt;&lt;p&gt;很多 Hugo 主题页面能打开，不代表你的本地环境就能跑。&lt;/p&gt;&#xA;&lt;p&gt;一定要先确认：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;主题最低支持版本&lt;/li&gt;&#xA;&lt;li&gt;是否要求 &lt;code&gt;extended&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;4-先打通最小链路再追求美观&#34;&gt;4. 先打通最小链路，再追求美观&#xA;&lt;/h3&gt;&lt;p&gt;这次如果一开始就折腾主题、菜单、页面细节，排障会困难很多。&lt;/p&gt;&#xA;&lt;p&gt;正确顺序应该是：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Hugo 能构建&lt;/li&gt;&#xA;&lt;li&gt;Nginx 能访问&lt;/li&gt;&#xA;&lt;li&gt;DNS 正常&lt;/li&gt;&#xA;&lt;li&gt;HTTPS 正常&lt;/li&gt;&#xA;&lt;li&gt;再换主题和美化&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;十二下一步&#34;&gt;十二、下一步&#xA;&lt;/h2&gt;&lt;p&gt;博客虽然已经上线，但现在还只是第一阶段。接下来我准备继续补这些内容：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;关于页&lt;/li&gt;&#xA;&lt;li&gt;归档页&lt;/li&gt;&#xA;&lt;li&gt;搜索页&lt;/li&gt;&#xA;&lt;li&gt;头像和侧边栏资料&lt;/li&gt;&#xA;&lt;li&gt;更多正式文章&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这篇文章本身，就是这个博客发布出去的第一篇“建站记录”。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>博客已切换到 Stack 主题</title>
            <link>https://blog.chen-api.cloud/posts/hello-stack/</link>
            <pubDate>Tue, 26 May 2026 12:00:00 +0800</pubDate>
            <guid>https://blog.chen-api.cloud/posts/hello-stack/</guid>
            <description>&lt;p&gt;博客已经部署完成，并切换到了 Hugo Theme Stack。&lt;/p&gt;&#xA;&lt;p&gt;接下来会逐步补充文章、页面和更多配置。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
