# 22 · 服务域名迁移:dsh.alotbuy.com → alotbuy.com - 日期:2026-09-10 - 触发:用户裁定「服务域名改为 alotbuy.com」,并在两条路径中选定 **路径 ②:走 Cloudflare 代理(橙云,零 DNS 改动)** - 结论一句话:**已完成迁移** —— 门户 = `https://alotbuy.com`,用户实例 = `https://<用户名>.alotbuy.com`;旧域名 `dsh.alotbuy.com` 全部 **301** 到新域名(含用户名映射);证书 `alotbuy.com + *.alotbuy.com` 已签发且**续期演练参数已加固**。 - 状态:**已上线**;遗留:CF SSL 模式建议人工确认 Full (Strict)、全员需重新登录 > **TL;DR**|**结论**:域名迁移完成:门户 **`alotbuy.com`**、用户实例 **`<用户名>.alotbuy.com`**;旧域 `dsh.alotbuy.com` 全部 **301**(含用户名映射)。 > **关键**:走 Cloudflare 代理(橙云、零 DNS 改动);签 `alotbuy.com + *.alotbuy.com` 通配证书(**DNS-01 传播必须 60 s**)+ CF 真实 IP 还原。 > **状态**:✅ 已上线(含回滚步骤) --- ## 一、决策与前置侦察(实测) | 项 | 结果 | |---|---| | `alotbuy.com` A 记录 | **已指向本机** `47.77.182.89`,经 **Cloudflare 代理(橙云)** | | `alotbuy.com` 当时内容 | **nginx 404(空站)** → 根域未被占用,接管无冲突 ✅ | | `*.alotbuy.com` | **通配记录已存在**(橙云)→ 用户子域天然可解析 ✅ | | 同域其它记录 | `gao`/`mao`→154.40.35.3、`www`→apex、`work`→apex、`alimail/smtp`→mxhichina、MX/TXT(SPF) → **迁移不触碰这些** | | CF token 权限 | **仅 DNS(Zone:DNS:Edit)**:能改记录、能签 DNS-01 证书;**不能读写 zone 设置**(SSL 模式需人工确认) | | CF 回源端口(实测 `ss`) | 全部 **443**,无 80 连接 → CF 处于 Full(或 Strict)模式,**CF→源站已加密**,无明文风险 ✅ | | 备案 | alotbuy.com 已在阿里云备案(否则子域无法访问)✅ | ## 二、执行步骤(含踩坑) ### 1. 签发通配证书(DNS-01) ```bash certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/cloudflare.ini \ --dns-cloudflare-propagation-seconds 60 --non-interactive --agree-tos \ --cert-name alotbuy.com -d alotbuy.com -d '*.alotbuy.com' ``` 产物:`/etc/letsencrypt/live/alotbuy.com/{fullchain,privkey}.pem`(有效期至 2026-12-09,已配置自动续期)。 > ⚠️ **踩坑 1(重要)**:首次签发**失败**(`No TXT record found at _acme-challenge.alotbuy.com`)。certbot 日志显示 TXT 记录**创建成功**,只是**默认只等 10 秒传播**(CF 上实测 ~10 s 才可见,正好卡边界)。写临时 TXT 探测证实记录可被 Google/CF 解析到(无通配 CNAME 劫持),**把传播等待改为 60 s 后即成功**。 > ⚠️ **踩坑 2(续期)**:`certbot` 只把该参数写进**新证书**的 renewal conf;**旧证书(dsh.alotbuy.com)仍是默认 10 s** → 会在 ~60 天后续期失败。已给两个 renewal conf 都补上 `dns_cloudflare_propagation_seconds = 60`。 ### 2. nginx vhost(新域名) - 新增 `/www/server/panel/vhost/nginx/alotbuy.com.conf`:`server_name alotbuy.com www.alotbuy.com *.alotbuy.com`,80 段**代理**(不 301,兼容 CF 任一模式),443 段用新证书; - 继承 dsh 站点的三项优化:`proxy_buffering off`(流式)、`gzip_proxied any`(930 KB bundle 压缩)、`/assets/` 长缓存; - **CF 真实 IP 还原**:`set_real_ip_from ` + `real_ip_header CF-Connecting-IP`(写在 server 块内,避免全局生效;否则日志/风控里全是 CF 机房 IP)。 > 踩坑 3:`set_real_ip_from` 写在 vhost 文件顶层会落到 **http 上下文作用于全局**,务必放进 server 块。 ### 3. 切换域名配置(drain + 重启) 脚本:`/opt/dsh/switch-domain-alotbuy.sh`(幂等、带备份、**drain 用按 pid 结束而非 `pkill -f`**——后者会杀掉自身 ssh 会话,档案 20 已踩过) ``` env: DSHS_BASE_DOMAIN=alotbuy.com DSHS_COOKIE_DOMAIN=.alotbuy.com (备份 /etc/dshs.env.bak-20260910-2332) 停服务 → 结束残留 dsh 子进程/scope → 起服务(残留实例数 = 0) ``` ### 4. 旧域名 301(保留用户名映射) `dsh.alotbuy.com.conf` 改为纯跳转,使用 **map + 通配 server_name**(正则 server_name 实测**不匹配**,踩坑 4): ```nginx map $host $alotbuy_new_host { default alotbuy.com; ~^(?