效果
每天凌晨 4 点,VPS 自动检查 GitHub 官方 Release。
有新版本 → 自动下载新文件,下载成功后再删除旧版本。
没有新版本 → 什么都不做。
文件直接写进 Filebrowser 挂载的目录,网页刷新即可看到,不需要改 compose,也不需要重启容器。
先了解三件事
v2rayN 官方发布的是 zip 便携包(解压后里面才有
v2rayN.exe),所以同步的是 zip,不是单独的 exe。安卓版不叫 v2rayN,叫 v2rayNG,是另一个仓库
2dust/v2rayNG。本教程默认目录:
Filebrowser 目录:
/root/filebrowser文件存放目录:
/root/filebrowser/my-files/proxy/
如果你的路径不同,请把下面所有命令和脚本里的路径一起改掉。
第 1 步:SSH 登录 VPS,安装工具
apt update && apt install -y curl jq
curl:下载文件jq:解析 GitHub 返回的 JSON
第 2 步:创建同步脚本
整段复制粘贴到终端,回车执行:
cat > /root/filebrowser/sync-proxy.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
DIR=/root/filebrowser/my-files/proxy
STATE=/root/filebrowser/.sync-state
mkdir -p "$DIR" "$STATE"
# 格式:名字;GitHub仓库;文件名正则
ITEMS=(
"v2rayN;2dust/v2rayN;^v2rayN-windows-64.*\.zip$"
"v2rayNG;2dust/v2rayNG;^v2rayNG_[0-9.]+_(arm64-v8a|armeabi-v7a)\.apk$"
)
for item in "${ITEMS[@]}"; do
IFS=';' read -r name repo regex <<< "$item"
echo "[$(date '+%F %T')] 检查 $name"
json=$(curl -fsSL --retry 3 "https://api.github.com/repos/$repo/releases/latest")
tag=$(jq -r .tag_name <<< "$json")
if [ "$(cat "$STATE/$name.tag" 2>/dev/null)" = "$tag" ]; then
echo " 已是最新 $tag,跳过"; continue
fi
tmp=$(mktemp -d)
jq -r --arg re "$regex" '.assets[] | select(.name|test($re)) | "\(.name) \(.browser_download_url)"' <<< "$json" > "$tmp/list"
if [ ! -s "$tmp/list" ]; then echo " 没匹配到文件,跳过"; rm -rf "$tmp"; continue; fi
# 先全部下载到临时目录,成功后才替换旧文件
while read -r fname url; do
echo " 下载 $fname"
curl -fL --retry 3 -o "$tmp/$fname" "$url"
done < "$tmp/list"
# 删除上一个版本的旧文件
if [ -f "$STATE/$name.files" ]; then
while read -r old; do rm -f "$DIR/$old"; done < "$STATE/$name.files"
fi
awk '{print $1}' "$tmp/list" > "$STATE/$name.files"
while read -r fname _; do mv -f "$tmp/$fname" "$DIR/$fname"; done < "$tmp/list"
echo "$tag" > "$STATE/$name.tag"
rm -rf "$tmp"
echo " 已更新到 $tag"
done
EOF
chmod +x /root/filebrowser/sync-proxy.sh
脚本里两条规则的含义
常见改法:
只要 WPF 界面的 Windows 版:
^v2rayN-windows-64\.zip$只要 arm64 的 apk:把
(arm64-v8a|armeabi-v7a)改成arm64-v8a
第 3 步:手动运行一次
/root/filebrowser/sync-proxy.sh
ls -lh /root/filebrowser/my-files/proxy/
正常输出类似:
[2026-09-21 11:33:10] 检查 v2rayN
下载 v2rayN-windows-64.zip
...
已更新到 7.24.9
[2026-09-21 11:33:40] 检查 v2rayNG
下载 v2rayNG_2.2.6_arm64-v8a.apk
...
已更新到 2.2.6
ls 应该能看到 zip 和 apk 文件。
如果提示“没匹配到文件”
说明官方文件名和脚本里的正则对不上。先看官方当前的文件名:
curl -s https://api.github.com/repos/2dust/v2rayN/releases/latest | jq -r '.assets[].name'
curl -s https://api.github.com/repos/2dust/v2rayNG/releases/latest | jq -r '.assets[].name'
然后修改脚本里对应的正则:
nano /root/filebrowser/sync-proxy.sh
(改完 Ctrl+O 回车保存,Ctrl+X 退出。)
第 4 步:设置每天自动运行
(crontab -l 2>/dev/null; echo "0 4 * * * /root/filebrowser/sync-proxy.sh >> /root/filebrowser/sync.log 2>&1") | crontab -
确认已添加:
crontab -l
应该看到:
0 4 * * * /root/filebrowser/sync-proxy.sh >> /root/filebrowser/sync.log 2>&1
含义:每天 4:00(按 VPS 系统时区)运行脚本,输出追加到 sync.log。
注意:
sync.log要等 cron 第一次运行后才会出现。第一次手动运行的输出只显示在屏幕上,所以此时看不到日志文件是正常的。
第 5 步:清理手动放的旧文件
脚本只会删除它自己下载的旧版本,你之前手动放进去的旧文件需要自己删:
ls -lh /root/filebrowser/my-files/proxy/
rm /root/filebrowser/my-files/proxy/旧文件名
第 6 步:验证
浏览器打开
http://VPS的IP:8080,进入proxy目录,确认能看到最新文件。第二天早上查看日志,确认 cron 自动运行成功:
tail -n 20 /root/filebrowser/sync.log
应该能看到当天 4 点的记录,没有新版本时显示“已是最新,跳过”。
日常维护
想同步其他软件怎么办
在脚本的 ITEMS=( ... ) 里加一行,格式为 名字;GitHub仓库;文件名正则,例如:
"clash;MetaCubeX/mihomo;^mihomo-windows-amd64-v[0-9.]+\.zip$"
名字不要和已有的重复,因为它会用来记录版本状态。
常见问题
Q1:日志显示 curl: (28) 或超时,下载不了? VPS 访问 GitHub 不通(国内机房常见)。需要给 VPS 配代理,或换一台能访问 GitHub 的机器。
Q2:日志显示 API rate limit exceeded? GitHub 未登录接口每小时限 60 次(按 IP 计算)。每天运行一次通常不会超;如果同一 IP 有别的程序也在调用,第二天自动恢复。
Q3:cron 没有自动运行?
systemctl status cron
如果不是 active (running):
systemctl enable --now cron
Q4:Filebrowser 网页里看不到新文件? 刷新网页(F5)。如果还没有,确认文件在 /root/filebrowser/my-files/proxy/ 下,而不是别的目录。
Q5:下载中途断网会不会把现有文件弄丢? 不会。脚本先把新文件全部下载到临时目录,全部成功后才删除旧版本并替换。
评论区