refactor(frp): frpc 改二进制+systemd 常驻(NAS 出国通道死拉不了 Docker Hub);remote 脚本代下载并推送二进制

This commit is contained in:
wangjia
2026-07-15 06:44:09 +08:00
parent 01d080a68e
commit 9ca2732b1b
2 changed files with 41 additions and 26 deletions
+30 -25
View File
@@ -1,16 +1,19 @@
#!/bin/bash
# 在 NAS 上执行(由 setup-frp-remote.sh 上传并调用,也可手动跑):
# ① 写 frpc 配置 + docker compose 拉起(需 sudo,会提示输 DSM 密码)
# ① 写 frpc 配置 + 安装 frpc 二进制 + systemd 常驻(需 sudo,会提示输 DSM 密码)
# (不用 dockerNAS 出国通道不通拉不了 Docker Hub 镜像;二进制由远端脚本推来)
# ② mihomo 加 hosts 覆盖 / fake-ip-filter / use-hosts(幂等,自动备份,热重载)
# ③ 端到端验证
# 前提:/tmp/frp-setup/token 里是 frp auth token(由远端脚本从 Bitwarden 送来)。
# 前提:/tmp/frp-setup/ 下有 tokenBitwarden 取来)和 frpclinux_amd64 二进制)。
set -euo pipefail
FRP_DIR=/volume1/docker/frp
CFG=/volume1/docker/proxy/mihomo/config.yaml
TOKEN_FILE=/tmp/frp-setup/token
FRPC_BIN=/tmp/frp-setup/frpc
[ -s "$TOKEN_FILE" ] || { echo "!! 缺 token 文件 $TOKEN_FILE(应由 setup-frp-remote.sh 生成)"; exit 1; }
[ -s "$FRPC_BIN" ] || { echo "!! 缺 frpc 二进制 $FRPC_BIN(应由 setup-frp-remote.sh 上传)"; exit 1; }
read -r TOKEN < "$TOKEN_FILE"
echo "==> 1/6 写 frpc.toml + docker-compose.ymlsudo"
@@ -65,27 +68,28 @@ localPort = 22
remotePort = 10023
EOF
sudo chmod 600 "$FRP_DIR/frpc.toml"
sudo tee "$FRP_DIR/docker-compose.yml" > /dev/null <<'EOF'
services:
frpc:
image: snowdreamtech/frpc:0.70.0
container_name: frpc
network_mode: host
restart: unless-stopped
volumes:
- ./frpc.toml:/etc/frp/frpc.toml:ro
EOF
echo "==> 2/6 拉起 frpc 容器"
# DSM 的 docker 在 /usr/local/binContainer Manager 符号链接),不在 sudo 的 secure_path 里,必须绝对路径
DOCKER=/usr/local/bin/docker
COMPOSE=/usr/local/bin/docker-compose
cd "$FRP_DIR"
if sudo "$COMPOSE" version >/dev/null 2>&1; then
sudo "$COMPOSE" up -d
else
sudo "$DOCKER" compose up -d
fi
echo "==> 2/6 安装 frpc 二进制 + systemd 常驻"
sudo install -m 755 "$FRPC_BIN" /usr/local/bin/frpc
sudo tee /etc/systemd/system/frpc.service > /dev/null <<'EOF'
[Unit]
Description=frp client (home reverse tunnel to pangolin1)
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/frpc -c /volume1/docker/frp/frpc.toml
Restart=always
RestartSec=5
LimitNOFILE=65536
MemoryLimit=64M
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable frpc >/dev/null 2>&1 || true
sudo systemctl restart frpc
echo "==> 3/6 mihomohosts 覆盖 + fake-ip-filter + use-hosts(幂等)"
cp "$CFG" "$CFG.bak.frp"
@@ -183,9 +187,10 @@ sleep 1
nslookup git.yanmeiai.com 127.0.0.1 2>&1 | tail -3
echo "==> 6/6 验证 frpc 隧道"
sleep 2
sudo /usr/local/bin/docker logs frpc --tail 20 2>&1 || true
rm -f "$TOKEN_FILE"
sleep 3
sudo systemctl is-active frpc
sudo journalctl -u frpc --no-pager -n 20 2>/dev/null || sudo systemctl status frpc --no-pager | tail -20
rm -f "$TOKEN_FILE" "$FRPC_BIN"
echo ""
echo "完成。检查上方日志:应有 'login to server success',且 git-ssh/git-web/dsm/nas-ssh/win-rdp/win-ssh 六个 proxy 'start proxy success'。"
echo "若 login 失败:token 不对或 pangolin1:7000 不通;若个别 proxy 失败:对应本地端口没起。"
+11 -1
View File
@@ -16,11 +16,21 @@ rbw get "frp home-tunnel" > "$TMPTOKEN"
[ -s "$TMPTOKEN" ] || { echo "!! rbw 取 token 失败(先 rbw unlock"; rm -f "$TMPTOKEN"; exit 1; }
chmod 600 "$TMPTOKEN"
echo "==> 上传 token 与脚本到 $NAS_HOST:/tmp/frp-setup/"
echo "==> 准备 frpc 二进制(linux_amd64NAS 出国通道不通,由 Mac 代下载)"
FRP_VER=0.70.0
FRP_TAR="/tmp/frp_${FRP_VER}_linux_amd64.tar.gz"
if [ ! -x "/tmp/frp_${FRP_VER}_linux_amd64/frpc" ]; then
curl -sL -o "$FRP_TAR" "https://github.com/fatedier/frp/releases/download/v${FRP_VER}/frp_${FRP_VER}_linux_amd64.tar.gz"
tar xzf "$FRP_TAR" -C /tmp
fi
[ -x "/tmp/frp_${FRP_VER}_linux_amd64/frpc" ] || { echo "!! frpc 下载/解包失败"; exit 1; }
echo "==> 上传 token / 脚本 / 二进制到 $NAS_HOST:/tmp/frp-setup/"
# 用 ssh cat 管道而非 scpDSM 默认没开 SFTP 子系统,新版 scp(走SFTP协议)会 Connection closed
ssh "$NAS_HOST" 'mkdir -p /tmp/frp-setup && chmod 700 /tmp/frp-setup'
ssh "$NAS_HOST" 'cat > /tmp/frp-setup/token && chmod 600 /tmp/frp-setup/token' < "$TMPTOKEN"
ssh "$NAS_HOST" 'cat > /tmp/frp-setup/setup-frp-on-nas.sh' < setup-frp-on-nas.sh
ssh "$NAS_HOST" 'cat > /tmp/frp-setup/frpc' < "/tmp/frp_${FRP_VER}_linux_amd64/frpc"
rm -f "$TMPTOKEN"
echo "==> 在 NAS 上执行(sudo 步骤会提示输入 DSM 密码)"