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.
169 lines
8.2 KiB
Markdown
169 lines
8.2 KiB
Markdown
# 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`
|
||
- TLS:Certbot 管理 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`。
|