# JPpro proxy-ng Remote Inventory 最后核对时间:2026-05-26 19:10 Asia/Shanghai ## 远程位置 - Tabby profile:`个人-JPpro-akile-0504-1c1g` - Hostname:`jppro2-20260504201455dc6fca` - 公网 IP:`151.242.164.72` - 公开入口:`https://proxy.api.lilifamily.com` - 节点入口:`https://jp.proxy.api.lilifamily.com` - DNS:`proxy.api.lilifamily.com -> 151.242.164.72`,`jp.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` 排除,不能提交,也不能视为当前远程生效配置。 ## 当前部署架构 ```text 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 回源 token;token 仅在远程 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.com`、`jp.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` 关键代理配置: ```text 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 | ## 运行检查 ```bash 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-scan` 和 `sshd` jail。 - 监听端口包含 `22`、`80`、`443`。 - `/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`,运行 `sub2api`、`sub2api-caddy`、`sub2api-postgres`、`sub2api-redis` 四个容器。 - 已执行:`docker compose down --volumes --remove-orphans --rmi all --timeout 30`。 - 已删除:四个容器、`sub2api_sub2api_data`、`sub2api_postgres_data`、`sub2api_redis_data`、`sub2api_caddy_data`、`sub2api_caddy_config`、`sub2api_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` - DNS:`jp.proxy.api.lilifamily.com -> 151.242.164.72` - 初始回源:`https://proxy.api.lilifamily.com` - 已安装:`nginx/1.26.3`、`certbot 4.0.0`、`python3-certbot-nginx`、`curl`、`ca-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 token,JPpro 通过 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.com` 和 `jp.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。