refactor(frp): frpc 改二进制+systemd 常驻(NAS 出国通道死拉不了 Docker Hub);remote 脚本代下载并推送二进制
This commit is contained in:
+30
-25
@@ -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 失败:对应本地端口没起。"
|
||||
|
||||
@@ -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 密码)"
|
||||
|
||||
Reference in New Issue
Block a user