feat(dual-link-proxy): 一键安装脚本,空机器一条命令装完链路与面板

- 新增 scripts/install-dual-link.sh:装 3x-ui → 建两条 VLESS+WS 入站(绑 127.0.0.1)
  → 80 vhost 完成 ACME → 签证书 → 切 443 → 可选面板子域 + Basic Auth → 实测 101 并打印链接;
  支持 --dry-run 干跑、--yes 无人值守、已有 3x-ui 时复用而不重置密码
- 3xui-api.py 补 uuid / link / del-inbound 三个子命令,add 的 --uuid 改为可选
- verify-links.sh 统计实际检查项,空跑以退出码 2 报错,避免假通过
- 避坑清单补三条脚本类实测:ss 端口判定的字段误用、dry-run 仍落盘、验收空跑
This commit is contained in:
admin committed 2026-10-18 20:18:33 +08:00
1 parent cc86680e05
commit b2016af916
5 files changed
+655 -5

No files matched your search

@@ -47,3 +47,11 @@
18. 升内核要显式装 `linux-generic`。(依据:`apt-get upgrade` 把内核三个元包 `kept back`,跑完 `uname -r` 仍是旧内核;`apt install linux-generic` 才会装上新的 image 并在重启后生效。)
19. 用 ufw 限制 Docker 发布的端口要走 `DOCKER-USER` 链。(依据:`ufw status` 里没有放行规则,端口照样对外可达,因为 Docker 直接写 iptables 的 NAT 链绕过 ufw。)
## 五、写自动化脚本类
20. 判断端口是否占用用 `ss -tlnH "sport = :<端口>"`,判空即可。(依据:`ss -tln | awk '$4 ~ ":80 "'` 这种写法永远匹配不到——`$4` 是 `0.0.0.0:80`,末尾没有空格,于是「占用」和「空闲」共用一个返回值,脚本会把正在监听的端口当成空的往下走。)
21. `--dry-run` 分支里凡是 `cat > 目标文件`、`mkdir`、`cp` 都要先判断 DRY 再执行。(依据:只把命令包进 `run()` 的脚本,往往漏掉 heredoc 写文件这一步,干跑一次就把线上 vhost 覆盖了。)
22. 验收脚本要统计「实际跑了几个检查项」,为 0 时以非 0 退出。(依据:不带参数的验收脚本会把「什么都没查」打印成「全部通过」,这种绿灯比红灯更危险。)