Document live AnyTLS onboarding and pending Cloudflare verification

This commit is contained in:
hellcat 2026-10-11 17:21:48 +08:00
parent 3b72c3e3c1
commit 50eecb91fa
2 changed files with 132 additions and 29 deletions

View File

@ -1,45 +1,132 @@
# 节点与订阅网关接入
核对日期:2026-10-11。当前仅完成只读调查和方案草案;未部署节点、修改中转规则、DNS 或现有网关。凭据仅从 CoDocs 受保护连接资料获取,不写入本文。
核对日期:2026-10-11。本文是后续新增 dpl 节点的执行入口。首节点部署、完整订阅联网与正式套餐开放已完成;Cloudflare 后台 TLS 后验和显式缓存规则仍受浏览器权限阻塞,整体尚未全部完成。凭据、机器令牌、用户 UUID 与订阅令牌只存受保护文件,不写入本文或 Git。
## 已核实基线
## 当前连接关系
- gateway-01 运行 SubSieve。宿主机 Nginx 接公网 80/443;subscribe-gateway 映射到本机 8080/8443;subscribe-admin 使用 64444。两个容器共享 sgw_gw_config、sgw_gw_logs。
- 现有设置接口使用单个 upstream_url、upstream_host、subscribe_path,并生成保护配置;没有在检查的接口与界面中发现多机场列表。不得把原上游改成 dpl。
- 网关主机约 1GB 内存,现场可用约 448MB、磁盘余量约 13GB。同机第二套实例具备部署条件,但需限制资源并检查实际负载;共享主机仍有共同故障风险。
- node-us01 的 XrayR 服务 active,占用 TCP 443。新节点使用独立服务、配置和空闲端口;禁止升级、重启或替换原 XrayR。
- 中转后台现有 23 条规则;原 us01 是 haiwi.lshan.eu.org:46101 → node-us01:443,开启。只能新增 dpl 专用规则,原规则保留。
- Namecheap 中 deeplink-subscribe.com 使用 BasicDNS;现场 Cloudflare 账户的完整 10 域名列表没有该域名。
- 本地面板代码包含 AnyTLS 和 VLESS/REALITY 配置与多种订阅生成。线上版本及节点后端能力须独立核验,不能据此宣布已兼容。
订阅:客户端 → c2.deeplink-subscribe.com(Cloudflare 橙云 HTTPS)→ gateway-01 宿主 Nginx → dpl 独立 SubSieve → dpl 面板。
## 首节点拟定方案
流量:客户端 → haiwi.lshan.eu.org:47101 → node-us01 64.44.115.18:24443 → 目标网络。AnyTLS 使用 us01.deeplink-subscribe.com 的有效证书,订阅要求严格校验。普通 Cloudflare 橙云只用于订阅 HTTP,不用于原生 AnyTLS 流量。
订阅:客户端 → c2.deeplink-subscribe.com(Cloudflare HTTPS 代理)→ gateway-01 的新增域名站点 → dpl 专用 SubSieve 实例 → dpl 订阅接口。
| 资源 | 本次新增 | 必须保留的原有资源 |
| --- | --- | --- |
| node-us01 | dpl-node,TCP 24443,机器/节点 ID 1 | XrayR,TCP 443 |
| 中转 | dpl-us01-anytls,47101 → 24443 | us01,46101 → 443;其他规则 |
| gateway-01 | dpl-subscribe-gateway、dpl-subscribe-admin | subscribe-gateway、subscribe-admin |
| 网关回环端口 | 18080 / 18443,管理 16444 | 8080 / 8443,管理 64444 |
| Docker 存储 | dpl_sgw_config、dpl_sgw_logs | sgw_gw_config、sgw_gw_logs |
| Docker 网络 | dpl_sgw_net,172.28.31.0/24 | 原项目网络 |
流量:客户端 → 新增中转入口/端口 → node-us01 的 dpl 独立节点服务 → 目标网络。订阅网关不承载这条流量链路。
现场 SubSieve 的接口和界面只有一个上游,没有发现直接维护两个机场的上游列表。因此采用同机第二实例,独立配置、凭据、卷和端口。新网关限制 160MB,管理容器限制 128MB,分别限制 0.5 CPU;管理端口不开放公网。以后新增 dpl 节点复用这套网关,无需重复部署。
用户已确认首个节点采用 AnyTLS,显示名为“🇺🇸 美国 US - 01”。选择前核对面板 API、动态用户下发、计费与流量上报、节点后端版本以及实际客户端支持。AnyTLS 使用 us01.deeplink-subscribe.com 的有效证书与严格校验,客户端连接中转入口,SNI 保持该证书域名。普通 Cloudflare 橙云只用于 HTTPS 订阅,不直接代理这两种原生节点协议。
节点使用官方 cedar2025/Xboard-Node v1.13,Linux amd64 文件 SHA256 为 55bf71fa9d9f2048d3255ae7c0af929a41897ca7743f6ead34132a6ca4c79043。独立 systemd 服务及配置目录,不更新或重启 XrayR。网关固定镜像 ID 见 scripts/node-onboarding/gateway.compose.yml。共享宿主机的容量须在每次变更前重新核验。
同机第二网关使用独立 Compose 项目、容器名称、卷、管理凭据和本机端口;绝不复用原 sgw 卷。不运行原项目 setup/update/down。宿主 Nginx 新增专用 server_name;检查通过后仅平滑重载,前后回归旧订阅。新实例内部端口待复核后分配,管理入口不直接开放公网。
## DNS、真实 IP 和证书
域名在 Cloudflare 添加 zone,迁移必要现有记录,获取实际分配的 NS 后再修改 Namecheap。c2 指向网关并开启代理;源站使用有效证书与 Full (strict)。订阅路径绕过缓存、禁止交互式挑战;不能共享缓存带用户 token 的响应。开启代理可能改善入口路径,但不能保证所有地区可达,也不能据此认定历史故障原因。
Namecheap 已委托至 bradley.ns.cloudflare.com、jewel.ns.cloudflare.com。导入的原有记录保留。c2 指向网关并启用代理;us01 指向节点,DNS only。两张源站证书有效期至 2027-01-09,公网订阅 HTTPS 可用。
## 每次新增节点流程
Cloudflare Full (strict) 曾提交保存,但保存后的账户状态因网站权限拦截未复核;显式订阅 Cache Rule 尚未创建,不能据公网 HTTPS 正常写成已完成。当前实际订阅返回 CF-Cache-Status: DYNAMIC、Cache-Control: private, no-store。
1. 明确机场、服务器、协议、套餐组、节点 ID、监听端口、中转入口和倍率;显示名称使用“🇺🇸 美国 US - 01”格式;服务、机器和中转规则使用 dpl 前缀。
2. 经白色机只读检查服务、TCP/UDP 端口、防火墙、资源与原机场节点基线。记录检查时间,不能复用过期的空闲端口判断。
3. 备份受影响配置和原状态到服务器受保护目录;确定只新增资源的清单及回滚操作。
4. 核对后端官方版本与面板 API 兼容性,生成独立服务配置;私钥/API 密钥只存受保护文件。脚本与非敏感模板按 Git 提交、推送、明确版本发布。
5. 新增面板节点但暂不对普通用户展示;部署独立节点服务,只操作该服务。检查语法、启动、端口和日志,不能只看 HTTP 200。
6. 在中转后台新增专用规则到新监听端口;核对规则名、入口和目标后保存,不编辑原规则。
7. 使用隔离测试用户检查订阅格式、导入、通过中转联网、出口 IP、DNS、流量上报、权限与超额限制;前后复核原机场服务。未做真实客户端测试时明确标记待验收。
8. 验收通过才展示新节点,更新本文节点登记及 STATUS;分别记录配置、测试、Git 发布和真实验收结果。
9. 回滚只停用本次新增节点/规则、停止新服务并撤回新域名配置;保留审计记录。不停止旧容器,不恢复整库覆盖后续业务。
宿主 Nginx 只信任 Cloudflare 官方网段的 CF-Connecting-IP,再向新容器发送清洗后的真实 IP。新容器仅信任本项目网桥 172.28.31.1。实际公网请求的 Cloudflare trace IP 与新网关日志已逐值比对一致,文档不保留个人 IP。
## 节点登记
按用户追加授权,原机场两个订阅 vhost 也已加入 /etc/nginx/dpl-cloudflare-realip.conf,其余内容保留。写入前备份、nginx -t 和平滑重载通过;vhost 级信任列表替代继承的旧静态列表。原容器内的网桥信任配置保留,原订阅经 Cloudflare 的请求也已核对到访问者出口 IP。
| 机场 | 节点 | 协议 | 落地端口 | 中转入口 | 面板 ID | 状态 |
dpl-cloudflare-ips.timer 每日宿主机时间 02:00 执行,随机延迟最多 15 分钟。脚本下载官方 ips-v4 / ips-v6,校验地址族、CIDR、数量、重复和过宽网段,完整有效才原子替换;下载/校验失败保留上次文件,Nginx 检查/重载失败回退文件。当前成功同步 22 段、定时器启用。不是实时推送;失败记录在 journal,没有主动告警,尚未执行故障注入验收。
新网关 Certbot 独立使用 /etc/dpl-letsencrypt,由 dpl-gateway-cert.timer 每日 03:00、随机延迟最多一小时续期。--no-directory-hooks 避开原机场全局钩子,专用钩子只检查/重载新网关、新管理容器和宿主 Nginx。新网关和新节点的续期 dry-run 均已通过;网关专用 deploy hook 实际执行检查/重载通过,原容器启动时间未变。ACME webroot 为 /var/lib/dpl-sgw/acme,父目录须允许 Nginx worker 遍历;admin.env 保持 600,验收目录保持 700。
节点续期钩子只匹配 /etc/dpl-node/certificate-domain 中的域名并 try-restart dpl-node,不操作 XrayR。首次签发前须审计既有 pre/post/deploy 钩子及 renewal 配置;不能认为签发新域名仅影响新服务。
### 首次签发期间的原网关重启
首次 c2 签发前未充分审计既有 Certbot 全局 deploy hook,触发它重启了一次原 subscribe-gateway,时间为 2026-10-11 08:14:19 UTC。原管理容器未重启。已告知用户,后续将新证书注册/续期迁至独立目录并禁用原目录钩子;原钩子本身未修改。
原网关重启后运行正常,原订阅路由回归通过,容器 ID 保持原值;之后的新证书钩子及 IP 同步未再次重启原容器。不能据后续回归通过声称整个任务中原网关从未重启,或证明当时所有用户均无感。
## 新节点参数单
| 参数 | 首次实例 | 后续填写规则 |
| --- | --- | --- |
| key / name | us01 / 🇺🇸 美国 US - 01 | 唯一 key;旗帜、中文国家、国家代码、两位序号 |
| server | node-us01 | 从 CoDocs 项目关系及连接资料确认 |
| listen-port | 24443 | 当场核对 TCP/UDP 和防火墙,不复用过期判断 |
| relay-host / relay-port | haiwi.lshan.eu.org / 47101 | 新增规则,不改原规则 |
| tls-domain | us01.deeplink-subscribe.com | DNS only,有效证书 |
| group / plans | 首次隔离组;套餐 1、6、7、8 | 当前真实 ID 和授权集合 |
| backup | /root/codex-backups/dpl/node-onboarding-20261011-us01 | 每节点独立时间/key 目录 |
## 重复执行步骤
1. 读取根 AGENTS、维护入口和本文。经 CoDocs 白色机中转访问服务器;本地网页使用指定访问域名。记录原服务 PID/启动时间/端口、中转规则、Docker ID/启动时间、原订阅结果;审计资源、防火墙、所有证书钩子。受保护备份本次将修改的配置和 Git 差异,不输出私密内容。
2. 非敏感脚本和模板先 Git 提交/推送,再更新服务器到明确提交,保留生产原有差异。无法直接拉取时可传输已推送提交的 Git bundle 后 fetch/fast-forward,不能用压缩包覆盖。scripts/node-onboarding 可 subtree split 为独立运维仓库;面板 .env 不送到节点。
3. 在生产应用根目录按参数单运行 stage.php,创建机器、AnyTLS 节点、隔离组和 100MB/一天的临时用户。节点虽启用显示,正式用户没有隔离组权限。相同 manifest 重跑只报告已创建;同名资源存在却缺少 manifest 时停止,不自动接管。
```sh
php scripts/node-onboarding/stage.php \
--key=us01 --name='🇺🇸 美国 US - 01' \
--relay-host=haiwi.lshan.eu.org --relay-port=47101 \
--listen-port=24443 --tls-domain=us01.deeplink-subscribe.com \
--backup=/root/codex-backups/dpl/node-onboarding-20261011-us01
```
4. 将受保护备份的 node-config.yml、node-secret.env 经白机安装到节点 /etc/dpl-node/config.yml、secret.env,均 600;运维仓库 checkout 明确 Git 版本到 /opt/dpl-node/provision。首次安装使用下面命令。脚本检查参数、配置、端口、已有后端及 XrayR 状态,校验官方二进制并安装独立 unit,不自动启动。已有 dpl-node 时不能重跑覆盖;升级须单独复核。
```sh
bash /opt/dpl-node/provision/install-node.sh \
--listen-port=24443 --tls-domain=us01.deeplink-subscribe.com
```
5. 配置 DNS only、有效证书并审计/安装仅匹配新域名的续期钩子,再启用 dpl-node。在中转后台只新增 dpl-<key>-anytls,核对保存后的入口/目标和诊断结果。本次未启用收发 Proxy Protocol,以后启用前须同时确认入口和后端支持。
6. 后续 dpl 节点复用 c2 及当前网关,不再次更换 NS。另一个机场需要不同上游时才新增独立实例;不得改已有上游、运行原项目 setup/update/down 或复用旧卷。
7. 在网关创建本次验收目录(700),以 600 保存 stage.php 生成的 QA 私密文件和实际订阅;准备官方客户端并校验官方发布摘要。首轮已校验的 Linux 1.14.3 客户端保留于 /opt/dpl-gateway/acceptance/,下述命令可复用它。拉取临时用户完整订阅到私密文件;sing-box 使用正常版本 UA(如 sing-box/1.14.3),不要使用覆盖版本识别的裸 flag=sing-box。核验名称、入口、SNI、严格 TLS、缓存头和真实 IP;先官方客户端 check,再完整配置实际联网,核对出口、DNS、上下行计费与上报。
```sh
python3 /opt/dpl-gateway/provision/verify-node.py \
--qa /var/lib/dpl-sgw/qa/qa.json \
--binary /opt/dpl-gateway/acceptance/sing-box-1.14.3-linux-amd64/sing-box \
--subscription /var/lib/dpl-sgw/qa/subscription.json \
--expected-exit 64.44.115.18
```
helper 仅替换 TUN 等入站为临时本机 SOCKS,保留订阅 DNS、分流及出站,退出时停止客户端;失败日志留在同一私密目录。这不等于手机 GUI、系统 TUN、多地区、超额或多设备并发验收。某环境到入口不通时分段诊断并换环境核验,HTTP 200 不能替代联网。
8. 上述验收通过后,在生产根目录运行 readiness.php 和 promote.php,显式指定当前套餐集合。已有正式组时额外传 --group=<ID>。只关联所选尚无组的套餐及这些套餐现有无组用户,不改价格、周期、流量或设备限制。
```sh
php scripts/node-onboarding/readiness.php \
--backup=/root/codex-backups/dpl/node-onboarding-20261011-us01
php scripts/node-onboarding/promote.php \
--backup=/root/codex-backups/dpl/node-onboarding-20261011-us01 \
--plans=1,6,7,8
```
首次隔离组改为基础节点、订阅域名设置为 c2,以后复用正式组。脚本要求节点在线且临时用户已有流量,保存 before-promotion.json,最后禁用临时用户并写 promoted.json。清理本次客户端和私密传输副本,保留服务器备份、禁用用户与审计记录。
9. 回归原机场服务/规则/订阅,实际核对正式组权限、面板节点及订阅域名保存,确认测试用户禁用且不再下发。更新本文及 STATUS,分别记录提交、发布、真实验收及未完成项。
数据库默认 sing-box 模板已迁移新 DNS/路由格式,保留原分流和选择逻辑;现代本地 DoH 使用默认 dialer,不绕到空 direct 出站。仓库原默认资源和其他机场模板不改。apply-template.php 仅接受原默认模板,或与显式 expected-current-sha256 完全匹配的旧版本,逐次备份后只更新该模板/缓存。用户定制或未知模板须先审查,不能强行覆盖。
## 回退与排障
- 单节点:停用本次节点/新增中转,停止新 dpl-node;保留 XrayR、原规则和审计数据。
- 正式关联:依据 before-promotion.json 精确恢复本次套餐/用户组及订阅域名,先确认当前值仍是本次写入值,避免覆盖后续业务。不恢复整库。
- 模板:从对应私密模板备份恢复该条内容并清理模板缓存,不替换整个设置表。
- 网关:只停新 Compose 项目、撤回新域名 vhost,检查后平滑重载。不能停止原项目、删原卷或改原上游;独立证书目录和定时器按本次备份回退。
- IP 同步:检查 dpl-cloudflare-ips.service、journal 和最后有效文件,不退化为信任所有来源。原 vhost 的追加授权变更可按专用备份独立回退。
- 浏览器保存拒绝:检查 Codex Settings → Browser → Agent permissions 的 Browse 网站规则及覆盖规则;仍拦截则重新启动应用后复核。不能用其他控制方式绕过拒绝,公网结果不能替代账户设置核验。
## 节点登记及验收边界
| 机场 | 节点 | 协议 | 落地 | 中转 | 面板 ID | 状态 |
| --- | --- | --- | --- | --- | --- | --- |
| dpl | 🇺🇸 美国 US - 01 / node-us01 | AnyTLS | 24443(待部署) | 拟新增47101,保留原46101 | 待创建 | 方案已授权,实施中 |
| dpl | 🇺🇸 美国 US - 01 / node-us01 | AnyTLS | 24443 | haiwi.lshan.eu.org:47101 | 1 | 已上线;基础节点组,正式套餐 1/6/7/8 |
网关双实例、节点后端兼容性与真实联调均未验收。后续按实际结果补充可复用模板,不把方案草案当作可直接执行的部署脚本。
已完成:独立服务、节点 TLS、新中转、新网关、DNS/橙云、真实 IP 比对、新旧订阅 vhost 官方 IP 自动同步、两张证书续期演练。官方 sing-box 1.14.3 的完整实际订阅(仅把入站替换为临时本机 SOCKS)经中转联网,出口 64.44.115.18、US、HTTPS TLSv1.3,严格节点证书校验;完整 DNS 和远程分流规则实际启动通过,面板已记录上下行流量。
用户随后具体授权正式开放:套餐 1/6/7/8 和其中 1 位现有无组用户已关联基础节点组,界面核对节点在线、命名和组名正确;站点设置订阅 URL 实际显示 c2。临时用户已禁用,订阅返回 403,实际下发用户集合不再包含该用户;正式用户可见该节点。价格、周期、流量和设备限制未改。本机临时客户端已停止。
核心代码发布为 3b72c3e3c182313ebdae9f81a6e83712775942a3;节点/网关独立运维仓库为 b05c3215505c6ea70042aed0b102c682406528be。面板生产已有教程及文件模式差异保留。最初本机至中转出现 EOF,节点直连 TLS 正常;网关主机环境的完整中转客户端测试通过,不能据该结果保证用户所在所有地区路径可达。截图见 codex/output/node-us01-planning/node-live.png 与 relay-created.png。
仍待完成:Cloudflare Full (strict) 后验及显式缓存规则;工具仍报告 dash.cloudflare.com 被保存的拒绝权限拦截,用户需解除实际规则或重启应用后再核验。GUI/手机导入、系统 TUN、多地区、超额及多设备并发不在已执行验收范围内。
后续可直接给维护代理:“按 docs/maintenance/NODE_ONBOARDING.md 接入 dpl 的下一节点,先填参数单、复核共享资源和证书钩子,只新增,不动原机场;完整订阅实测后再开放指定套餐,更新登记与 STATUS。”本文不启动聊天结束后的自动维护。

View File

@ -95,3 +95,19 @@ Resend 发信、常规 SMTP、配额回退、投递事件回调、master 一次
最新要求覆盖上一节三行说明:本地四个套餐已去掉套餐时长行,仅保留套餐流量和显式引用虚拟展示设备数的说明。线上只读核对同名同ID套餐及流量/展示设备数一致;准备按两个独立仓库的 Git 版本发布,并仅同步这四个套餐的 content。价格、周期、实际限制不修改。发布与线上页面验收尚未完成。
本轮发布与验收完成:前台提交 5e8efa3a11d9301384f934d6fc10dfe0ae8774e2 已推送仓库并在线上通过 Git fast-forward 更新;服务器已有 HTTPS 前台拉取未认证,因此使用该已推送提交的增量 Git bundle 执行 fetch/merge,未传输账号凭据、未打包覆盖源代码。生产 Vue TypeScript检查和 Vite发布构建通过,四个套餐只更新 content。主题、原说明和已有差异备份于 /root/codex-backups/dpl/plan-description-20261011-140006。浏览器在指定线上访问域名核验四个套餐只显示流量及展示设备数(6、18、200、200),无时长或额外设备行;PHP-FPM及Horizon均active。截图 codex/output/plan-description-20261011/online-preview.png。价格、可购周期、实际设备限制及已有教程修改未改变。
## 2026-10-11 首节点、独立订阅网关与 Cloudflare IP 同步
用户确认 AnyTLS、节点名“🇺🇸 美国 US - 01”。node-us01 新增 dpl-node / Xboard-Node v1.13(sing-box 内核),独立 TCP 24443;中转只新增 dpl-us01-anytls:haiwi.lshan.eu.org:47101 → 64.44.115.18:24443。原 XrayR TCP 443、PID 和启动时间保持原值,原 46101 → 443 规则及其他中转规则保留。
因既有 SubSieve 只有单上游,gateway-01 部署第二套独立容器/卷/网络及回环端口,不改旧上游。Namecheap NS 已委托 Cloudflare,c2.deeplink-subscribe.com 橙云指向新网关,us01 域名 DNS only。新实例管理端口仅回环监听,订阅日志不记录查询令牌。真实 IP 已按官方 Cloudflare 网段清洗并实际比对;用户追加授权的原机场两个订阅 vhost 也已接入同一官方 IP 自动同步。每日下载、验证、原子替换及错误回退代码上线,当前 22 网段同步成功、定时器启用;没有主动告警,尚未执行故障注入。
新网关证书续期迁至独立 Certbot 目录和定时器,禁用原目录钩子。两张新证书有效期至 2027-01-09,节点与网关续期 dry-run 通过,网关专用 deploy hook 实际检查/重载通过。需记录首次签发的实际事件:未充分审计原全局 Certbot hook,导致原 subscribe-gateway 于 08:14:19 UTC 重启一次;已告知用户并完成后续隔离。原管理容器未重启,此后新钩子/IP 同步未再次重启原容器,最终旧路由 HTTP 200、新旧容器运行及 Nginx 语法通过;不能宣称整个任务原网关从未重启或所有用户无感。
生产默认 sing-box 模板迁移现代 DNS/路由语法,实际启动发现并修正空 direct DNS detour;只在原模板/明确哈希匹配并受保护备份后更新 dpl 默认模板,不改其他机场。官方 sing-box 1.14.3 完整实际订阅通过检查及实际启动(仅替换为临时 SOCKS 入站),保留 DNS/分流/出站,经中转获得美国出口 64.44.115.18、严格 TLS、HTTPS TLSv1.3,面板记录上下行计费。正常订阅 HTTP 200、CF DYNAMIC、private/no-store。GUI/手机、系统 TUN、多地区、超额及多设备并发未执行验收。
用户具体授权后,节点开放至基础节点组,个人/家庭/业务/业务B 套餐 ID 1/6/7/8 及其中现有 1 位无组用户完成关联。界面核验在线节点、名称和组名,订阅 URL 字段显示 c2;价格、周期、流量及设备限制不改。临时用户已禁用,其订阅 403、实际下发用户集合排除该用户,正式用户可见首节点;本机临时客户端停止。
核心根仓库版本 3b72c3e3c182313ebdae9f81a6e83712775942a3,独立运维仓库 b05c3215505c6ea70042aed0b102c682406528be,均先提交/推送再按 Git 部署,生产原教程与文件模式差异保留。精确数据/配置备份在服务器受保护目录,不写凭据入 Git。重复接入参数、执行步骤及回退见 NODE_ONBOARDING.md;验收截图在 codex/output/node-us01-planning/。
尚未完成:Cloudflare Full (strict) 提交后的账户状态复核、显式订阅缓存绕过规则。dash.cloudflare.com 被浏览器保存拒绝持续拦截;用户多次修改设置后实际重试仍失败,需要清除覆盖规则或重新启动应用后再核对。公网 HTTPS 正常和 no-store 不能代替这些账户检查,整体任务尚未全部完成。