бинарники из релизов репозитория вместо f.n1ko.dev

- релиз bins: sing-box/ipt2socks для всех архитектур + versions + install.sh
  (https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/<file>)
- install.sh/nikovpn.py/wrappers: источники по порядку — релиз ->
  f.n1ko.dev (резерв) -> локальный bin/
- статус: traffic_total это всего потрачено, а не лимит (traffic_limit=0
  значит безлимит)
This commit is contained in:
Niko Marmeladkov 2026-08-26 12:07:32 +03:00
parent c887b77784
commit aeb8fd6077
Signed by: Niko
GPG key ID: E3B955F9442D44E3
6 changed files with 59 additions and 32 deletions

View file

@ -27,8 +27,10 @@ cd nikovpn_openwrt
echo 'login:password' > /root/creds 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 остаётся резервным источником.
## Команды ## Команды

View file

@ -27,6 +27,7 @@
# ============================================================================ # ============================================================================
BASE_URL="https://f.n1ko.dev/nikovpn_openwrt" 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" API_URL="https://vpnd.n1ko.dev/api/v1"
WORK_DIR="/etc/nikovpn" WORK_DIR="/etc/nikovpn"
CREDS_FILE="/root/creds" CREDS_FILE="/root/creds"
@ -459,7 +460,8 @@ install_bins() {
if [ "$skip_sb" != 1 ]; then if [ "$skip_sb" != 1 ]; then
log "Получаю sing-box ($SB_ARCH) ..." 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 cp "$REPO_DIR/bin/sing-box-$SB_ARCH.gz" "$TMP/sing-box.gz" 2>/dev/null
[ -s "$TMP/sing-box.gz" ] || die "не удалось скачать sing-box" [ -s "$TMP/sing-box.gz" ] || die "не удалось скачать sing-box"
gzip -dc "$TMP/sing-box.gz" > "$TMP/sing-box" 2>/dev/null || 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 if [ "$TUNNEL" = "ipt2socks" ] && [ "$skip_ipt" != 1 ]; then
log "Получаю ipt2socks ($IPT_ARCH) ..." 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 cp "$REPO_DIR/bin/ipt2socks-$IPT_ARCH.gz" "$TMP/ipt2socks.gz" 2>/dev/null
[ -s "$TMP/ipt2socks.gz" ] || die "не удалось скачать ipt2socks" [ -s "$TMP/ipt2socks.gz" ] || die "не удалось скачать ipt2socks"
gzip -dc "$TMP/ipt2socks.gz" > "$TMP/ipt2socks" 2>/dev/null || 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") tu=$(sed -n 's/.*"traffic_used": *\([0-9]*\).*/\1/p' "$TMP/me")
tt=$(sed -n 's/.*"traffic_total": *\([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") td=$(sed -n 's/.*"traffic_day": *\([0-9]*\).*/\1/p' "$TMP/me")
echo "Трафик: использовано $tu, за сутки $td, лимит $tt байт" echo "Трафик: использовано $tu байт, за сутки $td, всего $tt"
fi fi
} }
@ -798,9 +801,11 @@ install() {
mkdir -p "$WORK_DIR" "$TMP" mkdir -p "$WORK_DIR" "$TMP"
log "Проверяю обновления с f.n1ko.dev ..." log "Проверяю обновления ..."
dl "$BASE_URL/versions" "$TMP/versions" || cp "$REPO_DIR/versions" "$TMP/versions" 2>/dev/null dl "$REL_URL/versions" "$TMP/versions" || \
[ -s "$TMP/versions" ] || die "не могу скачать $BASE_URL/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="" SB_VER=""; IPT_VER=""
while IFS='=' read -r k v; do while IFS='=' read -r k v; do
case "$k" in sing-box) SB_VER="$v" ;; ipt2socks) IPT_VER="$v" ;; esac case "$k" in sing-box) SB_VER="$v" ;; ipt2socks) IPT_VER="$v" ;; esac

View file

@ -35,6 +35,7 @@ from pathlib import Path
from urllib.parse import parse_qs, unquote, urlsplit from urllib.parse import parse_qs, unquote, urlsplit
BASE_URL = "https://f.n1ko.dev/nikovpn_openwrt" 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" API_URL = "https://vpnd.n1ko.dev/api/v1"
WORK_DIR = "/etc/nikovpn" WORK_DIR = "/etc/nikovpn"
CREDS_FILE = "/root/creds" CREDS_FILE = "/root/creds"
@ -635,9 +636,10 @@ def install_bins(rt: Router, sb_arch: str, ipt_arch: str, tunnel: str,
if local.exists(): if local.exists():
push_gz(rt, local, SB_PATH, "{b} version", "sing-box") push_gz(rt, local, SB_PATH, "{b} version", "sing-box")
else: else:
log(f"скачиваю sing-box ({sb_arch}) на роутере с f.n1ko.dev ...") log(f"скачиваю sing-box ({sb_arch}) на роутере ...")
gz = f"/tmp/nikovpn.{os.getpid()}.sb.gz" 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") die("не удалось скачать sing-box")
rt.run(f"gzip -dc {gz} > {SB_PATH} && chmod +x {SB_PATH}", check=True) rt.run(f"gzip -dc {gz} > {SB_PATH} && chmod +x {SB_PATH}", check=True)
if rt.run(f"{SB_PATH} version")[0] != 0: 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(): if local.exists():
push_gz(rt, local, IPT_PATH, "{b} -V", "ipt2socks") push_gz(rt, local, IPT_PATH, "{b} -V", "ipt2socks")
else: else:
log(f"скачиваю ipt2socks ({ipt_arch}) на роутере с f.n1ko.dev ...") log(f"скачиваю ipt2socks ({ipt_arch}) на роутере ...")
gz = f"/tmp/nikovpn.{os.getpid()}.ipt.gz" 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") die("не удалось скачать ipt2socks")
rt.run(f"gzip -dc {gz} > {IPT_PATH} && chmod +x {IPT_PATH}", check=True) rt.run(f"gzip -dc {gz} > {IPT_PATH} && chmod +x {IPT_PATH}", check=True)
if rt.run(f"{IPT_PATH} -V")[0] != 0: if rt.run(f"{IPT_PATH} -V")[0] != 0:
@ -818,7 +821,9 @@ def do_install(rt: Router, args, update=False):
IPT_VER = v IPT_VER = v
if not SB_VER: if not SB_VER:
rc, out, _ = rt.run( 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)") f"wget -q -O - {BASE_URL}/versions 2>/dev/null)")
if rc == 0: if rc == 0:
for line in out.decode(errors="replace").splitlines(): for line in out.decode(errors="replace").splitlines():
@ -947,7 +952,7 @@ def do_status(rt: Router, args):
me = json.loads(body) me = json.loads(body)
print(f"Трафик: использовано {human(me.get('traffic_used'))}, " print(f"Трафик: использовано {human(me.get('traffic_used'))}, "
f"за сутки {human(me.get('traffic_day'))}, " f"за сутки {human(me.get('traffic_day'))}, "
f"лимит {human(me.get('traffic_total'))}") f"всего {human(me.get('traffic_total'))}")
except SystemExit: except SystemExit:
pass pass

View file

@ -2,12 +2,17 @@
# NikoVPN: статус VPN # NikoVPN: статус VPN
[ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh status [ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh status
TMP=/tmp/nikovpn-status.sh TMP=/tmp/nikovpn-status.sh
URL="https://f.n1ko.dev/nikovpn_openwrt/install.sh" for URL in \
if command -v curl >/dev/null 2>&1; then "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/install.sh" \
curl -fsSL "$URL" -o "$TMP" 2>/dev/null "https://f.n1ko.dev/nikovpn_openwrt/install.sh"; do
elif command -v wget >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
wget -q "$URL" -O "$TMP" 2>/dev/null curl -fsSL "$URL" -o "$TMP" 2>/dev/null
fi 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 if [ -s "$TMP" ]; then
chmod +x "$TMP" chmod +x "$TMP"
exec "$TMP" status exec "$TMP" status

View file

@ -2,12 +2,17 @@
# NikoVPN: удаление VPN (останавливает сервисы и чистит firewall) # NikoVPN: удаление VPN (останавливает сервисы и чистит firewall)
[ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh uninstall [ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh uninstall
TMP=/tmp/nikovpn-uninstall.sh TMP=/tmp/nikovpn-uninstall.sh
URL="https://f.n1ko.dev/nikovpn_openwrt/install.sh" for URL in \
if command -v curl >/dev/null 2>&1; then "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/install.sh" \
curl -fsSL "$URL" -o "$TMP" 2>/dev/null "https://f.n1ko.dev/nikovpn_openwrt/install.sh"; do
elif command -v wget >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
wget -q "$URL" -O "$TMP" 2>/dev/null curl -fsSL "$URL" -o "$TMP" 2>/dev/null
fi 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 if [ -s "$TMP" ]; then
chmod +x "$TMP" chmod +x "$TMP"
exec "$TMP" uninstall exec "$TMP" uninstall

View file

@ -2,12 +2,17 @@
# NikoVPN: обновление (переустановка) — скачивает свежий install.sh с f.n1ko.dev # NikoVPN: обновление (переустановка) — скачивает свежий install.sh с f.n1ko.dev
[ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh update [ -f /etc/nikovpn/install.sh ] && exec /etc/nikovpn/install.sh update
TMP=/tmp/nikovpn-update.sh TMP=/tmp/nikovpn-update.sh
URL="https://f.n1ko.dev/nikovpn_openwrt/install.sh" for URL in \
if command -v curl >/dev/null 2>&1; then "https://git.n1ko.dev/Niko/nikovpn_openwrt/releases/download/bins/install.sh" \
curl -fsSL "$URL" -o "$TMP" 2>/dev/null "https://f.n1ko.dev/nikovpn_openwrt/install.sh"; do
elif command -v wget >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
wget -q "$URL" -O "$TMP" 2>/dev/null curl -fsSL "$URL" -o "$TMP" 2>/dev/null
fi 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 if [ -s "$TMP" ]; then
chmod +x "$TMP" chmod +x "$TMP"
exec "$TMP" update exec "$TMP" update