Files
knowledge-base/snippets/niikn-podkop/hub-backup-watchdog.sh

46 lines
3.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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)"