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已切到 JPpro151.242.164.72,3c4g 上旧proxy.apinginx 站点已禁用。- Sub2API 只绑定宿主机
127.0.0.1:8080,公网只能经 nginxcatproxy或受限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 已排除。
部署架构
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
公开直连主站路径:
Client
↓ HTTPS :443 catproxy.lilifamily.com
3c4g nginx
↓ 127.0.0.1:8080
Sub2API
部署安全边界:
origin.proxy.api.lilifamily.com只允许 JPpro IP151.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 - 远程
.env:SUB2API_IMAGE=sub2api:custom-menu-safe-embed-20260527-r2 - 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 |
运行检查
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当前无 nginxlimit_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 Keybriqt配置5h=300、1d=500,API Keyfree配置1d=50。 - 本机测速与限速维度详见
docs/memorys/2026-05-26-主站测速与限速核对.md。
2026-05-27 自定义菜单安全嵌入部署
- 目标:用户侧新增一级菜单
购买套餐,站内嵌入https://pay.ldxp.cn/shop/5HAP5JVN。 - 安全边界:菜单项配置
omit_auth_context=true,iframe URL 不传token、user_id、src_host、src_url。 - 本地构建:前端 build 后交叉编译 linux/amd64 Go 二进制,使用
-tags embed嵌入前端资源。 - 远程部署方式:上传 runtime patch tar,在远程基于
weishaw/sub2api:latest替换/app/sub2api和/app/resources后docker commit生成本地镜像。 - runtime patch:
/tmp/sub2api-custom-menu-runtime-patch-20260527.tar.gz - runtime patch SHA256:
321b69bcf40470be9f2de10f8f1114ebd6bd7e6e014783b123c7160781ac127d - 当前镜像:
sub2api:custom-menu-safe-embed-20260527 - 镜像 ID:
sha256:356653e0e5a7b688faacb728a0f94d450e102393fd73bb16c705000f359133de - 部署前备份:
/opt/sub2api/backups/deploy-custom-menu-20260526-222849 - 菜单配置备份:
/opt/sub2api/backups/custom-menu-shop-20260526-224153 - 线上数据库
settings.custom_menu_items已写入:
[
{
"id": "shop",
"label": "购买套餐",
"icon_svg": "",
"url": "https://pay.ldxp.cn/shop/5HAP5JVN",
"visibility": "user",
"sort_order": 0,
"omit_auth_context": true
}
]
- 写入数据库后已重启
sub2api容器刷新 CSP frame-src 缓存。 - 验证结果:
sub2apihealthy;catproxy.lilifamily.com/health和proxy.api.lilifamily.com/health返回200;catproxy.lilifamily.com/custom/shop和proxy.api.lilifamily.com/custom/shop返回200;CSPframe-src已包含https://pay.ldxp.cn。
2026-05-27 自定义菜单安全嵌入 r2 发布
- 目标:发布提交
7954492cee99,包含侧边栏隐藏版本号和最终 custom menu 安全契约修正。 - 本地版本:
0.1.131 - 本地 commit:
7954492cee99 - 本地构建:
pnpm -C frontend build后执行CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -tags embed。 - runtime patch:
/tmp/sub2api-custom-menu-safe-embed-r2-runtime-patch.tar.gz - runtime patch SHA256:
962de880c5e0917e3c6b351fd1955c3d94c8f7b6fcfae558492535c08faac0d0 - 部署前备份:
/opt/sub2api/backups/deploy-custom-menu-r2-20260527-000642 - 当前镜像:
sub2api:custom-menu-safe-embed-20260527-r2 - 镜像 ID:
sha256:ceeea1a913ea8386f24b4296b856295c18febd0b19eeb1e92de4ef9512e3f3a2 - 远程二进制核对:
Sub2API 0.1.131 (commit: 7954492cee99, built: 2026-05-27T07:02:24Z)。 - 远程健康核对:
docker inspect sub2api显示镜像sub2api:custom-menu-safe-embed-20260527-r2且healthy。 - 公网验证:
catproxy.lilifamily.com/health和proxy.api.lilifamily.com/health返回{"status":"ok"}。 - 菜单验证:
proxy.api.lilifamily.com/api/v1/settings/public返回版本0.1.131,custom_menu_items[0].label=购买套餐,omit_auth_context=true。 - iframe CSP 验证:
catproxy.lilifamily.com/custom/shop与proxy.api.lilifamily.com/custom/shop返回200,CSPframe-src包含https://pay.ldxp.cn。