feat(deploy): cloudflared 出站隧道前置控制面 API(api.yanmeiai.com→127.0.0.1:8080)
deploy.sh 在 systemd 安装段新增 cloudflared 二进制(apt 源)+ unit 安装; enable-on-boot 用 /etc/pangolin/cloudflared.env(TUNNEL_TOKEN)存在与否作 门槛,避免全新单机部署在 token 未落地前因 cloudflared 起不来而失败。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
This commit is contained in:
@@ -257,6 +257,24 @@ sed "s#/usr/local/bin/sing-box#${SB_BIN}#g" \
|
|||||||
chmod 644 /etc/systemd/system/sing-box.service
|
chmod 644 /etc/systemd/system/sing-box.service
|
||||||
install -d -m 755 /etc/polkit-1/rules.d
|
install -d -m 755 /etc/polkit-1/rules.d
|
||||||
install -m 644 "$HERE/polkit/49-pangolin-singbox.rules" /etc/polkit-1/rules.d/
|
install -m 644 "$HERE/polkit/49-pangolin-singbox.rules" /etc/polkit-1/rules.d/
|
||||||
|
|
||||||
|
# ── cloudflared(控制面 API 出站隧道,Cloudflare apt 源)─────────────────────────
|
||||||
|
if ! command -v cloudflared >/dev/null 2>&1; then
|
||||||
|
log "安装 cloudflared(Cloudflare apt 源)..."
|
||||||
|
install -m 0755 -d /usr/share/keyrings
|
||||||
|
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
|
||||||
|
-o /usr/share/keyrings/cloudflare-main.gpg
|
||||||
|
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bookworm main' \
|
||||||
|
> /etc/apt/sources.list.d/cloudflared.list
|
||||||
|
apt-get update -qq
|
||||||
|
apt-get install -y -qq cloudflared
|
||||||
|
fi
|
||||||
|
# apt 固定装到 /usr/bin;软链到 unit 期望的 /usr/local/bin(与其他 pangolin 二进制一致)。
|
||||||
|
CFD_BIN=/usr/bin/cloudflared
|
||||||
|
[ -x "$CFD_BIN" ] || die "cloudflared 安装失败:$CFD_BIN 不存在。"
|
||||||
|
ln -sf "$CFD_BIN" /usr/local/bin/cloudflared
|
||||||
|
install -m 644 "$HERE/systemd/cloudflared.service" /etc/systemd/system/
|
||||||
|
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
|
|
||||||
log "启动控制面(pangolin-server,以 $PUSER 运行)..."
|
log "启动控制面(pangolin-server,以 $PUSER 运行)..."
|
||||||
@@ -275,6 +293,15 @@ if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -q "Status: a
|
|||||||
log "ufw 放行 ${HTTP_PORT}/tcp(控制面 API,明文)"
|
log "ufw 放行 ${HTTP_PORT}/tcp(控制面 API,明文)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ── cloudflared:按需启用(需 /etc/pangolin/cloudflared.env 提供 TUNNEL_TOKEN)───
|
||||||
|
if [ -f /etc/pangolin/cloudflared.env ]; then
|
||||||
|
log "启用 cloudflared(检测到 /etc/pangolin/cloudflared.env)..."
|
||||||
|
systemctl enable --now cloudflared.service
|
||||||
|
else
|
||||||
|
log "cloudflared 已安装但未启动:等 /etc/pangolin/cloudflared.env(TUNNEL_TOKEN)就绪后执行:"
|
||||||
|
log " systemctl enable --now cloudflared.service"
|
||||||
|
fi
|
||||||
|
|
||||||
# ── 11. 摘要 ──────────────────────────────────────────────────────────────────
|
# ── 11. 摘要 ──────────────────────────────────────────────────────────────────
|
||||||
log "完成。单机栈已起(SQLite + pangolin 用户)。"
|
log "完成。单机栈已起(SQLite + pangolin 用户)。"
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Pangolin cloudflared (control-plane API tunnel → 127.0.0.1:8080)
|
||||||
|
Documentation=https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/
|
||||||
|
After=network-online.target pangolin-server.service
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
# TUNNEL_TOKEN 从此文件注入(不入 unit 本体、不进 ps);cloudflared 自动读取 env TUNNEL_TOKEN。
|
||||||
|
EnvironmentFile=/etc/pangolin/cloudflared.env
|
||||||
|
ExecStart=/usr/local/bin/cloudflared --no-autoupdate tunnel run
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5
|
||||||
|
# 出站隧道,无需 root:用非特权用户即可(与 pangolin-server 同用户)。
|
||||||
|
User=pangolin
|
||||||
|
NoNewPrivileges=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
Reference in New Issue
Block a user