Press 域名切换 — 跨CF失败回退与同根原生改名

TL;DR

两次尝试换 Press 控制面板域名。第一次跨根域名(getgrowth.app → solar-flow.ai,不同 CF 账户)仅部分成功,有严重副作用,已回退。第二次同根换前缀(press.getgrowth.app → os.getgrowth.app)成功,采用 Frappe 原生目录改名方式,无软链接依赖。

现状:✅ os.getgrowth.app 原生运行中;press.getgrowth.app 已废弃(目录已改名)。


🎯 背景

  • 需求:老师要求 Press 控制面板域名从 press.getgrowth.app 换掉
  • 第一次尝试:跨根域名换到 os.solar-flow.ai(不同 CF 账户),通过替换 tunnel token + 软链接实现 → 副作用太大,已回退
  • 第二次尝试:同根域名换到 os.getgrowth.app(同一 CF 账户),通过 Frappe 原生目录改名实现 → 成功
  • 卡点:跨根域名时 Frappe 生态完全不认新域名(nginx、Agent、DB 全写死旧根域名),只换一个 Press 面板导致整站不可用

✅ 前置条件

  • Press VPS (104.236.24.124) root SSH
  • getgrowth.app 在旧 CF 账户中,solar-flow.ai 在新 CF 账户中
  • 两个 CF 账户均有 Zero Trust Tunnel 可用
  • 知道如何通过 Press 容器跳板访问 n1+f1(docker exec ssh -o StrictHostKeyChecking=no root@45.55.93.224

🏗️ 零信任隧道架构(背景知识)

浏览器
  → CF Zero Trust Tunnel
    → cloudflared (Press VPS 宿主机, systemd 管理, Type=notify)
      → localhost:8082
        → Docker 端口映射 → frontend 容器:8080 (nginx)
          → proxy_pass backend:8000 (Gunicorn)
            → Frappe bench 站点

三台 VPS 的 tunnel 分布

VPScloudflared流量方式
Press (104.236.24.124)有,systemdTunnel 代理 Press 面板
n1+f1 (45.55.93.224)CF DNS 橙云 → 公网 IP → nginx
m1 (159.65.38.50)纯数据库

Press 容器名(docker-compose 命名规则):

  • frappepress-press-frontend-1(nginx,宿主机 8082→容器 8080)
  • frappepress-press-backend-1(Gunicorn + bench,监听 8000)
  • frappepress-press-db-1(Press 专用 MariaDB)

请求链路关键点:nginx server_name $host + X-Frappe-Site-Name $host → Frappe 用 host 匹配 sites/<域名>/ 目录名 → 找不到就 404


🛠️ 第一次:跨根域名切换(getgrowth.app → solar-flow.ai)❌ 已回退

第 1 步:替换 CF Tunnel Token

cp /etc/systemd/system/cloudflared.service /etc/systemd/system/cloudflared.service.bak
sed -i 's|^ExecStart=.*|ExecStart=/usr/local/bin/cloudflared --no-autoupdate tunnel run --token <新CF账户Token>|' /etc/systemd/system/cloudflared.service
systemctl daemon-reload && systemctl restart cloudflared

第 2 步:新 CF 账户配置 Public Hostname

Zero Trust → Networks → Tunnels → Public Hostname:os.solar-flow.ailocalhost:8082

第 3 步:软链接解决 404

docker exec -u root frappepress-press-backend-1 ln -sf \
  /home/frappe/frappe-bench/sites/press.getgrowth.app \
  /home/frappe/frappe-bench/sites/os.solar-flow.ai

⚠️ 副作用(导致回退的原因)

  1. 现有站点全部不可访问:gottenergy/demo1/demo2 的 nginx + site_url 还是 getgrowth.app
  2. 软链接容器重建后丢失
  3. Press DB 记录仍指向旧域名:Root Domain、Server name、Press Settings domain
  4. n1+f1 的 nginx 和 Agent 配置完全是旧域名,Agent 无法上报 Press
  5. Token 明文在 service 文件,权限 644

第 4 步:回退

cp /etc/systemd/system/cloudflared.service.bak /etc/systemd/system/cloudflared.service
systemctl daemon-reload && systemctl restart cloudflared
docker exec frappepress-press-backend-1 rm -f /home/frappe/frappe-bench/sites/os.solar-flow.ai

🛠️ 第二次:同根域名前缀切换(press.getgrowth.app → os.getgrowth.app)✅ 成功

核心思路

跨根域名需要改几十处配置(nginx、Agent、DB、DNS、TLS)。同根域名只需改 Press 面板这一个子域名,因为 *.getgrowth.app 通配符生效,DNS/TLS/nginx 全都不用动。

第 1 步:CF Zero Trust 加 Public Hostname

在原有 tunnel 下新增:os.getgrowth.applocalhost:8082 (不要删旧的 press.getgrowth.app,等验证通过再删)

第 2 步:Frappe 原生改名(目录 + 数据库)

# 删掉可能存在的旧软链接
docker exec frappepress-press-backend-1 rm -f /home/frappe/frappe-bench/sites/os.getgrowth.app
 
# 重命名站点目录(Frappe 核心操作)
docker exec frappepress-press-backend-1 mv \
  /home/frappe/frappe-bench/sites/press.getgrowth.app \
  /home/frappe/frappe-bench/sites/os.getgrowth.app
 
# 更新 DB 里的 site_url
echo "
frappe.db.sql(\"UPDATE tabSingles SET value='os.getgrowth.app' WHERE field='site_url'\")
frappe.db.commit()
print('site_url:', frappe.db.sql(\"SELECT value FROM tabSingles WHERE field='site_url'\", as_dict=True))
" | docker exec -i frappepress-press-backend-1 bench --site os.getgrowth.app console

第 3 步:验证

curl -s -o /dev/null -w "HTTP %{http_code}
" http://localhost:8082 -H "Host: os.getgrowth.app"
# 预期:200

为什么同根切换比跨根简单

配置项跨根(solar-flow.ai)同根(os.getgrowth.app)
CF DNS需加 *.solar-flow.ai*.getgrowth.app 已覆盖
CF Tunnel需跨账户换 token同一账户直接加 Public Hostname
n1 nginx需改 proxy.conf + bench nginx.conf不改,*.getgrowth.app 匹配
Agent press_url需改不改,DNS 还在
Press DBRoot Domain、Server、Press Settings 全改只改 site_url
TLS 证书需新建 *.solar-flow.ai*.getgrowth.app 已覆盖
站点 gottenergy/demo1/demo2全需改 site_url不动
影响范围全生态仅 Press 面板自身

🔀 意外插曲:UFW 封锁 80/443 导致站点 522

域名切换过程中发现 demo2.getgrowth.app 返回 522 Connection Timeout。

排查

# Press VPS → n1+f1 测端口
ping 45.55.93.224          # 通
timeout 3 bash -c 'echo > /dev/tcp/45.55.93.224/443'  # BLOCKED
timeout 3 bash -c 'echo > /dev/tcp/45.55.93.224/80'   # BLOCKED
 
# SSH 进去看 UFW
docker exec frappepress-press-backend-1 ssh -o StrictHostKeyChecking=no root@45.55.93.224 "ufw status verbose"
# → 只有 22/tcp 和 2525/tcp,没有 80 和 443

根因

部署邮件桥接(cf-smtp-bridge)时加了 UFW 规则保护 2525 端口,但 UFW 默认策略是 deny incoming,80/443 没在 allow 列表里,被拒之门外。

修复

docker exec frappepress-press-backend-1 ssh -o StrictHostKeyChecking=no root@45.55.93.224 \
  "ufw allow 80/tcp && ufw allow 443/tcp"

🔍 验证方法

# Press 面板
docker exec frappepress-press-backend-1 bench --site os.getgrowth.app execute "frappe.db.get_single_value('System Settings', 'System Settings', 'site_url')"
 
# 站点连通性
curl -s -o /dev/null -w "HTTP %{http_code}
" https://demo2.getgrowth.app
 
# Tunnel 状态
systemctl status cloudflared | head -5

🕳️ 被否决的方案


⚠️ 已知限制 / 副作用

  • press.getgrowth.app 已不可用:站点目录已重命名,通过旧域名访问会 404
  • CF Zero Trust 里旧的 press.getgrowth.app Public Hostname 可删除
  • solar-flow.ai 方案存档:已确认为「完全夺舍替换」而不是单点切换,见 跨CF账号改域名

🔒 安全 & 成本速查

  • Token 存放/etc/systemd/system/cloudflared.service,权限 644
  • UFW 规则:n1+f1 必须保持 80/tcp + 443/tcp + 22/tcp + 2525/tcp(Docker内网)
  • 月度成本:无额外成本
  • 回滚方式mv sites/os.getgrowth.app sites/press.getgrowth.app + 改 DB site_url 回去

📌 待办

  • 删掉 CF Zero Trust 里旧的 press.getgrowth.app Public Hostname
  • 等 solar-flow.ai 全面夺舍时,参照 跨CF账号改域名 的完整清单

📋 速查命令合集

# Press 容器名
docker ps --format '{{.Names}}' | grep press
 
# 查 tunnel
systemctl status cloudflared
journalctl -u cloudflared --since "5 min ago" --no-pager
 
# 本地测试 Press
curl -s -o /dev/null -w "HTTP %{http_code}
" http://localhost:8082 -H "Host: os.getgrowth.app"
 
# 查 n1+f1 UFW
docker exec frappepress-press-backend-1 ssh -o StrictHostKeyChecking=no root@45.55.93.224 "ufw status verbose"
 
# 查 bench 容器
docker exec frappepress-press-backend-1 ssh -o StrictHostKeyChecking=no root@45.55.93.224 "docker ps --format '{{.Names}} {{.Status}}'"
 
# 测试端口
timeout 3 bash -c 'echo > /dev/tcp/45.55.93.224/443' && echo "OK" || echo "BLOCKED"

📝 更新日志

日期改动原因
2026-07-08跨根 solar-flow.ai 尝试 → 发现副作用 → 回退单点切换导致生态全挂
2026-07-08同根 os.getgrowth.app 原生改名成功Frappe 目录改名 + DB site_url
2026-07-08修复 n1+f1 UFW 封锁 80/443邮件桥接部署时漏加规则