B5 switchover: sing-box is the only runtime payload

- master getConfig serves singbox_config only; xray payload retired
  (build failure is a hard 500, agent keeps its current state)
- agent: singbox_config arrival is the switch signal — flush xray
  tail traffic, stop xray, activate sing-box; activation failure
  restarts xray from the last payload and retries next poll; a
  legacy master (no sing-box keys) keeps the xray path untouched
- sing-box log rotation: 8 MiB copy-truncate with one .1 kept,
  checked on the traffic cycle
- install-agent.sh: xray/geo downloads and checks removed, agent
  binary now from the V2.0.0 release, self-check is sing-box
  binary + check on the live config
- display version default 2.0.0 (master V2.0.0 / agent A2.0.0)
This commit is contained in:
Muse
2026-10-23 01:24:43 +00:00
parent 3e2829e49d
commit 4a532e8c5a
9 changed files with 389 additions and 114 deletions
+24 -47
View File
@@ -27,7 +27,6 @@ error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
[[ $EUID -ne 0 ]] && error "请用 root 运行"
command -v curl >/dev/null 2>&1 || error "缺少 curl,请先安装 curl 后重跑"
command -v unzip >/dev/null 2>&1 || error "缺少 unzip,请先安装 unzip 后重跑"
MASTER=""; TOKEN=""; NAME=""
while [[ $# -gt 0 ]]; do
@@ -72,11 +71,13 @@ case "$ARCH" in
*) error "不支持的架构: $ARCH (仅支持 amd64/arm64)";;
esac
# 发行下载基址(本仓 Gitea Releases,发行 tag V1.0.0):agent 二进制、xray、geo
# 全部走自建镜像,不再依赖 GitHub CDN(部分节点极慢甚至僵死,见第 15 条)。
RELEASE_BASE="https://git.881218.xyz/rogue/3x-ui-agent/releases/download/V1.0.0"
# 发行下载基址(本仓 Gitea Releases,发行 tag V2.0.0):agent 二进制走
# 自建镜像,不再依赖 GitHub CDN(部分节点极慢甚至僵死,见第 15 条)。
# sing-box 核心在 NexusGate 仓的专用发行里(见下方 SINGBOX_BASE)。
# 注意:本脚本是 V2 版——只装 sing-box 运行时;主控未升 V2 前不要用它
# 重装节点(节点升级走面板一键更新,不需要本脚本)。
RELEASE_BASE="https://git.881218.xyz/rogue/3x-ui-agent/releases/download/V2.0.0"
XUI_URL="${XUI_URL:-${RELEASE_BASE}/x-ui-linux-${BIN_ARCH}}"
XRAY_VER="26.6.27"
ROOT="${XUI_ROOT:-}"
XUI_HOME="${ROOT}/usr/local/x-ui"
@@ -94,34 +95,15 @@ curl -fL -o "${AGENT_BIN}.new" "$XUI_URL" || error "agent 下载失败: $XUI_URL
chmod +x "${AGENT_BIN}.new"
mv -f "${AGENT_BIN}.new" "${AGENT_BIN}"
info "下载 xray v${XRAY_VER}..."
cd "${XUI_HOME}/bin"
case "$BIN_ARCH" in
amd64) XRAY_ZIP="Xray-linux-64.zip";;
arm64) XRAY_ZIP="Xray-linux-arm64-v8a.zip";;
esac
# 每一步都显式判失败并报错退出(第 17 条):历史教训——下载/解压失败曾被
# && 链条吞掉,脚本带病走完报成功,结果 bin 里没有 xray、入站全断而面板显在线。
curl -fL -o "$XRAY_ZIP" "${RELEASE_BASE}/${XRAY_ZIP}" || error "xray 下载失败: ${RELEASE_BASE}/${XRAY_ZIP}"
[[ -s "$XRAY_ZIP" ]] || error "xray 下载得到空文件: ${RELEASE_BASE}/${XRAY_ZIP}"
unzip -o -q "$XRAY_ZIP" xray || error "xray 解压失败: $XRAY_ZIP"
mv xray "xray-linux-${BIN_ARCH}" || error "xray 落位失败(解压产物缺失)"
chmod +x "xray-linux-${BIN_ARCH}"
rm -f "$XRAY_ZIP"
info "下载 geo 文件..."
curl -fL -o geoip.dat "${RELEASE_BASE}/geoip.dat" || error "geoip 下载失败: ${RELEASE_BASE}/geoip.dat"
[[ -s geoip.dat ]] || error "geoip 下载得到空文件: ${RELEASE_BASE}/geoip.dat"
curl -fL -o geosite.dat "${RELEASE_BASE}/geosite.dat" || error "geosite 下载失败: ${RELEASE_BASE}/geosite.dat"
[[ -s geosite.dat ]] || error "geosite 下载得到空文件: ${RELEASE_BASE}/geosite.dat"
cd - >/dev/null
# 第 6 条 B3 起 agent 为双能力:除 xray 外再装 sing-box 核心(自编
# v1.13.21,with_v2ray_api with_utls with_quic),主控下发 sing-box
# 配置时即由它承载。sing-box 资产在 NexusGate 仓的专用发行里(与
# NexusGate 共用同一自编件)。其 version 输出为 unknown(自编件无
# 版本戳),故另写版本记录文件供 agent 遥测读取。xray 与 geo 的
# 下载暂保留——现行运行时仍是 xray,B5 正式切换后才在本脚本移除。
# 第 6 条 B5 正式切换:agent 只装 sing-box 核心(自编 v1.13.21,
# with_v2ray_api with_utls with_quic),xray 与 geo 下载已移除——
# sing-box 配置零 geo 引用,节点不再需要 geo 文件;xray 本体亦不再
# 随装。存量节点 bin 里已有的 xray/geo 文件本脚本不删(回滚旧主控时
# 仍可用)。sing-box 资产在 NexusGate 仓的专用发行里(与 NexusGate
# 共用同一自编件)。其 version 输出为 unknown(自编件无版本戳),
# 故另写版本记录文件供 agent 遥测读取。
# 每一步都显式判失败并报错退出(第 17 条):历史教训——下载失败曾被
# && 链条吞掉,脚本带病走完报成功,结果核心缺失、入站全断而面板显在线。
SINGBOX_VER="1.13.21"
SINGBOX_BASE="https://git.881218.xyz/rogue/NexusGate/releases/download/sing-box-v${SINGBOX_VER}"
SINGBOX_URL="${SINGBOX_URL:-${SINGBOX_BASE}/nexusgate-sing-box-linux-${BIN_ARCH}}"
@@ -132,21 +114,11 @@ chmod +x "${XUI_HOME}/bin/sing-box-linux-${BIN_ARCH}.new"
mv -f "${XUI_HOME}/bin/sing-box-linux-${BIN_ARCH}.new" "${XUI_HOME}/bin/sing-box-linux-${BIN_ARCH}"
printf '%s\n' "$SINGBOX_VER" > "${XUI_HOME}/bin/sing-box.version"
# 安装收尾自检(第 17 条):文件在不等于能用——xray 本体须存在、可执行、
# version 能真实跑通;geo 须存在且非空;agent 本体须可执行。任一不过即
# 报错退出并指出缺什么,不许带病进入写配置/起服务阶段。
# 安装收尾自检(第 17 条):文件在不等于能用——sing-box 本体须存在、
# 可执行、version 能真实跑通;若已有生效配置,须过 sing-box check;
# agent 本体须可执行。任一不过即报错退出并指出缺什么,不许带病进入
# 写配置/起服务阶段。
self_check() {
local xray_bin="${XUI_HOME}/bin/xray-linux-${BIN_ARCH}"
[[ -f "$xray_bin" ]] || error "自检失败:缺少 xray 本体 ${xray_bin}"
[[ -x "$xray_bin" ]] || error "自检失败:xray 本体不可执行 ${xray_bin}"
local ver_out
if ! ver_out=$("$xray_bin" version 2>/dev/null); then
error "自检失败:xray 本体无法运行(${xray_bin} version 退出非零)"
fi
[[ -n "$ver_out" ]] || error "自检失败:xray version 无输出(${xray_bin})"
info "自检通过:$(printf '%s' "$ver_out" | head -n 1)"
[[ -s "${XUI_HOME}/bin/geoip.dat" ]] || error "自检失败:geoip.dat 缺失或为空(${XUI_HOME}/bin/geoip.dat)"
[[ -s "${XUI_HOME}/bin/geosite.dat" ]] || error "自检失败:geosite.dat 缺失或为空(${XUI_HOME}/bin/geosite.dat)"
local sb_bin="${XUI_HOME}/bin/sing-box-linux-${BIN_ARCH}"
[[ -x "$sb_bin" ]] || error "自检失败:sing-box 本体缺失或不可执行 ${sb_bin}"
local sb_out
@@ -155,6 +127,11 @@ self_check() {
fi
[[ -n "$sb_out" ]] || error "自检失败:sing-box version 无输出(${sb_bin})"
info "sing-box 自检通过:$(printf '%s' "$sb_out" | head -n 1)(版本记录 ${SINGBOX_VER})"
local sb_cfg="${XUI_HOME}/bin/config-singbox.json"
if [[ -s "$sb_cfg" ]]; then
"$sb_bin" check -c "$sb_cfg" >/dev/null 2>&1 || error "自检失败:现行 sing-box 配置未过 check(${sb_cfg})"
info "sing-box 配置自检通过:${sb_cfg}"
fi
[[ -x "$AGENT_BIN" ]] || error "自检失败:agent 二进制不可执行 ${AGENT_BIN}"
}
self_check