From aeb8fd60776af924d24cb5165a1c7bf406eaba72 Mon Sep 17 00:00:00 2001 From: Niko Marmeladkov Date: Wed, 26 Aug 2026 12:07:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B1=D0=B8=D0=BD=D0=B0=D1=80=D0=BD=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B8=D0=B7=20=D1=80=D0=B5=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=8F=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20f.n?= =?UTF-8?q?1ko.dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - релиз bins: sing-box/ipt2socks для всех архитектур + versions + install.sh (https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/) - install.sh/nikovpn.py/wrappers: источники по порядку — релиз -> f.n1ko.dev (резерв) -> локальный bin/ - статус: traffic_total это всего потрачено, а не лимит (traffic_limit=0 значит безлимит) --- README.md | 6 ++++-- install.sh | 17 +++++++++++------ nikovpn.py | 17 +++++++++++------ status.sh | 17 +++++++++++------ uninstall.sh | 17 +++++++++++------ update.sh | 17 +++++++++++------ 6 files changed, 59 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 2405bcb..8008d5c 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,10 @@ cd nikovpn_openwrt echo 'login:password' > /root/creds ``` -Бинарники при установке качаются с f.n1ko.dev (каталог `bin/` ~150 MB -в репозиторий не входит; если он есть рядом с install.sh — берётся из него). +Бинарники при установке качаются из [релизов репозитория] +(https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/tag/bins) — каталог +`bin/` в клон не входит; если он есть рядом с install.sh — берётся из него. +f.n1ko.dev остаётся резервным источником. ## Команды diff --git a/install.sh b/install.sh index cf0b67e..a7dcf1b 100755 --- a/install.sh +++ b/install.sh @@ -27,6 +27,7 @@ # ============================================================================ BASE_URL="https://f.n1ko.dev/nikovpn_openwrt" +REL_URL="https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins" API_URL="https://vpnd.n1ko.dev/api/v1" WORK_DIR="/etc/nikovpn" CREDS_FILE="/root/creds" @@ -459,7 +460,8 @@ install_bins() { if [ "$skip_sb" != 1 ]; then log "Получаю sing-box ($SB_ARCH) ..." - dl "$BASE_URL/bin/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" || \ + dl "$REL_URL/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" || \ + dl "$BASE_URL/bin/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" || \ cp "$REPO_DIR/bin/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" 2>/dev/null [ -s "$TMP/sing-box.gz" ] || die "не удалось скачать sing-box" gzip -dc "$TMP/sing-box.gz" > "$TMP/sing-box" 2>/dev/null || die "повреждённый архив sing-box" @@ -471,7 +473,8 @@ install_bins() { if [ "$TUNNEL" = "ipt2socks" ] && [ "$skip_ipt" != 1 ]; then log "Получаю ipt2socks ($IPT_ARCH) ..." - dl "$BASE_URL/bin/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" || \ + dl "$REL_URL/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" || \ + dl "$BASE_URL/bin/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" || \ cp "$REPO_DIR/bin/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" 2>/dev/null [ -s "$TMP/ipt2socks.gz" ] || die "не удалось скачать ipt2socks" gzip -dc "$TMP/ipt2socks.gz" > "$TMP/ipt2socks" 2>/dev/null || die "повреждённый архив ipt2socks" @@ -754,7 +757,7 @@ status() { tu=$(sed -n 's/.*"traffic_used": *\([0-9]*\).*/\1/p' "$TMP/me") tt=$(sed -n 's/.*"traffic_total": *\([0-9]*\).*/\1/p' "$TMP/me") td=$(sed -n 's/.*"traffic_day": *\([0-9]*\).*/\1/p' "$TMP/me") - echo "Трафик: использовано $tu, за сутки $td, лимит $tt байт" + echo "Трафик: использовано $tu байт, за сутки $td, всего $tt" fi } @@ -798,9 +801,11 @@ install() { mkdir -p "$WORK_DIR" "$TMP" - log "Проверяю обновления с f.n1ko.dev ..." - dl "$BASE_URL/versions" "$TMP/versions" || cp "$REPO_DIR/versions" "$TMP/versions" 2>/dev/null - [ -s "$TMP/versions" ] || die "не могу скачать $BASE_URL/versions (нет интернета?)" + log "Проверяю обновления ..." + dl "$REL_URL/versions" "$TMP/versions" || \ + dl "$BASE_URL/versions" "$TMP/versions" || \ + cp "$REPO_DIR/versions" "$TMP/versions" 2>/dev/null + [ -s "$TMP/versions" ] || die "не могу скачать versions (нет интернета?)" SB_VER=""; IPT_VER="" while IFS='=' read -r k v; do case "$k" in sing-box) SB_VER="$v" ;; ipt2socks) IPT_VER="$v" ;; esac diff --git a/nikovpn.py b/nikovpn.py index 7266eb2..04ff8b7 100644 --- a/nikovpn.py +++ b/nikovpn.py @@ -35,6 +35,7 @@ from pathlib import Path from urllib.parse import parse_qs, unquote, urlsplit BASE_URL = "https://f.n1ko.dev/nikovpn_openwrt" +REL_URL = "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins" API_URL = "https://vpnd.n1ko.dev/api/v1" WORK_DIR = "/etc/nikovpn" CREDS_FILE = "/root/creds" @@ -635,9 +636,10 @@ def install_bins(rt: Router, sb_arch: str, ipt_arch: str, tunnel: str, if local.exists(): push_gz(rt, local, SB_PATH, "{b} version", "sing-box") else: - log(f"скачиваю sing-box ({sb_arch}) на роутере с f.n1ko.dev ...") + log(f"скачиваю sing-box ({sb_arch}) на роутере ...") gz = f"/tmp/nikovpn.{os.getpid()}.sb.gz" - if not router_download(rt, f"{BASE_URL}/bin/sing-box-{sb_arch}.gz", gz): + if not (router_download(rt, f"{REL_URL}/sing-box-{sb_arch}.gz", gz) or + router_download(rt, f"{BASE_URL}/bin/sing-box-{sb_arch}.gz", gz)): die("не удалось скачать sing-box") rt.run(f"gzip -dc {gz} > {SB_PATH} && chmod +x {SB_PATH}", check=True) if rt.run(f"{SB_PATH} version")[0] != 0: @@ -649,9 +651,10 @@ def install_bins(rt: Router, sb_arch: str, ipt_arch: str, tunnel: str, if local.exists(): push_gz(rt, local, IPT_PATH, "{b} -V", "ipt2socks") else: - log(f"скачиваю ipt2socks ({ipt_arch}) на роутере с f.n1ko.dev ...") + log(f"скачиваю ipt2socks ({ipt_arch}) на роутере ...") gz = f"/tmp/nikovpn.{os.getpid()}.ipt.gz" - if not router_download(rt, f"{BASE_URL}/bin/ipt2socks-{ipt_arch}.gz", gz): + if not (router_download(rt, f"{REL_URL}/ipt2socks-{ipt_arch}.gz", gz) or + router_download(rt, f"{BASE_URL}/bin/ipt2socks-{ipt_arch}.gz", gz)): die("не удалось скачать ipt2socks") rt.run(f"gzip -dc {gz} > {IPT_PATH} && chmod +x {IPT_PATH}", check=True) if rt.run(f"{IPT_PATH} -V")[0] != 0: @@ -818,7 +821,9 @@ def do_install(rt: Router, args, update=False): IPT_VER = v if not SB_VER: rc, out, _ = rt.run( - f"(curl -fsSL {BASE_URL}/versions 2>/dev/null || " + f"(curl -fsSL {REL_URL}/versions 2>/dev/null || " + f"wget -q -O - {REL_URL}/versions 2>/dev/null || " + f"curl -fsSL {BASE_URL}/versions 2>/dev/null || " f"wget -q -O - {BASE_URL}/versions 2>/dev/null)") if rc == 0: for line in out.decode(errors="replace").splitlines(): @@ -947,7 +952,7 @@ def do_status(rt: Router, args): me = json.loads(body) print(f"Трафик: использовано {human(me.get('traffic_used'))}, " f"за сутки {human(me.get('traffic_day'))}, " - f"лимит {human(me.get('traffic_total'))}") + f"всего {human(me.get('traffic_total'))}") except SystemExit: pass diff --git a/status.sh b/status.sh index 8a0b4f0..e158e06 100755 --- a/status.sh +++ b/status.sh @@ -2,12 +2,17 @@ # NikoVPN: статус VPN [ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh status TMP=/tmp/nikovpn-status.sh -URL="https://f.n1ko.dev/nikovpn_openwrt/install.sh" -if command -v curl >/dev/null 2>&1; then - curl -fsSL "$URL" -o "$TMP" 2>/dev/null -elif command -v wget >/dev/null 2>&1; then - wget -q "$URL" -O "$TMP" 2>/dev/null -fi +for URL in \ + "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/install.sh" \ + "https://f.n1ko.dev/nikovpn_openwrt/install.sh"; do + if command -v curl >/dev/null 2>&1; then + curl -fsSL "$URL" -o "$TMP" 2>/dev/null + elif command -v wget >/dev/null 2>&1; then + wget -q "$URL" -O "$TMP" 2>/dev/null + fi + [ -s "$TMP" ] && break + rm -f "$TMP" +done if [ -s "$TMP" ]; then chmod +x "$TMP" exec "$TMP" status diff --git a/uninstall.sh b/uninstall.sh index 88749b0..23a0e58 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -2,12 +2,17 @@ # NikoVPN: удаление VPN (останавливает сервисы и чистит firewall) [ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh uninstall TMP=/tmp/nikovpn-uninstall.sh -URL="https://f.n1ko.dev/nikovpn_openwrt/install.sh" -if command -v curl >/dev/null 2>&1; then - curl -fsSL "$URL" -o "$TMP" 2>/dev/null -elif command -v wget >/dev/null 2>&1; then - wget -q "$URL" -O "$TMP" 2>/dev/null -fi +for URL in \ + "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/install.sh" \ + "https://f.n1ko.dev/nikovpn_openwrt/install.sh"; do + if command -v curl >/dev/null 2>&1; then + curl -fsSL "$URL" -o "$TMP" 2>/dev/null + elif command -v wget >/dev/null 2>&1; then + wget -q "$URL" -O "$TMP" 2>/dev/null + fi + [ -s "$TMP" ] && break + rm -f "$TMP" +done if [ -s "$TMP" ]; then chmod +x "$TMP" exec "$TMP" uninstall diff --git a/update.sh b/update.sh index d2a8c30..e9272c6 100755 --- a/update.sh +++ b/update.sh @@ -2,12 +2,17 @@ # NikoVPN: обновление (переустановка) — скачивает свежий install.sh с f.n1ko.dev [ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh update TMP=/tmp/nikovpn-update.sh -URL="https://f.n1ko.dev/nikovpn_openwrt/install.sh" -if command -v curl >/dev/null 2>&1; then - curl -fsSL "$URL" -o "$TMP" 2>/dev/null -elif command -v wget >/dev/null 2>&1; then - wget -q "$URL" -O "$TMP" 2>/dev/null -fi +for URL in \ + "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/install.sh" \ + "https://f.n1ko.dev/nikovpn_openwrt/install.sh"; do + if command -v curl >/dev/null 2>&1; then + curl -fsSL "$URL" -o "$TMP" 2>/dev/null + elif command -v wget >/dev/null 2>&1; then + wget -q "$URL" -O "$TMP" 2>/dev/null + fi + [ -s "$TMP" ] && break + rm -f "$TMP" +done if [ -s "$TMP" ]; then chmod +x "$TMP" exec "$TMP" update