# yc3 总控运维记录

最后验证：2026-07-19

## 服务边界

- `yc3.flha.ru` 提供静态页面、客户端发布、健康聚合和公共行情读取代理。
- 公共行情 GET 请求优先读取 `yc2.flha.ru`，仅在连接失败或上游返回 5xx 时回退到 `yc.flha.ru`。
- 鉴权、审计、模拟账户、DCA 推荐、回测接口和所有写操作始终固定到 `yc2.flha.ru`。
- 4xx 响应不会触发回退，防止参数或权限错误被另一个上游掩盖。

## 回退白名单

- `/api/health`
- `/api/ticker/price`
- `/api/ticker/depth`
- `/api/btc/signal`
- `/api/eth/signal`
- `/api/news/live`
- `/api/sr`
- `/api/support-resistance`
- `/api/eth/analysis`
- `/api/sol/analysis`
- `/api/gold/analysis`
- `/api/oil/analysis`
- `/api/signal/history`
- `/api/signal/stats`
- `/data/ops.json`

成功响应包含：

- `X-WarRoom-Upstream: yc2|yc`
- `X-WarRoom-Failover: 0|1`

## HTTPS

- 域名：`yc3.flha.ru`
- 证书：Let's Encrypt
- 当前证书有效期：2026-07-19 至 2026-10-17
- `certbot.timer` 已启用并处于运行状态。
- 续期部署钩子会校验并重载 sing-box 内置 Nginx。
- HTTP 请求永久重定向到 HTTPS，HTTPS 返回 HSTS。

## 验证

```powershell
curl.exe -i "https://yc3.flha.ru/api/ticker/price?symbol=BTCUSDT"
curl.exe -i -X POST "https://yc3.flha.ru/api/ticker/price?symbol=BTCUSDT"
curl.exe -I "http://yc3.flha.ru/"
curl.exe "https://yc3.flha.ru/api/master/status?fresh=1"
```

预期结果：

- 正常行情响应为 200，并显示 `X-WarRoom-Upstream: yc2`。
- 公共读取路径上的 POST 返回 405。
- HTTP 返回 301 并跳转到 HTTPS。
- 状态文档的 `gateway.version` 不低于 `1.1.0`，`read_routing.stateful_upstream` 为 `yc2`。

## 发布注意事项

- 使用 `deploy-master.ps1 -CoreOnly` 发布网页、主控服务和 Nginx 配置。
- 部署凭据只能通过 `MASTER_DEPLOY_KEY`、`MASTER_DEPLOY_PWFILE` 或 `MASTER_DEPLOY_PASSWORD` 注入，不得写入仓库。
- 每次发布必须重启 `master-control.service`；安装脚本已执行 `systemctl restart`，避免新代码落盘但旧进程继续运行。
- 发布完成后必须检查 Nginx 配置、主控版本、正常读取、强制回退和证书定时器。

## 外部告警

- `warroom-alert-notifier.timer` 每分钟从本机 `127.0.0.1:9080/data/ops.json` 读取双节点状态。
- Telegram / Webhook 凭据只保存在 `/etc/warroom/alerts.env`，权限必须为 `0600`。
- 私有去重状态位于 `/var/lib/warroom-alerts/state.json`；网页只读取不含凭据的 `/data/alert-notifier.json`。
- 配置格式、阈值和验收流程见 `ALERTING.md`。

## Sing-box 端口契约

2026-07-19 线上核验：Sing-box 配置检查通过，服务为 `active/enabled`。

- TCP 直连：`8881`、`8884`、`8885`、`8886`、`8889`、`8890`、`8891`、`8892`。
- UDP 直连：`8882`、`8883`、`8892`；外部抓包验证三端口均可到达。
- WebSocket 公网入口：订阅使用 CDN 的 TCP `80/443`，源站 Nginx 监听 `23011`。
- `8887/8888` 是 Nginx 回源到 VMess/VLESS 的本地后端端口，客户端不得直接填写；两个回源路径均已验证返回 HTTP `101 Switching Protocols`。
- `9080` 是主控内部端口，仅绑定 `127.0.0.1`，公网超时是预期安全状态。

排障时先确认客户端重新拉取当前订阅，再核对所选节点的协议和端口。网站 HTTPS 正常只能证明 `443` 的 Web 服务，不等同于所有代理协议都正常。

## 开机启动链

2026-07-19 修复了重启后入口失联：WARP 策略路由曾把系统 DNS 送进尚未握手的隧道，Nginx 又在启动时解析上游域名，形成循环依赖。

当前启动顺序：

1. `wg-quick@warp.service` 创建 WARP 接口。
2. `warroom-network-bootstrap.service` 强制公共 DNS 走物理网络主路由。
3. `warroom-nginx.service` 独立启动 `/etc/sing-box/nginx.conf`，不再依附 Sing-box 的 `ExecStartPre`。
4. `sing-box.service` 与 `argo.service` 在入口和 DNS 就绪后启动。
5. `master-control.service`、`warroom-alert-notifier.timer`、`warroom-dr@yc3.timer`、`certbot.timer` 分别由 systemd 自动拉起。

实际重启验收：2026-07-19 13:00 UTC 执行整机重启，无人工登录干预；约一分钟后上述服务与 timer 全部为 `enabled/active`，DNS 解析恢复，systemd 失败单元为 0，TCP `80/443/23011`、HTTPS 首页、主控健康接口与 Telegram 告警状态均通过。

验证：

```bash
systemctl is-enabled warroom-network-bootstrap warroom-nginx sing-box argo master-control
systemctl is-active warroom-network-bootstrap warroom-nginx sing-box argo master-control
systemctl is-enabled warroom-alert-notifier.timer warroom-dr@yc3.timer certbot.timer
systemctl is-active warroom-alert-notifier.timer warroom-dr@yc3.timer certbot.timer
ss -lntup | grep -E ':(80|443|23011|888[1-9]|889[0-2])\\b'
```
