最近我把主站从 humfurie.org 迁移到了 humfurie.com。听起来只是改个名字,结果牵涉到 DNS、动态 DNS、Cloudflare 缓存、反向代理、DNS 过滤器,以及我自建的几乎所有服务。我从没想过会这么麻烦,所以写下这篇文章,记录改了什么、需要更新什么,以及如果你也要这么做,应该检查哪些东西。
改了什么
两个域名同时互换了角色,这正是它比一般迁移更复杂的原因:
- humfurie.org 变成了 humfurie.com。现在这是我的主站和作品集。
- humphrey.humfurie.org 变成了 humfurie.org。这是一个独立的网站:一个 Laravel 加 React 12 的应用,是我用来学习 Laravel 的副业项目。
所以 humfurie.org 并没有消失,而是指向了一个与以前完全不同的网站,这会影响缓存等方面,下面会讲到。
第 1 步:DNS 记录和动态 DNS
第一项工作是把我所有的域名和子域名添加到新的 DNS 记录里。我对外提供的每个服务都有自己的主机名,所以每一个都需要在新域名下建一条记录。
我还在 Portainer 里用 oznu 的镜像设置了动态 DNS(DDNS)。当你家里宽带的公网 IP 地址变化时,DDNS 能让 DNS 记录继续指向你的网络。没有它的话,运营商一旦分配了新地址,自建环境就可能悄无声息地失效。
第 2 步:切换子域名上的每个服务
所有运行在子域名上的东西都要迁到新域名。清单比我记得的还要长:
- 我的作品集和新的 humfurie.org 网站
- Immich
- AdGuard
- Outline
- n8n
- humfurie.org 的 API
- 我的 Resend 实例
- Cordova 网站
- LibreChat
- 我的 R2 实例
这些服务各自的配置里都引用了自己的主机名,所以改完 DNS 之后,没有一个能当成「设置好就不用管」。
第 3 步:重做 Cloudflare 缓存
切换之后,页面不能正常加载了。原因是缓存:Cloudflare 还保留着旧环境的内容和设置。我不得不重做缓存,页面才恢复正常。
我还专门重做了 humfurie.org 的缓存设置。因为它现在是一个与原来那个地址上完全不同的网站,旧的缓存行为已经不再适用。如果你也把域名挪给新网站用,同样要处理这个问题。
第 4 步:更新代码和 MCP 连接
代码方面,我把作品集改成使用 humfurie.com。由于我的个人服务现在换了域名,我也更新了 Claude 的 MCP,因为旧的 URL 已经失效。做完这些之后,我把所有改动都推送了上去。
第 5 步:服务器端(这还没结束)
我以为代码推送完就结束了,其实不然。部署在我自建服务器上的服务,同样需要使用新域名:
- 我通过 SSH 连上服务器,把每个服务都拉取了最新代码。
- 我更新了各个 .env 文件,里面保存着每个服务启动时读取的域名设置。
- 我更新了 Traefik,也就是我的反向代理。它按主机名来路由请求,所以换域名意味着这里也有大量要改的地方。
- 我更新了 AdGuard,因为我用到了它的 DNS 功能,里面的条目需要和新域名保持一致。
第 6 步:我仍然无法解释的警告(本地问题还是全局问题?)
就在我以为一切正常时,出现了一个新问题。我的一些子域名(n8n、outline 和 cordova)被显示为不安全,浏览器提示连接不是私密连接。这个问题还没解决,说实话,我还不知道它只是我自己网络上的本地问题,还是所有人都会遇到的全局问题。
以下是我目前的发现,以及为什么说不通:
- Google 安全浏览的站点状态显示这些网站是安全的,但警告依然出现。
- SSL 证书看起来没问题。我在 Mac 上检查 n8n.humfurie.com,看到的是切换当天签发的有效 Let's Encrypt 证书,主机名也正确。所以至少在那条路径上,证书看起来没有问题。
- 我的 DNS 返回了奇怪的结果。查看 AdGuard 的查询日志,返回的地址是 0.0.0.0 或 192.168.0.0,而我的服务器本应返回 192.168.1.1。据我所知,这种情况对所有网站都存在,不只是我自己的,这说明问题出在我的 DNS 设置上,而不是 Google。
我目前怀疑是 AdGuard,因为我在使用它的 DNS 功能,而且迁移期间改动了很多设置。返回空地址的 DNS 过滤器会让浏览器无处可去,证书警告可能只是副作用。但我还没有确认,也不能排除新域名确实存在信誉问题的可能。接下来我会查看查询日志里对每次应答原因的说明(拦截、重写,还是上游返回的结果),比较 AdGuard、路由器和公共解析器(例如 1.1.1.1)的应答,并用手机的移动网络打开同样的网站,看问题是否在我的网络之外也会出现。
等我弄清楚是本地问题还是全局问题,我会更新这一节。
如果你要切换域名,请对照这份清单
- 开始之前,列出所有使用旧域名主机名的服务。
- 把所有新域名和子域名添加到 DNS 记录中;如果 IP 会变化,请设置 DDNS。
- 清除并重建 CDN 缓存,尤其是当旧域名现在指向另一个网站时。
- 更新每一个应用配置和 .env 文件,而不仅仅是代码仓库里的代码。
- 更新反向代理的路由规则。
- 更新所有引用旧名称的本地 DNS 或过滤规则,并用网络之外的设备也测试一遍。
- 更新通过 URL 调用你服务的集成,包括 MCP 连接这样的工具。
- 尽早在 Google Search Console 中验证新域名,这样子域名被标记时,你能看到安全警告并申请重新审核。
最后的想法
大部分环境现在已经运行在新域名上,但步骤比我预想的多得多,第 6 步的警告仍然是个悬而未决的问题。最主要的教训是:自建意味着你要为每一个依赖负责,包括那些你已经不再留意的部分,比如 DNS、缓存和路由。如果你打算做类似的迁移,先写好检查清单,并且不仅要在自己的网络内测试,也要在网络外测试。想起更多细节后,我会继续补充这篇文章。