# ERR-20260516-003 — setup-test-server.sh 共机模式 ufw 阻塞主站 :80/:443

## 现象

跑 `sudo bash setup-test-server.sh`（共机模式）后，test 服务器主站 `https://ffworkspace.test.faradayfuturecn.com/` 从公网完全不可达（curl 返 000 / 超时），但宿主上 nginx 仍 active、`curl localhost` 仍正常。

## 根因

我写第一版共机分支时，想法是"nginx 已托管 :80/:443，setup 不要碰这两个端口"，于是 ufw 段只做：

```bash
ufw allow 22/tcp
ufw deny 8080/tcp
... ufw enable
```

错在哪：

- ufw 默认策略是 `deny incoming`
- 跑前 ufw 可能**未启用**（test 服务器历史就如此——nginx 一直靠 iptables-default 通畅）
- 一旦 `ufw enable`，只剩 :22 一条 ALLOW，:80/:443 没显式放行 → 默认 deny 把主站打死

把"don't touch :80/:443"误解为"don't add allow rule"，实际是"don't add Caddy 进程到这两个端口"。允许规则该不该加和 Caddy 是否监听**完全无关**——只取决于这两个端口要不要对外。

## 解决

立即恢复：

```bash
sudo ufw allow 80/tcp && sudo ufw allow 443/tcp
```

源头修：setup-test-server.sh 不再按模式分两段写 ufw，统一开 22/80/443，仅 :8080 共机模式时显式 deny（独立模式 :8080 不存在，no-op）。

## 复用建议

- **拉起防火墙时永远先 `ufw allow` 现网必需的端口，再 `enable`**。"沿用现状"在 ufw 这里不成立——`enable` 永远把策略压到 `default deny`。
- **共机/独立模式判定影响的是"我跑哪些进程"，不是"宿主开哪些端口"**。端口开放是宿主既定事实，setup 脚本要尊重而不是覆写。
- **改一台多人共用服务器的防火墙前**，先 `sudo ufw status verbose` 截一份，跑完对比；本次因为偷懒没截图，差点判断不出来。
- 跑 setup 类脚本要预备一个**带主机外网 curl**的并行 session 持续 ping 主站，第一次 5xx/超时立刻停下。

## 关联

- 一并修了 [`scripts/internal-app-platform/setup-test-server.sh`](../../scripts/internal-app-platform/setup-test-server.sh) §5
- 与 [`12-nginx-caddy-coexist.md`](../../docs/modules/internal-app-platform/12-nginx-caddy-coexist.md) §3 一致：共机模式仅改"Caddy 绑哪儿"，不改"宿主开哪些端口"
- 同事故链上还有 ERR-20260516-001（缺 env） / 002（PoC infra 没迁）——都是 PR 合并后没把目标服务器同步到"可用"状态
