diff --git a/scripts/setup-frp-on-nas.sh b/scripts/setup-frp-on-nas.sh index f558d82..eb58904 100755 --- a/scripts/setup-frp-on-nas.sh +++ b/scripts/setup-frp-on-nas.sh @@ -1,16 +1,19 @@ #!/bin/bash # 在 NAS 上执行(由 setup-frp-remote.sh 上传并调用,也可手动跑): -# ① 写 frpc 配置 + docker compose 拉起(需 sudo,会提示输 DSM 密码) +# ① 写 frpc 配置 + 安装 frpc 二进制 + systemd 常驻(需 sudo,会提示输 DSM 密码) +# (不用 docker:NAS 出国通道不通拉不了 Docker Hub 镜像;二进制由远端脚本推来) # ② mihomo 加 hosts 覆盖 / fake-ip-filter / use-hosts(幂等,自动备份,热重载) # ③ 端到端验证 -# 前提:/tmp/frp-setup/token 里是 frp auth token(由远端脚本从 Bitwarden 送来)。 +# 前提:/tmp/frp-setup/ 下有 token(Bitwarden 取来)和 frpc(linux_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.yml(sudo)" @@ -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/bin(Container 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 mihomo:hosts 覆盖 + 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 失败:对应本地端口没起。" diff --git a/scripts/setup-frp-remote.sh b/scripts/setup-frp-remote.sh index 6875f2b..3b6f6fe 100755 --- a/scripts/setup-frp-remote.sh +++ b/scripts/setup-frp-remote.sh @@ -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_amd64;NAS 出国通道不通,由 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 管道而非 scp:DSM 默认没开 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 密码)"