#!/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)"