zizi 6814fa2a62 docs(ops): record proxy-ng deployment hardening
Add deployment traces for the JPpro proxy node, RackNerd origin hosts, catproxy boundary changes, local speed checks, and Sub2API rate-limit behavior.

Keep remote secrets excluded while tracking sanitized nginx, compose, plan, and operational memory documents.
2026-05-26 23:27:41 +08:00

169 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# US RackNerd 0526 Sub2API Remote Inventory
最后核对时间2026-05-26 19:37 Asia/Shanghai
## 远程位置
- Tabby profile`个人-US-racknerd-0526-3c4g`
- Hostname`racknerd-0a1c758`
- 公网 IP`216.45.59.243`
- origin 入口:`https://origin.proxy.api.lilifamily.com`
- 公开直连主站入口:`https://catproxy.lilifamily.com`
- 部署目录:`/opt/sub2api`
- Compose project`sub2api`
- 系统Debian GNU/Linux 13 (trixie)
## 当前状态
- 已部署并验证。
- Docker`Docker version 29.5.2, build 79eb04c`
- Docker Compose`Docker Compose version v5.1.4`
- nginx`nginx/1.26.3`
- DNS`origin.proxy.api.lilifamily.com -> 216.45.59.243``catproxy.lilifamily.com -> 216.45.59.243`
- `proxy.api.lilifamily.com` 已切到 JPpro `151.242.164.72`3c4g 上旧 `proxy.api` nginx 站点已禁用。
- Sub2API 只绑定宿主机 `127.0.0.1:8080`,公网只能经 nginx `catproxy` 或受限 `origin` 转发。
- PostgreSQL、Redis、Mihomo 不映射公网端口。
- 从旧机迁移的业务计数已核对:`users=1``api_keys=3``accounts=133`
## 本地留痕
- 当前远程 Compose 副本:`current/docker-compose.yml`
- 旧主域 nginx 配置副本:`current/nginx-sub2api.conf`,当前远程已禁用,仅作历史/回滚参考
- 当前 origin 配置副本:`current/nginx-origin-sub2api.conf`
- 当前 catproxy 配置副本:`current/nginx-catproxy-sub2api.conf`
- 当前默认拒绝配置副本:`current/nginx-default-deny.conf`
- 当前 token map 配置副本:`current/proxy-ng-token-map.conf`,真实 token 已脱敏
- 防火墙与 origin 边界记录:`current/firewall-notes.md`
- 迁移包 SHA256 记录:`backups/migrate-to-racknerd-0526-20260525-205103.SHA256SUMS`
- 密钥目录说明:`secrets/README.md`
真实 `.env`、Mihomo 配置、订阅文件、proxy-ng token、证书私钥和临时备份不得提交。需要本地留存时放入 `secrets/``backups/`,并确认 `.gitignore` 已排除。
## 部署架构
```text
Client
↓ HTTPS :443 proxy.api.lilifamily.com
JPpro nginx proxy-ng
↓ HTTPS + X-Proxy-Ng-Token
3c4g nginx origin.proxy.api.lilifamily.com
↓ 127.0.0.1:8080
sub2api container
postgres / redis / mihomo containers
```
公开直连主站路径:
```text
Client
↓ HTTPS :443 catproxy.lilifamily.com
3c4g nginx
↓ 127.0.0.1:8080
Sub2API
```
部署安全边界:
- `origin.proxy.api.lilifamily.com` 只允许 JPpro IP `151.242.164.72` 访问,并校验 `X-Proxy-Ng-Token`
- `catproxy.lilifamily.com` 不做 IP 白名单限制,是 3c4g 上可直接访问的主站域名和回滚入口。
- `proxy.api.lilifamily.com` 不再解析到 3c4g也不再由 3c4g nginx 站点提供服务。
- Sub2API 容器端口只绑定 `127.0.0.1:8080`
## 当前配置要点
- origin 域名:`origin.proxy.api.lilifamily.com`
- catproxy 域名:`catproxy.lilifamily.com`
- TLSCertbot 管理 nginx 证书。
- origin 证书路径:`/etc/letsencrypt/live/origin.proxy.api.lilifamily.com/fullchain.pem`
- catproxy 证书路径:`/etc/letsencrypt/live/catproxy.lilifamily.com/fullchain.pem`
- token 配置:`/etc/nginx/proxy-ng/token.conf`,权限 `600 root root`
- token map 配置:`/etc/nginx/conf.d/proxy-ng-token-map.conf`,本地副本已脱敏
- 远程 `.env``PUBLIC_DOMAIN=proxy.api.lilifamily.com`
- URL allowlist 当前关闭:`SECURITY_URL_ALLOWLIST_ENABLED=false`
## DNS state after proxy-ng hardening
| Name | A records | Role |
|---|---|---|
| `proxy.api.lilifamily.com` | `151.242.164.72` | Public entry |
| `jp.proxy.api.lilifamily.com` | `151.242.164.72` | JPpro proxy-ng node |
| `catproxy.lilifamily.com` | `216.45.59.243` | Public direct main-site and rollback entry |
| `origin.proxy.api.lilifamily.com` | `216.45.59.243` | Proxy-ng origin only |
## 运行检查
```bash
cd /opt/sub2api
docker compose ps
curl -sS http://127.0.0.1:8080/health
nginx -t
systemctl is-active nginx
curl --noproxy '*' -i https://origin.proxy.api.lilifamily.com/health
curl --noproxy '*' -i https://catproxy.lilifamily.com/health
```
期望结果:
- `sub2api``sub2api-postgres``sub2api-redis` 为 healthy。
- 本机 `/health` 返回 `{"status":"ok"}`
- 非 JPpro 来源访问 `origin.proxy.api.lilifamily.com/health` 返回 `403`
- JPpro 带 `X-Proxy-Ng-Token` 访问 origin 返回 `200`
- 公网访问 `catproxy.lilifamily.com/health` 返回 `200`
- 直连 `216.45.59.243:8080` 不对公网开放。
## 操作记录
### 2026-05-26 迁移目标盘点
- 通过 Tabby profile `个人-US-racknerd-0526-3c4g` 只读核对。
- 确认公网 IP`216.45.59.243`
- 确认系统Debian GNU/Linux 13 (trixie)。
- 确认尚未部署 `/opt/sub2api`,尚未安装 Docker。
### 2026-05-26 部署与迁移完成
- 安装 Docker CE、Docker Compose plugin、nginx、certbot、`python3-certbot-nginx``rsync`
- 从旧机迁移包恢复 `/opt/sub2api`,迁移包 SHA256 在新机按 basename 重新校验通过。
- 使用 `pg_restore -U sub2api -d sub2api --clean --if-exists` 导入 PostgreSQL dump。
- 业务数据计数核对通过:`users=1``api_keys=3``accounts=133`
- 启动 Compose 服务,`sub2api``sub2api-postgres``sub2api-redis` 均为 healthy`sub2api-mihomo` 为 running。
- 配置 nginx 站点 `/etc/nginx/sites-available/sub2api.conf`,启用 `/etc/nginx/sites-enabled/sub2api.conf`
- Certbot 已为 `proxy.api.lilifamily.com` 签发并部署 HTTPS 证书。
- 公网验证通过:`https://proxy.api.lilifamily.com/health` 返回 `{"status":"ok"}`
- API 路由验证通过:未授权 `POST https://proxy.api.lilifamily.com/v1/responses` 返回 `401 API_KEY_REQUIRED`
- 旧机未停止,仍作为短期回滚来源。
### 2026-05-26 proxy-ng origin hardening backup
- Backup path: `/root/sub2api-hardening-backup-20260526-033010`
- Includes nginx config, docker-compose.yml, `.env`, and PostgreSQL dump.
- Secret token exists only on remote root-readable nginx config and is not stored in Git.
### 2026-05-26 origin/catproxy hardening
-`origin.proxy.api.lilifamily.com``catproxy.lilifamily.com` 签发 Let's Encrypt 证书,到期时间均为 `2026-08-24`
- 新增 `/etc/nginx/sites-available/origin-sub2api.conf`,只允许 `151.242.164.72` 并校验 `X-Proxy-Ng-Token`
- 新增 `/etc/nginx/sites-available/catproxy-sub2api.conf`;初始版本限制管理来源,后续已按当前决策改为公开直连主站入口。
- 新增 `/etc/nginx/sites-available/00-default-deny.conf`,未知 Host 默认返回 `444`
- 为 nginx 增加 `map_hash_bucket_size 128`,修复长 hostname map 导致的 `nginx -t` 失败。
-`proxy.api.lilifamily.com` 站点已从 `sites-enabled` 禁用,备份路径:`/root/sub2api-disable-public-proxy-backup-20260526-040529`
- 验证结果:非白名单访问 origin 返回 `403`JPpro 带 token 访问 origin 返回 `200`,公网主入口 `proxy.api.lilifamily.com` 返回 JPpro 节点响应头。
- 配置 logrotate`/etc/logrotate.d/nginx-proxy-ng`dry-run 无语法错误。
### 2026-05-26 catproxy 访问边界调整
- 按当前决策,`catproxy.lilifamily.com` 不再限制访问来源,作为 3c4g 公开直连主站域名和回滚入口。
- 远程备份:`/etc/nginx/sites-available/catproxy-sub2api.conf.bak-20260526043650`
-`/etc/nginx/sites-available/catproxy-sub2api.conf` 删除 `allow 106.37.220.142``deny all`
- 保留 `origin.proxy.api.lilifamily.com` 的来源 IP 白名单和 `X-Proxy-Ng-Token` 校验。
- 验证结果:`nginx -t` 成功,`systemctl reload nginx` 成功,`catproxy.lilifamily.com/health` 返回 `200`,非白名单访问 `origin.proxy.api.lilifamily.com/health` 返回 `403`
### 2026-05-26 主站限速核对
- `catproxy.lilifamily.com` 当前无 nginx `limit_req` / `limit_conn`,主站直连不按 IP 限速。
- `origin.proxy.api.lilifamily.com` 当前只做 JPpro IP 白名单和 `X-Proxy-Ng-Token` 校验,不做 nginx 速率限制。
- Sub2API 业务请求限速维度是用户、用户+分组、API Key 窗口额度;不是按 IP 限速。
- 生产库非敏感快照:当前用户全局 `rpm_limit=0`;部分分组配置 `20/30/40/100 RPM`API Key `briqt` 配置 `5h=300``1d=500`API Key `free` 配置 `1d=50`
- 本机测速与限速维度详见 `docs/memorys/2026-05-26-主站测速与限速核对.md`