niikn: самовосстановление обхода (netns-probe+heal+boot-self-heal на OpenWrt, watchdog LXC137) + внешний бэкап-сторож на HOSTKEY (dead-man's switch); скрипты в snippets/niikn-podkop

This commit is contained in:
dttb
2026-06-29 23:56:17 +03:00
parent cabcd11e0c
commit 5b2ffaf033
8 changed files with 254 additions and 2 deletions

View File

@@ -0,0 +1,45 @@
#!/bin/bash
# hub-backup-watchdog.sh — ВНЕШНИЙ (truly-external) бэкап-сторож на HOSTKEY 151.241.234.241
# (другой провайдер, чистый EU-интернет → TG напрямую). cron */5. Переживает падение дома/LXC137.
# 1) Независимо следит за AdminVPS-хабом НИИКН 78.17.4.225 (ICMP+TCP 443/9443).
# 2) Dead-man's switch: проверяет живость дома (git.dttb.ru). Дом недоступен → основной мониторинг
# (LXC137) мог лечь → алертит отсюда, через независимый канал.
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HUB=78.17.4.225
HOME_URL=https://git.dttb.ru/
CHAT=1292155421
. /root/.tg-alert.env 2>/dev/null # TOKEN=...
S_HUB=/root/.hub-backup.hub.alert
S_HOME=/root/.hub-backup.home.state # "fails" — гистерезис для дома
A_HOME=/root/.hub-backup.home.alert
send(){ [ -n "$TOKEN" ] && curl -s --max-time 20 "https://api.telegram.org/bot${TOKEN}/sendMessage" \
--data-urlencode "chat_id=$CHAT" --data-urlencode "text=$1" >/dev/null 2>&1; }
tcp(){ timeout 5 bash -c "echo >/dev/tcp/$HUB/$1" 2>/dev/null && echo 1 || echo 0; }
NOW=$(date +%s)
# 1. Независимая проверка хаба
icmp=$(ping -c2 -W2 "$HUB" >/dev/null 2>&1 && echo 1 || echo 0)
p443=$(tcp 443); p9443=$(tcp 9443)
if [ "$p443" = 0 ] && [ "$p9443" = 0 ]; then
msg="🚨 [внешний сторож HOSTKEY] VPN-хаб НИИКН ($HUB) лёг: TCP 443/9443 молчат (ICMP=$icmp). Весь обход недоступен. Проверь AdminVPS (неоплата?)."
last=$(cat "$S_HUB" 2>/dev/null || echo 0); [ $((NOW-last)) -gt 3600 ] && { send "$msg"; echo "$NOW" > "$S_HUB"; }
echo "ALERT: hub down"
else
[ -f "$S_HUB" ] && { send "✅ [внешний сторож HOSTKEY] VPN-хаб НИИКН ($HUB) снова в строю."; rm -f "$S_HUB"; }
fi
# 2. Dead-man's switch: живость дома (gitea — стабильный публичный сервис dttb)
if curl -s -o /dev/null --max-time 10 -w '%{http_code}' "$HOME_URL" 2>/dev/null | grep -qE '^(200|30.|40.)$'; then
echo 0 > "$S_HOME"
[ -f "$A_HOME" ] && { send "✅ [внешний сторож HOSTKEY] Дом dttb снова доступен — основной мониторинг (LXC137) жив."; rm -f "$A_HOME"; }
else
f=$(( $(cat "$S_HOME" 2>/dev/null || echo 0) + 1 )); echo "$f" > "$S_HOME"
if [ "$f" -ge 2 ]; then
msg="⚠️ [внешний сторож HOSTKEY] Дом dttb недоступен снаружи ($HOME_URL не отвечает, $f проверки подряд) — возможно лёг интернет/инфра дома, а с ним и основной сторож LXC137. Следи за хабом вручную; этот внешний сторож продолжает работать."
last=$(cat "$A_HOME" 2>/dev/null || echo 0); [ $((NOW-last)) -gt 3600 ] && { send "$msg"; echo "$NOW" > "$A_HOME"; }
echo "ALERT: home unreachable ($f)"
else
echo "home degraded $f/2"
fi
fi
echo "done (hub 443=$p443 9443=$p9443 icmp=$icmp)"