<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>教程 on XEDCZQ的博客</title><link>https://xedczq.cn/categories/%E6%95%99%E7%A8%8B/</link><description>Recent content in 教程 on XEDCZQ的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 11 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://xedczq.cn/categories/%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>Mac 使用 CCSwitch 切换中转站后恢复 Codex 历史记录</title><link>https://xedczq.cn/post/codex_ccswitch%E5%8E%86%E5%8F%B2%E6%81%A2%E5%A4%8D/</link><pubDate>Thu, 11 Jun 2026 00:00:00 +0800</pubDate><guid>https://xedczq.cn/post/codex_ccswitch%E5%8E%86%E5%8F%B2%E6%81%A2%E5%A4%8D/</guid><description>&lt;h1 id="mac-使用-ccswitch-切换中转站后恢复-codex-历史记录"&gt;&lt;a href="#mac-%e4%bd%bf%e7%94%a8-ccswitch-%e5%88%87%e6%8d%a2%e4%b8%ad%e8%bd%ac%e7%ab%99%e5%90%8e%e6%81%a2%e5%a4%8d-codex-%e5%8e%86%e5%8f%b2%e8%ae%b0%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;Mac 使用 CCSwitch 切换中转站后恢复 Codex 历史记录
&lt;/h1&gt;&lt;p&gt;这篇笔记记录在 Mac 上使用 CCSwitch 切换 Codex 中转站或模型提供方后，历史对话突然不显示时的排查和恢复方法。&lt;/p&gt;
&lt;p&gt;先说结论：&lt;strong&gt;历史文件通常仍保存在 Mac 本机，只是切换 Provider 后，当前环境可能无法直接查询旧 Provider 下的线程。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本文使用第三方命令行工具 &lt;code&gt;codex-threadripper&lt;/code&gt; 重新扫描和同步本地线程。它不是 OpenAI 官方工具，安装和执行前建议先确认软件来源，并完整备份 &lt;code&gt;~/.codex&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="问题现象"&gt;&lt;a href="#%e9%97%ae%e9%a2%98%e7%8e%b0%e8%b1%a1" class="header-anchor"&gt;&lt;/a&gt;问题现象
&lt;/h2&gt;&lt;p&gt;使用 CCSwitch 切换 Codex 的中转站、&lt;code&gt;model_provider&lt;/code&gt; 或 &lt;code&gt;base_url&lt;/code&gt; 后，可能出现以下情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codex 可以正常启动和回答问题。&lt;/li&gt;
&lt;li&gt;新创建的对话可以正常保存。&lt;/li&gt;
&lt;li&gt;切换前的历史对话不再显示。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.codex&lt;/code&gt; 目录仍然存在，磁盘空间也没有明显减少。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类情况不一定代表历史文件被删除。Codex 的本地线程数据可能带有 Provider、模型来源或环境相关信息；切换配置后，新环境看到的线程集合可能和旧环境不同。&lt;/p&gt;
&lt;h2 id="恢复思路"&gt;&lt;a href="#%e6%81%a2%e5%a4%8d%e6%80%9d%e8%b7%af" class="header-anchor"&gt;&lt;/a&gt;恢复思路
&lt;/h2&gt;&lt;p&gt;完整流程可以概括为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;备份 ~/.codex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 使用 CCSwitch 切换到目标中转站
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 确认 Codex 可以正常运行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 使用 codex-threadripper 扫描并同步线程
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 重新打开 Codex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 检查历史记录和工具状态
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不要在没有备份的情况下直接修改或删除 Codex 本地数据库。历史文件还在时，通常还有恢复空间；原始数据一旦被覆盖，处理会麻烦很多。&lt;/p&gt;
&lt;h2 id="安装-codex-threadripper"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-codex-threadripper" class="header-anchor"&gt;&lt;/a&gt;安装 codex-threadripper
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;codex-threadripper&lt;/code&gt; 是用于扫描和处理 Codex 本地历史线程的第三方命令行工具。根据你使用的包管理方式，可以选择 Homebrew 或 npm。&lt;/p&gt;
&lt;h3 id="使用-homebrew-安装"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8-homebrew-%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;使用 Homebrew 安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew tap wangnov/tap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install codex-threadripper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="使用-npm-全局安装"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8-npm-%e5%85%a8%e5%b1%80%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;使用 npm 全局安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -g codex-threadripper
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装后先检查命令是否可用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex-threadripper --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果 Homebrew 或 npm 提示找不到包，说明当前软件源中没有该工具，或者工具名称、仓库地址已经变化。此时不要使用来源不明的二进制文件，先确认项目仓库和发布页面。&lt;/p&gt;
&lt;h2 id="mac-推荐恢复流程"&gt;&lt;a href="#mac-%e6%8e%a8%e8%8d%90%e6%81%a2%e5%a4%8d%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;Mac 推荐恢复流程
&lt;/h2&gt;&lt;h3 id="备份-codex-本地数据"&gt;&lt;a href="#%e5%a4%87%e4%bb%bd-codex-%e6%9c%ac%e5%9c%b0%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;备份 Codex 本地数据
&lt;/h3&gt;&lt;p&gt;先退出正在运行的 Codex，再执行备份：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -R ~/.codex ~/.codex_backup_&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d_%H%M%S&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;确认备份目录已经生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -ld ~/.codex_backup_*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;备份内容可能包含账户信息、配置和历史对话，不要上传到公开网盘、公共仓库或发送给不可信的人。&lt;/p&gt;
&lt;h3 id="使用-ccswitch-切换目标中转站"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8-ccswitch-%e5%88%87%e6%8d%a2%e7%9b%ae%e6%a0%87%e4%b8%ad%e8%bd%ac%e7%ab%99" class="header-anchor"&gt;&lt;/a&gt;使用 CCSwitch 切换目标中转站
&lt;/h3&gt;&lt;p&gt;在 CCSwitch 中切换到需要使用的目标中转站或模型提供方，然后重新打开 Codex，确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codex 可以正常启动。&lt;/li&gt;
&lt;li&gt;当前 Provider 可以正常鉴权。&lt;/li&gt;
&lt;li&gt;可以发送一条测试消息并收到回复。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先保证新环境本身可用，再同步历史记录。否则 Provider 配置问题和历史索引问题会混在一起，不容易判断故障位置。&lt;/p&gt;
&lt;h3 id="执行线程同步"&gt;&lt;a href="#%e6%89%a7%e8%a1%8c%e7%ba%bf%e7%a8%8b%e5%90%8c%e6%ad%a5" class="header-anchor"&gt;&lt;/a&gt;执行线程同步
&lt;/h3&gt;&lt;p&gt;在 Mac 终端运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex-threadripper sync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果工具没有自动识别 Codex 数据目录，可以显式指定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex-threadripper --codex-home &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.codex&amp;#34;&lt;/span&gt; sync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;$HOME/.codex&lt;/code&gt; 会在 macOS 上解析为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/Users/你的用户名/.codex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同步过程中不要同时启动多个 Codex 实例，也不要中途删除 &lt;code&gt;~/.codex&lt;/code&gt; 中的数据库或线程文件。&lt;/p&gt;
&lt;h3 id="重新加载-codex"&gt;&lt;a href="#%e9%87%8d%e6%96%b0%e5%8a%a0%e8%bd%bd-codex" class="header-anchor"&gt;&lt;/a&gt;重新加载 Codex
&lt;/h3&gt;&lt;p&gt;同步完成后，完全退出并重新启动 Codex，然后从当前版本提供的历史记录或恢复线程入口查看对话。&lt;/p&gt;
&lt;p&gt;Codex 不同版本的历史入口可能不同。若某个参数或交互指令不可用，先查看当前安装版本支持的命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;部分版本或界面可能提供历史列表、恢复会话、线程列表或搜索入口，应以当前客户端实际显示为准。&lt;/p&gt;
&lt;h3 id="查看同步状态"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e5%90%8c%e6%ad%a5%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;查看同步状态
&lt;/h3&gt;&lt;p&gt;可以使用第三方工具检查当前线程状态：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex-threadripper status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果该版本支持 Provider 分组，状态输出会按 &lt;code&gt;custom&lt;/code&gt;、&lt;code&gt;openai&lt;/code&gt; 等来源列出线程，便于确认旧记录是否已经被扫描和合并。&lt;/p&gt;
&lt;h2 id="如何判断恢复成功"&gt;&lt;a href="#%e5%a6%82%e4%bd%95%e5%88%a4%e6%96%ad%e6%81%a2%e5%a4%8d%e6%88%90%e5%8a%9f" class="header-anchor"&gt;&lt;/a&gt;如何判断恢复成功
&lt;/h2&gt;&lt;p&gt;可以从以下几个方面检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;切换前的历史线程重新出现在 Codex 中。&lt;/li&gt;
&lt;li&gt;打开旧线程后，用户消息和 Codex 回复顺序完整。&lt;/li&gt;
&lt;li&gt;新 Provider 下可以继续创建和保存对话。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;codex-threadripper status&lt;/code&gt; 能扫描到预期线程。&lt;/li&gt;
&lt;li&gt;重启 Codex 后，恢复的线程仍然可见。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见问题排查"&gt;&lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e6%8e%92%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;常见问题排查
&lt;/h2&gt;&lt;h3 id="找不到-codex-threadripper-命令"&gt;&lt;a href="#%e6%89%be%e4%b8%8d%e5%88%b0-codex-threadripper-%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;找不到 codex-threadripper 命令
&lt;/h3&gt;&lt;p&gt;先检查安装路径：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;which codex-threadripper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;codex-threadripper --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果通过 npm 安装，还需要确认 npm 全局可执行目录已经加入 &lt;code&gt;PATH&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="同步后仍然看不到旧对话"&gt;&lt;a href="#%e5%90%8c%e6%ad%a5%e5%90%8e%e4%bb%8d%e7%84%b6%e7%9c%8b%e4%b8%8d%e5%88%b0%e6%97%a7%e5%af%b9%e8%af%9d" class="header-anchor"&gt;&lt;/a&gt;同步后仍然看不到旧对话
&lt;/h3&gt;&lt;p&gt;按下面顺序检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确认同步时使用的是实际 Codex 目录 &lt;code&gt;~/.codex&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;确认执行同步前已经切换到目标 Provider。&lt;/li&gt;
&lt;li&gt;完全退出 Codex 后重新启动，而不是只关闭窗口。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;status&lt;/code&gt; 检查工具是否扫描到旧线程。&lt;/li&gt;
&lt;li&gt;检查旧数据是否位于其他 &lt;code&gt;CODEX_HOME&lt;/code&gt; 目录或备份目录。&lt;/li&gt;
&lt;li&gt;查看同步命令输出中是否有数据库锁、权限或格式不兼容错误。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="同步时提示数据库被占用"&gt;&lt;a href="#%e5%90%8c%e6%ad%a5%e6%97%b6%e6%8f%90%e7%a4%ba%e6%95%b0%e6%8d%ae%e5%ba%93%e8%a2%ab%e5%8d%a0%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;同步时提示数据库被占用
&lt;/h3&gt;&lt;p&gt;先退出 Codex 和其他可能访问 &lt;code&gt;~/.codex&lt;/code&gt; 的进程，再重试。不要在数据库正在写入时强制复制或修改索引。&lt;/p&gt;
&lt;h3 id="切回旧-provider-后历史又出现"&gt;&lt;a href="#%e5%88%87%e5%9b%9e%e6%97%a7-provider-%e5%90%8e%e5%8e%86%e5%8f%b2%e5%8f%88%e5%87%ba%e7%8e%b0" class="header-anchor"&gt;&lt;/a&gt;切回旧 Provider 后历史又出现
&lt;/h3&gt;&lt;p&gt;这通常说明原始历史数据没有丢失，而是不同 Provider 环境下的线程可见范围或索引不同。此时更应该先备份，再决定是否执行同步，而不是删除旧配置。&lt;/p&gt;
&lt;h2 id="回滚方法"&gt;&lt;a href="#%e5%9b%9e%e6%bb%9a%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;回滚方法
&lt;/h2&gt;&lt;p&gt;如果同步后出现异常，先退出 Codex。保留当前异常目录用于排查，然后将备份恢复为 &lt;code&gt;~/.codex&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;恢复前务必确认备份目录名称。下面只是示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv ~/.codex ~/.codex_after_sync
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -R ~/.codex_backup_20260611_120000 ~/.codex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不要直接照抄示例中的时间戳，应替换为你实际生成的备份目录。&lt;/p&gt;
&lt;h2 id="安全提醒"&gt;&lt;a href="#%e5%ae%89%e5%85%a8%e6%8f%90%e9%86%92" class="header-anchor"&gt;&lt;/a&gt;安全提醒
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.codex&lt;/code&gt; 可能包含登录状态、Provider 配置、API Key 引用和对话内容。&lt;/li&gt;
&lt;li&gt;不要把完整目录提交到 Git。&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;h2 id="小结"&gt;&lt;a href="#%e5%b0%8f%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;小结
&lt;/h2&gt;&lt;p&gt;使用 CCSwitch 切换 Codex 中转站后，历史记录消失通常不等于本地数据被删除，更可能是 Provider 配置变化后旧线程没有被当前环境读取。处理这类问题时，最重要的顺序是：&lt;strong&gt;先备份，再切换并验证 Provider，最后同步线程和检查结果。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;codex-threadripper&lt;/code&gt; 可以作为第三方恢复手段，但命令和包来源可能随版本变化。实际操作时，应先通过 &lt;code&gt;--help&lt;/code&gt; 核对当前版本，再对 &lt;code&gt;~/.codex&lt;/code&gt; 做任何写入操作。&lt;/p&gt;</description></item><item><title>个人博客建站流程（踩坑）</title><link>https://xedczq.cn/post/blog-build/</link><pubDate>Tue, 26 May 2026 11:30:00 +0800</pubDate><guid>https://xedczq.cn/post/blog-build/</guid><description>&lt;h1 id="个人博客建站流程"&gt;&lt;a href="#%e4%b8%aa%e4%ba%ba%e5%8d%9a%e5%ae%a2%e5%bb%ba%e7%ab%99%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;个人博客建站流程
&lt;/h1&gt;&lt;p&gt;个人博客上线的完整记录，一个很不理想的“踩坑流程”。&lt;/p&gt;
&lt;p&gt;这里把关键决策、问题原因和修复方式都写清楚，后面自己重搭时可以直接复用也当作教程发布。&lt;/p&gt;
&lt;h2 id="主流建站路线"&gt;&lt;a href="#%e4%b8%bb%e6%b5%81%e5%bb%ba%e7%ab%99%e8%b7%af%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;主流建站路线
&lt;/h2&gt;&lt;h3 id="免服务器路线"&gt;&lt;a href="#%e5%85%8d%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%b7%af%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;免服务器路线
&lt;/h3&gt;&lt;p&gt;适合技术新手、轻量展示需求、希望快速上线的人。&lt;/p&gt;
&lt;p&gt;典型方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GitHub Pages&lt;/code&gt; + &lt;code&gt;Hugo&lt;/code&gt; / &lt;code&gt;Hexo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;成本低，甚至可以接近 0 成本&lt;/li&gt;
&lt;li&gt;不需要维护服务器&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官网参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://pages.github.com/" target="_blank" rel="noopener"
 &gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://gohugo.io/" target="_blank" rel="noopener"
 &gt;Hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://hexo.io/" target="_blank" rel="noopener"
 &gt;Hexo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="传统服务器路线"&gt;&lt;a href="#%e4%bc%a0%e7%bb%9f%e6%9c%8d%e5%8a%a1%e5%99%a8%e8%b7%af%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;传统服务器路线
&lt;/h3&gt;&lt;p&gt;适合想要完全掌控、后续可能扩展动态功能的人。&lt;/p&gt;
&lt;p&gt;典型方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;购买云服务器 + 域名&lt;/li&gt;
&lt;li&gt;自建 Nginx + 静态站，或部署 WordPress/Typecho&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官网参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://wordpress.org/" target="_blank" rel="noopener"
 &gt;WordPress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://typecho.org/" target="_blank" rel="noopener"
 &gt;Typecho&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我最终选择的是传统服务器路线，因为我已经买了 1 年的云服务器，不想浪费。&lt;/p&gt;
&lt;h2 id="我的实际方案"&gt;&lt;a href="#%e6%88%91%e7%9a%84%e5%ae%9e%e9%99%85%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;我的实际方案
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;云服务器：华为云 ECS（已购 1 年）&lt;/li&gt;
&lt;li&gt;域名：阿里云购买 &lt;code&gt;xedczq.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;站点：静态博客（Hugo 生成 + Nginx 提供服务）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官网参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.huaweicloud.com/" target="_blank" rel="noopener"
 &gt;华为云&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.aliyun.com/" target="_blank" rel="noopener"
 &gt;阿里云&lt;/a&gt;&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;/ul&gt;
&lt;p&gt;后面事实证明，这两个“省钱决策”都没有错，但会带来额外的网络和备案流程复杂度。&lt;/p&gt;
&lt;h2 id="域名购买与解析"&gt;&lt;a href="#%e5%9f%9f%e5%90%8d%e8%b4%ad%e4%b9%b0%e4%b8%8e%e8%a7%a3%e6%9e%90" class="header-anchor"&gt;&lt;/a&gt;域名购买与解析
&lt;/h2&gt;&lt;p&gt;我在阿里云买完 &lt;code&gt;xedczq.cn&lt;/code&gt; 后，第一时间把 DNS 解析到了华为云服务器 IP，目的是先验证公网可达。&lt;/p&gt;
&lt;p&gt;这一步我建议先做三个最小验证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地 &lt;code&gt;nslookup 域名&lt;/code&gt; 是否解析到目标 IP&lt;/li&gt;
&lt;li&gt;服务器端服务是否真的监听在对外端口（80/443）&lt;/li&gt;
&lt;li&gt;安全组与防火墙端口是否放行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="icp-备案"&gt;&lt;a href="#icp-%e5%a4%87%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;ICP 备案
&lt;/h2&gt;&lt;p&gt;我遇到的第一个硬问题就是：ICP备案。&lt;/p&gt;
&lt;h3 id="什么情况下需要-icp-备案"&gt;&lt;a href="#%e4%bb%80%e4%b9%88%e6%83%85%e5%86%b5%e4%b8%8b%e9%9c%80%e8%a6%81-icp-%e5%a4%87%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;什么情况下需要 ICP 备案
&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;/ul&gt;
&lt;p&gt;通常不需要备案的场景：&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;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://beian.miit.gov.cn/" target="_blank" rel="noopener"
 &gt;工业和信息化部 ICP/IP 地址/域名信息备案管理系统&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为我不想重新买海外服务器，所以走了完整备案流程，前后大约 10 天。&lt;/p&gt;
&lt;h2 id="挂梯子后无法访问的问题"&gt;&lt;a href="#%e6%8c%82%e6%a2%af%e5%ad%90%e5%90%8e%e6%97%a0%e6%b3%95%e8%ae%bf%e9%97%ae%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;挂梯子后无法访问的问题
&lt;/h2&gt;&lt;p&gt;备案过后，我遇到了第二个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不挂梯子能访问&lt;/li&gt;
&lt;li&gt;挂梯子后访问异常&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个问题通常和“解析链路、代理线路、DNS 解析策略、地区网络路径”有关，不是单点故障。&lt;/p&gt;
&lt;p&gt;我一开始以为是华为服务器防火墙挡住了境外ip访问，查了半天突然发现直接用服务器ip可以访问到&amp;hellip;&lt;/p&gt;
&lt;p&gt;那就只能是 DNS 与线路策略存在地域差异，发现阿里云免费的DNS服务是只提供国内的解析，于是开始尝试引入 Cloudflare 做统一解析与代理。&lt;/p&gt;
&lt;h2 id="cloudflare-接入域名"&gt;&lt;a href="#cloudflare-%e6%8e%a5%e5%85%a5%e5%9f%9f%e5%90%8d" class="header-anchor"&gt;&lt;/a&gt;Cloudflare 接入域名
&lt;/h2&gt;&lt;p&gt;我把域名托管到了 Cloudflare，想解决跨地区访问稳定性问题。&lt;/p&gt;
&lt;p&gt;官网参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cloudflare.com/" target="_blank" rel="noopener"
 &gt;Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.cloudflare.com/application-services/products/dns/" target="_blank" rel="noopener"
 &gt;Cloudflare DNS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudflare 的核心优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全球 Anycast 网络&lt;/li&gt;
&lt;li&gt;DNS 生效快、可观测性好&lt;/li&gt;
&lt;li&gt;可选 CDN / WAF / 基础防护&lt;/li&gt;
&lt;li&gt;支持代理（橙色云）与仅 DNS（灰色云）两种模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="我踩到的点"&gt;&lt;a href="#%e6%88%91%e8%b8%a9%e5%88%b0%e7%9a%84%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;我踩到的点
&lt;/h3&gt;&lt;p&gt;我最开始直接开了“小橙云”（代理模式），结果站点反而不可用。&lt;/p&gt;
&lt;p&gt;排查后发现问题核心是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;代理模式会让访问先到 Cloudflare 边缘，再回源到我的服务器&lt;/li&gt;
&lt;li&gt;回源链路、证书模式、源站策略、备案接入条件如果没配齐，就可能触发访问异常&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="域名接入点备案"&gt;&lt;a href="#%e5%9f%9f%e5%90%8d%e6%8e%a5%e5%85%a5%e7%82%b9%e5%a4%87%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;域名接入点备案
&lt;/h2&gt;&lt;p&gt;Cloudflare 接入后又触发了“域名接入点备案”相关问题。我的处理方式是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先临时关闭代理（灰云，仅 DNS）&lt;/li&gt;
&lt;li&gt;回到华为云按要求做接入备案&lt;/li&gt;
&lt;li&gt;等待审核通过（我这次约 4 天）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步结束后，访问路径恢复稳定。&lt;/p&gt;
&lt;h2 id="https-上线"&gt;&lt;a href="#https-%e4%b8%8a%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;HTTPS 上线
&lt;/h2&gt;&lt;p&gt;最后一步是在服务器申请并部署免费 HTTPS 证书，完成全站加密访问。&lt;/p&gt;
&lt;p&gt;我这里采用的是免费证书方案（如 Let’s Encrypt 体系），并配置了 &lt;code&gt;HTTP -&amp;gt; HTTPS&lt;/code&gt; 跳转。&lt;/p&gt;
&lt;p&gt;官网参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://letsencrypt.org/" target="_blank" rel="noopener"
 &gt;Let&amp;rsquo;s Encrypt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到这里，博客才算真正完成上线。&lt;/p&gt;
&lt;h2 id="我这次流程的时间线"&gt;&lt;a href="#%e6%88%91%e8%bf%99%e6%ac%a1%e6%b5%81%e7%a8%8b%e7%9a%84%e6%97%b6%e9%97%b4%e7%ba%bf" class="header-anchor"&gt;&lt;/a&gt;我这次流程的时间线
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;域名购买与首轮解析：当天完成&lt;/li&gt;
&lt;li&gt;ICP 备案：约 10 天&lt;/li&gt;
&lt;li&gt;Cloudflare 接入与排查：1~2 天&lt;/li&gt;
&lt;li&gt;域名接入备案：约 4 天&lt;/li&gt;
&lt;li&gt;HTTPS 部署：当天完成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="最后总结"&gt;&lt;a href="#%e6%9c%80%e5%90%8e%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;最后总结
&lt;/h2&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;解析与代理是网络工程问题，不是一条命令的问题&lt;/li&gt;
&lt;li&gt;证书、回源、接入策略必须一起看，单点优化往往无效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这次建站最大的收获不是“会搭博客”，而是我对域名、DNS、备案、代理、回源链路这整条路径有了完整认知。&lt;/p&gt;</description></item><item><title>手机 GPT 连接 Mac Codex 教程</title><link>https://xedczq.cn/post/codex_%E6%89%8B%E6%9C%BAgpt%E8%BF%9E%E6%8E%A5%E6%95%99%E7%A8%8B/</link><pubDate>Tue, 26 May 2026 10:30:00 +0800</pubDate><guid>https://xedczq.cn/post/codex_%E6%89%8B%E6%9C%BAgpt%E8%BF%9E%E6%8E%A5%E6%95%99%E7%A8%8B/</guid><description>&lt;h1 id="手机-gpt-连接-mac-codex-教程"&gt;&lt;a href="#%e6%89%8b%e6%9c%ba-gpt-%e8%bf%9e%e6%8e%a5-mac-codex-%e6%95%99%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;手机 GPT 连接 Mac Codex 教程
&lt;/h1&gt;&lt;p&gt;这篇是我自己的实操记录，目标是把手机端 GPT 和 Mac 上的 Codex 正常联通。&lt;/p&gt;
&lt;h2 id="操作步骤"&gt;&lt;a href="#%e6%93%8d%e4%bd%9c%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;操作步骤
&lt;/h2&gt;&lt;h3 id="登录同一账号"&gt;&lt;a href="#%e7%99%bb%e5%bd%95%e5%90%8c%e4%b8%80%e8%b4%a6%e5%8f%b7" class="header-anchor"&gt;&lt;/a&gt;登录同一账号
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;在手机 GPT App 登录自己的账号&lt;/li&gt;
&lt;li&gt;在 Mac 的 Codex 里登录同一个账号&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="开启手机多因素认证"&gt;&lt;a href="#%e5%bc%80%e5%90%af%e6%89%8b%e6%9c%ba%e5%a4%9a%e5%9b%a0%e7%b4%a0%e8%ae%a4%e8%af%81" class="header-anchor"&gt;&lt;/a&gt;开启手机多因素认证
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;在手机端开启多因素认证（MFA），否则可能会在手机安全验证中失败&lt;/li&gt;
&lt;li&gt;我这里用的是 Apple 系统自带密码/认证能力完成验证&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="配置-codex-代理环境变量"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae-codex-%e4%bb%a3%e7%90%86%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8f" class="header-anchor"&gt;&lt;/a&gt;配置 Codex 代理环境变量
&lt;/h3&gt;&lt;p&gt;编辑 &lt;code&gt;~/.codex/.env&lt;/code&gt; 文件，加入以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-env" data-lang="env"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HTTP_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HTTPS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ALL_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WSS_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;http_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;https_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;all_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ws_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;wss_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:6789
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NO_PROXY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost,127.0.0.1,::1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;no_proxy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost,127.0.0.1,::1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置完成后，重启 Codex。&lt;/p&gt;
&lt;p&gt;魔法用户不改代理环境时codex可以正常使用 但是手机端可能会显示设备不在线&lt;/p&gt;
&lt;h3 id="连接手机与-codex"&gt;&lt;a href="#%e8%bf%9e%e6%8e%a5%e6%89%8b%e6%9c%ba%e4%b8%8e-codex" class="header-anchor"&gt;&lt;/a&gt;连接手机与 Codex
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;重启后重新尝试手机端与 Codex 的连接流程&lt;/li&gt;
&lt;li&gt;连接成功后即可正常使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="成功标准"&gt;&lt;a href="#%e6%88%90%e5%8a%9f%e6%a0%87%e5%87%86" class="header-anchor"&gt;&lt;/a&gt;成功标准
&lt;/h2&gt;&lt;p&gt;我这边判断是否成功主要看两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;手机 GPT 与 Mac Codex 使用同一账号状态稳定&lt;/li&gt;
&lt;li&gt;Codex 网络请求正常，不再出现代理/连接异常&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="排查建议"&gt;&lt;a href="#%e6%8e%92%e6%9f%a5%e5%bb%ba%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;排查建议
&lt;/h2&gt;&lt;p&gt;如果失败，我会按下面顺序排查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查手机和 Mac 是否确实为同一账号&lt;/li&gt;
&lt;li&gt;检查 MFA 是否已完成并生效&lt;/li&gt;
&lt;li&gt;检查 &lt;code&gt;~/.codex/.env&lt;/code&gt; 是否保存成功、端口是否正确&lt;/li&gt;
&lt;li&gt;确认本地代理 &lt;code&gt;127.0.0.1:6789&lt;/code&gt; 是否启动，端口是否一致&lt;/li&gt;
&lt;li&gt;重启 Codex 后再试一次&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>