Что получите
Телефон будет вибрировать когда:
- Сайт не отвечает
- Диск заполнен на 90%+
- Кто-то зашёл по SSH
- Сервис (nginx, postgres, ваше приложение) упал
- Памяти осталось мало
Без Prometheus. Без Grafana. Без Docker. Bash, cron и Nerve.
Шаг 1: Установить Nerve на сервере
Зайдите по SSH и выполните:
command -v go >/dev/null || {
GO_VERSION="$(curl -fsSL 'https://go.dev/VERSION?m=text' | head -n 1)"
case "$(uname -m)" in
x86_64|amd64) GO_ARCH="amd64" ;;
aarch64|arm64) GO_ARCH="arm64" ;;
esac
curl -fsSLO "https://go.dev/dl/${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
sudo tar -C /usr/local -xzf "${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
rm -f "${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
echo 'export PATH="/usr/local/go/bin:$(go env GOPATH)/bin:$PATH"' >> ~/.bashrc
export PATH="/usr/local/go/bin:$PATH"
}
go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
Шаг 2: Сохранить DSN
echo 'export NERVE_DSN="nerve://TOKEN:[email protected]"' | sudo tee /etc/profile.d/nerve.sh
sudo chmod +x /etc/profile.d/nerve.sh
source /etc/profile.d/nerve.sh
Шаг 3: Скрипт «всё в одном»
#!/bin/bash
# /usr/local/bin/nerve-server-check.sh
set -euo pipefail
export PATH="/usr/local/go/bin:$(go env GOPATH 2>/dev/null || echo /root/go)/bin:$PATH"
source /etc/profile.d/nerve.sh 2>/dev/null || true
HOST=$(hostname)
# --- 1. Сайт ---
URL="https://yoursite.ru"
HTTP=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$URL" || echo "000")
if [ "$HTTP" = "000" ] || [ "$HTTP" -ge 500 ]; then
echo "ЛЕЖИТ: $URL (HTTP $HTTP) на $HOST" | nerve send --severity critical
fi
# --- 2. Диск (алерт при 90%) ---
df -h --output=target,pcent -x tmpfs -x devtmpfs 2>/dev/null | tail -n +2 | while read -r mount pct; do
usage="${pct%%%}"
if [ "$usage" -ge 90 ]; then
echo "ДИСК: $mount заполнен на ${usage}% ($HOST)" | nerve send --severity critical
fi
done
# --- 3. Упавшие сервисы ---
FAILED=$(systemctl list-units --state=failed --no-legend --plain 2>/dev/null | head -5)
if [ -n "$FAILED" ]; then
echo "УПАЛИ СЕРВИСЫ на $HOST: $FAILED" | nerve send --severity critical
fi
# --- 4. Память (алерт при 90%) ---
MEM=$(free | awk '/^Mem:/ {printf "%.0f", $3/$2 * 100}')
if [ "$MEM" -ge 90 ]; then
echo "ПАМЯТЬ: ${MEM}% занято на $HOST" | nerve send --severity alert
fi
# --- 5. Load average ---
LOAD=$(awk '{print $1}' /proc/loadavg)
CPUS=$(nproc)
HIGH=$(echo "$LOAD > $CPUS * 2" | bc -l 2>/dev/null || echo "0")
if [ "$HIGH" = "1" ]; then
echo "НАГРУЗКА: $LOAD (${CPUS} CPU) на $HOST" | nerve send --severity alert
fi
sudo chmod +x /usr/local/bin/nerve-server-check.sh
Шаг 4: SSH-алерт
Узнавать о каждом входе по SSH:
sudo tee /etc/profile.d/nerve-ssh-alert.sh > /dev/null << 'EOF'
if [ -n "$SSH_CLIENT" ]; then
IP=$(echo "$SSH_CLIENT" | awk '{print $1}')
echo "SSH: $USER@$(hostname) с $IP" \
| NERVE_DSN="$(grep NERVE_DSN /etc/profile.d/nerve.sh | cut -d'"' -f2)" \
nerve send 2>/dev/null &
fi
EOF
sudo chmod +x /etc/profile.d/nerve-ssh-alert.sh
Шаг 5: Запуск по cron
# Проверка каждые 3 минуты
(crontab -l 2>/dev/null; echo "*/3 * * * * /usr/local/bin/nerve-server-check.sh") | crontab -
Проверить
echo "тестовый алерт с $(hostname)" | nerve send
Должен прийти push на телефон.
Почему не Zabbix
ZabbixОтдельный сервер, база данных, веб-интерфейс, agent на каждой машине. Для 1-2 серверов — overkill.
Prometheus + GrafanaКрасивые графики, но настройка alerting = отдельная задача. Нужен Alertmanager, receiver, инфраструктура.
NerveОдин bash-скрипт, cron, push на телефон. Зашифровано. Бесплатно в бете. Настройка за 5 минут.
Когда вырастете до 10+ серверов — Zabbix или Prometheus будут уместны. Для первого VPS — Nerve достаточно.