Добавить install/monitor.sh
This commit is contained in:
parent
13e25fcc74
commit
1b8eaf4d9d
1 changed files with 97 additions and 0 deletions
97
install/monitor.sh
Normal file
97
install/monitor.sh
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Мониторинг живости трёх инбаундов + алерт в Telegram.
|
||||||
|
# Установка в cron: */15 * * * * /opt/vpn-setup/monitor.sh >> /var/log/vpn-monitor.log 2>&1
|
||||||
|
#
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
WORKDIR="/opt/vpn-setup"
|
||||||
|
source "$WORKDIR/params.env"
|
||||||
|
|
||||||
|
STATE_FILE="$WORKDIR/monitor_state"
|
||||||
|
touch "$STATE_FILE"
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
send_alert() {
|
||||||
|
local message="$1"
|
||||||
|
log "ALERT: $message"
|
||||||
|
if [[ -n "${TELEGRAM_BOT_TOKEN:-}" && -n "${TELEGRAM_CHAT_ID:-}" ]]; then
|
||||||
|
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
|
||||||
|
-d chat_id="${TELEGRAM_CHAT_ID}" \
|
||||||
|
-d text="🚨 VPN Monitor: ${message}" > /dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
was_down() {
|
||||||
|
grep -q "^$1:down$" "$STATE_FILE" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
mark_state() {
|
||||||
|
local name="$1"
|
||||||
|
local state="$2"
|
||||||
|
grep -v "^$name:" "$STATE_FILE" > "${STATE_FILE}.tmp" 2>/dev/null || true
|
||||||
|
echo "$name:$state" >> "${STATE_FILE}.tmp"
|
||||||
|
mv "${STATE_FILE}.tmp" "$STATE_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
check_tcp_port() {
|
||||||
|
local name="$1"
|
||||||
|
local port="$2"
|
||||||
|
if timeout 5 bash -c "cat < /dev/null > /dev/tcp/127.0.0.1/${port}" 2>/dev/null; then
|
||||||
|
if was_down "$name"; then
|
||||||
|
send_alert "${name} восстановлен (порт ${port} снова отвечает)"
|
||||||
|
fi
|
||||||
|
mark_state "$name" "up"
|
||||||
|
log "OK: $name (tcp/$port)"
|
||||||
|
else
|
||||||
|
if ! was_down "$name"; then
|
||||||
|
send_alert "${name} НЕ отвечает (порт ${port}). Возможна блокировка."
|
||||||
|
fi
|
||||||
|
mark_state "$name" "down"
|
||||||
|
log "FAIL: $name (tcp/$port)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_systemd_service() {
|
||||||
|
local name="$1"
|
||||||
|
local service="$2"
|
||||||
|
if systemctl is-active --quiet "$service"; then
|
||||||
|
if was_down "$name-svc"; then
|
||||||
|
send_alert "Сервис ${service} снова запущен"
|
||||||
|
fi
|
||||||
|
mark_state "$name-svc" "up"
|
||||||
|
else
|
||||||
|
if ! was_down "$name-svc"; then
|
||||||
|
send_alert "Сервис ${service} УПАЛ (systemd). Пробую перезапустить."
|
||||||
|
fi
|
||||||
|
mark_state "$name-svc" "down"
|
||||||
|
systemctl restart "$service" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
log "=== Проверка начата ==="
|
||||||
|
|
||||||
|
check_systemd_service "xray" "xray"
|
||||||
|
check_systemd_service "hysteria" "hysteria-server"
|
||||||
|
|
||||||
|
check_tcp_port "VLESS-XHTTP-443" 443
|
||||||
|
check_tcp_port "VLESS-TCP-8443" 8443
|
||||||
|
|
||||||
|
if [[ -n "${DOMAIN:-}" ]]; then
|
||||||
|
CERT_FILE="/etc/letsencrypt/live/${DOMAIN}/fullchain.pem"
|
||||||
|
if [[ -f "$CERT_FILE" ]]; then
|
||||||
|
EXPIRY_DATE=$(openssl x509 -enddate -noout -in "$CERT_FILE" | cut -d= -f2)
|
||||||
|
EXPIRY_EPOCH=$(date -d "$EXPIRY_DATE" +%s)
|
||||||
|
NOW_EPOCH=$(date +%s)
|
||||||
|
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
|
||||||
|
if [[ $DAYS_LEFT -lt 14 ]]; then
|
||||||
|
send_alert "Сертификат ${DOMAIN} истекает через ${DAYS_LEFT} дней. Проверьте certbot renew."
|
||||||
|
fi
|
||||||
|
log "Сертификат действителен ещё ${DAYS_LEFT} дней"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "=== Проверка завершена ==="
|
||||||
Loading…
Add table
Add a link
Reference in a new issue