Каждая минута простоя стоит денег и репутации. Правильный мониторинг позволяет реагировать на проблемы в течение минут, а не часов.
UptimeRobot — бесплатный мониторинг
- Зарегистрируйтесь на uptimerobot.com
- Add New Monitor → HTTP(s)
- URL:
https://yourdomain.com - Интервал: 5 минут (бесплатный план)
- Оповещение: Email, Telegram, Slack
Telegram-алерты с VPS через bash
#!/bin/bash
# /usr/local/bin/check-site.sh
BOT_TOKEN="ВАШ_ТОКЕН"
CHAT_ID="ВАШ_CHAT_ID"
URL="https://yourdomain.com"
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$URL")
if [ "$HTTP_CODE" != "200" ]; then
curl -s "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" -d "chat_id=$CHAT_ID" -d "text=🚨 Сайт недоступен! Code: $HTTP_CODE - $(date)"
fi
chmod +x /usr/local/bin/check-site.sh
# Cron каждые 5 минут:
*/5 * * * * /usr/local/bin/check-site.sh
Мониторинг ресурсов сервера
# Установить netdata (красивый дашборд)
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
# Доступен на http://ВАШ_IP:19999
Полезные команды диагностики
htop # CPU, RAM, процессы
iotop # Нагрузка на диск
nethogs # Трафик по процессам
df -h # Место на диске
free -h # Использование RAM
ss -tlnp # Открытые порты
Разбор типичных проблем скрипта проверки
Скрипт шлёт «сайт недоступен», хотя сайт открывается в браузере — частая причина в том, что curl без дополнительных флагов не следует за редиректами и не выставляет заголовок User-Agent, из-за чего некоторые сайты или WAF отдают код 403 или 301 вместо 200.
$ curl -s -o /dev/null -w "%{http_code}" https://yourdomain.com
403
Добавьте -L для следования за редиректами и заголовок User-Agent, имитирующий браузер, если сайт защищён от ботов: curl -s -L -A "Mozilla/5.0" -o /dev/null -w "%{http_code}" https://yourdomain.com. Проверьте итоговую команду вручную из консоли, прежде чем класть её в cron — так вы увидите реальный код ответа, а не только результат работы скрипта.
Telegram-уведомление не приходит, хотя curl к Telegram API выполняется без ошибок — проверьте код ответа самого Telegram, а не только код завершения curl: неверный chat_id или невыполненный /start у бота вернёт JSON с "ok": false, но curl завершится с кодом 0, потому что запрос технически прошёл.
{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
Сравнение вариантов мониторинга аптайма
| Вариант | Откуда проверяется | Минимальный интервал |
|---|---|---|
| UptimeRobot (бесплатный план) | Внешние сервера сервиса | 5 минут |
| Bash-скрипт на самом VPS | С того же сервера, что и сайт | Любой, зависит от cron |
| Uptime Kuma (self-hosted) | С вашего отдельного сервера мониторинга | 20 секунд |
| Zabbix | С выделенного сервера мониторинга, поддерживает агентов | Настраиваемый, вплоть до секунд |
Когда мониторинга с одной точки недостаточно
- Bash-скрипт на самом VPS не заметит, что сервер целиком недоступен — если упал сам сервер, некому запустить проверку и отправить алерт. Нужен внешний сервис вроде UptimeRobot, который проверяет сайт снаружи.
- Один внешний чекер может дать ложное срабатывание из-за временных проблем у себя в сети — платные планы мониторинга проверяют с нескольких географических точек и шлют алерт только при совпадении отказов.
- Нужен мониторинг не только HTTP-кода, но и содержимого страницы или времени ответа критического API — простой скрипт на curl проверяет только код ответа, для контроля контента нужны более специализированные проверки.
- Требуется SLA-отчётность с историей инцидентов за месяцы для клиентов или руководства — бесплатные инструменты обычно хранят историю ограниченный срок, для долгой отчётности нужен платный план или собственная база инцидентов.
Проверка результата
- Запустите скрипт вручную и временно остановите Nginx:
systemctl stop nginx— должно прийти уведомление в Telegram в течение следующего запуска по cron. - Проверьте, что cron реально выполняет задачу:
grep CRON /var/log/syslog | tailдолжен показывать регулярные записи о запуске скрипта. - Убедитесь, что скрипт не шлёт ложные срабатывания при кратковременных сетевых заминках — добавьте повторную проверку перед алертом, если единичные ложные срабатывания уже случались.
- Проверьте, что после восстановления сайта система также присылает уведомление о восстановлении, а не только об аварии — иначе легко забыть, что проблема давно решена.
Для мониторинга ресурсов самого сервера, а не только доступности сайта снаружи, — статья про Netdata. Self-hosted альтернатива UptimeRobot с собственным дашбордом и историей без ограничения по времени разобрана в статье про Uptime Kuma.