Files
knowledge-base/snippets/finland-hub-watchdog.sh

47 lines
3.0 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
# Внешний сторож VPN-хаба НИИКН (AdminVPS 78.17.4.225) — на openclaw LXC 137, cron */5.
# Ловит "хаб лёг целиком": приостановка AdminVPS за неоплату / упавшая VM — сервисы не слушают порты.
# Самолечить нельзя (коробка провайдерская/выключена) → ТОЛЬКО алерт. TG (Олег) + email, дедуп + "отбой".
# Контейнерный self-heal живёт на самом хабе (restart:always + watchtower). Образец: antoshka-watch-self.sh.
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HUB=78.17.4.225
CHAT=1292155421
CFG=/root/.openclaw/openclaw.json
STATE=/root/.finland-hub-watchdog.last
TOKEN=$(grep -oE '[0-9]{8,}:[A-Za-z0-9_-]{30,}' "$CFG" 2>/dev/null | head -1)
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
[ -f /root/.wd-mail.env ] && . /root/.wd-mail.env
if [ -n "${MAILTO:-}" ]; then
printf 'From: dttb watchdog <%s>\nTo: %s\nSubject: %s\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\nDate: %s\n\n%s\n' \
"$SMTPUSER" "$MAILTO" "[Finland-hub LXC137] watchdog" "$(date -R)" "$1" > /tmp/.fhwd.eml
curl -s --max-time 25 --url "smtp://${MAILHOST}:587" --ssl-reqd --resolve "${MAILHOST}:587:${MAILIP}" \
--mail-from "$SMTPUSER" --mail-rcpt "$MAILTO" --user "${SMTPUSER}:${SMTPPASS}" --upload-file /tmp/.fhwd.eml >/dev/null 2>&1
fi
}
tcp(){ timeout 5 bash -c "echo >/dev/tcp/$HUB/$1" 2>/dev/null && echo 1 || echo 0; }
icmp=$(ping -c2 -W2 "$HUB" >/dev/null 2>&1 && echo 1 || echo 0)
p443=$(tcp 443); p9443=$(tcp 9443)
# Хаб "лежит", если оба сервисных порта молчат (как было при приостановке AdminVPS)
if [ "$p443" = "0" ] && [ "$p9443" = "0" ]; then
if [ "$icmp" = "1" ]; then
msg="🚨 VPN-хаб НИИКН ($HUB) НЕ обслуживает: TCP 443/9443 молчат, ICMP есть. Похоже на приостановку AdminVPS (неоплата) или зависшую VM — лёг весь обход (Claude/TG/WA/VLESS у НИИКН и клиентов). Проверь биллинг AdminVPS / vps-панель."
else
msg="🚨 VPN-хаб НИИКН ($HUB) полностью недоступен (ни ICMP, ни TCP 443/9443). Лёг весь обход. Проверь AdminVPS."
fi
now=$(date +%s); last=$(cat "$STATE" 2>/dev/null || echo 0)
if [ $((now - last)) -gt 3600 ]; then send "$msg"; fi # повтор не чаще раза в час
[ -f "$STATE" ] || echo "$now" > "$STATE"
echo "ALERT: $msg"
exit 1
fi
# всё ок — если был в алерте, шлём отбой
if [ -f "$STATE" ]; then send "✅ VPN-хаб НИИКН ($HUB) снова в строю (TCP 443=$p443, 9443=$p9443)."; rm -f "$STATE"; fi
echo "OK: hub up (icmp=$icmp 443=$p443 9443=$p9443)"