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
..

JPpro proxy-ng Remote Inventory

最后核对时间2026-05-26 19:10 Asia/Shanghai

远程位置

  • Tabby profile个人-JPpro-akile-0504-1c1g
  • Hostnamejppro2-20260504201455dc6fca
  • 公网 IP151.242.164.72
  • 公开入口:https://proxy.api.lilifamily.com
  • 节点入口:https://jp.proxy.api.lilifamily.com
  • DNSproxy.api.lilifamily.com -> 151.242.164.72jp.proxy.api.lilifamily.com -> 151.242.164.72
  • 回源目标:https://origin.proxy.api.lilifamily.com
  • 当前状态proxy-ng 公开入口节点;不运行 Sub2API、PostgreSQL、Redis、Caddy 或账号出口代理

本地留痕

  • 当前远程状态说明:current/README.md
  • 当前 nginx 站点配置副本:current/nginx-jp-proxy-sub2api.conf
  • 当前 nginx map 配置副本:current/proxy-ng-map.conf
  • 加固记录:current/proxy-ng-hardening-notes.md

secrets/ 目录允许在本机私有保存历史 .env、临时 admin 密码或其他敏感材料,但这些文件已被 .gitignore 排除,不能提交,也不能视为当前远程生效配置。

当前部署架构

Client
  ↓ HTTPS :443 proxy.api.lilifamily.com / jp.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

JPpro 节点职责边界:

  • 只做入口反向代理和线路中转。
  • 不保存 Sub2API 业务状态。
  • 不持有 Sub2API 数据库密码、Redis 密码或业务 API Key。
  • 不部署 Clash、sing-box、Xray、SOCKS、mixed 等账号出口代理能力。
  • 持有 TLS 证书私钥和 proxy-ng 回源 tokentoken 仅在远程 root-only 文件中保存,不进 Git。

当前部署方式

  • 安装方式Debian apt 安装 nginx、certbot、python3-certbot-nginx、curl、ca-certificates、fail2ban、logrotate。
  • nginx 版本:nginx/1.26.3
  • Certbot 版本:certbot 4.0.0
  • 证书路径:/etc/letsencrypt/live/proxy.api.lilifamily.com/fullchain.pem
  • 私钥路径:/etc/letsencrypt/live/proxy.api.lilifamily.com/privkey.pem
  • 证书覆盖域名:proxy.api.lilifamily.comjp.proxy.api.lilifamily.com
  • 证书到期时间:2026-08-24 10:01:14 UTC
  • 远程站点配置:/etc/nginx/sites-available/jp-proxy-sub2api.conf
  • 远程站点启用链接:/etc/nginx/sites-enabled/jp-proxy-sub2api.conf
  • 远程 map 配置:/etc/nginx/conf.d/proxy-ng-map.conf
  • 远程 token 配置:/etc/nginx/proxy-ng/token.conf,权限 600 root root

关键代理配置:

proxy_pass https://origin.proxy.api.lilifamily.com;
proxy_ssl_server_name on;
proxy_ssl_name origin.proxy.api.lilifamily.com;
proxy_set_header Host origin.proxy.api.lilifamily.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Proxy-Ng-Node "jppro-akile-0504-1c1g";
proxy_set_header X-Proxy-Ng-Token $proxy_ng_expected_token;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
proxy_request_buffering off;

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

运行检查

nginx -t
systemctl is-active nginx
systemctl is-active fail2ban
fail2ban-client status nginx-proxy-ng-scan
openssl x509 -noout -enddate -in /etc/letsencrypt/live/proxy.api.lilifamily.com/fullchain.pem
ss -tulpn
curl --noproxy '*' -sS https://proxy.api.lilifamily.com/health
curl --noproxy '*' -sS https://jp.proxy.api.lilifamily.com/health
curl --noproxy '*' -i -X POST https://proxy.api.lilifamily.com/v1/responses \
  -H 'Content-Type: application/json' \
  --data '{"model":"gpt-5.5","input":"ping"}'

期望结果:

  • nginx -t 返回配置语法正确。
  • nginx 服务状态为 active
  • fail2ban 服务状态为 active,启用 nginx-proxy-ng-scansshd jail。
  • 监听端口包含 2280443
  • /health 返回 200 {"status":"ok"},响应头包含 X-Proxy-Ng-Node: jppro-akile-0504-1c1g
  • 未授权 /v1/responses 返回 401 API_KEY_REQUIRED,证明请求已到达后端 API 层。

操作记录

2026-05-24 admin 密码重置

  • 账号:zizi2000email@gmail.com
  • 结果:登录接口已验证成功。
  • 本地临时密码留痕:secrets/admin-reset-20260524-165937.txt
  • 远程旧密码 hash 恢复 SQL/opt/sub2api/backups/password-reset-20260524-170007/restore-admin-password.sql

临时密码文件被 .gitignore 排除,且应保持 600 权限。登录后应尽快在后台修改为正式密码。

2026-05-26 清理 JPpro 部署

  • 执行范围:只清理 个人-JPpro-akile-0504-1c1g 上的 Sub2API Compose 栈,不动 RackNerd 两台服务器。
  • 远程确认hostname 为 jppro2-20260504201455dc6fca,清理前存在 /opt/sub2api,运行 sub2apisub2api-caddysub2api-postgressub2api-redis 四个容器。
  • 已执行:docker compose down --volumes --remove-orphans --rmi all --timeout 30
  • 已删除:四个容器、sub2api_sub2api_datasub2api_postgres_datasub2api_redis_datasub2api_caddy_datasub2api_caddy_configsub2api_sub2api-network、四个服务镜像和 /opt/sub2api
  • 验证结果:docker ps -a 无容器,匹配 sub2api/postgres_data/redis_data/caddy_data/caddy_config 的卷为空,匹配 Sub2API/Caddy/PostgreSQL/Redis 的镜像为空,宿主机监听端口只剩 22

2026-05-26 部署 JPpro proxy-ng 入口中转

  • 执行范围:只在 个人-JPpro-akile-0504-1c1g 上部署 nginx 入口中转,不在该节点恢复 Sub2API Compose 栈。
  • 域名:jp.proxy.api.lilifamily.com
  • DNSjp.proxy.api.lilifamily.com -> 151.242.164.72
  • 初始回源:https://proxy.api.lilifamily.com
  • 已安装:nginx/1.26.3certbot 4.0.0python3-certbot-nginxcurlca-certificates
  • 已配置:/etc/nginx/sites-available/jp-proxy-sub2api.conf/etc/nginx/conf.d/proxy-ng-map.conf
  • 已签发初始证书:/etc/letsencrypt/live/jp.proxy.api.lilifamily.com/fullchain.pem,到期时间 2026-08-24 06:22:03 UTC
  • 公网验证:https://jp.proxy.api.lilifamily.com/health 返回 200 {"status":"ok"},根页面返回 200,未授权 POST /v1/responses 返回 401 API_KEY_REQUIRED

2026-05-26 proxy-ng origin hardening

  • 3c4g 生成 proxy-ng tokenJPpro 通过 root-only 文件 /etc/nginx/proxy-ng/token.conf 引用。
  • JPpro 回源从 https://proxy.api.lilifamily.com 改为 https://origin.proxy.api.lilifamily.com
  • proxy.api.lilifamily.com DNS 切换到 151.242.164.72
  • JPpro 使用 HTTP-01 签发覆盖 proxy.api.lilifamily.comjp.proxy.api.lilifamily.com 的证书。
  • 远程备份:/root/proxy-ng-hardening-backup-20260526-183749
  • 验证结果:https://proxy.api.lilifamily.com/health 返回 200 {"status":"ok"},未授权 POST /v1/responses 返回 401 API_KEY_REQUIRED,响应头包含 X-Proxy-Ng-Node: jppro-akile-0504-1c1g
  • 防滥用:启用 nginx 连接数/请求速率限制、扫描路径 444、fail2ban nginx-proxy-ng-scan、nginx logrotate。