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 分布:
| VPS | cloudflared | 流量方式 |
|---|---|---|
| Press (104.236.24.124) | 有,systemd | Tunnel 代理 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坑:sed 替换 token 失败
现象:
sed: -e expression #1, char 195: unterminated 's' command根因:token 太长(JWT 格式),终端输出被截断为eyJ*******,复制不完整 解决:改为整行替换s|^ExecStart=.*|ExecStart=...新token|,不匹配旧 token 内容
第 2 步:新 CF 账户配置 Public Hostname
Zero Trust → Networks → Tunnels → Public Hostname:os.solar-flow.ai → localhost: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为什么是软链接而不是 currentsite.txt
currentsite.txt是 Frappe 官方回退机制,但会让所有未知域名都落到 Press 站点。软链接更精准,且让 Frappe 开始生成新域名为基站的 URL——这正是迁移目标。
坑:404 排查过程
- 先以为 nginx 有问题 → 查 backend 容器
ss -tlnp | grep 8082无输出 → 才发现 nginx 在 frontend 容器不在 backend- 查 frontend
frappe.conf→server_name $host接受任意域名 → nginx 没问题- 最终确认 Frappe 用 Host header 匹配
sites/目录 →sites/os.solar-flow.ai/不存在
⚠️ 副作用(导致回退的原因)
- 现有站点全部不可访问:gottenergy/demo1/demo2 的 nginx + site_url 还是
getgrowth.app - 软链接容器重建后丢失
- Press DB 记录仍指向旧域名:Root Domain、Server name、Press Settings domain
- n1+f1 的 nginx 和 Agent 配置完全是旧域名,Agent 无法上报 Press
- 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.app → localhost: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坑:bench execute 不支持分号
现象:
bench execute "frappe.db.set_value(...); frappe.db.commit()"→SyntaxError: invalid syntax根因:bench execute是 eval 模式,只接受单表达式 解决:换bench console+ 管道传多行代码
坑:bench execute 解析 frappe.db 模块失败
现象:
ModuleNotFoundError: No module named 'frappe.db'根因:bench execute把frappe.db.xxx()按最后一个.拆成 module=frappe.db+ method=xxx(),但frappe.db不是独立模块 解决:换 console 管道方式,或用 SQL 直接操作
第 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 DB | Root 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🕳️ 被否决的方案
方案 A:跨根域名软链接(getgrowth.app → solar-flow.ai)
问题:只改了 Press 面板一个点,生态其余 20+ 处配置全未动,副作用太大(站点全挂、Agent 失联) 教训:跨根域名必须全面夺舍,不能只改一个入口。要么全改,要么不改。
方案 B:currentsite.txt 作为默认站点
问题:所有未知域名都会落到 Press 站点,安全风险。不如软链接精准 保留:适合单站点 bench 的兜底方案
⚠️ 已知限制 / 副作用
- 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 | 邮件桥接部署时漏加规则 |