<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>豕豕豕 - Blog</title><description>Life is colorful!</description><link>https://blog.shishishi.cc/</link><language>zh-cn</language><image><url>https://blog.shishishi.cc/_astro/shishishi.BzPJMGkr.png</url><title>豕豕豕</title><link>https://blog.shishishi.cc/</link></image><atom:icon>https://blog.shishishi.cc/_astro/shishishi.BzPJMGkr.png</atom:icon><atom:link href="https://blog.shishishi.cc/rss.xml" rel="self" type="application/rss+xml"/><item><title>在 Mac 上原生玩《王国之泪》：MacNativeGames 构建与使用教程</title><link>https://blog.shishishi.cc/blog/mac-native-games-totk-guide/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/mac-native-games-totk-guide/</guid><description>从环境准备到首次启动，用 MacNativeGames 将自己的《王国之泪》构建为 Mac App，说明版本选择、字体、手柄、画面设置、存档备份与常见排错。</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;想在 Mac 上玩《王国之泪》，现在可以试试 &lt;a href=&quot;https://github.com/ly05010419/MacNativeGames&quot;&gt;MacNativeGames&lt;/a&gt;。它会处理你提供的游戏文件，将游戏的 ARM64 代码适配到 Apple 芯片上运行，再通过 Metal 完成图形渲染，最后打包成一个可以从访达打开的 Mac App。准备工作主要集中在第一次构建，之后启动游戏就方便多了。&lt;/p&gt;
&lt;p&gt;这篇教程面向平时会用 Mac、但不一定熟悉编译工具的玩家。从安装依赖开始，一步步完成本体或更新版的构建，再处理操作、画面和存档。本文只讲 Mac 版。&lt;/p&gt;
&lt;div class=&quot;note&quot; data-callout=&quot;note&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;本文对应的版本&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;本文于 2026 年 10 月 22 日整理，依据项目提交 &lt;a href=&quot;https://github.com/ly05010419/MacNativeGames/tree/30a1b93d0776150fbaffd7c20f9a5ca0841c21c9&quot;&gt;&lt;code&gt;30a1b93&lt;/code&gt;&lt;/a&gt; 的说明与构建脚本。下文固定使用这份源码，方便核对操作。后续版本的要求和按键可能变化，使用新版时请同时查看它的 README。本文核对了文档和命令参数，没有重新完成一次全量游戏构建，也没有做性能基准测试。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;1-开始之前先确认这些条件&quot;&gt;1. 开始之前，先确认这些条件&lt;/h2&gt;
&lt;h3 id=&quot;机器与空间&quot;&gt;机器与空间&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;要求&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;Apple 芯片机型，如 M1、M2、M3、M4、M5；本文流程不适用于 Intel Mac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;macOS 26 或更高，使用项目的 Metal 4 图形后端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;项目建议 16 GB 或更多；8 GB 机型构建时可能大量使用交换空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储&lt;/td&gt;
&lt;td&gt;本体构建除原始游戏文件外约需 25 GB；全新本体加更新构建约需 40 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络&lt;/td&gt;
&lt;td&gt;安装依赖、获取构建所需的固定版本源码时需要联网&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上面的空间估算以工作目录和成品 App 位于同一个 APFS 卷为前提。构建器可以通过 APFS 克隆共享大型数据文件；输出到其他卷，或文件系统不支持克隆时，还要为 App 副本额外预留约 17 GB。空间紧张时，先把磁盘整理好再开始。&lt;/p&gt;
&lt;h3 id=&quot;游戏文件&quot;&gt;游戏文件&lt;/h3&gt;
&lt;p&gt;准备以下文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自己的《王国之泪》&lt;strong&gt;1.0.0 本体&lt;/strong&gt;，格式为未压缩的 XCI 或 NSP，标题 ID 为 &lt;code&gt;0100F2C0115B6000&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;自己的 &lt;code&gt;prod.keys&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果要构建更新版，再准备一份&lt;strong&gt;独立的累计更新包&lt;/strong&gt;，支持 1.1.2、1.2.1、1.4.3，格式为 NSP 或 NSZ。&lt;/li&gt;
&lt;li&gt;使用 NSP 本体时，还需准备系统共享字体，具体见后文。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;important&quot; data-callout=&quot;important&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;文件来源与成品使用&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;按项目要求，游戏、密钥及系统文件应来自你自己拥有的游戏和 Switch。仓库没有提供这些内容，本文也不提供下载来源。构建出的 App 包含游戏内容，请留作个人使用，不要分享成品 App。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;本体 NSZ/XCZ、DLC、合并包和个性化票据不在本文所用版本的支持范围内。&lt;/strong&gt; 更新包可以是 NSZ，不代表本体也可以直接使用 NSZ。构建 1.4.3 时，给出 1.0.0 本体和 1.4.3 的独立累计更新即可，不需要逐个安装中间版本。&lt;/p&gt;
&lt;h2 id=&quot;2-安装构建工具&quot;&gt;2. 安装构建工具&lt;/h2&gt;
&lt;p&gt;打开 macOS 的“终端”，先安装 Xcode 命令行工具：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;xcode-select&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果系统提示已经安装，直接继续；如果出现安装窗口，等安装结束再执行后面的命令。&lt;/p&gt;
&lt;p&gt;接着安装 &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;。按照官网的步骤操作，并完成安装器最后给出的 shell 配置。Apple 芯片 Mac 的默认安装位置是 &lt;code&gt;/opt/homebrew&lt;/code&gt;，具体说明见 &lt;a href=&quot;https://docs.brew.sh/Installation&quot;&gt;Homebrew 安装文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;确认终端能找到 Homebrew，再安装依赖：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; opus&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; libvpx&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; python@3.14&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python3.14&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后一条应显示 Python 3.14.x。后面的命令统一使用 &lt;code&gt;python3.14&lt;/code&gt;，避免误用系统自带或其他版本的 Python。&lt;/p&gt;
&lt;p&gt;这一版的 Mac 构建流程不要求安装 .NET、CMake 或 iOS 工具链。脚本会继续准备自身需要的环境，完成后的 App 运行时也不需要 Python。&lt;/p&gt;
&lt;h3 id=&quot;可选安装-metal-工具链&quot;&gt;可选：安装 Metal 工具链&lt;/h3&gt;
&lt;p&gt;如果已经安装完整 Xcode，可以按照 &lt;a href=&quot;https://developer.apple.com/documentation/Xcode/downloading-and-installing-additional-xcode-components&quot;&gt;Apple 的附加组件说明&lt;/a&gt;安装 Metal 工具链：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;xcodebuild&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -downloadComponent&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; MetalToolchain&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;项目会利用它将启动着色器预编译进 App。只有命令行工具、没有完整 Xcode 时，可以先跳过这一项：构建仍能进行，只是着色器预编译会使用本机、对应 App 路径的 Metal 缓存。后面移动 App 时，两种方式的差别就会体现出来。&lt;/p&gt;
&lt;h2 id=&quot;3-下载源码整理文件&quot;&gt;3. 下载源码，整理文件&lt;/h2&gt;
&lt;p&gt;下面把源码放在 &lt;code&gt;~/Projects&lt;/code&gt;。如果你已经在其他位置下载过，可以直接进入自己的项目目录。&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Projects&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Projects&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://github.com/ly05010419/MacNativeGames.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; MacNativeGames&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; checkout&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 30a1b93d0776150fbaffd7c20f9a5ca0841c21c9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后一条将源码切到本文使用的提交。Git 可能提示 &lt;code&gt;detached HEAD&lt;/code&gt;，这是查看固定提交时的正常状态，不影响构建。&lt;/p&gt;
&lt;p&gt;为了方便看懂命令，后文约定文件像这样摆放，&lt;strong&gt;文件名只是示例，请替换成你的实际路径&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/Games/TOTK/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  base.xci            本体；使用 NSP 时为 base.nsp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  update-1.4.3.nsp     可选的独立更新包&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  firmware/           NSP 路线需要，内部是解包后的 .nca 文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/keys/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  prod.keys&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再创建用户自己的应用目录，把成品直接构建到这里：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;~/Applications&lt;/code&gt; 在你的用户目录下，与系统的 &lt;code&gt;/Applications&lt;/code&gt; 是两个位置。本文使用前者，通常不需要管理员权限。提前确定输出位置，也能减少日后移动 App 引起的着色器缓存重建。&lt;/p&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;路径里有空格怎么办&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;把完整路径放进双引号，例如 &lt;code&gt;&quot;$HOME/Games/TOTK/My Game.xci&quot;&lt;/code&gt;。也可以把文件从访达拖进终端插入路径。注意双引号里的 &lt;code&gt;~&lt;/code&gt; 不会自动展开，因此本文统一写成 &lt;code&gt;&quot;$HOME/...&quot;&lt;/code&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;4-选择一条构建命令&quot;&gt;4. 选择一条构建命令&lt;/h2&gt;
&lt;p&gt;以下命令都在刚才的 &lt;code&gt;MacNativeGames&lt;/code&gt; 源码目录中运行。&lt;strong&gt;按自己的文件情况选一条即可，不需要依次执行。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;xci-本体先构建-100&quot;&gt;XCI 本体：先构建 1.0.0&lt;/h3&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python3.14&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; build_app.py&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/base.xci&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -k&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/keys/prod.keys&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications/Tears of the Kingdom.app&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会构建 1.0.0。通常 XCI 中的系统更新分区能提供共享字体；如果你的 XCI 缺少该分区，也要像下一节那样添加 &lt;code&gt;--firmware&lt;/code&gt; 或 &lt;code&gt;--shared-fonts&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;nsp-本体额外提供字体&quot;&gt;NSP 本体：额外提供字体&lt;/h3&gt;
&lt;p&gt;NSP 本体不带系统共享字体，因此要额外传入已经解包的固件目录：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python3.14&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; build_app.py&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/base.nsp&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -k&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/keys/prod.keys&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --firmware&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/firmware&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications/Tears of the Kingdom.app&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;firmware&lt;/code&gt; 应当是包含 &lt;code&gt;.nca&lt;/code&gt; 文件的目录，也可以是已安装固件的 &lt;code&gt;registered&lt;/code&gt; 目录。不要把固件 ZIP 压缩包直接传给它。&lt;/p&gt;
&lt;p&gt;如果以前成功提取过字体，可以把 &lt;code&gt;--firmware&lt;/code&gt; 换成：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;--shared-fonts&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/TOTK_build/totk/extracted/firmware/shared-fonts&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面是用于替换的参数片段，不是单独执行的命令。它指向的目录需要包含 &lt;code&gt;0-standard.bfttf&lt;/code&gt; 至 &lt;code&gt;5-nintendo-extension.bfttf&lt;/code&gt; 六个字体。构建器会校验文件，也会复用工作目录内已经有效的字体，不必手动改成系统上的普通字体。&lt;/p&gt;
&lt;h3 id=&quot;本体加更新以-143-为例&quot;&gt;本体加更新：以 1.4.3 为例&lt;/h3&gt;
&lt;p&gt;XCI 本体加独立更新包：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python3.14&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; build_app.py&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/base.xci&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -k&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/keys/prod.keys&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --update&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/update-1.4.3.nsp&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications/Tears of the Kingdom.app&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果本体是 NSP，完整命令为：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python3.14&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; build_app.py&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/base.nsp&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -k&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/keys/prod.keys&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --firmware&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/firmware&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --update&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Games/TOTK/update-1.4.3.nsp&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications/Tears of the Kingdom.app&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更新包为 NSZ 时，将 &lt;code&gt;--update&lt;/code&gt; 后的路径换成对应 &lt;code&gt;.nsz&lt;/code&gt; 文件即可；构建器会处理解压和校验。要构建 1.1.2 或 1.2.1，则换成相应版本的累计更新包。&lt;strong&gt;省略 &lt;code&gt;--update&lt;/code&gt; 就是构建 1.0.0，不会自动选择更新。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;几个参数可以这样记：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build_app.py&lt;/code&gt; 后的文件路径&lt;/td&gt;
&lt;td&gt;1.0.0 本体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-k&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;密钥文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选的独立累计更新包&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--firmware&lt;/code&gt; / &lt;code&gt;--shared-fonts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;二选一提供字体来源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;成品 App 的完整路径，需要以 &lt;code&gt;.app&lt;/code&gt; 结尾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--work&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;可选，自定义中间文件目录&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果不传 &lt;code&gt;-o&lt;/code&gt;，成品默认放在本体文件旁边。按本文摆放文件时，默认工作目录是 &lt;code&gt;~/Games/TOTK/TOTK_build&lt;/code&gt;，其中保存提取结果和构建日志。中途遇到可修复的问题，处理后重新运行原命令即可复用已经完成的步骤，先别急着删除整个目录。&lt;/p&gt;
&lt;h3 id=&quot;构建期间需要等多久&quot;&gt;构建期间需要等多久&lt;/h3&gt;
&lt;p&gt;脚本会提取并校验游戏数据、改写程序模块、准备着色器，最后完成打包和签名。终端继续输出进度时，先让它跑完。首次构建受机器内存、磁盘和网络影响很大，着色器编译尤其可能耗时。&lt;/p&gt;
&lt;p&gt;项目记录中，8 GB 的 M1 MacBook Air 仅 GPU 着色器编译这一步就可能花约 25 分钟。这只能帮助判断“为什么还没结束”，不能用作你的整次构建耗时预估。&lt;/p&gt;
&lt;p&gt;构建完成时，脚本会以 &lt;code&gt;--check&lt;/code&gt; 模式检查启动器。这表示可执行文件检查等步骤完成，&lt;strong&gt;还需要实际打开游戏，确认画面、声音和操作&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;5-第一次启动先让它准备好&quot;&gt;5. 第一次启动，先让它准备好&lt;/h2&gt;
&lt;p&gt;打开访达，按 &lt;code&gt;Command + Shift + G&lt;/code&gt;，输入 &lt;code&gt;~/Applications&lt;/code&gt;，双击 &lt;code&gt;Tears of the Kingdom.app&lt;/code&gt;。也可以从终端启动：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications/Tears of the Kingdom.app&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次启动会校验游戏数据并准备着色器。项目在本地观察到数据校验约需 20 秒，实际等待时间取决于机器和缓存状态。看到进度提示时，先等它完成。&lt;/p&gt;
&lt;p&gt;到达标题画面后，其余着色器仍可能在后台预热，第一次进入世界时还可能继续等待。构建器已经从你的游戏数据和公共着色器清单生成首启所需内容，通常不需要另找一份别人分享的缓存。&lt;/p&gt;
&lt;p&gt;进入没有走过的场景，仍可能遇到新的着色器变体并短暂卡顿。首次编译与持续低帧率是两种情况：如果同一处第二次经过明显改善，缓存已经发挥作用；如果一直很慢，就要继续看画面设置、内存和具体场景。&lt;/p&gt;
&lt;h3 id=&quot;app-可以移动吗&quot;&gt;App 可以移动吗&lt;/h3&gt;
&lt;p&gt;可以，但最好在构建前就确定位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;装有 Metal 工具链：&lt;/strong&gt; 预编译内容随 App 打包，移动后仍能利用这部分内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有 Metal 工具链：&lt;/strong&gt; 本机 Metal 缓存与 App 的位置有关，挪动后可能重新编译。系统清理缓存后也可能发生类似情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这也是本文直接用 &lt;code&gt;-o&lt;/code&gt; 构建到最终目录的原因。跨卷复制还可能多占一份游戏数据空间，并让 macOS 再次检查 App。&lt;/p&gt;
&lt;h2 id=&quot;6-手柄与键盘操作&quot;&gt;6. 手柄与键盘操作&lt;/h2&gt;
&lt;h3 id=&quot;手柄先留意确认键的位置&quot;&gt;手柄：先留意确认键的位置&lt;/h3&gt;
&lt;p&gt;macOS 能识别的兼容手柄，例如 DualSense 和 Xbox 手柄，会映射为 Switch Pro 手柄。默认布局按正面按键的位置对应：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;手柄上的位置&lt;/th&gt;
&lt;th&gt;Switch 按键&lt;/th&gt;
&lt;th&gt;Xbox&lt;/th&gt;
&lt;th&gt;PlayStation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;右侧&lt;/td&gt;
&lt;td&gt;A：确认、互动&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;圆圈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下方&lt;/td&gt;
&lt;td&gt;B：取消、冲刺&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;叉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上方&lt;/td&gt;
&lt;td&gt;X：跳跃&lt;/td&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;td&gt;三角&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;左侧&lt;/td&gt;
&lt;td&gt;Y：攻击&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;方块&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;因此，拿 Xbox 手柄看到游戏提示“按 A”时，默认要按右侧的 B。体感和震动能否工作，还取决于手柄本身及 macOS 是否提供相应能力。&lt;/p&gt;
&lt;p&gt;需要自定义手柄映射时，配置文件在：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/Library/Application Support/MacNativeGames/TOTK/controls.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如，给 DualSense 的触摸板点击分配地图键：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ini&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;touchpad&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; minus&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;未写出的按键继续使用默认值。修改后重启游戏；如果启动器提示某一行配置有误，按提示检查该行。删除这份配置文件可以恢复默认映射。&lt;/p&gt;
&lt;h3 id=&quot;键盘本文固定版本的布局&quot;&gt;键盘：本文固定版本的布局&lt;/h3&gt;
&lt;p&gt;下面是本文提交版本的默认键盘映射，按键按美式键盘物理位置识别。使用其他版本时，以对应 README 和游戏内快捷键提示为准。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mac 按键&lt;/th&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;W、A、S、D&lt;/td&gt;
&lt;td&gt;移动，左摇杆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;方向键&lt;/td&gt;
&lt;td&gt;转动视角，右摇杆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J&lt;/td&gt;
&lt;td&gt;A：确认、互动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K 或空格&lt;/td&gt;
&lt;td&gt;B：取消、冲刺&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;X：跳跃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U&lt;/td&gt;
&lt;td&gt;Y：攻击&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q / E&lt;/td&gt;
&lt;td&gt;L / R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Option / Shift&lt;/td&gt;
&lt;td&gt;ZL / ZR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F、T、H、G&lt;/td&gt;
&lt;td&gt;十字键左、上、右、下&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z / C&lt;/td&gt;
&lt;td&gt;按下左摇杆 / 右摇杆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Return&lt;/td&gt;
&lt;td&gt;菜单（+）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tab 或 Esc&lt;/td&gt;
&lt;td&gt;地图（−）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;7-画面设置一次调整一项&quot;&gt;7. 画面设置，一次调整一项&lt;/h2&gt;
&lt;p&gt;先用默认画面进入游戏，确认基础操作正常，再试下面的数字键。这样更容易判断是哪一项设置带来了变化。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;按键&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;切换完整信息面板、仅 FPS、全部隐藏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;切换补帧模式：关闭、30+30、半刷新率、无限制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;切换 MetalFX 2K、原生 2K、关闭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;切换 &lt;code&gt;16:9&lt;/code&gt;、适配窗口或显示器、&lt;code&gt;21:9&lt;/code&gt;；限 1.2.1 / 1.4.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;开关 MetalFX 时间性抗锯齿；限 1.4.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里有两点容易误会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;补帧显示的帧数包含生成帧，不能直接当作游戏逻辑运行帧率。&lt;/li&gt;
&lt;li&gt;“原生 2K”会调整合成画布与 UI，但 3D 场景仍有单独的渲染缩放，不能据此认为所有内部渲染目标都固定为 1440p。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;游戏默认跟随 Mac 的语言。如果想临时指定游戏为简体中文，先完全退出游戏，再运行：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --env&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; TOTK_LANG=zh-Hans&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/Applications/Tears of the Kingdom.app&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是本次启动的环境变量。已经运行的 App 不会因为再次执行 &lt;code&gt;open&lt;/code&gt; 就重新读取这些启动参数。&lt;/p&gt;
&lt;h2 id=&quot;8-存档在哪里更新前怎么备份&quot;&gt;8. 存档在哪里，更新前怎么备份&lt;/h2&gt;
&lt;p&gt;成品 App、构建工作目录和个人存档是三处不同的东西：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;th&gt;位置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;本文的成品 App&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Applications/Tears of the Kingdom.app&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本文的默认工作目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Games/TOTK/TOTK_build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存档 profile&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/Application Support/MacNativeGames/TOTK/profile&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;着色器缓存&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/Application Support/MacNativeGames/TOTK/shader-cache&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本次运行日志&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/Logs/MacNativeGames/totk.log&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上次运行日志&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/Logs/MacNativeGames/totk.previous.log&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在访达里按 &lt;code&gt;Command + Shift + G&lt;/code&gt; 就能进入这些目录。&lt;/p&gt;
&lt;p&gt;更换游戏版本前，&lt;strong&gt;先退出游戏，再把整个 &lt;code&gt;profile&lt;/code&gt; 文件夹复制到别处备份&lt;/strong&gt;。启动更新版时，项目还会在 profile 旁创建对应的升级前备份，例如 &lt;code&gt;profile-before-1.4.3&lt;/code&gt;；备份失败则停止启动。不要假设新版保存过的进度能被旧版读取，回退时应保留升级前的那份备份。&lt;/p&gt;
&lt;p&gt;更新项目代码时，获取你要使用的新版源码，再用原始本体、相同的更新包和输出路径重新构建。先退出正在运行的游戏，并保留原先的 &lt;code&gt;--firmware&lt;/code&gt;、&lt;code&gt;--shared-fonts&lt;/code&gt;、&lt;code&gt;--work&lt;/code&gt; 等必要参数。重新构建到相同路径会替换原 App；存档在上面的用户目录里独立保存。&lt;/p&gt;
&lt;h2 id=&quot;9-常见问题&quot;&gt;9. 常见问题&lt;/h2&gt;
&lt;h3 id=&quot;提示找不到-brew-或-python314&quot;&gt;提示找不到 &lt;code&gt;brew&lt;/code&gt; 或 &lt;code&gt;python3.14&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;先检查 Homebrew 安装器要求的 shell 配置是否完成，重新打开终端，再执行第二节的版本检查。即使机器上有 &lt;code&gt;python3&lt;/code&gt;，也不代表它就是 Python 3.14。使用 Apple 芯片版本的 Homebrew，避免把另一套 Intel 环境的依赖混进来。&lt;/p&gt;
&lt;h3 id=&quot;提示缺少-shared-fonts&quot;&gt;提示缺少 shared fonts&lt;/h3&gt;
&lt;p&gt;先看本体是不是 NSP。NSP 要传 &lt;code&gt;--firmware&lt;/code&gt; 或 &lt;code&gt;--shared-fonts&lt;/code&gt;；缺少系统更新分区的 XCI 也需要。确认传入的是解包后的目录，字体目录则应包含六个 &lt;code&gt;.bfttf&lt;/code&gt; 文件。&lt;/p&gt;
&lt;h3 id=&quot;提示版本或哈希不匹配&quot;&gt;提示版本或哈希不匹配&lt;/h3&gt;
&lt;p&gt;核对本体是否为 1.0.0，更新包是否为受支持的独立累计更新，文件是否完整，以及密钥是否与自己的内容相符。构建器的校验用于发现不受支持或损坏的输入，不要通过修改预期哈希跳过错误。&lt;/p&gt;
&lt;h3 id=&quot;双击后迟迟没有游戏窗口&quot;&gt;双击后迟迟没有游戏窗口&lt;/h3&gt;
&lt;p&gt;首次启动、移动 App 或跨卷复制后，可能正在进行系统检查或数据校验。先观察进度与日志；如果已经弹出明确错误，就按错误处理。构建阶段的 &lt;code&gt;--check&lt;/code&gt; 成功，只说明启动检查完成，不能替代真实游玩验证。&lt;/p&gt;
&lt;h3 id=&quot;一直卡顿或者内存压力很大&quot;&gt;一直卡顿，或者内存压力很大&lt;/h3&gt;
&lt;p&gt;先关闭其他占用大量内存的程序，查看“活动监视器”的内存压力与交换空间。用 3 键关闭额外的 2K 模式作对照，等后台预热完成，再测试同一场景。不要一边首次编译一边判断整台机器的最终性能，也不必把“删除全部缓存”当作常规优化：缓存删掉后需要重新准备。&lt;/p&gt;
&lt;h3 id=&quot;有音效但对白或背景音乐不正常&quot;&gt;有音效，但对白或背景音乐不正常&lt;/h3&gt;
&lt;p&gt;先确认 macOS 当前音频输出设备和音量，再检查日志中的 CoreAudio 或解码错误。项目已有针对流式音频路径的修复，可参考&lt;a href=&quot;https://github.com/ly05010419/MacNativeGames/blob/30a1b93d0776150fbaffd7c20f9a5ca0841c21c9/docs/audio-troubleshooting.md&quot;&gt;音频排障文档&lt;/a&gt;。仍在使用早期 App 时，用包含修复的源码和原始游戏文件重新构建；着色器编译造成的瞬间停顿也可能打断声音，需要分开判断。&lt;/p&gt;
&lt;h3 id=&quot;想安装-mod&quot;&gt;想安装 MOD&lt;/h3&gt;
&lt;p&gt;先完成一次无 MOD 的构建和启动。之后按项目的 &lt;a href=&quot;https://github.com/ly05010419/MacNativeGames/blob/30a1b93d0776150fbaffd7c20f9a5ca0841c21c9/docs/mods.md&quot;&gt;MOD 文档&lt;/a&gt;操作：代码补丁通过构建时的 &lt;code&gt;--mod&lt;/code&gt; 合入，RomFS 数据文件另有安装和清单要求。不要把其他环境里的 MOD 文件夹直接扔进 App 包。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ly05010419/MacNativeGames/blob/30a1b93d0776150fbaffd7c20f9a5ca0841c21c9/README.md&quot;&gt;MacNativeGames：本文对应版本的 README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ly05010419/MacNativeGames/blob/30a1b93d0776150fbaffd7c20f9a5ca0841c21c9/build_app.py&quot;&gt;构建脚本与参数定义&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ly05010419/MacNativeGames/blob/30a1b93d0776150fbaffd7c20f9a5ca0841c21c9/docs/first-launch-shaders.md&quot;&gt;首次启动与着色器准备说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.brew.sh/Installation&quot;&gt;Homebrew 安装文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.apple.com/documentation/Xcode/downloading-and-installing-additional-xcode-components&quot;&gt;Apple：下载与安装 Xcode 附加组件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>在你的 Linux 服务器上部署 Xboard 实现自建机场</title><link>https://blog.shishishi.cc/blog/xboard-linux-deployment-guide/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/xboard-linux-deployment-guide/</guid><description>从零搭建 Xboard 面板、Caddy HTTPS、Hysteria2 节点、订阅域名、SMTP 邮件和上线收口的完整部署记录。</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这篇教程源于我最近的一次从零搭建 Xboard 面板、Caddy HTTPS、Hysteria2 节点、订阅域名、SMTP 邮件和上线收口的完整过程。&lt;/p&gt;
&lt;p&gt;适合你的场景是：你有一台公网 Linux 服务器部署 Xboard 面板，再用一台或多台 Linux VPS 作为节点。当然 Xboard 部署在本地也不是大问题，但至少要有一台海外服务器承接节点。&lt;/p&gt;
&lt;h2 id=&quot;准备清单&quot;&gt;准备清单&lt;/h2&gt;
&lt;p&gt;开工前，建议先把下面这些东西准备齐：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一台面板服务器：Ubuntu 22.04 / 24.04 或 Debian 12，建议 1GB 内存起步，2GB 更稳，需要开放 &lt;code&gt;80/tcp&lt;/code&gt; 和 &lt;code&gt;443/tcp&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;一台或多台节点服务器：Ubuntu 22.04 / 24.04 或 Debian 12，协议使用 Hysteria2，需要开放 &lt;code&gt;8443/udp&lt;/code&gt;，或者后续使用端口跳跃时开放 &lt;code&gt;20000-29999/udp&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;一组拆开的域名：一个面板域名、一个订阅域名、一个或多个节点域名。&lt;/li&gt;
&lt;li&gt;Cloudflare DNS 管理权限：本文示例全部基于 Cloudflare 做 DNS 管理。&lt;/li&gt;
&lt;li&gt;一个 SMTP 发信服务：这里使用 Brevo 免费 SMTP。&lt;/li&gt;
&lt;li&gt;一个可接收验证邮件的邮箱入口：这里配合 Cloudflare Email Routing 使用。&lt;/li&gt;
&lt;li&gt;基础系统工具：&lt;code&gt;curl&lt;/code&gt;、&lt;code&gt;wget&lt;/code&gt;、&lt;code&gt;git&lt;/code&gt;、&lt;code&gt;ufw&lt;/code&gt;，以及后续要安装的 Docker、Caddy、certbot。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文示例域名如下：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;面板域名：v.shishishi3.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;订阅域名：474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;香港节点：hk.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;美国节点：us.474769754.xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实际使用时替换成你自己的域名。&lt;/p&gt;
&lt;h2 id=&quot;架构图&quot;&gt;架构图&lt;/h2&gt;
&lt;p&gt;本文采用直接的 Linux 部署方式：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用户 -&amp;gt; 域名 HTTPS -&amp;gt; Linux 服务器 Caddy -&amp;gt; Xboard 容器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用户 -&amp;gt; HY2 节点域名 UDP -&amp;gt; Linux 节点服务器 xboard-node&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推荐把域名职责拆开：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;v.shishishi3.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用途：Xboard 主面板、后台登录、管理员操作&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用途：订阅分发入口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;hk.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用途：香港节点域名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;us.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用途：美国节点域名&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;note&quot; data-callout=&quot;note&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;说明&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;不建议用同一个域名同时做后台、订阅和节点。分开之后排错和风控都清爽很多，同时也能降低某一项业务出问题后连带影响其他业务的风险。&lt;/p&gt;&lt;p&gt;如果你打算把订阅入口单独拆出来，买一个纯数字域名通常就够用了，一般不会超过 ¥10。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;正式教程&quot;&gt;正式教程&lt;/h2&gt;
&lt;h3 id=&quot;1-服务器准备&quot;&gt;1. 服务器准备&lt;/h3&gt;
&lt;p&gt;面板服务器建议：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;系统：Ubuntu 22.04 / 24.04 或 Debian 12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;内存：1GB 起，2GB 更稳&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;端口：80/tcp, 443/tcp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;节点服务器建议：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;系统：Ubuntu 22.04 / 24.04 或 Debian 12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;协议：Hysteria2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;端口：8443/udp，或端口跳跃 20000-29999/udp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;先更新系统：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; wget&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ca-certificates&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果这里因为之前安装过 Ookla speedtest 源报错卡住，直接跳到 &lt;a href=&quot;#pitfall-apt-source&quot;&gt;系统 apt 源报错&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;2-dns-配置&quot;&gt;2. DNS 配置&lt;/h3&gt;
&lt;p&gt;Cloudflare DNS 示例：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;A  v    面板服务器 IP  DNS only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;A  @    面板服务器 IP  DNS only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;A  hk   香港节点 IP    DNS only&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;A  us   美国节点 IP    DNS only&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根域名 &lt;code&gt;474769754.xyz&lt;/code&gt; 的主机名要填 &lt;code&gt;@&lt;/code&gt;，不是填 &lt;code&gt;474769754&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;节点域名必须灰云，也就是 &lt;code&gt;DNS only&lt;/code&gt;，不要橙云。&lt;/li&gt;
&lt;li&gt;HY2 走 UDP，Cloudflare 普通代理不转发这种流量。&lt;/li&gt;
&lt;li&gt;DNS 刚改完可能要等几分钟。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;nslookup&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;nslookup&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; hk.474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;nslookup&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; us.474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 1.1.1.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果你本机开了代理或 TUN，看到了 &lt;code&gt;198.18.x.x&lt;/code&gt; 这种 fake-ip，跳到 &lt;a href=&quot;#pitfall-fake-ip&quot;&gt;DNS 被 fake-ip 干扰&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;3-安装-docker-与-compose&quot;&gt;3. 安装 Docker 与 Compose&lt;/h3&gt;
&lt;p&gt;如果服务器还没有 Docker：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -fsSL&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://get.docker.com&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; enable&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --now&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-部署-xboard&quot;&gt;4. 部署 Xboard&lt;/h3&gt;
&lt;p&gt;Xboard 官方 &lt;code&gt;compose&lt;/code&gt; 分支提供了 Docker Compose 模板，默认把容器 &lt;code&gt;7001&lt;/code&gt; 暴露到宿主机 &lt;code&gt;7001&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /opt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -b&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --depth&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://github.com/cedar2025/Xboard&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; Xboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /opt/Xboard&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认 &lt;code&gt;compose.yaml&lt;/code&gt; 里有类似配置：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;services&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  xboard&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;    image&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;ghcr.io/cedar2025/xboard:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;    restart&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;unless-stopped&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;    ports&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;7001:7001&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;    volumes&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;./.env:/www/.env&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;./.docker/.data/:/www/.docker/.data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;./storage/logs:/www/storage/logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;./storage/theme:/www/storage/theme&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;./plugins:/www/plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;redis-data:/data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化安装，推荐 SQLite + 内置 Redis，简单好维护：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --rm&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -e&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ENABLE_SQLITE=&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -e&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ENABLE_REDIS=&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -e&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ADMIN_ACCOUNT=admin@example.com&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;  xboard&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; php&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; artisan&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; xboard:install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后会输出：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;管理员邮箱&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;管理员密码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;后台路径&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存好这些信息，然后启动长期服务：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; logs&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试本机访问：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -I&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; http://127.0.0.1:7001&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常应返回：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HTTP/1.1 200 OK&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-安装-caddy&quot;&gt;5. 安装 Caddy&lt;/h3&gt;
&lt;p&gt;安装 Caddy：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; debian-keyring&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; debian-archive-keyring&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-transport-https&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; curl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;  | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; gpg&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --dearmor&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /usr/share/keyrings/caddy-stable-archive-keyring.gpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;  | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; tee&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/apt/sources.list.d/caddy-stable.list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入 &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;v.shishishi3.com {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	reverse_proxy 127.0.0.1:7001&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;474769754.xyz {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	handle /s/* {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		reverse_proxy 127.0.0.1:7001&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	handle /api/v1/client/subscribe* {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;		reverse_proxy 127.0.0.1:7001&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	respond &quot;Not Found&quot; 404&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;解释：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;v.shishishi3.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;完整反代 Xboard 面板。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;只开放订阅路径，不暴露后台。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;/s/*&lt;/code&gt; 很重要。Xboard 实际订阅链接可能是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://474769754.xyz/s/xxxxxxxxxxxxxxxx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果只放行 &lt;code&gt;/api/v1/client/subscribe*&lt;/code&gt;，客户端导入订阅会被 Caddy 拦截。这种情况直接跳到 &lt;a href=&quot;#pitfall-subscription-404&quot;&gt;订阅 404&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;验证并重载 Caddy：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; validate&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --config&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/caddy/Caddyfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; reload&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; journalctl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -I&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://v.shishishi3.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -I&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://474769754.xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预期：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://v.shishishi3.com -&amp;gt; 200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://474769754.xyz -&amp;gt; 404&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数字域名根路径返回 &lt;code&gt;404&lt;/code&gt; 是正常的，因为我们故意不暴露面板。&lt;/p&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果这里出现 &lt;code&gt;unexpected eof while reading&lt;/code&gt;，跳到 &lt;a href=&quot;#pitfall-tls-eof&quot;&gt;Caddy TLS EOF&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;6-xboard-基础配置&quot;&gt;6. Xboard 基础配置&lt;/h3&gt;
&lt;p&gt;进入后台后先改：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;站点名称：xxx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;站点 URL： 此处应为您的域名或子域名（例如 https://v.shishishi3.com）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;订阅 URL：此处应为您的域名或子域名（例如 https://474769754.xyz）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安全建议：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;后台路径：改成随机路径&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;开放注册：上线前再开（自用的话可以不开放）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;邮箱验证：开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;登录验证码：开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;注册验证码：开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;订阅防盗：开启&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果只有一个 URL 字段，就填：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://v.shishishi3.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有单独订阅 URL，填：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;https://474769754.xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;7-邮件-smtp-配置自用可以不用考虑此部分&quot;&gt;7. 邮件 SMTP 配置（自用可以不用考虑此部分）&lt;/h3&gt;
&lt;p&gt;Cloudflare Email Routing 只能收信和转发，不能作为 SMTP 发信服务器。&lt;/p&gt;
&lt;p&gt;推荐用 Brevo 免费 SMTP：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SMTP 主机：smtp-relay.brevo.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SMTP 端口：587&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;加密方式：TLS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SMTP 用户名：Brevo 给你的 SMTP Login&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SMTP 密码：Brevo SMTP Key&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;发件人地址：noreply@474769754.xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;端口 &lt;code&gt;587&lt;/code&gt; 对应 &lt;code&gt;TLS&lt;/code&gt;/&lt;code&gt;STARTTLS&lt;/code&gt;，不要选 &lt;code&gt;SSL/TLS&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ac96b9001@smtp-brevo.com&lt;/code&gt; 这类地址是 SMTP 登录用户名，不是发件人地址。&lt;/li&gt;
&lt;li&gt;发件人可以是 &lt;code&gt;noreply@474769754.xyz&lt;/code&gt;，但必须在 Brevo 验证。&lt;/li&gt;
&lt;li&gt;Cloudflare Email Routing 可以接收 Brevo 发给 &lt;code&gt;noreply@474769754.xyz&lt;/code&gt; 的验证邮件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cloudflare DNS 里 SPF 只能有一条。如果 Cloudflare 已有：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;v=spf1 include:_spf.mx.cloudflare.net ~all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Brevo 又要求：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;v=spf1 include:spf.brevo.com ~all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要合并成：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;v=spf1 include:_spf.mx.cloudflare.net include:spf.brevo.com ~all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果发验证码收不到，先看 Xboard 日志：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /opt/Xboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; logs&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --tail=160&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; xboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -R&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;SMTP\|Brevo\|SendEmailJob\|Unauthorized&quot;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; storage/logs/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果日志里出现 &lt;code&gt;525 5.7.1 Unauthorized IP address&lt;/code&gt;，直接跳到 &lt;a href=&quot;#pitfall-smtp-unauthorized&quot;&gt;邮件验证码收不到&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;8-套餐设计&quot;&gt;8. 套餐设计&lt;/h3&gt;
&lt;p&gt;请根据您的实际节点机器和情况来，以下为我的套餐示例：&lt;/p&gt;
&lt;p&gt;如果美国节点有较大流量，香港节点只有少量流量，建议这样定位：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;美国圣何塞：主力节点，1x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;香港节点：备用节点，5x / 8x / 10x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;低价套餐示例：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;套餐名：Vela Basic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;月付：3.9 元&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;年付：36 元&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;流量：50GB/月&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;限速：300Mbps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;设备数：3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;US：1x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HK：5x 或更高&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果定价是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;月付：3 元&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;年付：30 元&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建议：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;流量：40GB/月&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;限速：200Mbps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;设备数：2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HK：8x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;套餐描述模板：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;markdown&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;## 套餐详情&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 流量：{{transfer}} GB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 速度限制：{{speed}} Mbps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 同时在线设备：{{devices}} 台&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 主力节点：美国西岸圣何塞&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 备用节点：香港高倍率节点&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;## 服务说明&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 流量{{reset_method}}重置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 支持多平台使用，适配常见 iOS、Android、Windows、macOS 客户端&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 美国圣何塞节点为主力线路，万兆带宽接入，实际可用峰值约 1.8Gbps - 6Gbps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;4.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 香港节点为备用线路，因月流量有限采用高倍率计费，适合临时切换或低延迟访问&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;5.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 适合日常浏览、社交媒体、AI 工具访问与轻度流媒体使用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;6.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 禁止 BT/PT、挖矿、扫描攻击、垃圾邮件及长时间占满带宽等滥用行为&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E5C07B&quot;&gt;7.&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; 7×24小时技术支持&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;9-创建-hy2-节点&quot;&gt;9. 创建 HY2 节点&lt;/h3&gt;
&lt;p&gt;在 Xboard 后台创建节点，类型选择：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Hysteria&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Xboard 后台新建 Hysteria 节点的基础表单&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1160&quot; height=&quot;1508&quot; src=&quot;https://blog.shishishi.cc/_astro/node-config-basic.DprqpAJX_Z1wMurh.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;示例 HK 节点：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;节点名称：HK-HY2-01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;基础倍率：5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;流量限制：0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;标签：HK, HY2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;权限组：Default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;节点地址：hk.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;连接端口：8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;服务端口：8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;协议版本：V2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;混淆：开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;混淆实现：Salamander&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;混淆密码：随机生成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SNI：hk.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;允许不安全：关闭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ECH：关闭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;上行带宽：按真实带宽填&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;下行带宽：按真实带宽填&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;绑定服务器：独立部署或绑定对应机器&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例 US 节点：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;节点名称：US-HY2-01&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;基础倍率：1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;节点地址：us.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;连接端口：8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;服务端口：8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SNI：us.474769754.xyz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ECH 不是 TLS 证书，不要把 ECH 当成证书配置。&lt;/li&gt;
&lt;li&gt;HY2 不走 Caddy 反代。&lt;/li&gt;
&lt;li&gt;Caddy 不能用 &lt;code&gt;reverse_proxy&lt;/code&gt; 代理普通 HY2 UDP 流量。&lt;/li&gt;
&lt;li&gt;节点域名必须灰云。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面这张图对应的是连接端口、服务端口、混淆、SNI 和 ECH 这些传输层相关配置：&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Xboard 后台 Hysteria 节点的传输层配置&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1158&quot; height=&quot;1506&quot; src=&quot;https://blog.shishishi.cc/_astro/node-config-transport.C1FUTCPl_ZQLeSj.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;如果你要配置端口跳跃和绑定服务器，可以参考下面这张对应界面：&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Xboard 后台 Hysteria 节点的 Hop 间隔与绑定服务器配置&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1152&quot; height=&quot;1510&quot; src=&quot;https://blog.shishishi.cc/_astro/node-config-hop-binding.Bhb1avyz_ZvbXdD.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3 id=&quot;10-安装-xboard-node&quot;&gt;10. 安装 Xboard-Node&lt;/h3&gt;
&lt;p&gt;您可以直接到 Xboard 的管理后台 -&amp;gt; 节点管理 -&amp;gt; 添加服务器 获取安装 xboard-node 的相关代码，然后将命令在服务器中执行，等待下载完成即可。&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Xboard 后台生成服务器 Token 并提供安装命令的界面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3018&quot; height=&quot;1576&quot; src=&quot;https://blog.shishishi.cc/_astro/server-token-install-dialog.CtsRUXgz_bdJes.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;p&gt;在完成安装后可以看到面板的服务器显示在线以及负载等信息&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Xboard 后台服务器管理页面显示节点在线状态&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2388&quot; height=&quot;1000&quot; src=&quot;https://blog.shishishi.cc/_astro/server-status-overview.BMF0Keqf_Z10Dgan.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3 id=&quot;11-hy2-证书配置&quot;&gt;11. HY2 证书配置&lt;/h3&gt;
&lt;p&gt;HY2 必须有 TLS 证书。&lt;/p&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果你已经看到 &lt;code&gt;protocol &quot;hysteria&quot; requires TLS certificate files&lt;/code&gt;，直接跳到 &lt;a href=&quot;#pitfall-hy2-cert&quot;&gt;服务器在线但节点未运行&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;先申请证书。节点服务器上如果没有 Web 服务占用 80，可以直接：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; certbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; certbot&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; certonly&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --standalone&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -d&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; hk.474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --agree-tos&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  -m&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; admin@474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --non-interactive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果同机有 Caddy 或 nginx 占用 80，先停服务，申请后再启动：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; stop&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; certbot&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; certonly&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --standalone&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -d&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; hk.474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --agree-tos&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; admin@474769754.xyz&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --non-interactive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;证书路径：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/etc/letsencrypt/live/hk.474769754.xyz/fullchain.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/etc/letsencrypt/live/hk.474769754.xyz/privkey.pem&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;复制到 Xboard-Node 目录：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; mkdir&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/xboard-node/certs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 0644&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/letsencrypt/live/hk.474769754.xyz/fullchain.pem&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;  /etc/xboard-node/certs/hk.fullchain.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 0600&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/letsencrypt/live/hk.474769754.xyz/privkey.pem&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;  /etc/xboard-node/certs/hk.privkey.pem&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑配置：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nano&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/xboard-node/config.yml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;顶层加入：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;yaml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;cert&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  cert_mode&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  domain&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;hk.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  cert_file&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/etc/xboard-node/certs/hk.fullchain.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  key_file&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/etc/xboard-node/certs/hk.privkey.pem&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意 &lt;code&gt;cert:&lt;/code&gt; 必须是顶层配置，不要缩进到 &lt;code&gt;panel:&lt;/code&gt; 或 &lt;code&gt;machine:&lt;/code&gt; 下面。&lt;/p&gt;
&lt;p&gt;重启：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; restart&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; xboard-node&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; journalctl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; xboard-node&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --since&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;2 minutes ago&quot;&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --no-pager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证 UDP 监听：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ss&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -lunp&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 8443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常应该看到 &lt;code&gt;8443/udp&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;US 节点同理，把域名和文件名换成：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;us.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/etc/xboard-node/certs/us.fullchain.pem&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/etc/xboard-node/certs/us.privkey.pem&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;12-防火墙与安全组&quot;&gt;12. 防火墙与安全组&lt;/h3&gt;
&lt;p&gt;面板服务器开放：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;80/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;443/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;22/tcp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;节点服务器开放：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8443/udp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;22/tcp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果使用端口跳跃：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;20000-29999/udp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ufw 示例：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; allow&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 22/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; allow&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 80/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; allow&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 443/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; allow&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 8443/udp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; enable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; status&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果云厂商有安全组，也必须放行对应 UDP。只开系统防火墙不够。&lt;/p&gt;
&lt;h3 id=&quot;13-hy2-端口跳跃&quot;&gt;13. HY2 端口跳跃&lt;/h3&gt;
&lt;p&gt;Hysteria2 支持端口跳跃。推荐范围：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;20000-29999/udp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Xboard 节点配置：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;连接端口：20000-29999&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;服务端口：8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Hop 间隔：30&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;节点服务器把端口范围转发到实际监听端口：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; iptables&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nat&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -A&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; PREROUTING&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; udp&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --dport&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 20000:29999&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -j&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; REDIRECT&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --to-ports&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 8443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存规则：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; iptables-persistent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; netfilter-persistent&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; save&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; iptables&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nat&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -S&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; PREROUTING&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 8443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ss&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -lunp&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 8443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;稳定前建议同时保留：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8443/udp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;20000-29999/udp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;稳定后可以只保留端口跳跃范围。&lt;/p&gt;
&lt;div class=&quot;tip&quot; data-callout=&quot;tip&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;排错&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;如果你担心 &lt;code&gt;ss&lt;/code&gt; 看不到端口范围，跳到 &lt;a href=&quot;#pitfall-port-hop&quot;&gt;无法看到 UDP 端口范围&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;14-用户订阅与客户端&quot;&gt;14. 用户订阅与客户端&lt;/h3&gt;
&lt;p&gt;用户创建流程：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;创建套餐 -&amp;gt; 创建用户 -&amp;gt; 给用户绑定套餐 -&amp;gt; 复制订阅链接 -&amp;gt; 客户端导入&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果客户端导入后只有 &lt;code&gt;DIRECT&lt;/code&gt;，没有节点，常见原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户没有有效套餐。&lt;/li&gt;
&lt;li&gt;套餐权限组没有包含节点权限组。&lt;/li&gt;
&lt;li&gt;节点隐藏开关开启了。&lt;/li&gt;
&lt;li&gt;节点没运行。&lt;/li&gt;
&lt;li&gt;客户端不支持 Hysteria2。&lt;/li&gt;
&lt;li&gt;订阅模板不支持 HY2。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;直接看订阅内容：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -L&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;https://474769754.xyz/s/你的token&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果输出里没有：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;hysteria&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;hy2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;hk.474769754.xyz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;US-HY2-01&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明 Xboard 没把节点发出来，优先查套餐和权限组。&lt;/p&gt;
&lt;p&gt;如果输出里有节点，但客户端不显示，换支持 HY2 的客户端或换订阅类型，例如 sing-box、Clash Meta、Mihomo。&lt;/p&gt;
&lt;h3 id=&quot;15-开放注册前检查&quot;&gt;15. 开放注册前检查&lt;/h3&gt;
&lt;p&gt;建议上线前确认：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;SMTP 测试邮件成功&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;邮箱验证开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;注册验证码开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;登录验证码开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;后台路径已改随机&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;订阅域名只放行 /s/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;套餐权限组配置正确&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;节点倍率配置正确&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HK 节点倍率较高&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;云安全组只开放必要端口&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;试用策略建议：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;注册送套餐：关闭&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;或 1GB / 1 天&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;低价套餐不要开放过多 HK 流量&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;16-上线收口&quot;&gt;16. 上线收口&lt;/h3&gt;
&lt;p&gt;最终建议端口：&lt;/p&gt;
&lt;p&gt;面板服务器：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;80/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;443/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;22/tcp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;节点服务器：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;22/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;20000-29999/udp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不用端口跳跃：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;22/tcp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8443/udp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Caddy 只暴露：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;面板域名完整反代&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;订阅域名只放行 /s/* 和必要 API&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后台设置：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;开放注册：按需开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;邮箱验证：开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;验证码：开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;后台路径：随机&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;试用额度：极低或关闭&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;节点策略：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;US 主力，1x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HK 备用，5x / 8x / 10x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就能从测试态进入公开上线态。&lt;/p&gt;
&lt;h2 id=&quot;注意事项&quot;&gt;注意事项&lt;/h2&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-apt-source&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;系统-apt-源报错&quot;&gt;系统 apt 源报错&lt;/h3&gt;
&lt;p&gt;如果遇到这个错误：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;E: The repository &apos;https://packagecloud.io/ookla/speedtest-cli/ubuntu noble Release&apos; does not have a Release file.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明 Ookla speedtest 的 apt 源不支持当前系统版本，先禁用它：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -R&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;packagecloud.io/ookla&quot;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/apt/sources.list&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/apt/sources.list.d/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假设输出是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/etc/apt/sources.list.d/ookla_speedtest-cli.list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;禁用：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; mv&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/apt/sources.list.d/ookla_speedtest-cli.list&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;  /etc/apt/sources.list.d/ookla_speedtest-cli.list.disabled&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-get&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是我们实际踩过的坑。安装脚本里只要跑 &lt;code&gt;apt-get update&lt;/code&gt;，这个坏源就会把整套流程卡住。&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-fake-ip&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;dns-被-fake-ip-干扰&quot;&gt;DNS 被 fake-ip 干扰&lt;/h3&gt;
&lt;p&gt;如果你本机开了代理或 TUN，可能会看到 &lt;code&gt;198.18.x.x&lt;/code&gt; 这种 fake-ip。这时用公共 DNS 或临时关闭代理排查。&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-tls-eof&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;caddy-tls-eof&quot;&gt;Caddy TLS EOF&lt;/h3&gt;
&lt;p&gt;现象：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;curl: (35) TLS connect error: unexpected eof while reading&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;排查：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;nslookup&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; 域名&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 1.1.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; validate&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --config&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/caddy/Caddyfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; journalctl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常见原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DNS 没指到服务器。&lt;/li&gt;
&lt;li&gt;Caddyfile 没上传到服务器。&lt;/li&gt;
&lt;li&gt;Caddy 没 reload。&lt;/li&gt;
&lt;li&gt;80/443 没放行。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-subscription-404&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;订阅-404&quot;&gt;订阅 404&lt;/h3&gt;
&lt;p&gt;如果响应头是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HTTP/2 404&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;server: Caddy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;content-length: 9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明 Caddy 拦了。确认 Caddyfile 放行：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;handle /s/* {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	reverse_proxy 127.0.0.1:7001&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-smtp-unauthorized&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;邮件验证码收不到&quot;&gt;邮件验证码收不到&lt;/h3&gt;
&lt;p&gt;看日志：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -R&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;SendEmailJob\|SMTP\|Unauthorized&quot;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /opt/Xboard/storage/logs/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;525 5.7.1 Unauthorized IP address&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这表示 Brevo 拒绝了发信出口 IP。查 Xboard 容器出口 IP：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /opt/Xboard&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; docker&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; compose&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; exec&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -T&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; xboard&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://ifconfig.me&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把返回的 IP 加到 Brevo 的 &lt;code&gt;Authorized IP addresses&lt;/code&gt; 里。&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-hy2-cert&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;服务器在线但节点未运行&quot;&gt;服务器在线但节点未运行&lt;/h3&gt;
&lt;p&gt;看日志：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; journalctl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; xboard-node&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 120&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --no-pager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;requires TLS certificate files&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明 HY2 缺证书配置，按第 11 节补 &lt;code&gt;cert:&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-node-idle&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;节点运行但无人使用&quot;&gt;节点运行但无人使用&lt;/h3&gt;
&lt;p&gt;这是正常状态，表示节点已经启动，只是当前没有客户端连接。&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-port-hop&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;无法看到-udp-端口范围&quot;&gt;无法看到 UDP 端口范围&lt;/h3&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ss&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -lunp&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 8443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果使用端口跳跃，&lt;code&gt;ss&lt;/code&gt; 不显示 &lt;code&gt;20000-29999&lt;/code&gt; 是正常的，因为程序实际监听的是 &lt;code&gt;8443&lt;/code&gt;。要看 iptables：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; iptables&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nat&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -S&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; PREROUTING&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 20000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时别忘了云厂商安全组也要放行 &lt;code&gt;20000-29999/udp&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a id=&quot;pitfall-delete-plan&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;删除套餐失败&quot;&gt;删除套餐失败&lt;/h3&gt;
&lt;p&gt;如果提示“该订阅下存在订单无法删除”，不要硬删。&lt;/p&gt;
&lt;p&gt;推荐：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;禁用套餐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;隐藏套餐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;关闭购买&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;改名 Test-Deprecated&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生产系统里保留历史订单引用是正常设计。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cedar2025/Xboard/tree/compose&quot;&gt;Xboard compose 分支与 &lt;code&gt;ghcr.io/cedar2025/xboard:latest&lt;/code&gt; 镜像&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cedar2025/Xboard/compose/compose.yaml&quot;&gt;Xboard 官方 compose 文件（宿主机 &lt;code&gt;7001&lt;/code&gt; 映射到容器 &lt;code&gt;7001&lt;/code&gt;）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cedar2025/Xboard-Node&quot;&gt;Xboard-Node 的 Hysteria2、machine mode、node mode 和安装脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://v2.hysteria.network/docs/advanced/Port-Hopping/&quot;&gt;Hysteria2 Port Hopping 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/email-service/get-started/&quot;&gt;Cloudflare Email Routing 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://help.brevo.com/hc/en-us/articles/7924908994450-Send-transactional-emails-using-Brevo-SMTP&quot;&gt;Brevo SMTP 配置文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>从磁盘到文件：用 macOS 理解 GPT、APFS、容器和卷</title><link>https://blog.shishishi.cc/blog/macos-file-system/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/macos-file-system/</guid><description>从 macOS 的角度梳理物理磁盘、GPT 分区、APFS 容器、卷、挂载点和系统卷组之间的关系。</description><pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很多人第一次看 macOS 的磁盘结构时，都会被几个词绕住：磁盘、分区、容器、卷、文件系统、挂载点。它们看起来都像「硬盘的一部分」，但其实处在不同层级。&lt;/p&gt;
&lt;p&gt;最容易混的地方在于，传统磁盘结构常常是「一个分区就是一个卷」，而现代 macOS 默认使用 APFS。APFS 在分区和卷之间又加了一层「容器」，一个容器里可以放多个卷，并且这些卷共享同一片空间。&lt;/p&gt;
&lt;p&gt;所以这篇文章不从抽象定义开始，而是按 macOS 上最常见的路径往下看：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;物理磁盘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; GPT 分区表&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 分区&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; APFS 容器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; APFS 卷&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 文件和目录&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是普通 exFAT 移动硬盘，结构通常更简单：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;物理磁盘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; GPT / MBR 分区表&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 分区&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; exFAT 文件系统卷&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 文件和目录&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理解这两条线以后，磁盘工具里的 &lt;code&gt;Macintosh HD&lt;/code&gt;、&lt;code&gt;Macintosh HD - Data&lt;/code&gt;、&lt;code&gt;Preboot&lt;/code&gt;、&lt;code&gt;Recovery&lt;/code&gt;、&lt;code&gt;VM&lt;/code&gt;，以及命令行里的 &lt;code&gt;/dev/disk0&lt;/code&gt;、&lt;code&gt;/dev/disk0s2&lt;/code&gt;、&lt;code&gt;disk3&lt;/code&gt;，就不会再像一堆突然冒出来的设备。&lt;/p&gt;
&lt;h2 id=&quot;物理磁盘真正的存储设备&quot;&gt;物理磁盘：真正的存储设备&lt;/h2&gt;
&lt;p&gt;物理磁盘就是实际存在的存储设备，比如内置 SSD、外置硬盘、U 盘、SD 卡、NVMe 硬盘。&lt;/p&gt;
&lt;p&gt;在 macOS 里，它可能显示为：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/dev/disk0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/dev/disk4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但要注意，&lt;code&gt;disk0&lt;/code&gt;、&lt;code&gt;disk4&lt;/code&gt; 这类编号不是永久身份。插拔设备、重启系统、挂载磁盘镜像后，编号都可能变化。判断当前磁盘结构时，更可靠的方式是直接看：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从底层看，物理磁盘本质上是一串连续的块。分区表负责说明：哪些块属于哪个分区。&lt;/p&gt;
&lt;h2 id=&quot;gpt磁盘上的分区地图&quot;&gt;GPT：磁盘上的分区地图&lt;/h2&gt;
&lt;p&gt;GPT 是现代 macOS 常见的分区表格式。它不管理文件，也不知道你的照片、文档、应用在哪里。它只记录磁盘被怎么切分。&lt;/p&gt;
&lt;p&gt;GPT 通常记录这些信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分区从哪里开始。&lt;/li&gt;
&lt;li&gt;分区到哪里结束。&lt;/li&gt;
&lt;li&gt;分区类型是什么。&lt;/li&gt;
&lt;li&gt;分区 GUID 是什么。&lt;/li&gt;
&lt;li&gt;分区名称是什么。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 GPT 更像磁盘级别的地图。它告诉系统「这块地方是 EFI 分区，那块地方是 APFS 分区」，但不会进入分区内部管理文件。&lt;/p&gt;
&lt;p&gt;老设备或某些兼容性场景里也会看到 MBR。对于现在的 Mac 系统盘和大多数现代外置盘，GPT 才是更常见的选择。&lt;/p&gt;
&lt;h2 id=&quot;分区磁盘上划出来的一段连续空间&quot;&gt;分区：磁盘上划出来的一段连续空间&lt;/h2&gt;
&lt;p&gt;分区是物理磁盘上的一段连续空间。&lt;/p&gt;
&lt;p&gt;在 macOS 里，常见命名类似：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;disk0      整块磁盘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;disk0s1    第 1 个分区&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;disk0s2    第 2 个分区&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个分区里面可以放很多东西，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APFS&lt;/li&gt;
&lt;li&gt;HFS+&lt;/li&gt;
&lt;li&gt;exFAT&lt;/li&gt;
&lt;li&gt;FAT32&lt;/li&gt;
&lt;li&gt;NTFS&lt;/li&gt;
&lt;li&gt;Linux ext4&lt;/li&gt;
&lt;li&gt;EFI System Partition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传统理解里经常是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;一个分区 = 一个文件系统 = 一个卷&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比如一个普通 exFAT U 盘，大概率就是这样：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;GPT 分区&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; exFAT 文件系统&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 卷名 DATA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 文件&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种情况下，分区和卷看起来几乎是同一个东西。但 APFS 不完全按这个直觉来。&lt;/p&gt;
&lt;h2 id=&quot;文件系统文件怎么被组织&quot;&gt;文件系统：文件怎么被组织&lt;/h2&gt;
&lt;p&gt;文件系统负责定义文件如何存储、目录如何组织、权限如何记录、空闲空间如何管理。&lt;/p&gt;
&lt;p&gt;常见文件系统包括：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文件系统&lt;/th&gt;
&lt;th&gt;常见平台&lt;/th&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;APFS&lt;/td&gt;
&lt;td&gt;macOS、iOS、iPadOS&lt;/td&gt;
&lt;td&gt;Apple 的现代文件系统，支持空间共享、快照、克隆、加密等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HFS+&lt;/td&gt;
&lt;td&gt;老版本 macOS&lt;/td&gt;
&lt;td&gt;APFS 之前的 Apple 文件系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTFS&lt;/td&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Windows 系统盘常用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;exFAT&lt;/td&gt;
&lt;td&gt;跨平台&lt;/td&gt;
&lt;td&gt;适合 U 盘、移动硬盘，兼容 macOS 和 Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAT32&lt;/td&gt;
&lt;td&gt;老设备&lt;/td&gt;
&lt;td&gt;兼容性高，但单文件最大 4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ext4&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;Linux 常用文件系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Btrfs&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;支持快照、校验等现代特性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XFS&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;常见于大文件和服务器场景&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;文件系统会影响很多具体行为，比如文件名规则、文件大小上限、权限模型、是否支持快照、是否区分大小写、是否支持日志或写时复制。&lt;/p&gt;
&lt;p&gt;macOS 当前最重要的文件系统是 APFS。它不只是「一种格式」，还带来了容器、空间共享、卷组、快照这些管理方式。&lt;/p&gt;
&lt;h2 id=&quot;apfs-容器共享空间池&quot;&gt;APFS 容器：共享空间池&lt;/h2&gt;
&lt;p&gt;APFS 的核心变化是「容器」。&lt;/p&gt;
&lt;p&gt;一个 GPT 分区可以被用作 APFS 的物理存储空间，然后在里面创建一个 APFS 容器。这个容器再包含多个 APFS 卷。&lt;/p&gt;
&lt;p&gt;典型结构像这样：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;物理磁盘 disk0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; GPT 分区 disk0s2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    -&amp;gt; APFS Container disk3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      -&amp;gt; Macintosh HD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      -&amp;gt; Macintosh HD - Data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      -&amp;gt; Preboot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      -&amp;gt; Recovery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      -&amp;gt; VM&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;disk3&lt;/code&gt; 虽然也叫 &lt;code&gt;disk&lt;/code&gt;，但它不是另一块物理硬盘，而是 macOS 合成出来的 APFS 容器设备。&lt;/p&gt;
&lt;p&gt;APFS 容器最大的特点是：里面的卷可以共享空间。比如一个 1 TB 的 APFS 容器里有两个卷，卷 A 当前用了 200 GB，卷 B 当前用了 100 GB，那么剩下的空间不是预先固定给某个卷，而是仍然属于容器，可以按需分配给任意卷。&lt;/p&gt;
&lt;p&gt;这和传统分区很不一样。传统分区如果提前切成两个 500 GB 分区，那么 A 分区用不完的空间，B 分区不能自动拿来用。APFS 容器则更灵活：多个卷共享容器里的空闲空间。&lt;/p&gt;
&lt;p&gt;当然，APFS 卷也不是完全没有边界。需要手动控制时，可以给卷设置 reserve size 和 quota size：前者表示保底空间，后者表示最多能用多少空间。&lt;/p&gt;
&lt;h2 id=&quot;卷真正被挂载和使用的单位&quot;&gt;卷：真正被挂载和使用的单位&lt;/h2&gt;
&lt;p&gt;卷是操作系统可以挂载、命名、显示，并让用户读写文件的逻辑单位。&lt;/p&gt;
&lt;p&gt;在 Finder 里你看到的这些名字，通常都是卷：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Macintosh HD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Macintosh HD - Data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Backup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;MyDisk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在命令行里，外置卷通常挂载到：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/Volumes/Backup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows 里的 &lt;code&gt;C:&lt;/code&gt;、&lt;code&gt;D:&lt;/code&gt; 也可以理解为卷。Linux 里常见的 &lt;code&gt;/mnt/data&lt;/code&gt;、&lt;code&gt;/media/xxx&lt;/code&gt; 则是卷被挂载后的访问位置。&lt;/p&gt;
&lt;p&gt;所以「卷」强调的是操作系统层面的可用单位；「分区」强调的是磁盘上的连续空间；「APFS 容器」强调的是多个 APFS 卷共享的空间池。&lt;/p&gt;
&lt;h2 id=&quot;挂载把卷接入目录树&quot;&gt;挂载：把卷接入目录树&lt;/h2&gt;
&lt;p&gt;挂载就是把一个卷接入操作系统的目录树。一个外置硬盘卷名叫 &lt;code&gt;Backup&lt;/code&gt;，在 macOS 中通常会挂载到：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/Volumes/Backup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没有挂载时，卷可能存在，文件系统也可能完好，但 Finder 里看不到，也无法通过正常路径访问里面的文件。&lt;/p&gt;
&lt;p&gt;常见命令包括：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; mount&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /dev/disk4s2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; unmount&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /dev/disk4s2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; unmountDisk&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /dev/disk4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;unmount&lt;/code&gt; 是卸载某个卷或分区，&lt;code&gt;unmountDisk&lt;/code&gt; 是卸载整块磁盘上的所有可卸载卷。&lt;/p&gt;
&lt;h2 id=&quot;macintosh-hd-和-macintosh-hd---data-为什么分开&quot;&gt;Macintosh HD 和 Macintosh HD - Data 为什么分开&lt;/h2&gt;
&lt;p&gt;从 macOS Catalina 开始，Apple 把系统文件和用户数据拆开。大致可以理解为：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Macintosh HD          系统卷&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Macintosh HD - Data   数据卷&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;系统卷存放 macOS 系统内容。现代 macOS 中，它是只读的；从 macOS Big Sur 开始，系统卷进一步成为 Signed System Volume，也就是签名系统卷。系统会验证系统内容是否被篡改，如果校验失败，启动过程会被阻止或要求重新安装系统。&lt;/p&gt;
&lt;p&gt;数据卷则存放用户文件、应用数据、可写配置等内容。macOS 通过 APFS Volume Group 和 firmlink 等机制，把系统卷和数据卷在用户视角下组合成一个系统。&lt;/p&gt;
&lt;p&gt;所以你在 Finder 里看起来像是在访问一个统一的磁盘，底下其实是两个职责不同的卷协同工作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统卷负责保持系统内容稳定、可验证。&lt;/li&gt;
&lt;li&gt;数据卷负责保存用户和应用产生的可写数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这也是为什么不要简单地把 &lt;code&gt;Macintosh HD - Data&lt;/code&gt; 当成「多出来的重复磁盘」。它是现代 macOS 文件管理体系的一部分。&lt;/p&gt;
&lt;h2 id=&quot;apfs-卷组把相关卷组合起来&quot;&gt;APFS 卷组：把相关卷组合起来&lt;/h2&gt;
&lt;p&gt;APFS Volume Group 是一组有关联的 APFS 卷。&lt;/p&gt;
&lt;p&gt;最典型的就是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Macintosh HD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Macintosh HD - Data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它们组成系统卷组。这个设计让 macOS 可以同时做到两件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统内容独立、只读、可验证。&lt;/li&gt;
&lt;li&gt;用户数据保持可写，并继续出现在熟悉的目录位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用户平时看到的是一个整体，但系统内部知道哪些路径属于系统卷，哪些内容来自数据卷。&lt;/p&gt;
&lt;h2 id=&quot;prebootrecoveryvm-是什么&quot;&gt;Preboot、Recovery、VM 是什么&lt;/h2&gt;
&lt;p&gt;APFS 系统容器里通常还会看到一些系统维护卷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Preboot&lt;/code&gt;：保存启动 APFS 系统卷所需的信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Recovery&lt;/code&gt;：保存恢复环境，用于重装 macOS、磁盘工具、终端和系统恢复。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VM&lt;/code&gt;：保存虚拟内存、交换文件、休眠相关数据。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Update&lt;/code&gt;：部分 macOS 版本中可能出现，用于系统更新流程。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些卷一般由系统自动维护，不建议手动删除。尤其是系统盘上的 &lt;code&gt;Preboot&lt;/code&gt; 和 &lt;code&gt;Recovery&lt;/code&gt;，看起来不常用，但真正出问题时可能就是救命入口。&lt;/p&gt;
&lt;h2 id=&quot;格式化抹掉删除卷删除分区不是一回事&quot;&gt;格式化、抹掉、删除卷、删除分区不是一回事&lt;/h2&gt;
&lt;p&gt;磁盘工具里的几个操作名字很像，但层级不同。&lt;/p&gt;
&lt;p&gt;格式化通常指在某个分区或卷上创建新的文件系统。例如：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; eraseVolume&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ExFAT&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; DATA&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /dev/disk4s2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这表示在 &lt;code&gt;/dev/disk4s2&lt;/code&gt; 上创建 exFAT 文件系统，并把卷名设为 &lt;code&gt;DATA&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;抹掉磁盘则可能更彻底。如果你选中整块物理磁盘抹掉，macOS 可能会重建分区表、创建新分区、创建文件系统和卷：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; eraseDisk&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ExFAT&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; DATA&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; GPT&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /dev/disk4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会影响整块磁盘，原有分区都会消失。&lt;/p&gt;
&lt;p&gt;删除 APFS 卷和删除 APFS 分区也不同。&lt;/p&gt;
&lt;p&gt;删除 APFS 卷后，空间回到 APFS 容器内部：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;APFS Container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Volume B&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Free space inside container&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除 APFS 分区后，空间才回到 GPT 层面的未分配空间：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;GPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; EFI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Free Space&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Other Partition&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这就是很多人疑惑的地方：为什么我删了一个 APFS 卷，磁盘工具里没有出现真正的「未分配空间」？因为你只是删掉了容器内部的卷，而不是删掉 GPT 层面的分区。&lt;/p&gt;
&lt;h2 id=&quot;快照不是复制一整份文件&quot;&gt;快照：不是复制一整份文件&lt;/h2&gt;
&lt;p&gt;APFS 支持快照。快照记录的是某一时刻的文件系统状态，不是一开始就完整复制所有数据。&lt;/p&gt;
&lt;p&gt;APFS 使用 Copy-on-Write。刚创建快照时，它占用的额外空间很少；之后文件发生变化，旧数据块被保留下来，快照才能继续看到旧状态。&lt;/p&gt;
&lt;p&gt;这也是 Time Machine、系统更新回滚和系统恢复能够高效工作的基础之一。&lt;/p&gt;
&lt;p&gt;不过快照也会占空间。如果你发现磁盘空间明明删了文件却没有马上回来，除了废纸篓、缓存、云同步之外，也可以检查是否有本地快照仍然保留了旧数据。&lt;/p&gt;
&lt;h2 id=&quot;efi-分区别随便删的启动辅助区域&quot;&gt;EFI 分区：别随便删的启动辅助区域&lt;/h2&gt;
&lt;p&gt;GPT 磁盘上常见一个 EFI System Partition，也叫 ESP。它通常使用 FAT32，用来保存 UEFI 启动相关文件。&lt;/p&gt;
&lt;p&gt;macOS 外置盘有时也会创建 EFI 分区，即使它不一定真的用于启动。系统盘上的 EFI 分区不要随意删除。它平时安静得像不存在，但它属于启动链路的一部分。&lt;/p&gt;
&lt;h2 id=&quot;raid-和普通卷的关系&quot;&gt;RAID 和普通卷的关系&lt;/h2&gt;
&lt;p&gt;RAID 是把多个磁盘组合起来的技术。比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RAID 0：条带化，提高性能，没有冗余。&lt;/li&gt;
&lt;li&gt;RAID 1：镜像，提高冗余。&lt;/li&gt;
&lt;li&gt;RAID 5：带校验的冗余方案。&lt;/li&gt;
&lt;li&gt;RAID 10：镜像加条带。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RAID 组合后，操作系统通常会看到一个新的逻辑磁盘。然后这个逻辑磁盘上仍然可以继续建立分区表、分区、文件系统和卷。&lt;/p&gt;
&lt;p&gt;也就是说 RAID 不替代文件系统，它在更底层把多个物理磁盘组合成一个逻辑设备。&lt;/p&gt;
&lt;h2 id=&quot;看到-diskutil-输出时怎么判断&quot;&gt;看到 diskutil 输出时怎么判断&lt;/h2&gt;
&lt;p&gt;在 macOS 中，快速判断可以看这些线索：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;看到的内容&lt;/th&gt;
&lt;th&gt;通常表示&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/dev/disk4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;整块磁盘，可能是物理磁盘，也可能是合成设备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/dev/disk4s2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;某块磁盘上的第 2 个分区&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GUID_partition_scheme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;这块磁盘使用 GPT 分区表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EFI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;EFI System Partition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Apple_APFS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;这个分区被用作 APFS 物理存储&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;APFS Container&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;APFS 容器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;APFS Volume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;APFS 容器内部的卷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Free Space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GPT 层面的未分配空间&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;还有一个非常实用的命令：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;diskutil&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apfs&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它会比 &lt;code&gt;diskutil list&lt;/code&gt; 更清楚地展示 APFS 容器、卷、卷组、快照等信息。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;macOS 上最重要的结论是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;APFS 不是简单的“一个分区一个卷”。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;它更像是在一个分区里建立容器，再由容器管理多个共享空间的卷。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理解这一点之后，再看磁盘工具里的 &lt;code&gt;Macintosh HD&lt;/code&gt;、&lt;code&gt;Macintosh HD - Data&lt;/code&gt;、&lt;code&gt;Preboot&lt;/code&gt;、&lt;code&gt;Recovery&lt;/code&gt;、&lt;code&gt;VM&lt;/code&gt;，就不会觉得它们是凭空多出来的几块硬盘了。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/guide/disk-utility/add-delete-or-erase-apfs-volumes-dskua9e6a110/mac&quot;&gt;Disk Utility: Add, delete, or erase APFS volumes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/guide/security/signed-system-volume-security-secd698747c9/web&quot;&gt;Apple Platform Security: Signed system volume security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Linux 服务器部署 QQ 机器人：NapCat + NoneBot2 + GsCore + Caddy</title><link>https://blog.shishishi.cc/blog/linux-qq-bot-napcat-nonebot-gscore-caddy/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/linux-qq-bot-napcat-nonebot-gscore-caddy/</guid><description>一篇从零到可用的部署记录，覆盖 NapCat、NoneBot2、GsCore、Caddy 反代，以及我们实际踩到的乱码、命令缺失、本地绑定和证书失败问题。</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这次我想在 Linux 服务器上把一套 QQ 机器人真正跑稳，于是最后落下来的方案是 &lt;code&gt;NapCat + NoneBot2 + GsCore&lt;/code&gt;，前面再加一层 &lt;code&gt;Caddy&lt;/code&gt; 做 HTTPS 和反向代理。思路并不复杂，但真正一路走下来，问题几乎都出在那些“看起来只是小细节”的地方：终端编码、脚手架命令、Web 后台监听地址、证书验证，甚至是最基础的 DNS。&lt;/p&gt;
&lt;p&gt;这篇文章把整套过程整理成一份可以直接照着走的教程，也把我们这次遇到的坑和修法一并写下来。它不是“理想环境下一次成功”的笔记，而是更接近真实部署现场的版本。&lt;/p&gt;
&lt;h2 id=&quot;最终架构&quot;&gt;最终架构&lt;/h2&gt;
&lt;p&gt;我们最终采用的是下面这条链路：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;QQ / 群消息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; NapCat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; NoneBot2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; nonebot-plugin-genshinuid&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; GsCore&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; 具体业务插件（如 GenshinUID）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要把后台安全地开放到公网，则再额外加一层：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Browser&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Caddy (HTTPS / reverse_proxy)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; NapCat WebUI / GsCore WebConsole&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我有两个实际建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;机器人消息链路和后台管理链路要分开理解。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;6099&lt;/code&gt; 和 &lt;code&gt;8765&lt;/code&gt; 不要直接裸露到公网，尽量只让 &lt;code&gt;Caddy&lt;/code&gt; 回源到本机端口。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;组件职责&quot;&gt;组件职责&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;NapCat&lt;/code&gt;：负责协议端和 QQ 登录，本质上是机器人和 QQ 之间的入口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoneBot2&lt;/code&gt;：负责 Bot 框架本身，接收 OneBot 事件、分发插件、组织逻辑。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GsCore&lt;/code&gt;：早柚核心，负责统一连接和插件生态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nonebot-plugin-genshinuid&lt;/code&gt;：NoneBot2 侧连接 GsCore 的官方插件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Caddy&lt;/code&gt;：负责自动 HTTPS、反向代理，以及把后台入口放到统一域名下。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;环境准备&quot;&gt;环境准备&lt;/h2&gt;
&lt;p&gt;本文默认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统是 Ubuntu / Debian 系 Linux&lt;/li&gt;
&lt;li&gt;你有 &lt;code&gt;root&lt;/code&gt; 或 &lt;code&gt;sudo&lt;/code&gt; 权限&lt;/li&gt;
&lt;li&gt;服务器已经可以联网&lt;/li&gt;
&lt;li&gt;你已经准备好一个用于登录的 QQ 账号&lt;/li&gt;
&lt;li&gt;你有一个域名，并且后面会用 Cloudflare 管理 DNS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议目录结构像这样：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/qqbot        # NoneBot2 项目&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/gsuid_core   # GsCore 本体&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;第一步安装-napcat&quot;&gt;第一步：安装 NapCat&lt;/h2&gt;
&lt;p&gt;NapCat 官方 Linux 安装器可以直接使用：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; napcat.sh&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://nclatest.znin.net/NapNeko/NapCat-Installer/main/script/install.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;bash&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; napcat.sh&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --tui&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装后，通常可以通过下面的命令再次进入它的 TUI：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; napcat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;我们遇到的第一个坑napcat-shell-乱码&quot;&gt;我们遇到的第一个坑：NapCat Shell 乱码&lt;/h3&gt;
&lt;p&gt;刚打开 &lt;code&gt;Napcat Shell&lt;/code&gt; 时，我们看到的是一堆类似 &lt;code&gt;~@~A&lt;/code&gt;、&lt;code&gt;~M~U&lt;/code&gt; 的乱码，而不是正常中文界面。这不是 NapCat 坏了，而是典型的终端字符集和 &lt;code&gt;TERM&lt;/code&gt; 设置问题。&lt;/p&gt;
&lt;p&gt;先检查：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;locale&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; $LANG&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; $TERM&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果不是 UTF-8，可以先临时修正：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; LANG&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;zh_CN&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; LC_ALL&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;zh_CN&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; TERM&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;xterm-256color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; napcat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果服务器没有对应 locale，再补：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; locales&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; locale-gen&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; zh_CN.UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update-locale&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; LANG=zh_CN.UTF-8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你不想使用中文 locale，用通用的 &lt;code&gt;C.UTF-8&lt;/code&gt; 也可以：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; LANG&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; LC_ALL&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; TERM&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;xterm-256color&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; napcat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;登录-napcat-webui&quot;&gt;登录 NapCat WebUI&lt;/h3&gt;
&lt;p&gt;NapCat 的 WebUI 默认通常在 &lt;code&gt;6099&lt;/code&gt; 端口。启动后，可以在日志里看到带 token 的访问地址。登录后完成 QQ 扫码，并修改好 WebUI 密码。&lt;/p&gt;
&lt;h2 id=&quot;第二步创建-nonebot2-项目&quot;&gt;第二步：创建 NoneBot2 项目&lt;/h2&gt;
&lt;p&gt;先建立 Python 虚拟环境：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ~/qqbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ~/qqbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; venv&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .venv&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --prompt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nonebot2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装基础依赖：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;nonebot2[fastapi]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nonebot-adapter-onebot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;.env&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dotenv&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;HOST&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;127.0.0.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;PORT&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;ONEBOT_ACCESS_TOKEN&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;改成你自己的长随机串&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;COMMAND_START&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;COMMAND_SEP&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;bot.py&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; nonebot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; nonebot.adapters.onebot.v11 &lt;/span&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; Adapter &lt;/span&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; OneBotV11Adapter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;nonebot.&lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;init&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;driver &lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; nonebot.&lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;get_driver&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;driver.&lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;register_adapter&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;(OneBotV11Adapter)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C678DD&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt; __name__&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;__main__&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;    nonebot.&lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动试一下：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; bot.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;第三步让-napcat-连到-nonebot2&quot;&gt;第三步：让 NapCat 连到 NoneBot2&lt;/h2&gt;
&lt;p&gt;在 NapCat 的网络配置里，新建一个 &lt;code&gt;WebSocket 客户端&lt;/code&gt;，把它指向：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;ws://127.0.0.1:8080/onebot/v11/ws&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Token 要和 &lt;code&gt;.env&lt;/code&gt; 中的 &lt;code&gt;ONEBOT_ACCESS_TOKEN&lt;/code&gt; 保持一致。&lt;/p&gt;
&lt;p&gt;如果出现 &lt;code&gt;403&lt;/code&gt;，优先检查 token 是否一字不差。&lt;/p&gt;
&lt;h2 id=&quot;第四步安装-gscore&quot;&gt;第四步：安装 GsCore&lt;/h2&gt;
&lt;p&gt;根据 GsCore 官方文档，把它单独安装在 Bot 目录的同级：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ~&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://github.com/Genshin-bots/gsuid_core.git&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --depth=1&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --single-branch&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; gsuid_core&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方更推荐 &lt;code&gt;uv&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; python&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 3.13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; sync&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --python&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 3.13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; python&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ensurepip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动 GsCore：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;uv&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; core&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首次启动后，会生成：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/gsuid_core/data/config.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/gsuid_core/data/core_config.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;第五步在-nonebot2-里接入-gscore&quot;&gt;第五步：在 NoneBot2 里接入 GsCore&lt;/h2&gt;
&lt;p&gt;GsCore 在 NoneBot2 侧的官方插件是 &lt;code&gt;nonebot-plugin-genshinuid&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;我们遇到的第二个坑nb-命令不存在&quot;&gt;我们遇到的第二个坑：&lt;code&gt;nb&lt;/code&gt; 命令不存在&lt;/h3&gt;
&lt;p&gt;我们一开始按文档执行：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;nb&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; plugin&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nonebot-plugin-genshinuid&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果报错：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-bash: nb: command not found&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原因不是项目坏了，而是环境里没装 &lt;code&gt;nb-cli&lt;/code&gt;。&lt;code&gt;nb&lt;/code&gt; 不是 Python 自带命令，它是 NoneBot 的脚手架。&lt;/p&gt;
&lt;p&gt;有两种解法：&lt;/p&gt;
&lt;h4 id=&quot;解法-a补齐-nb-cli&quot;&gt;解法 A：补齐 &lt;code&gt;nb-cli&lt;/code&gt;&lt;/h4&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ~/qqbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nb-cli&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;nb&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; plugin&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nonebot-plugin-genshinuid&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;解法-b直接用-pip&quot;&gt;解法 B：直接用 &lt;code&gt;pip&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;如果你已经手写了 &lt;code&gt;bot.py&lt;/code&gt;，其实直接安装插件通常就够了：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ~/qqbot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .venv/bin/activate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;pip&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; nonebot-plugin-genshinuid&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这次我们更推荐第二种，因为路径更短，也更少引入额外依赖。&lt;/p&gt;
&lt;h3 id=&quot;给-nonebot-env-加上-gscore-配置&quot;&gt;给 NoneBot &lt;code&gt;.env&lt;/code&gt; 加上 GsCore 配置&lt;/h3&gt;
&lt;p&gt;在原有 &lt;code&gt;.env&lt;/code&gt; 下面继续补：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;dotenv&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;gsuid_core_ws_token&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;123&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;gsuid_core_host&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;localhost&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;gsuid_core_port&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;8765&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;gsuid_core_botid&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;NoneBot2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;配置-gscore-的-configjson&quot;&gt;配置 GsCore 的 &lt;code&gt;config.json&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;编辑：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/gsuid_core/data/config.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至少确认这些值：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;HOST&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;PORT&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;8765&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;masters&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;你的QQ号&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;WS_TOKEN&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;123&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;TRUSTED_IPS&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WS_TOKEN&lt;/code&gt; 要和 NoneBot &lt;code&gt;.env&lt;/code&gt; 里的 &lt;code&gt;gsuid_core_ws_token&lt;/code&gt; 一致&lt;/li&gt;
&lt;li&gt;&lt;code&gt;masters&lt;/code&gt; 填你自己的 QQ 号，否则后面很多核心命令你没有权限执行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;第六步安装业务插件&quot;&gt;第六步：安装业务插件&lt;/h2&gt;
&lt;p&gt;GsCore 本体只能算平台，真正的功能还需要业务插件。&lt;/p&gt;
&lt;p&gt;如果你已经把自己加入 &lt;code&gt;masters&lt;/code&gt;，可以在聊天里让 GsCore 直接安装：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;core安装插件GenshinUID&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你更想手动装：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ~/gsuid_core/plugins&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -b&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; v4&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://github.com/KimigaiiWuyi/GenshinUID.git&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --depth=1&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --single-branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完记得重启 GsCore。&lt;/p&gt;
&lt;h2 id=&quot;第七步访问-gscore-后台&quot;&gt;第七步：访问 GsCore 后台&lt;/h2&gt;
&lt;p&gt;GsCore 的后台是它的 Web Console，默认路径是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;http://127.0.0.1:8765/app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你在本机浏览器访问，这通常就够了。&lt;/p&gt;
&lt;h3 id=&quot;我们遇到的第三个坑外网访问-gscore-返回-502&quot;&gt;我们遇到的第三个坑：外网访问 GsCore 返回 502&lt;/h3&gt;
&lt;p&gt;我们在公网直接访问时拿到了 &lt;code&gt;HTTP ERROR 502&lt;/code&gt;，后来看到 GsCore 的提示日志：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;WebConsole挂载于本地, 如想外网访问请修改data/config.json中host为0.0.0.0!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这说明后台只监听本机，外部访问当然进不来。最直接的修法是把：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;HOST&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改成：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;HOST&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但更好的做法是不要直接把 &lt;code&gt;8765&lt;/code&gt; 裸暴露出去，而是让 &lt;code&gt;GsCore&lt;/code&gt; 继续只监听本机，再交给 &lt;code&gt;Caddy&lt;/code&gt; 反向代理。&lt;/p&gt;
&lt;h2 id=&quot;第八步用-caddy-暴露-napcat-和-gscore-后台&quot;&gt;第八步：用 Caddy 暴露 NapCat 和 GsCore 后台&lt;/h2&gt;
&lt;p&gt;从实际安全性上看，把 &lt;code&gt;6099&lt;/code&gt; 和 &lt;code&gt;8765&lt;/code&gt; 直接开公网不是个好习惯。更稳妥的方式是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NapCat WebUI 和 GsCore WebConsole 只监听本机&lt;/li&gt;
&lt;li&gt;服务器只对外开放 &lt;code&gt;80/443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;由 &lt;code&gt;Caddy&lt;/code&gt; 统一做 HTTPS 和反向代理&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;安装-caddy&quot;&gt;安装 Caddy&lt;/h3&gt;
&lt;p&gt;在 Ubuntu / Debian 上可以这样装：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; debian-keyring&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; debian-archive-keyring&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt-transport-https&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; curl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &apos;https://dl.cloudsmith.io/public/caddy/stable/gpg.key&apos;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; gpg&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --dearmor&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /usr/share/keyrings/caddy-stable-archive-keyring.gpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -1sLf&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &apos;https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt&apos;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; tee&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/apt/sources.list.d/caddy-stable.list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; update&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; apt&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -y&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;推荐的回源方式&quot;&gt;推荐的回源方式&lt;/h3&gt;
&lt;p&gt;让后端都只监听本机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NapCat WebUI -&amp;gt; &lt;code&gt;127.0.0.1:6099&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GsCore WebConsole -&amp;gt; &lt;code&gt;127.0.0.1:8765&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后写 &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	email yourmail@example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;napcat.example.com {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	reverse_proxy 127.0.0.1:6099&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gscore.example.com {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;	reverse_proxy 127.0.0.1:8765&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查并重载：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; fmt&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --overwrite&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/caddy/Caddyfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; validate&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --config&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; /etc/caddy/Caddyfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; restart&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; systemctl&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; status&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;第九步我们遇到的第四个坑caddy-证书申请失败&quot;&gt;第九步：我们遇到的第四个坑：Caddy 证书申请失败&lt;/h2&gt;
&lt;p&gt;Caddy 启动后本身是正常的，但日志里一直在报 &lt;code&gt;challenge failed&lt;/code&gt;。最后发现问题并不在 Caddy，而是更前面的基础设施：我忘了去 Cloudflare 里添加 DNS 记录。&lt;/p&gt;
&lt;p&gt;这类错误很典型，通常是下面几种之一：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;域名没有正确解析到当前服务器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;80/443&lt;/code&gt; 没有对公网放通&lt;/li&gt;
&lt;li&gt;其他程序占用了 &lt;code&gt;80&lt;/code&gt; 或 &lt;code&gt;443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DNS 刚改完还没生效&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;排查命令&quot;&gt;排查命令&lt;/h3&gt;
&lt;p&gt;查看 Caddy 日志：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; journalctl&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; caddy&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; 80&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; --no-pager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查域名解析：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;dig&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; +short&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; napcat.你的域名&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;dig&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; +short&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; gscore.你的域名&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; A&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查监听情况：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;ss&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -lntp&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; | &lt;/span&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &apos;:80\|:443&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查防火墙：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;sudo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; ufw&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; status&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你在 Cloudflare 里忘了加 DNS，那么 Caddy 的 ACME 验证当然不可能成功。这个问题很“基础”，但也最常见。&lt;/p&gt;
&lt;h2 id=&quot;最终建议的安全姿势&quot;&gt;最终建议的安全姿势&lt;/h2&gt;
&lt;p&gt;如果只是自己使用后台，我建议这样收口：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;6099&lt;/code&gt; 和 &lt;code&gt;8765&lt;/code&gt; 不对公网开放&lt;/li&gt;
&lt;li&gt;只开放 &lt;code&gt;80/443&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;NapCat 和 GsCore 都只监听本机&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;Caddy&lt;/code&gt; 统一反代&lt;/li&gt;
&lt;li&gt;后台本身保留 token / 强密码&lt;/li&gt;
&lt;li&gt;如果条件允许，再加 IP 白名单或额外认证层&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里要特别提醒一点：邮箱不是认证机制。它只是 Caddy 申请证书时的联系邮箱，不是登录保护。真正保护你后台的，是 HTTPS、反代边界、后台密码、token，以及你有没有把源端口直接开到公网。&lt;/p&gt;
&lt;h2 id=&quot;推荐的启动顺序&quot;&gt;推荐的启动顺序&lt;/h2&gt;
&lt;p&gt;部署完成后，推荐按这个顺序启动和排查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;NapCat&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NoneBot2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GsCore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;业务插件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Caddy&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果有问题，也按这条链路往后看：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;QQ 登录是否正常&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-&amp;gt; OneBot WebSocket 是否正常&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-&amp;gt; NoneBot 是否启动&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-&amp;gt; GsCore 是否已连接&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-&amp;gt; 插件是否已加载&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-&amp;gt; Web 后台是否可访问&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;-&amp;gt; HTTPS / DNS / Caddy 是否正常&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;这次部署里最值得记住的四件事&quot;&gt;这次部署里最值得记住的四件事&lt;/h2&gt;
&lt;h3 id=&quot;1-tui-乱码通常不是程序坏了而是终端环境不对&quot;&gt;1. TUI 乱码通常不是程序坏了，而是终端环境不对&lt;/h3&gt;
&lt;p&gt;先看 &lt;code&gt;LANG&lt;/code&gt;、&lt;code&gt;LC_ALL&lt;/code&gt;、&lt;code&gt;TERM&lt;/code&gt;，别急着怀疑软件本身。&lt;/p&gt;
&lt;h3 id=&quot;2-nb-命令不存在往往只是没装-nb-cli&quot;&gt;2. &lt;code&gt;nb&lt;/code&gt; 命令不存在，往往只是没装 &lt;code&gt;nb-cli&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;如果你走的是手写 &lt;code&gt;bot.py&lt;/code&gt; 路线，很多时候直接 &lt;code&gt;pip install&lt;/code&gt; 插件反而更省事。&lt;/p&gt;
&lt;h3 id=&quot;3-后台只绑定本地时公网访问失败是正常现象&quot;&gt;3. 后台只绑定本地时，公网访问失败是正常现象&lt;/h3&gt;
&lt;p&gt;看到 &lt;code&gt;host=localhost&lt;/code&gt; 或“挂载于本地”的提示，就不要继续往外网层面猜了。&lt;/p&gt;
&lt;h3 id=&quot;4-https-证书失败很多时候不是代理错了而是-dns-没配&quot;&gt;4. HTTPS 证书失败，很多时候不是代理错了，而是 DNS 没配&lt;/h3&gt;
&lt;p&gt;反代、TLS、证书这些东西看起来高级，但最常见的故障点往往仍然是最基础的那层。&lt;/p&gt;
&lt;h2 id=&quot;参考文档&quot;&gt;参考文档&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://napneko.github.io/&quot;&gt;NapCat 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nonebot.dev/&quot;&gt;NoneBot2 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://onebot.adapters.nonebot.dev/&quot;&gt;OneBot 适配器文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.sayu-bot.com/&quot;&gt;GsCore 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Genshin-bots/gsuid_core&quot;&gt;GsCore 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/&quot;&gt;Caddy 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/automatic-https&quot;&gt;Caddy Automatic HTTPS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://caddyserver.com/docs/caddyfile/directives/reverse_proxy&quot;&gt;Caddy reverse_proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;结语&quot;&gt;结语&lt;/h2&gt;
&lt;p&gt;这套方案最后跑通时，我最强烈的感受并不是“终于把机器人装好了”，而是这类部署工作的难点从来都不只是安装命令本身。真正决定你后面省不省心的，是边界有没有收清楚：协议端和框架端是不是分离，后台是不是裸露在公网，域名是不是已经指对，日志是不是能帮你快速定位问题。&lt;/p&gt;
&lt;p&gt;把这些边界收好之后，&lt;code&gt;NapCat + NoneBot2 + GsCore + Caddy&lt;/code&gt; 其实是一套非常顺手的组合。它不算最轻，也不算最花哨，但足够清晰，足够稳定，也足够适合长期维护。&lt;/p&gt;
</content:encoded></item><item><title>我的个人服务器框架重构</title><link>https://blog.shishishi.cc/blog/server-frame/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/server-frame/</guid><description>记录我当前个人服务器的入口、域名、服务分层和维护边界。</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这次整理个人服务器，我最想解决的不是「再多跑几个服务」，而是把已经长出来的一堆服务重新放回清晰的边界里。&lt;/p&gt;
&lt;p&gt;过去很多 HomeLab 的服务会自然堆在一起：博客、导航页、监控、面板、自研项目、机器人、Minecraft 私服，还有各种临时实验。它们一开始都只是「先跑起来」，时间久了之后，入口、域名、数据库、端口和备份策略就会互相缠在一起。出问题时很难判断是哪一层坏了，迁移时也很难只搬走其中一部分。&lt;/p&gt;
&lt;p&gt;现在回头看，四月那版更像迁移草稿：先把 HK Main、Mac mini、代理节点和各个 Stack 的职责画出来。今天这版则更接近当前现场：哪些域名真的在用，哪些服务已经成为长期服务，哪些入口只是为了朋友访问或我自己维护而存在。&lt;/p&gt;
&lt;p&gt;所以这套 framework 的目标很明确：公网入口统一，服务按职责拆分，敏感组件收回内网，静态内容尽量交给托管平台，真正需要长期运行、持久化或接入内网的服务再放到 Mac mini 上。&lt;/p&gt;
&lt;h2 id=&quot;总体思路&quot;&gt;总体思路&lt;/h2&gt;
&lt;p&gt;当前架构采用「Cloudflare 统一 DNS/访问层 + HK Main 公网入口 + Mac mini 本地核心服务」的模式。&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;flowchart LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    User[&quot;公网用户 / 朋友&quot;] --&amp;gt; CF[&quot;Cloudflare DNS / CDN&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    CF --&amp;gt; Pages[&quot;Cloudflare Pages&amp;lt;br/&amp;gt;Astro Blog 等静态内容&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    CF --&amp;gt; HK[&quot;HK Main&amp;lt;br/&amp;gt;frps only&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    HK --&amp;gt; FRPC[&quot;Mac mini&amp;lt;br/&amp;gt;frpc&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    FRPC --&amp;gt; NPM[&quot;Nginx Proxy Manager&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    NPM --&amp;gt; Monitor[&quot;monitor-stack&amp;lt;br/&amp;gt;Komari&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    NPM --&amp;gt; Home[&quot;homepage-stack&amp;lt;br/&amp;gt;Homepage&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    NPM --&amp;gt; Private[&quot;private-services-stack&amp;lt;br/&amp;gt;Nextcloud / Vault&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    NPM --&amp;gt; VPN[&quot;vpn-stack&amp;lt;br/&amp;gt;VPN 下载与配置入口&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Friends[&quot;可信朋友&quot;] --&amp;gt; GameAccess[&quot;Tailscale 优先&amp;lt;br/&amp;gt;frp / 域名备用&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    GameAccess --&amp;gt; Games[&quot;game-stack&amp;lt;br/&amp;gt;Game Server&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    VPN --&amp;gt; Nodes[&quot;代理 / VPN 节点&amp;lt;br/&amp;gt;按需接入&quot;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的关键是把「入口」和「业务」拆开。&lt;/p&gt;
&lt;p&gt;HK Main 只作为公网入口，负责运行 &lt;code&gt;frps&lt;/code&gt;，不承载数据库、不放个人文件、不跑长期业务，也不和代理出口节点混用。真正的服务运行在本地 Mac mini 的 Orbstack 里，由 &lt;code&gt;frpc&lt;/code&gt; 接入 HK Main，再交给 Nginx Proxy Manager（NPM）做域名分流和反向代理。&lt;/p&gt;
&lt;p&gt;静态博客仍然适合放在 Cloudflare Pages 这类托管平台上；但当前的 &lt;code&gt;homepage.shishishi3.com&lt;/code&gt; 已经不是单纯的静态主页，而是 HomeLab 的导航和状态入口，所以它作为长期服务放在 Mac mini 上。这样一来，静态发布面和内网服务面不会互相拖累。&lt;/p&gt;
&lt;h2 id=&quot;服务器角色&quot;&gt;服务器角色&lt;/h2&gt;
&lt;p&gt;Mac mini 是这套系统的核心宿主机。它没有公网 IP，主要负责运行长期服务、数据库、自研项目、机器人和游戏服务。所有容器按 Docker Compose Stack 拆分，每个 Stack 都有自己的配置目录、数据目录和网络边界。&lt;/p&gt;
&lt;p&gt;HK Main 是唯一暴露在公网入口层的主机。它只运行 &lt;code&gt;frps&lt;/code&gt;，接收来自 Cloudflare 后的 HTTP/HTTPS 流量，再通过 frp 转发到 Mac mini。这个节点的职责越少越好，因为它在公网侧，攻击面必须尽量小。&lt;/p&gt;
&lt;p&gt;代理或 VPN 节点只承担网络出口和接入职责，不参与 Nextcloud、Homepage、Komari、游戏服等主业务服务，也不和 HK Main 混用。节点可以增减，但入口层和本地服务层不跟着晃。&lt;/p&gt;
&lt;p&gt;这种拆分的好处是边界清楚：入口坏了查 HK Main，业务坏了查 Mac mini，文件同步坏了查 Nextcloud，监控异常看 Komari，游戏访问异常查 &lt;code&gt;gs&lt;/code&gt; 和对应端口，不需要在同一台机器上翻一堆彼此无关的容器。&lt;/p&gt;
&lt;h2 id=&quot;域名规划&quot;&gt;域名规划&lt;/h2&gt;
&lt;p&gt;域名也按职责拆开。现在我不再把域名表写成「未来想跑什么」，而是直接按当前正在使用的入口来记。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;shishishi3.com&lt;/code&gt; 用来承载面向我自己和可信访问者的常规 Web 服务：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;子域名&lt;/th&gt;
&lt;th&gt;服务&lt;/th&gt;
&lt;th&gt;部署位置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;komari.shishishi3.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Komari 监控面板&lt;/td&gt;
&lt;td&gt;&lt;code&gt;monitor-stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;homepage.shishishi3.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Homepage 导航与服务入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;homepage-stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vpndl.shishishi3.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VPN 下载、配置或说明入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vpn-stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gs.shishishi3.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;游戏服务访问入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;game-stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nc.shishishi3.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nextcloud 文件与同步服务&lt;/td&gt;
&lt;td&gt;&lt;code&gt;private-services-stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;v.shishishi3.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vault / 私密工具入口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;private-services-stack&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这一版比四月的规划更收敛：&lt;code&gt;status&lt;/code&gt;、&lt;code&gt;panel&lt;/code&gt;、&lt;code&gt;bot&lt;/code&gt;、&lt;code&gt;demo&lt;/code&gt; 这些名字先从文章里拿掉，不再用它们代表当前状态。需要时当然还可以重新加，但域名规划应该反映正在跑的服务，而不是把所有可能性都提前占住。&lt;/p&gt;
&lt;p&gt;基础设施域名则继续保持低调，只用来指向 HK Main、frp、节点或内部管理入口。普通服务入口放在 &lt;code&gt;shishishi3.com&lt;/code&gt; 下，基础设施入口不要和业务域名混在一起。排查 DNS、证书、Cloudflare 规则和 NPM 反代时，这条线越清楚越省事。&lt;/p&gt;
&lt;h2 id=&quot;公网入口&quot;&gt;公网入口&lt;/h2&gt;
&lt;p&gt;这套方案不把 Cloudflare Tunnel 作为主入口。Cloudflare 负责 DNS、CDN、WAF 和访问控制，真正需要回到本地的源站入口统一落到 HK Main。&lt;/p&gt;
&lt;p&gt;Web 流量的路径大致是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;用户浏览器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Cloudflare&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; HK Main:80/443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; frps&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Mac mini frpc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; NPM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  -&amp;gt; Komari / Homepage / Nextcloud / Vault / VPN 入口等服务容器&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;端口转发采用 TCP 方式：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HK Main:80  -&amp;gt; frps:8080 -&amp;gt; Mac mini frpc -&amp;gt; NPM:80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;HK Main:443 -&amp;gt; frps:8443 -&amp;gt; Mac mini frpc -&amp;gt; NPM:443&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;frps&lt;/code&gt; 只做转发，不在 HK Main 上处理业务请求。&lt;code&gt;frpc&lt;/code&gt; 和 &lt;code&gt;frps&lt;/code&gt; 之间启用 TLS 传输，NPM 负责域名分流、反向代理和证书管理。后端服务不直接向公网暴露端口，只加入 NPM 能访问到的 Docker 网络。&lt;/p&gt;
&lt;p&gt;非 HTTP/HTTPS 服务不强行塞进 NPM。比如 &lt;code&gt;gs.shishishi3.com&lt;/code&gt; 更像是游戏服务的友好入口标识，实际连接可以按游戏协议、端口和访问对象来决定：可信朋友优先走 Tailscale，无法安装客户端时再通过 frp 或受限端口作为备用入口。&lt;/p&gt;
&lt;h2 id=&quot;mac-mini-上的-stack-拆分&quot;&gt;Mac mini 上的 Stack 拆分&lt;/h2&gt;
&lt;p&gt;Mac mini 上的服务按职责拆成几层。名字不需要追求漂亮，关键是看到目录就能知道它负责什么。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;edge-stack&lt;/code&gt; 是入口层，包含 &lt;code&gt;frpc&lt;/code&gt; 和 NPM。它负责把公网流量接入本地，并把不同域名转发到对应服务。NPM 管理后台默认只允许内网或 Tailscale 访问，不直接暴露到公网。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;monitor-stack&lt;/code&gt; 放 Komari。监控系统看起来只是一个面板，但它承担的是「我是不是该起来看一眼」这种责任，所以要独立持久化，升级时也不要和其他服务绑在一起。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;homepage-stack&lt;/code&gt; 放 Homepage。它是人的入口，不是机器入口：链接、分组、服务状态、常用管理地址都可以放这里。它可以暴露给自己使用，但不应该顺手把每个后台都直接暴露出去。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;private-services-stack&lt;/code&gt; 放 Nextcloud 和 &lt;code&gt;v.shishishi3.com&lt;/code&gt; 这类私密服务。这里的共同点不是技术栈，而是数据敏感：文件、同步数据、密码库或其他私人资料都要有明确的数据卷、备份计划和访问限制。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vpn-stack&lt;/code&gt; 放 &lt;code&gt;vpndl.shishishi3.com&lt;/code&gt; 对应的下载、配置或说明入口。它不一定需要复杂，但它牵涉到接入方式，所以要和普通展示项目分开，避免随手改一个页面时影响别人连接。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;game-stack&lt;/code&gt; 放 &lt;code&gt;gs.shishishi3.com&lt;/code&gt; 背后的游戏服务。游戏服务不和 Web 反向代理混用；访问上优先 Tailscale，备用方案才是 frp 或受限端口。存档、模组和配置文件单独持久化并定期备份。&lt;/p&gt;
&lt;p&gt;临时项目仍然可以有自己的 &lt;code&gt;projects-stack&lt;/code&gt;，但它不再是这篇文章里的主角。当前这套架构的核心不是「我能展示多少 demo」，而是 Komari、Homepage、VPN 入口、游戏服务、Nextcloud 和私密服务这些已经在使用的东西要稳定。&lt;/p&gt;
&lt;p&gt;拆分以后，每个 Stack 都可以独立启动、停止、备份和迁移。新增服务时，先判断它属于哪一层，再加入对应 Stack，而不是把所有容器继续扔进同一个平面里。&lt;/p&gt;
&lt;h2 id=&quot;安全策略&quot;&gt;安全策略&lt;/h2&gt;
&lt;p&gt;HK Main 的原则是「只做入口，不放业务」。它只开放 &lt;code&gt;80&lt;/code&gt;、&lt;code&gt;443&lt;/code&gt;、&lt;code&gt;frps&lt;/code&gt; 控制端口和必要的高位转发端口；&lt;code&gt;frps&lt;/code&gt; 使用强 Token，禁用默认管理端口；SSH 只允许密钥登录，禁止密码登录。&lt;/p&gt;
&lt;p&gt;Mac mini 的原则是「服务分层，数据收口」。Orbstack 中按 Stack 拆分网络，数据库端口不映射到公网侧，NPM 管理后台不直接暴露公网，所有 &lt;code&gt;.env&lt;/code&gt;、数据库密码、Token 和密钥文件都不提交到 Git。Nextcloud 和 Vault 这类服务尤其不能只满足于「页面能打开」，还要确认数据卷、备份和恢复路径。&lt;/p&gt;
&lt;p&gt;Cloudflare 的原则是「域名分流，访问控制前置」。常规 Web 服务可以开启 CDN 和 WAF；面板类服务优先叠加 Cloudflare Access 或 IP 限制；证书尽量使用 DNS 验证或 Cloudflare Origin Certificate，避免 HTTP 验证被 frp 转发链路影响。&lt;/p&gt;
&lt;p&gt;备份重点包括 Cloudflare Pages 项目配置、Astro Blog 源码仓库、Homepage 配置、Komari 数据、Nextcloud 数据和数据库、Vault 类服务的数据卷、VPN 配置入口、游戏存档和 NPM 配置。能恢复，才算真正部署完成。&lt;/p&gt;
&lt;h2 id=&quot;维护顺序&quot;&gt;维护顺序&lt;/h2&gt;
&lt;p&gt;现在这套东西已经不是单纯的迁移计划，所以后续维护也不应该从「启动所有容器」开始，而应该先把入口和数据边界理清楚。&lt;/p&gt;
&lt;p&gt;第一步是盘点现有容器、镜像版本、端口映射、volume、数据库和配置文件，并完成一次可验证的备份。第二步在 Mac mini 上按 Stack 建立目录，每个 Stack 独立维护 &lt;code&gt;compose.yml&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt; 和 &lt;code&gt;data/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果入口有变动，先检查 HK Main 的 &lt;code&gt;frps&lt;/code&gt;、防火墙和必要端口，再验证 Mac mini 的 &lt;code&gt;frpc&lt;/code&gt; 是否稳定连接。入口链路通了之后，再看 &lt;code&gt;edge-stack&lt;/code&gt; 和 NPM，确认 &lt;code&gt;npm-http&lt;/code&gt;、&lt;code&gt;npm-https&lt;/code&gt; 转发注册成功，对应域名也命中了正确的 Proxy Host。&lt;/p&gt;
&lt;p&gt;如果业务有变动，就按域名逐个验证：&lt;code&gt;komari&lt;/code&gt; 看监控数据是否连续，&lt;code&gt;homepage&lt;/code&gt; 看导航和状态卡片是否正确，&lt;code&gt;vpndl&lt;/code&gt; 看下载和配置是否可用，&lt;code&gt;gs&lt;/code&gt; 看游戏协议和端口是否通，&lt;code&gt;nc&lt;/code&gt; 看文件同步和数据库状态，&lt;code&gt;v&lt;/code&gt; 看登录、解锁和数据持久化。&lt;/p&gt;
&lt;p&gt;最后检查 DNS、NPM 反代规则、备份任务和旧端口映射。确认新入口稳定后，再关闭旧容器或旧域名，不把所有风险堆到最后。&lt;/p&gt;
&lt;h2 id=&quot;后续&quot;&gt;后续&lt;/h2&gt;
&lt;p&gt;这套 framework 现在已经从四月的「准备重构」进入了「按当前服务持续维护」阶段。后续还需要补齐几类具体模板：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;monitor-stack&lt;/code&gt; 的 &lt;code&gt;compose.yml&lt;/code&gt; 和 Komari 备份说明。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;homepage-stack&lt;/code&gt; 的配置结构。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;private-services-stack&lt;/code&gt; 的 Nextcloud / Vault 备份与恢复流程。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vpn-stack&lt;/code&gt; 的入口说明和访问控制清单。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;game-stack&lt;/code&gt; 的 &lt;code&gt;compose.yml&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;NPM 反向代理规则清单。&lt;/li&gt;
&lt;li&gt;定期备份脚本与恢复演练记录。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;等这些模板补齐后，这套框架就不只是一次重构记录，而是一套可以反复复用的个人服务器部署方式：新服务按层加入，旧服务按层迁移，出了问题也能沿着入口、业务、数据和网络边界逐层定位。&lt;/p&gt;
</content:encoded></item><item><title>在 codex 养宠物？真的假的？</title><link>https://blog.shishishi.cc/blog/codex-pet/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/codex-pet/</guid><description>codex宠物功能的启用，如何制作一个属于自己的宠物</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本文整理了在 Codex 中启用 pet、安装自定义 pet、以及从一张参考图制作属于自己的 pet 的完整流程。示例以本仓库的 &lt;a href=&quot;https://github.com/lliooly/fleetsnowfluff-codex-pet.git&quot;&gt;FleetSnowfluff&lt;/a&gt; 为准。&lt;/p&gt;
&lt;div class=&quot;note&quot; data-callout=&quot;note&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;说明&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;适用场景：你已经在使用 Codex 桌面端或 Codex CLI，希望启用内置 pet，或者制作一个自己的动画 pet 并上传分享。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;1-先理解几个概念&quot;&gt;1. 先理解几个概念&lt;/h2&gt;
&lt;h3 id=&quot;11-codex-pet-是什么&quot;&gt;1.1 Codex pet 是什么&lt;/h3&gt;
&lt;p&gt;Codex pet 是一个会随工作状态变化的小型动画伙伴。一个可安装的 pet 通常是一个本地文件夹，里面至少包含：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;pet-id&amp;gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  pet.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  spritesheet.webp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pet.json&lt;/code&gt; 负责描述名字、ID、说明和 spritesheet 文件路径；&lt;code&gt;spritesheet.webp&lt;/code&gt; 是动画图集。&lt;/p&gt;
&lt;p&gt;本仓库的最终安装包是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/.codex/pets/fleetsnowfluff/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  pet.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  spritesheet.webp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;12-hatch-pet-skill-和-pet-包不是同一个东西&quot;&gt;1.2 &lt;code&gt;hatch-pet&lt;/code&gt; skill 和 pet 包不是同一个东西&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hatch-pet&lt;/code&gt; 是用于“制作 pet”的 Codex Skill。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.codex/pets/&amp;lt;pet-id&amp;gt;/&lt;/code&gt; 是 Codex 最终读取的“pet 成品包”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说，别人给你一个已经做好的 pet 包时，你不需要安装 &lt;code&gt;hatch-pet&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;只有自己从图片或 prompt 生成 pet 时才需要 &lt;code&gt;hatch-pet&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-如何在-codex-中启用-pet&quot;&gt;2. 如何在 Codex 中启用 pet&lt;/h2&gt;
&lt;h3 id=&quot;21-启用内置-pet&quot;&gt;2.1 启用内置 pet&lt;/h3&gt;
&lt;p&gt;在 Codex 桌面端：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 Codex。&lt;/li&gt;
&lt;li&gt;进入 &lt;code&gt;Settings&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;切到 &lt;code&gt;Appearance&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;code&gt;Pets&lt;/code&gt; 区域。&lt;/li&gt;
&lt;li&gt;选择你想启用的 pet。&lt;/li&gt;
&lt;li&gt;如果界面里有 &lt;code&gt;Tuck Away Pet&lt;/code&gt;，可以用它暂时隐藏 pet。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也支持在 Codex 会话里使用：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;/pet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你看不到 pet 选择器，先更新 Codex，再重启应用。&lt;/p&gt;
&lt;h3 id=&quot;22-启用自定义-pet&quot;&gt;2.2 启用自定义 pet&lt;/h3&gt;
&lt;p&gt;把 pet 包放到本机 Codex pets 目录。&lt;/p&gt;
&lt;p&gt;macOS / Linux：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -p&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/.codex/pets/fleetsnowfluff&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;cp&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; pet.json&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; spritesheet.webp&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/.codex/pets/fleetsnowfluff/&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows PowerShell：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;powershell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;New-Item&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;ItemType Directory &lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;Force &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$env:USERPROFILE&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;\.codex\pets\fleetsnowfluff&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt;Copy-Item&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt; .\pet.json, .\spritesheet.webp &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$env:USERPROFILE&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;\.codex\pets\fleetsnowfluff\&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后重启 Codex，回到：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Settings -&amp;gt; Appearance -&amp;gt; Pets&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;选择 &lt;code&gt;FleetSnowfluff&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;3-自定义-pet-的文件规范&quot;&gt;3. 自定义 pet 的文件规范&lt;/h2&gt;
&lt;h3 id=&quot;31-最小-petjson&quot;&gt;3.1 最小 &lt;code&gt;pet.json&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;fleetsnowfluff&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;displayName&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;FleetSnowfluff&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;A tiny pink-haired chibi coder sprite with oversized sunglasses, white-blue outfit, and small attached wings.&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;spritesheetPath&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;spritesheet.webp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; 建议使用小写字母、数字和连字符。&lt;/li&gt;
&lt;li&gt;文件夹名最好和 &lt;code&gt;id&lt;/code&gt; 一致。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;displayName&lt;/code&gt; 是界面显示名，可以保留大小写。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spritesheetPath&lt;/code&gt; 通常指向同目录下的 &lt;code&gt;spritesheet.webp&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;32-spritesheet-图集规格&quot;&gt;3.2 spritesheet 图集规格&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hatch-pet&lt;/code&gt; 工作流使用固定 atlas：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;尺寸：1536 x 1872&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;网格：8 列 x 9 行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;单格：192 x 208&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;格式：WebP 或 PNG，必须支持透明背景&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;9 行状态如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: right&quot;&gt;行&lt;/th&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;th style=&quot;text-align: right&quot;&gt;帧数&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;idle&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;6&lt;/td&gt;
&lt;td&gt;待机、呼吸、眨眼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;running-right&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;8&lt;/td&gt;
&lt;td&gt;向右移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;running-left&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;8&lt;/td&gt;
&lt;td&gt;向左移动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;waving&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;4&lt;/td&gt;
&lt;td&gt;挥手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;4&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jumping&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;5&lt;/td&gt;
&lt;td&gt;跳跃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;5&lt;/td&gt;
&lt;td&gt;&lt;code&gt;failed&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;8&lt;/td&gt;
&lt;td&gt;失败或沮丧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;waiting&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;6&lt;/td&gt;
&lt;td&gt;等待&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;7&lt;/td&gt;
&lt;td&gt;&lt;code&gt;running&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;6&lt;/td&gt;
&lt;td&gt;任务进行中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: right&quot;&gt;8&lt;/td&gt;
&lt;td&gt;&lt;code&gt;review&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: right&quot;&gt;6&lt;/td&gt;
&lt;td&gt;检查或 review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;未使用的格子必须是透明的。&lt;/p&gt;
&lt;h2 id=&quot;4-如何制作一个属于自己的-pethatch-pet&quot;&gt;4. 如何制作一个属于自己的 pet：&lt;code&gt;hatch-pet&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;如果你还没有安装 &lt;code&gt;hatch-pet&lt;/code&gt;，在 Codex 中输入：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;$skill-installer hatch-pet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装后重启 Codex。&lt;/p&gt;
&lt;p&gt;如果需要手动安装 curated skill，可以参考 OpenAI skills 仓库中的安装方式：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;python&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;$CODEX_HOME&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/skills/.system/skill-installer/scripts/install-skill-from-github.py&quot;&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --repo&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; openai/skills&lt;/span&gt;&lt;span style=&quot;color:#56B6C2&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D19A66&quot;&gt;  --path&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; skills/.curated/hatch-pet&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通常不需要自己手动跑这条命令，直接在 Codex 里用 &lt;code&gt;$skill-installer hatch-pet&lt;/code&gt; 更方便。&lt;/p&gt;
&lt;h2 id=&quot;5-从参考图制作自己的-pet&quot;&gt;5. 从参考图制作自己的 pet&lt;/h2&gt;
&lt;h3 id=&quot;51-准备参考图&quot;&gt;5.1 准备参考图&lt;/h3&gt;
&lt;p&gt;参考图可以是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;角色头像&lt;/li&gt;
&lt;li&gt;像素角色&lt;/li&gt;
&lt;li&gt;吉祥物&lt;/li&gt;
&lt;li&gt;截图&lt;/li&gt;
&lt;li&gt;logo 或草图&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;图片越清楚，生成结果越稳定。最好提前决定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pet 名字&lt;/li&gt;
&lt;li&gt;要保留的核心特征&lt;/li&gt;
&lt;li&gt;是否有必须保留的配件或身体结构&lt;/li&gt;
&lt;li&gt;哪些东西不要生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们制作 FleetSnowfluff 时，参考图里最重要的特征是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;粉色短发&lt;/li&gt;
&lt;li&gt;黑色大墨镜&lt;/li&gt;
&lt;li&gt;白蓝色未来感服装&lt;/li&gt;
&lt;li&gt;小型靴子&lt;/li&gt;
&lt;li&gt;身体两侧的白蓝色翅膀&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;52-推荐-prompt-写法&quot;&gt;5.2 推荐 prompt 写法&lt;/h3&gt;
&lt;p&gt;可以这样要求 Codex：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;使用 $hatch-pet，参考这张图片制作一个 Codex pet。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;名字：FleetSnowfluff&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;必须保留：粉色短发、黑色墨镜、白蓝色衣服、白蓝色翅膀。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;风格：Codex digital pet，像素感、小体型、粗轮廓、透明背景。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;不要：文字、背景、阴影、漂浮装饰、音乐符号、散落星星。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;完成后生成 pet.json、spritesheet.webp、QA contact sheet 和预览视频。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重点是把“必须保留”和“不要生成”写清楚。&lt;/p&gt;
&lt;h3 id=&quot;53-正常生成流程&quot;&gt;5.3 正常生成流程&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hatch-pet&lt;/code&gt; 的流程可以理解为 4 步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;准备 run 目录、名字、描述和 prompt。&lt;/li&gt;
&lt;li&gt;生成 base pet，也就是主视觉参考。&lt;/li&gt;
&lt;li&gt;基于 base 生成 9 行动作。&lt;/li&gt;
&lt;li&gt;合成 spritesheet，做 QA，打包到 &lt;code&gt;~/.codex/pets/&amp;lt;pet-id&amp;gt;/&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们当时的进度可以对应成：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Getting FleetSnowfluff ready.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Imagining FleetSnowfluff&apos;s main look.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Picturing FleetSnowfluff&apos;s poses.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Hatching FleetSnowfluff.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;54-为什么要先确认-base&quot;&gt;5.4 为什么要先确认 base&lt;/h3&gt;
&lt;p&gt;base 是后续所有动作行的身份锚点。base 错了，动作行通常也会错。&lt;/p&gt;
&lt;p&gt;检查 base 时要看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;角色是不是完整全身。&lt;/li&gt;
&lt;li&gt;核心特征是否保留。&lt;/li&gt;
&lt;li&gt;是否有干净的纯色 chroma-key 背景。&lt;/li&gt;
&lt;li&gt;是否有文字、阴影、漂浮装饰等不应出现的内容。&lt;/li&gt;
&lt;li&gt;是否适合缩成 192x208 的小格子。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FleetSnowfluff 的第一次 base 没有翅膀，所以必须重做；第二次 base 保留了翅膀，才继续动作行生成。&lt;/p&gt;
&lt;h2 id=&quot;6-动作行生成要点&quot;&gt;6. 动作行生成要点&lt;/h2&gt;
&lt;h3 id=&quot;61-用子代理并行生成&quot;&gt;6.1 用子代理并行生成&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hatch-pet&lt;/code&gt; 适合把动作行交给子代理并行生成。这样每个子代理只负责一个状态：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;idle&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;running-right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;running-left&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;waving&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;jumping&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;failed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;waiting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;running&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;review&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;父会话只负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;记录生成结果&lt;/li&gt;
&lt;li&gt;决定是否镜像 &lt;code&gt;running-left&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;运行最终合成&lt;/li&gt;
&lt;li&gt;检查 QA&lt;/li&gt;
&lt;li&gt;打包 pet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样可以避免多个代理同时改 &lt;code&gt;imagegen-jobs.json&lt;/code&gt; 造成冲突。&lt;/p&gt;
&lt;h3 id=&quot;62-不要随便镜像-running-left&quot;&gt;6.2 不要随便镜像 &lt;code&gt;running-left&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;有些 pet 可以用 &lt;code&gt;running-right&lt;/code&gt; 水平镜像得到 &lt;code&gt;running-left&lt;/code&gt;。但如果角色有非对称特征，就不要镜像。&lt;/p&gt;
&lt;p&gt;FleetSnowfluff 有蓝色发夹、墨镜渐变和侧向翅膀细节，所以我们没有镜像，而是单独生成了 &lt;code&gt;running-left&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;判断标准：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有单侧发夹、徽标、文字、单边武器时，不镜像。&lt;/li&gt;
&lt;li&gt;有方向性光照或手持道具时，不镜像。&lt;/li&gt;
&lt;li&gt;左右完全对称的小动物，可以考虑镜像。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;63-每行常见规则&quot;&gt;6.3 每行常见规则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;idle&lt;/code&gt;：只做轻微呼吸、眨眼、上下浮动。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waving&lt;/code&gt;：只通过手部姿势表达挥手，不要画波浪线。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jumping&lt;/code&gt;：只用身体位置表达跳跃，不要画地面阴影或落地烟尘。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;failed&lt;/code&gt;：可以有贴着身体的小眼泪或烟雾，但不要漂浮红叉、符号。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;waiting&lt;/code&gt;：安静等待，不要新增复杂道具。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;running&lt;/code&gt;：表示任务进行中，不是字面意义跑步。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;review&lt;/code&gt;：用身体前倾、头部角度或手部姿态表达专注，不要加代码窗口或纸张。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;7-qa-与验证&quot;&gt;7. QA 与验证&lt;/h2&gt;
&lt;p&gt;生成完成后，至少检查这些文件：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/contact-sheet.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/reports/review.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/reports/validation.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/*.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本仓库的 QA 文件：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/contact-sheet.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/reports/review.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/reports/validation.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;71-contact-sheet-看什么&quot;&gt;7.1 contact sheet 看什么&lt;/h3&gt;
&lt;p&gt;人工检查 contact sheet：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每一行状态是否正确。&lt;/li&gt;
&lt;li&gt;每个状态的帧数是否正确。&lt;/li&gt;
&lt;li&gt;角色身份是否一致。&lt;/li&gt;
&lt;li&gt;翅膀、发型、墨镜、衣服是否保持一致。&lt;/li&gt;
&lt;li&gt;有没有白底、阴影、漂浮杂物、裁切、空帧。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;72-json-验证看什么&quot;&gt;7.2 JSON 验证看什么&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;validation.json&lt;/code&gt; 应该没有：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;errors&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: []&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最好也没有：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;warnings&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: []&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;review.json&lt;/code&gt; 应该显示每一行 &lt;code&gt;ok: true&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;73-预览视频&quot;&gt;7.3 预览视频&lt;/h3&gt;
&lt;p&gt;如果安装了 &lt;code&gt;ffmpeg&lt;/code&gt;，可以生成每个状态的 mp4 预览。&lt;/p&gt;
&lt;p&gt;如果 &lt;code&gt;ffmpeg&lt;/code&gt; 不存在，spritesheet 和 pet 包仍然可以生成，只是没有视频预览。我们制作 FleetSnowfluff 时就先遇到了这个问题，安装 &lt;code&gt;ffmpeg&lt;/code&gt; 后再补生成了：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/idle.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/running-right.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/running-left.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/waving.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/jumping.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/failed.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/waiting.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/running.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/review.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;8-重命名-pet-的正确方式&quot;&gt;8. 重命名 pet 的正确方式&lt;/h2&gt;
&lt;p&gt;只改 &lt;code&gt;displayName&lt;/code&gt; 不够。应该同步：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/.codex/pets/&amp;lt;pet-id&amp;gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pet.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;run metadata&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;README / docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;QA summary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Git 仓库目录&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以 FleetSnowfluff 为例：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;id&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;fleetsnowfluff&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;displayName&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;FleetSnowfluff&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E06C75&quot;&gt;  &quot;spritesheetPath&quot;&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;&quot;spritesheet.webp&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时目录应该是：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/.codex/pets/fleetsnowfluff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你保留了生成 run 目录，也建议把旧名字全局替换，避免后续上传或二次维护时混乱。&lt;/p&gt;
&lt;p&gt;检查残留名称：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;rg&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -n&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;OldName|oldname&quot;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;9-打包成可上传仓库&quot;&gt;9. 打包成可上传仓库&lt;/h2&gt;
&lt;p&gt;建议最终仓库结构：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;my-pet/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  README.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  pet.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  spritesheet.webp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  qa/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    contact-sheet.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    reports/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      review.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      validation.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    videos/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      idle.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      running-right.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      running-left.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      waving.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      jumping.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      failed.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      waiting.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      running.mp4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      review.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化 git：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; init&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; commit&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -m&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; &quot;Add FleetSnowfluff Codex pet&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上传到 GitHub：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; remote&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; git@github.com:&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;r&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;rep&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;o&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你用 HTTPS：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; remote&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; https://github.com/&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;r&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;rep&lt;/span&gt;&lt;span style=&quot;color:#ABB2BF&quot;&gt;o&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt;.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#61AFEF&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;color:#D19A66&quot;&gt; -u&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; origin&lt;/span&gt;&lt;span style=&quot;color:#98C379&quot;&gt; main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;10-常见问题&quot;&gt;10. 常见问题&lt;/h2&gt;
&lt;h3 id=&quot;pet-没出现在-codex-里&quot;&gt;pet 没出现在 Codex 里&lt;/h3&gt;
&lt;p&gt;检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否放在 &lt;code&gt;~/.codex/pets/&amp;lt;pet-id&amp;gt;/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;是否有 &lt;code&gt;pet.json&lt;/code&gt; 和 &lt;code&gt;spritesheet.webp&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pet.json&lt;/code&gt; 里的 &lt;code&gt;spritesheetPath&lt;/code&gt; 是否正确。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; 是否和目录名一致。&lt;/li&gt;
&lt;li&gt;是否重启了 Codex。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;pet-出现白底或背景残留&quot;&gt;pet 出现白底或背景残留&lt;/h3&gt;
&lt;p&gt;通常是透明背景处理失败。应重新生成或修复对应动作行，确保：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;背景是纯 chroma-key 色。&lt;/li&gt;
&lt;li&gt;不要阴影、渐变、光晕。&lt;/li&gt;
&lt;li&gt;不要把背景色用在角色本体上。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;某一行动作坏了&quot;&gt;某一行动作坏了&lt;/h3&gt;
&lt;p&gt;不要重做整只 pet。只修复失败行：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;queue repair -&amp;gt; regenerate that row -&amp;gt; record result -&amp;gt; finalize again&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;动作中角色变样了&quot;&gt;动作中角色变样了&lt;/h3&gt;
&lt;p&gt;这是 identity drift。修复时要把 base、原图、contact sheet 和失败说明都作为 grounding context，要求只重做失败行。&lt;/p&gt;
&lt;h3 id=&quot;想保留某个细节&quot;&gt;想保留某个细节&lt;/h3&gt;
&lt;p&gt;必须在 base 生成前说明。比如 FleetSnowfluff 的翅膀就是必须保留项：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;必须保留白蓝色翅膀；翅膀是身体轮廓的一部分，不是漂浮装饰。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;11-一份可直接复制的制作请求&quot;&gt;11. 一份可直接复制的制作请求&lt;/h2&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;使用 $hatch-pet 帮我制作一个 Codex pet。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;名字：&amp;lt;YourPetName&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;参考图：见附件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;必须保留：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &amp;lt;核心特征 1&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &amp;lt;核心特征 2&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- &amp;lt;核心特征 3&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;风格：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- Codex digital pet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- pixel-art-adjacent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 小体型 chibi 比例&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 粗深色轮廓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 透明背景&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 平面赛璐璐阴影&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;不要：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 文字&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 背景&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 阴影&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 漂浮装饰&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 波浪线&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 速度线&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 粒子特效&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;请生成：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- pet.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- spritesheet.webp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- QA contact sheet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;- 每个状态的预览视频&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;如果某一步失败，只重试失败的行，不要重做整只 pet。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;完成后整理为一个 git 仓库，方便上传。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;12-本仓库的-fleetsnowfluff-成品&quot;&gt;12. 本仓库的 FleetSnowfluff 成品&lt;/h2&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;pet.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;spritesheet.webp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/contact-sheet.png&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/reports/review.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/reports/validation.json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;qa/videos/*.mp4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装路径示例：&lt;/p&gt;
&lt;pre class=&quot;astro-code one-dark-pro&quot; style=&quot;background-color:#282c34;color:#abb2bf; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;~/.codex/pets/fleetsnowfluff&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前仓库可直接上传，也可直接复制到 &lt;code&gt;~/.codex/pets/fleetsnowfluff&lt;/code&gt; 使用。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.openai.com/codex/cloud&quot;&gt;OpenAI Codex docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/codex/&quot;&gt;OpenAI Codex product page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.openai.com/codex/skills&quot;&gt;OpenAI Agent Skills docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openai/skills&quot;&gt;openai/skills repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openai/skills/tree/main/skills/.curated/hatch-pet&quot;&gt;openai/skills curated hatch-pet directory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>外区 Apple ID 网页版注册教程</title><link>https://blog.shishishi.cc/blog/foreign-apple-id/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/foreign-apple-id/</guid><description>一份以 Apple 官网为入口的外区 Apple ID 网页版注册教程模板，包含准备材料、注册步骤、验证流程和常见问题。</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;note&quot; data-callout=&quot;note&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;说明&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;注册和使用账号时，请遵守 Apple 服务条款以及当地法律法规，不建议购买、共享或使用来历不明的账号。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;适用场景&quot;&gt;适用场景&lt;/h2&gt;
&lt;p&gt;这篇教程适合以下情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想下载 &lt;code&gt;美区或其他地区&lt;/code&gt; App Store 提供的应用；&lt;/li&gt;
&lt;li&gt;需要体验 &lt;code&gt;美区或其他地区&lt;/code&gt; 区域提供的 Apple 服务；&lt;/li&gt;
&lt;li&gt;希望把主账号和外区账号分开使用，降低对 iCloud 主账号的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不建议用于以下情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;绕过版权、付费、订阅或地区法律限制；&lt;/li&gt;
&lt;li&gt;使用虚假身份、虚假付款方式或无法确认来源的账单信息；&lt;/li&gt;
&lt;li&gt;制作或购买第三方成品 Apple ID。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;准备材料&quot;&gt;准备材料&lt;/h2&gt;
&lt;p&gt;开始前建议准备好：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个没有注册过 Apple ID 的邮箱；&lt;/li&gt;
&lt;li&gt;一个可以接收验证码的手机号（有外国手机号优先使用外国号，没有外国手机号时，+86 也可以，手机号可以重复注册多个账号）；&lt;/li&gt;
&lt;li&gt;一台可以访问 Apple 官网的电脑、手机或平板；&lt;/li&gt;
&lt;li&gt;稳定的网络环境（可不挂代理）；&lt;/li&gt;
&lt;li&gt;后续如果要购买付费内容，再准备与 &lt;code&gt;美区或其他地区&lt;/code&gt; 匹配的合法付款方式（国内优先考虑礼品卡）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;网页端创建 Apple Account 时，重点是邮箱、密码、国家或地区、生日和手机号验证。付款方式通常不是网页注册的核心步骤，后续登录 App Store、Apple Music、Apple TV 或 iCloud+ 等服务时，才可能被要求补充。&lt;/p&gt;
&lt;h2 id=&quot;注册步骤&quot;&gt;注册步骤&lt;/h2&gt;
&lt;h3 id=&quot;1-打开-apple-账号注册页面&quot;&gt;1. 打开 Apple 账号注册页面&lt;/h3&gt;
&lt;p&gt;在浏览器中打开：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://account.apple.com/account&quot;&gt;https://account.apple.com/account&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;建议使用常用浏览器的无痕窗口或新浏览器配置文件，避免旧账号登录状态影响注册页面显示。&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Apple Account 注册入口页面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;514&quot; height=&quot;1262&quot; src=&quot;https://blog.shishishi.cc/_astro/account.DyZvxxat_Z1Qf6FP.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3 id=&quot;2-填写账号信息&quot;&gt;2. 填写账号信息&lt;/h3&gt;
&lt;p&gt;按页面提示填写：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;填写建议&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;姓名&lt;/td&gt;
&lt;td&gt;随便填&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;国家或地区&lt;/td&gt;
&lt;td&gt;选择 &lt;code&gt;[美区或其他地区]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出生日期&lt;/td&gt;
&lt;td&gt;只要大于 18 岁随便填&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;邮箱&lt;/td&gt;
&lt;td&gt;使用 &lt;strong&gt;未注册过&lt;/strong&gt; Apple ID 的邮箱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;密码&lt;/td&gt;
&lt;td&gt;建议使用强密码或自己熟悉的密码，并妥善保存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手机号&lt;/td&gt;
&lt;td&gt;使用可以正常接收验证码的手机号&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;国家或地区是这一步的重点。这里选择的地区会影响后续 Apple 服务可见内容、付款方式、账单信息和部分年龄验证要求。&lt;/p&gt;
&lt;h3 id=&quot;3-选择是否订阅-apple-更新&quot;&gt;3. 选择是否订阅 Apple 更新&lt;/h3&gt;
&lt;p&gt;页面可能会提供 Apple 更新、新闻、软件、产品和服务相关邮件的订阅选项。&lt;/p&gt;
&lt;p&gt;这一步不是必选项。想少收邮件可以取消勾选，想接收 Apple 官方信息可以保留勾选。&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;产品和服务相关邮件的订阅选项&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;764&quot; height=&quot;310&quot; src=&quot;https://blog.shishishi.cc/_astro/Announcements.BReIIh4h_ZtRJdG.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3 id=&quot;4-完成验证码验证&quot;&gt;4. 完成验证码验证&lt;/h3&gt;
&lt;p&gt;点击继续后，Apple 通常会要求验证邮箱和手机号。&lt;/p&gt;
&lt;p&gt;操作顺序一般是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开邮箱，查收 Apple 发送的验证码；&lt;/li&gt;
&lt;li&gt;在网页中输入邮箱验证码；&lt;/li&gt;
&lt;li&gt;查收短信验证码；&lt;/li&gt;
&lt;li&gt;在网页中输入手机号验证码；&lt;/li&gt;
&lt;li&gt;等待账号创建完成。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果长时间收不到验证码，可以检查垃圾邮件、短信拦截、手机号格式、浏览器代理和网络状态。不要短时间内连续重复提交，以免触发额外限制。&lt;/p&gt;
&lt;h3 id=&quot;5-登录网页版-apple-account&quot;&gt;5. 登录网页版 Apple Account&lt;/h3&gt;
&lt;p&gt;注册完成后，通常会自动登录到 Apple Account 页面。&lt;/p&gt;
&lt;p&gt;登录后检查以下信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;姓名和生日是否正确；&lt;/li&gt;
&lt;li&gt;国家或地区是否为 &lt;code&gt;美区或其他地区&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;邮箱和手机号是否已验证；&lt;/li&gt;
&lt;li&gt;账号安全设置是否完整；&lt;/li&gt;
&lt;li&gt;双重认证是否已经开启或等待后续开启。&lt;/li&gt;
&lt;/ul&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;Apple Account 页面&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2126&quot; height=&quot;1210&quot; src=&quot;https://blog.shishishi.cc/_astro/AAccount.DbBuNs83_ZCA4K.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3 id=&quot;6-后续补充付款与账单信息&quot;&gt;6. 后续补充付款与账单信息&lt;/h3&gt;
&lt;p&gt;由于外区绑定银行卡困难，建议选择「无 / None」的选项，然后使用礼品卡。&lt;/p&gt;
&lt;h3 id=&quot;7-登录到-app-store&quot;&gt;7. 登录到 App Store&lt;/h3&gt;
&lt;div class=&quot;warning&quot; data-callout=&quot;warning&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;这一步虽然网页仍显示国家和地区，但是当登录 App Store 时可能会被送回国内区。所以，下一步是先切换 App Store 的地区。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这里使用的方法是地区切换链接。&lt;/p&gt;
&lt;p&gt;首先退出 App Store 的账号。&lt;/p&gt;
&lt;p&gt;iOS 26.4 及以上：打开 App Store，点击右上角的 Apple 账户头像，点击最上面的账号，验证后划到底部，点击「退出登录」。&lt;/p&gt;
&lt;p&gt;iOS 26.3 及以前：打开 App Store，点击右上角的 Apple 账户头像，划到底部，点击「退出登录」。&lt;/p&gt;
&lt;p&gt;macOS：打开 App Store，点击顶栏 Store 选项，然后退出登录。&lt;/p&gt;
&lt;div class=&quot;important&quot; data-callout=&quot;important&quot; data-collapsible=&quot;false&quot;&gt;&lt;div class=&quot;admonition-title&quot;&gt;&lt;div class=&quot;callout-title-text&quot;&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;callout-content&quot;&gt;&lt;p&gt;退出登录后请不要着急登录，否则账号可能会被送回原地区。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;接下来把下面的链接直接复制粘贴到 Safari 回车。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;地区&lt;/th&gt;
&lt;th&gt;快捷跳转链接&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;美国&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143441&amp;amp;cc=us&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日本&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143462&amp;amp;cc=jp&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;韩国&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143466&amp;amp;cc=kr&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;香港&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143463&amp;amp;cc=hk&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;尼日利亚&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143561&amp;amp;cc=ng&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;土耳其&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143480&amp;amp;cc=tr&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;埃及&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143516&amp;amp;cc=eg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;印度&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143467&amp;amp;cc=in&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阿根廷&lt;/td&gt;
&lt;td&gt;&lt;code&gt;itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/resetAndRedirect?dsf=143505&amp;amp;cc=ar&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;输入链接后出现无法连接 App Store 是正常的。&lt;/p&gt;
&lt;figure style=&quot;text-align: center;&quot; data-lightbox=&quot;article&quot;&gt;&lt;img alt=&quot;无法连接 App Store 图&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;520&quot; height=&quot;352&quot; src=&quot;https://blog.shishishi.cc/_astro/error.ByhhROjw_1PkwVH.webp&quot; srcset=&quot;&quot;&gt;&lt;/figure&gt;
&lt;h3 id=&quot;8-检查账号&quot;&gt;8. 检查账号&lt;/h3&gt;
&lt;p&gt;最后登录账号看下国家或地区对不对，并下载几个 App 锁定区域，避免被送回原地区，或者直接兑换礼品卡。&lt;/p&gt;
&lt;p&gt;补充说明：因为 Apple 的转区策略要求账号不能有余额，所以直接兑换礼品卡可以比较稳定地锁区。&lt;/p&gt;
&lt;h2 id=&quot;后续使用建议&quot;&gt;后续使用建议&lt;/h2&gt;
&lt;p&gt;外区 Apple ID 建议只用于 App Store 下载、更新和必要的区域服务，不建议替代主 iCloud 账号。&lt;/p&gt;
&lt;p&gt;日常可以采用这种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iCloud 保持登录主账号；&lt;/li&gt;
&lt;li&gt;App Store 需要时切换到外区账号；&lt;/li&gt;
&lt;li&gt;下载或更新完成后，再切回主账号。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样可以减少照片、备份、通讯录和查找设备等核心数据受到影响的概率。&lt;/p&gt;
&lt;h2 id=&quot;常见问题&quot;&gt;常见问题&lt;/h2&gt;
&lt;h3 id=&quot;为什么没有none--无付款方式&quot;&gt;为什么没有「None / 无」付款方式？&lt;/h3&gt;
&lt;p&gt;可能原因包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前服务或当前地区不支持跳过付款方式；&lt;/li&gt;
&lt;li&gt;账号首次使用媒体服务时需要补充账单信息；&lt;/li&gt;
&lt;li&gt;付款方式、账单地址和账号地区不匹配；&lt;/li&gt;
&lt;li&gt;设备、网络或账号状态触发了额外验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;网页端注册不一定会立刻要求付款方式。后续使用 Apple 媒体服务或付费服务时，是否能选择「无」，最终以 Apple 页面显示为准。&lt;/p&gt;
&lt;h3 id=&quot;外区-apple-id-可以绑定国内银行卡吗&quot;&gt;外区 Apple ID 可以绑定国内银行卡吗？&lt;/h3&gt;
&lt;p&gt;不一定。Apple 支持的付款方式会因国家或地区变化。付款方式通常需要与账号所在国家或地区匹配，具体可查看 Apple 官方的付款方式支持列表。&lt;/p&gt;
&lt;h3 id=&quot;可以长期和主账号混用吗&quot;&gt;可以长期和主账号混用吗？&lt;/h3&gt;
&lt;p&gt;可以，但建议只在 App Store 层面切换，不要频繁切换 iCloud 主账号。&lt;/p&gt;
&lt;p&gt;需要注意的是，不同账号下载的应用通常需要使用对应账号更新。如果某个应用是用外区账号下载的，后续更新时可能需要再次登录这个外区账号。&lt;/p&gt;
&lt;h3 id=&quot;账号被锁定怎么办&quot;&gt;账号被锁定怎么办？&lt;/h3&gt;
&lt;p&gt;优先使用 Apple 官方账号恢复入口：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://iforgot.apple.com/&quot;&gt;https://iforgot.apple.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不要频繁尝试密码，也不要使用第三方解锁服务。&lt;/p&gt;
&lt;h3 id=&quot;已经有-apple-id可以直接改地区吗&quot;&gt;已经有 Apple ID，可以直接改地区吗？&lt;/h3&gt;
&lt;p&gt;可以在账号设置中修改国家或地区，但修改前通常需要处理订阅、余额、付款方式和家庭共享等问题。对主账号来说，直接改区的影响更大，所以更推荐使用单独账号管理外区 App Store 需求。&lt;/p&gt;
&lt;h2 id=&quot;注意事项&quot;&gt;注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;开启双重认证；&lt;/li&gt;
&lt;li&gt;保存好邮箱、手机号和恢复方式；&lt;/li&gt;
&lt;li&gt;不要把账号借给别人使用；&lt;/li&gt;
&lt;li&gt;不要购买成品账号；&lt;/li&gt;
&lt;li&gt;不要在不可信设备上登录；&lt;/li&gt;
&lt;li&gt;付款、订阅和家庭共享相关操作，以 Apple 官方页面提示为准。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;关于礼品卡&quot;&gt;关于礼品卡&lt;/h2&gt;
&lt;p&gt;闲鱼礼品卡最方便，但可能会面临黑卡或者汇率略高等问题。&lt;/p&gt;
&lt;p&gt;对于美区，建议参考这篇文章：
&lt;a href=&quot;https://zhuanlan.zhihu.com/p/636121931&quot;&gt;操作简单又安全靠谱的美区 Apple ID 礼品卡购买充值保姆级教程 - 知乎 Apple 大白&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对于土区，建议直接去 &lt;a href=&quot;https://www.seagm.com/&quot;&gt;SEAGM&lt;/a&gt; 或 &lt;a href=&quot;https://www.oyunfor.com/&quot;&gt;Oyunfor&lt;/a&gt;，其中 SEAGM 支持支付宝，Oyunfor 仅支持 MasterCard、Visa 等银行卡。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/ht204034&quot;&gt;How to create a new Apple Account - Apple Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/kb/HT201266&quot;&gt;Add a payment method to your Apple Account - Apple Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-ca/111741&quot;&gt;Payment methods that you can use with your Apple Account - Apple Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://linux.do/t/topic/2021625?mobile_view=0&quot;&gt;外区 Apple ID 注册指南 以土区为例 - Linuxdo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/636121931&quot;&gt;操作简单又安全靠谱的美区 Apple ID 礼品卡购买充值保姆级教程 - 知乎 Apple 大白&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>念念不忘，必有回响</title><link>https://blog.shishishi.cc/blog/memory/</link><guid isPermaLink="true">https://blog.shishishi.cc/blog/memory/</guid><description>纪念逝去的......</description><pubDate>Wed, 10 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;All the past, all is overtrue&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;人的一生总是在不断向前走，不断开始新生活。慢慢的，我们开始忘记了许多人、许多事…….&lt;/p&gt;
&lt;p&gt;有人说，人生本来就是这样嘛，一辈子会遇到那么多的人，经历那么多的事，怎么可能全部记住啊。&lt;/p&gt;
&lt;p&gt;对哦，怎么可能全部记住呢……&lt;/p&gt;
&lt;p&gt;这里将会记录下我渐渐忘却的记忆，当我再次看见这些文字，希望我还可以回忆起已经丢失的记忆……&lt;/p&gt;
</content:encoded></item></channel></rss>