feat: 合并边缘节点运维并完善 Surge 配置安全
迁入通用节点部署工具、离线交付页生成器和共用技能,隔离真实配置与交付产物。统一 Codex 与 Claude Code 开发约定,补充节点迁移与运维文档。 完善 FINAL、策略组引用、输入校验、Surge 字段编码与 AI DNS 例外保护,增加隔离测试和订阅验证工具。 验证:全量类型检查、44 项单测、前端构建、脚本语法、技能入口与凭据隔离检查均通过。
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# {{HOST_LABEL}} 边缘节点 · 交付文档
|
||||
|
||||
服务器:`{{SSH_USER}}@{{SERVER_IP}}`(SSH 别名 `{{SSH_ALIAS}}`),{{VPS_PROVIDER_AND_SPECS}}
|
||||
IPv6:`{{SERVER_IPV6}}`
|
||||
根域名:`{{DOMAIN_ROOT}}`(Cloudflare 管理,泛域名 DNS-only / 灰云)
|
||||
部署时间:{{DEPLOY_DATE}}
|
||||
|
||||
---
|
||||
|
||||
## 服务清单
|
||||
|
||||
| 服务 | 作用 | 访问地址 | 用户名 | 密码 |
|
||||
|---|---|---|---|---|
|
||||
| **aaPanel** | 服务器控制面板:文件管理、防火墙、监控、站点管理 | `https://{{SUB_PANEL}}.{{DOMAIN_ROOT}}{{AAPANEL_ENTRANCE}}` | `{{AAPANEL_USER}}` | `{{AAPANEL_PASS}}` |
|
||||
| **3x-ui** | Xray 代理面板:管理 inbound、客户端、流量统计 | `https://{{SUB_XUI}}.{{DOMAIN_ROOT}}{{XUI_PATH}}` | `{{XUI_USER}}` | `{{XUI_PASS}}` |
|
||||
| **节点伪装页** | 承载六条 WS 隧道的域名,本身只是普通网页伪装 | `https://{{SUB_COVER}}.{{DOMAIN_ROOT}}` | — | — |
|
||||
| **落地页** | 根域名首页,静态页面,无实际功能 | `https://{{DOMAIN_ROOT}}` | — | — |
|
||||
|
||||
> ⚠️ **访问 aaPanel 面板务必使用真实浏览器**(Chrome/Safari/Edge 等)。用 curl 等工具测试时如果 UA 不像真实浏览器(比如只写默认 UA 或过于简单的 `Mozilla/5.0 (Macintosh)`),会被反爬虫机制拒绝,返回伪装的 404 页面——这是正常防护行为,不是故障。见 `references/pitfalls.md`。
|
||||
|
||||
## 后台服务(无独立管理界面,通过 aaPanel/3x-ui 或 SSH 管理)
|
||||
|
||||
| 服务 | 作用 |
|
||||
|---|---|
|
||||
| **nginx 1.24** | 反向代理入口,承载所有 HTTPS 域名、TLS 终止、伪装 WS 转发 |
|
||||
| **Cloudflare WARP(proxy 模式)** | 本机 SOCKS5 代理 `127.0.0.1:{{WARP_SOCKS_PORT}}`,给"WARP 出口"的 inbound 做净化出口 |
|
||||
| **warp-healthcheck.timer** | systemd 定时器,每 60 秒检查 WARP 代理是否真的在转发流量,异常时自动重启 warp-svc |
|
||||
| **acme.sh** | 自动续期泛域名证书 `*.{{DOMAIN_ROOT}}`,续期后自动重新部署证书并 reload nginx |
|
||||
| **UFW 防火墙** | 只放行 22 / 80 / 443 / 888 / {{AAPANEL_PORT}}(面板端口)/ 39000-40000(aaPanel 被动端口范围) |
|
||||
|
||||
## 六条代理 inbound(三种协议 × direct/WARP)
|
||||
|
||||
| 协议 | 用途 | 域名 | WS 路径 | 内部端口 | 凭据 |
|
||||
|---|---|---|---|---|---|
|
||||
| VMess · direct | 直连出口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | `{{WS_PATH_VMESS_DIRECT}}` | {{PORT_VMESS_DIRECT}} | UUID `{{XUI_UUID}}` |
|
||||
| VMess · WARP | 净出口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | `{{WS_PATH_VMESS_WARP}}` | {{PORT_VMESS_WARP}} | 同上 |
|
||||
| Trojan · direct | 直连出口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | `{{WS_PATH_TROJAN_DIRECT}}` | {{PORT_TROJAN_DIRECT}} | 密码 `{{NODE_PASSWORD}}` |
|
||||
| Trojan · WARP | 净出口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | `{{WS_PATH_TROJAN_WARP}}` | {{PORT_TROJAN_WARP}} | 同上 |
|
||||
| Shadowsocks · direct | 直连出口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | `{{WS_PATH_SS_DIRECT}}` | {{PORT_SS_DIRECT}} | 密码 `{{NODE_PASSWORD}}`,method `{{SS_METHOD}}` |
|
||||
| Shadowsocks · WARP | 净出口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | `{{WS_PATH_SS_WARP}}` | {{PORT_SS_WARP}} | 同上 |
|
||||
|
||||
六个 inbound 全部归属于**同一个 3x-ui 客户端 `node-main`**:VMess 用 UUID 认证,Trojan 和 Shadowsocks 共用同一个 `NODE_PASSWORD` 认证(因为是同一个客户端行)。所以在 3x-ui"客户端"页只看到 node-main 一行,点开它的信息详情就能看到全部 6 条节点链接/二维码和一个订阅。三个协议共用同一个 `{{SUB_COVER}}.{{DOMAIN_ROOT}}` 站点和泛域名证书,没有新建站点/新申请证书。新增/管理 inbound 是直接写 3x-ui 数据库(`/etc/x-ui/x-ui.db`)+ 重启 x-ui 的方式(面板 HTTP API 在这个版本上会 403,参见 `references/pitfalls.md`)。
|
||||
|
||||
节点二维码 / 订阅链接见《02-节点信息》(`scripts/14-generate-links-and-qr.py` 生成)。
|
||||
|
||||
## 安全提醒
|
||||
|
||||
- `SUB_PANEL={{SUB_PANEL}}` / `SUB_XUI={{SUB_XUI}}` / `SUB_COVER={{SUB_COVER}}` 这三个子域名前缀、六条 WS 伪装路径、两个面板入口路径,都不要公开发布——它们是控制面的地图。
|
||||
- 所有密码、UUID 已生成并写在上表和 `config.env` 里,`config.env` 只保留在你的本机,没有上传到任何 git 仓库。建议尽快把密码转存进密码管理器。
|
||||
- WARP 模式是你自己的干净出口,不是绕过他人网络管控的工具。
|
||||
@@ -0,0 +1,108 @@
|
||||
# {{HOST_LABEL}} 节点信息 · 客户端导入
|
||||
|
||||
用支持对应协议的客户端(v2rayN / v2rayNG / Shadowrocket / Nekobox / sing-box / Surge / Clash Meta 等)扫码或粘贴链接即可导入。运行 `scripts/14-generate-links-and-qr.py` 会自动生成本文档所需的全部 `.link` 文件和 `-qr.png` 二维码图片到同一个输出目录 —— 把对应文件内容/图片贴进下面每一节即可,不需要手抄。
|
||||
|
||||
六个节点使用同一个域名 `{{SUB_COVER}}.{{DOMAIN_ROOT}}`,同一个协议内的 direct/WARP 只有 WS 路径不同。
|
||||
|
||||
---
|
||||
|
||||
## 线路一:VMess 直连出口
|
||||
|
||||
出站走服务器自身公网 IP(`{{SERVER_IP}}`),速度最快,但暴露服务器真实 IP。
|
||||
|
||||

|
||||
|
||||
```
|
||||
{{VMESS_DIRECT_LINK}}
|
||||
```
|
||||
|
||||
## 线路二:VMess WARP 净出口
|
||||
|
||||
出站走 Cloudflare WARP,隐藏服务器真实 IP,出口 IP 是 Cloudflare 的地址,速度略慢于直连。
|
||||
|
||||

|
||||
|
||||
```
|
||||
{{VMESS_WARP_LINK}}
|
||||
```
|
||||
|
||||
## 线路三:Trojan 直连出口
|
||||
|
||||

|
||||
|
||||
```
|
||||
{{TROJAN_DIRECT_LINK}}
|
||||
```
|
||||
|
||||
## 线路四:Trojan WARP 净出口
|
||||
|
||||

|
||||
|
||||
```
|
||||
{{TROJAN_WARP_LINK}}
|
||||
```
|
||||
|
||||
## 线路五:Shadowsocks 直连出口
|
||||
|
||||
生成器会输出带 Xray 传输参数的 `ss://` 链接与二维码,Proxy Station 可解析导入。其他客户端若不接受该写法,可用下面的参数或 sing-box JSON 片段。Surge 不支持 SS over WS,这两条线路不会下发到 Surge。
|
||||
|
||||
| 参数 | 值 |
|
||||
|---|---|
|
||||
| 地址 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` |
|
||||
| 端口 | `443` |
|
||||
| 加密方式 (method) | `{{SS_METHOD}}` |
|
||||
| 密码 | `{{NODE_PASSWORD}}`(与 Trojan 共用同一密码) |
|
||||
| 传输 | `ws`,路径 `{{WS_PATH_SS_DIRECT}}` |
|
||||
| TLS / SNI | 开启,`{{SUB_COVER}}.{{DOMAIN_ROOT}}` |
|
||||
|
||||
sing-box outbound(`ss-direct-singbox.json`,由生成脚本自动写出):
|
||||
```json
|
||||
{{SS_DIRECT_SINGBOX_JSON}}
|
||||
```
|
||||
|
||||
Surge 用户使用其他受支持线路;不能把 SS over WS 写成 Surge 的 `obfs=wss`。
|
||||
|
||||
## 线路六:Shadowsocks WARP 净出口
|
||||
|
||||
参数和线路五完全一样,公开端口仍为 443,只有出口与 WS 路径不同(`{{WS_PATH_SS_WARP}}`)。
|
||||
|
||||
sing-box outbound(`ss-warp-singbox.json`):
|
||||
```json
|
||||
{{SS_WARP_SINGBOX_JSON}}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 手动填写参数 · VMess(如果客户端不支持扫码/粘贴链接)
|
||||
|
||||
| 参数 | direct | WARP |
|
||||
|---|---|---|
|
||||
| 地址 (address) | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | 同左 |
|
||||
| 端口 (port) | `443` | 同左 |
|
||||
| 用户ID (UUID) | `{{XUI_UUID}}` | 同左 |
|
||||
| 额外ID (AlterId) | `0` | 同左 |
|
||||
| 加密方式 (security) | `auto` | 同左 |
|
||||
| 传输协议 (network) | `ws` | 同左 |
|
||||
| 伪装类型 (type) | `none` | 同左 |
|
||||
| 路径 (path) | `{{WS_PATH_VMESS_DIRECT}}` | `{{WS_PATH_VMESS_WARP}}` |
|
||||
| Host / SNI | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | 同左 |
|
||||
| TLS | 开启 | 开启 |
|
||||
|
||||
## 手动填写参数 · Trojan
|
||||
|
||||
| 参数 | direct | WARP |
|
||||
|---|---|---|
|
||||
| 地址 / 端口 | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` / `443` | 同左 |
|
||||
| 密码 | `{{NODE_PASSWORD}}`(与 Shadowsocks 共用同一密码) | 同左 |
|
||||
| 传输协议 (network) | `ws` | 同左 |
|
||||
| 路径 (path) | `{{WS_PATH_TROJAN_DIRECT}}` | `{{WS_PATH_TROJAN_WARP}}` |
|
||||
| Host / SNI | `{{SUB_COVER}}.{{DOMAIN_ROOT}}` | 同左 |
|
||||
| TLS | 开启 | 开启 |
|
||||
|
||||
## 验证方式
|
||||
|
||||
导入后连接,访问 `https://1.1.1.1/cdn-cgi/trace`,看返回的 `ip=` 和 `warp=`:
|
||||
- direct 线路(任意协议)应显示 `ip={{SERVER_IP}}`,`warp=off`
|
||||
- WARP 线路(任意协议)应显示一个 Cloudflare 段的 IP,`warp=on`
|
||||
|
||||
服务器侧的 `scripts/12-smoke-test.sh` 已经对全部六条线路做过 WS-101 + 出口 IP 的实测验证;如果你这边导入后验证结果不对,大概率是客户端参数抄错了(尤其是 path 和 host 要跟表里完全一致,包括大小写),不是服务器端的问题。
|
||||
@@ -0,0 +1,71 @@
|
||||
# {{HOST_LABEL}} 运维指南(edge-node-multi-protocol)
|
||||
|
||||
本指南基于 `edge-node-multi-protocol` skill 部署的真实节点整理,适用于维护这台节点或用同一个 skill 部署新节点。
|
||||
|
||||
---
|
||||
|
||||
## 一、这套系统是什么
|
||||
|
||||
一键把一台裸的 Debian/Ubuntu VPS 变成:
|
||||
|
||||
```
|
||||
用户 ──HTTPS──▶ nginx(aaPanel管理) ──┬─▶ aaPanel 面板(反代到 127.0.0.1:面板端口)
|
||||
├─▶ 3x-ui 面板(反代到 127.0.0.1:14533)
|
||||
└─▶ 节点伪装域名 {{SUB_COVER}}.{{DOMAIN_ROOT}}
|
||||
├─ VMess direct/WARP (2 inbound)
|
||||
├─ Trojan direct/WARP (2 inbound)
|
||||
└─ Shadowsocks direct/WARP (2 inbound)
|
||||
每个 direct 直接出公网
|
||||
每个 WARP 走 WARP SOCKS5(127.0.0.1:{{WARP_SOCKS_PORT}}) 出 Cloudflare
|
||||
```
|
||||
|
||||
外层是泛域名 TLS(acme.sh 自动续期)+ Cloudflare DNS(灰云,不走 CF 代理),三个协议的六个 inbound 共用同一份证书和同一个 cover 域名。
|
||||
|
||||
## 二、部署一台新节点的标准流程
|
||||
|
||||
见 `SKILL.md` → Workflow,简要版:
|
||||
|
||||
```
|
||||
00-preflight → 02-cf-dns → 03-sign-wildcard-cert
|
||||
→ 04-install-aapanel → 05-harden-aapanel → 04b-install-nginx
|
||||
→ 06-install-warp → 06b-warp-watchdog
|
||||
→ 07-install-3xui → 08-xui-bootstrap(一次性建好全部6个inbound)
|
||||
→ 09-aapanel-sites → 09b-default-444
|
||||
→ 10-ufw → 11-monitoring(可选)
|
||||
→ 12-smoke-test(验证全部6条线路)
|
||||
→ 14-generate-links-and-qr(本地运行,出分享链接+二维码)
|
||||
```
|
||||
|
||||
## 三、这套 skill 已修复的版本兼容坑
|
||||
|
||||
来自实战踩坑,脚本里已经改好,这里记录原因方便你判断"要不要重新核实":
|
||||
|
||||
### 坑 1:aaPanel 安装等待循环的 pgrep 自匹配 bug
|
||||
|
||||
早期版本用 `pgrep -f install_7.0` 判断安装进程是否还在跑,但这条检查命令自己的命令行文本里就含有 `"install_7.0"` 字符串,导致 pgrep 把自己也匹配进去,判断条件永远为假,脚本卡死轮询——即使安装其实早就装完了(通常 1 分钟左右)。**已修复**:现在改成检查安装日志里的 `Congratulations! Installed successfully!` 字符串。
|
||||
|
||||
### 坑 2:aaPanel 7.x 把部分内部模块挪到了 `class_v2` 目录
|
||||
|
||||
建站脚本原本只把 `/www/server/panel` 和 `/www/server/panel/class` 加进 `sys.path`,缺了 `/www/server/panel/class_v2`,导致 `ModuleNotFoundError: theme_config`。**已修复**:`09-aapanel-sites.py` 已经加上了这一行。如果你手写新脚本要 import 面板内部模块,记得也加上。
|
||||
|
||||
### 坑 3:aaPanel 反爬虫策略比早期文档写的更严格
|
||||
|
||||
用 curl 测试面板入口时,UA 必须是完整真实的浏览器 UA(如 `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15`),过于简单的 UA(哪怕带 "Mozilla" 字样)会被判定为扫描器,返回伪装的 404。**排查经验**:如果面板域名/入口路径怎么测都是 404,**先别怀疑域名绑定、CDN_PROXY、证书配置**——先换一个更真实的浏览器 UA 字符串重新 curl,或者直接用真实浏览器打开看看。`12-smoke-test.sh` 已经用了正确的 UA。
|
||||
|
||||
### 坑 4:3x-ui 的 client 表是"协议通用凭据表"
|
||||
|
||||
VMess/VLESS 用 `uuid` 列,Trojan/Shadowsocks 用 `password` 列;`client_traffics.email` 全局唯一(一个 client 一行,不是一个 inbound 一行);WARP 路由规则要"追加"而不是"整个重写",否则会把已有协议的路由覆盖掉。完整表结构和新增协议的步骤见 `references/3x-ui-schema.md`。
|
||||
|
||||
## 四、日常运维
|
||||
|
||||
- **重启 aaPanel**:只能用 `/etc/init.d/bt restart`(或 `bt 1`),**绝对不能用** `systemctl restart btpanel`——systemd 单元的 `ExecStart` 走的是这条 SysV 脚本,`systemctl restart` 会把面板停掉且不会自动拉起,反代的面板域名直接 502。
|
||||
- **重启 nginx**:同理用 `/etc/init.d/nginx reload/restart`,不要用 systemctl。
|
||||
- **续期证书**:acme.sh 已经注册了 `--reloadcmd`,到期自动续期、自动重新部署到 4 个域名的证书目录、自动 reload nginx,不需要人工干预。可以用 `~/.acme.sh/acme.sh --list` 查看到期时间。
|
||||
- **加新的代理客户端**(同一协议下加一个用户):去 3x-ui 面板对已有 inbound 加 client,或者直接改数据库(面板 HTTP API 在这个版本上会 403,见坑4),参考 `references/3x-ui-schema.md`。
|
||||
- **加新的协议**(第4个协议):见 `SKILL.md` → "Adding a protocol to an already-provisioned node",以及 `references/3x-ui-schema.md` 最后一节和 `references/protocol-choice.md` 关于什么时候值得加。
|
||||
- **WARP 掉线自愈**:`warp-healthcheck.timer` 每 60 秒检查一次,通过 SOCKS5 代理实际发请求确认 `warp=on`,异常会自动重启 `warp-svc`。查看状态:`systemctl status warp-healthcheck.timer`。
|
||||
- **防火墙**:只放行了 22/80/443/888/面板端口/39000-40000,六个协议 inbound 全部是 `127.0.0.1`-only、走 nginx 反代 443,不需要额外开端口。
|
||||
|
||||
## 五、监控(可选)
|
||||
|
||||
`11-monitoring.sh` 支持接入 Nezha / Komari。去 `config.env` 填 `NEZHA_SERVER`/`NEZHA_SECRET` 或 `KOMARI_ENDPOINT`/`KOMARI_DISCOVERY_KEY`,单独跑这一个脚本即可,不影响其他服务。
|
||||
50
.claude/skills/edge-node-multi-protocol/templates/README.md
Normal file
50
.claude/skills/edge-node-multi-protocol/templates/README.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# Documentation templates
|
||||
|
||||
Three markdown templates to fill in with a real node's values after deployment, plus
|
||||
`landing.html` (the public landing-page cover, used by `09b-default-444.sh`).
|
||||
|
||||
- `01-handover-template.md` — service inventory: what's running, how to log in, what each thing does.
|
||||
- `02-node-info-template.md` — client-facing: share links + QR codes for all 6 nodes, manual params as fallback.
|
||||
- `03-ops-guide-template.md` — architecture + standard workflow + the version-compat pitfalls + day-2 ops.
|
||||
|
||||
## How to fill them in
|
||||
|
||||
1. Run `scripts/14-generate-links-and-qr.py` first — it writes `vmess-direct.link`,
|
||||
`vmess-warp.link`, `trojan-direct.link`, `trojan-warp.link`, the matching `-qr.png` files, and
|
||||
`ss-direct.link` / `ss-warp.link` with their QR codes plus `ss-direct-singbox.json` /
|
||||
`ss-warp-singbox.json` into an output directory. Put the doc copies
|
||||
in the same directory so the `` image references in
|
||||
`02-node-info-template.md` resolve.
|
||||
2. Copy the three `*-template.md` files into that same output directory (drop the `-template`
|
||||
suffix if you like, e.g. `01-handover.md`), and replace every `{{TOKEN}}` below with the real
|
||||
value from `config.env` (or the node's live state, for things like `AAPANEL_PORT` which the
|
||||
installer randomizes — read it from `/www/server/panel/data/port.pl` on the box).
|
||||
3. For `{{VMESS_DIRECT_LINK}}` / `{{VMESS_WARP_LINK}}` / `{{TROJAN_DIRECT_LINK}}` /
|
||||
`{{TROJAN_WARP_LINK}}`, paste the contents of the matching `.link` file. For
|
||||
`{{SS_DIRECT_SINGBOX_JSON}}` / `{{SS_WARP_SINGBOX_JSON}}`, paste the matching `.json` file's
|
||||
contents inside the fenced code block that's already there.
|
||||
|
||||
## Token reference
|
||||
|
||||
| Token | Source |
|
||||
|---|---|
|
||||
| `{{HOST_LABEL}}` | Whatever short name you use for this node (e.g. an SSH alias or hostname) |
|
||||
| `{{SSH_ALIAS}}` / `{{SSH_USER}}` | Your local SSH config / `config.env` `SSH_USER` |
|
||||
| `{{SERVER_IP}}` / `{{SERVER_IPV6}}` | `config.env` |
|
||||
| `{{VPS_PROVIDER_AND_SPECS}}` | Whatever's useful to note (provider, region, vCPU/RAM) |
|
||||
| `{{DEPLOY_DATE}}` | The date you ran through the workflow |
|
||||
| `{{DOMAIN_ROOT}}` / `{{SUB_PANEL}}` / `{{SUB_XUI}}` / `{{SUB_COVER}}` | `config.env` |
|
||||
| `{{AAPANEL_ENTRANCE}}` / `{{AAPANEL_USER}}` / `{{AAPANEL_PASS}}` / `{{AAPANEL_PORT}}` | `config.env` + live panel port from the box |
|
||||
| `{{XUI_PATH}}` / `{{XUI_USER}}` / `{{XUI_PASS}}` | `config.env` |
|
||||
| `{{XUI_UUID}}` | `config.env` (node-main's VMess credential) |
|
||||
| `{{NODE_PASSWORD}}` | `config.env` (node-main's shared Trojan+Shadowsocks credential) |
|
||||
| `{{SS_METHOD}}` | `config.env` |
|
||||
| `{{PORT_VMESS_DIRECT}}` / `{{PORT_VMESS_WARP}}` / `{{PORT_TROJAN_DIRECT}}` / `{{PORT_TROJAN_WARP}}` / `{{PORT_SS_DIRECT}}` / `{{PORT_SS_WARP}}` | `config.env` |
|
||||
| `{{WS_PATH_VMESS_DIRECT}}` / `{{WS_PATH_VMESS_WARP}}` / `{{WS_PATH_TROJAN_DIRECT}}` / `{{WS_PATH_TROJAN_WARP}}` / `{{WS_PATH_SS_DIRECT}}` / `{{WS_PATH_SS_WARP}}` | `config.env` |
|
||||
| `{{WARP_SOCKS_PORT}}` | `config.env` (default 40000) |
|
||||
| `{{VMESS_DIRECT_LINK}}` / `{{VMESS_WARP_LINK}}` / `{{TROJAN_DIRECT_LINK}}` / `{{TROJAN_WARP_LINK}}` | contents of the matching `.link` file from step 9 |
|
||||
| `{{SS_DIRECT_SINGBOX_JSON}}` / `{{SS_WARP_SINGBOX_JSON}}` | contents of the matching `.json` file from step 9 |
|
||||
|
||||
Never fill these in with placeholder/example values in a copy that leaves your machine — every
|
||||
token above except `{{HOST_LABEL}}`/`{{DEPLOY_DATE}}`/`{{VPS_PROVIDER_AND_SPECS}}` is either a
|
||||
secret or part of your control-plane map.
|
||||
@@ -0,0 +1,19 @@
|
||||
<!doctype html><html lang="en"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>__NODE_NAME__</title>
|
||||
<style>
|
||||
:root{color-scheme:light dark}
|
||||
*{box-sizing:border-box}
|
||||
body{margin:0;min-height:100vh;display:grid;place-items:center;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:linear-gradient(135deg,#0a2a43,#1668a8);color:#eaf4ff}
|
||||
.card{max-width:560px;padding:48px 40px;text-align:center}
|
||||
h1{font-size:2.2rem;margin:0 0 .4em;letter-spacing:.04em}
|
||||
p{opacity:.82;line-height:1.7;margin:.3em 0}
|
||||
.dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:#43b0ff;box-shadow:0 0 10px #43b0ff;margin-right:8px;vertical-align:middle}
|
||||
.foot{margin-top:2.4em;font-size:.82rem;opacity:.55}
|
||||
</style></head><body>
|
||||
<div class="card">
|
||||
<h1>__NODE_NAME__</h1>
|
||||
<p><span class="dot"></span>Edge service operational</p>
|
||||
<p>Private research & networking endpoint. No public service is hosted on this page.</p>
|
||||
<p class="foot">for authorized use only</p>
|
||||
</div></body></html>
|
||||
Reference in New Issue
Block a user