Про упавший сайт чаще всего узнают от клиента. Между падением и звонком проходит несколько часов, а если это случилось ночью — то и до утра.
Мониторинг решает две разные задачи, и путать их не стоит:
- доступность — работает ли сайт прямо сейчас, и если нет, кто об этом узнает
- нагрузка — сколько ресурсов тратится и когда кончится запас
Первое настраивается за десять минут и нужно всем. Второе — инструмент для диагностики и планирования.
Часть 1. Быстрая проверка руками
Когда нужно посмотреть состояние сервера прямо сейчас, хватает пяти команд.
Общая нагрузка:
uptime
14:32:05 up 23 days, 4:11, 1 user, load average: 0.42, 0.51, 0.48
Три числа в конце — средняя нагрузка за 1, 5 и 15 минут. Сравнивать их нужно с количеством ядер: на одноядерном сервере 1.0 означает полную загрузку, на четырёхъядерном — четверть. Узнать число ядер:
nproc
Тревожно, когда пятнадцатиминутное значение стабильно выше числа ядер: нагрузка не пиковая, а постоянная.
Память:
free -h
Смотрите на строку Mem в колонке available — это реально доступная память с учётом кэша. Колонка free почти всегда маленькая, и пугаться её не нужно: Linux намеренно занимает свободную память под кэш.
А вот ненулевой used в строке Swap — сигнал. Значит, память кончилась и система вытесняет данные на диск, отчего всё замедляется в разы.
Диск:
df -h
Заполнение выше 90% — повод разбираться сегодня. При 100% сервер перестаёт работать: базы не пишут, логи не пишутся, сайт отдаёт ошибки.
Найти, что занимает место:
du -sh /var/* | sort -h | tail -10
Чаще всего виноваты логи в /var/log, старые бэкапы или образы Docker.
Что грузит процессор прямо сейчас:
apt install htop -y
htop
Интерактивная таблица процессов: сортировка по CPU и памяти, видно, кто именно нагружает сервер. Выход — q.
Кто занимает порты:
ss -tulpn
Полезно, чтобы найти забытую службу, которая висит и ест ресурсы.
Часть 2. Уведомления о падении
Это тот самый минимум, который стоит настроить всем и сразу. Даже если графиков нет — вы должны узнавать о падении раньше клиента.
Uptime Kuma
Самый простой вариант: ставится контейнером, интерфейс понятен без чтения документации, умеет слать уведомления в Telegram, почту и десяток других каналов.
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma
nano docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: unless-stopped
volumes:
- kuma_data:/app/data
networks:
- web
volumes:
kuma_data:
networks:
web:
external: true
docker compose up -d
Установка Docker и общего reverse proxy с автоматическим SSL описана здесь: Docker на VPS. Добавьте домен в Caddyfile:
status.example.com {
reverse_proxy uptime-kuma:3001
}
В интерфейсе создаёте проверку: тип HTTP(s), адрес сайта, интервал 60 секунд. Дальше подключаете уведомления — для Telegram нужен токен бота от @BotFather и ваш chat id.
Что стоит проверять помимо главной страницы:
- страницу, которая обращается к базе — тогда проверка поймает и «сайт открывается, но база лежит»
- срок действия SSL-сертификата — Kuma предупредит заранее
- отдельные API-эндпоинты, если они есть
Важно: мониторинг должен стоять не на том сервере, который он проверяет. Иначе при падении сервера упадёт и мониторинг, и уведомления не придут. Поставьте Kuma на отдельный VPS за 5 € или используйте внешний сервис — этого достаточно.
Вариант без своего сервера
Если не хочется поднимать ещё одну машину, берите внешний сервис проверки доступности — у большинства есть бесплатный тариф на несколько адресов. Работает это по тому же принципу и требует только адреса сайта.
Часть 3. Графики нагрузки
Графики отвечают на вопросы, которые не видны в моменте: когда начались проблемы, растёт ли потребление памяти день ото дня, справится ли сервер в следующем сезоне.
Netdata
Ставится одной командой и сразу показывает сотни метрик в реальном времени с секундной детализацией.
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sh /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry
Интерфейс поднимается на порту 19999.
Не открывайте этот порт в firewall. Netdata по умолчанию не требует авторизации, и открытая наружу панель раскрывает всё о вашем сервере. Правильный способ — SSH-туннель:
ssh -L 19999:localhost:19999 deploy@ВАШ_IPПосле этого панель доступна наhttp://localhost:19999только у вас.
Netdata заметно экономнее, чем кажется, но на тарифе «Старт» с 2 ГБ памяти имеет смысл уменьшить срок хранения истории — по умолчанию он держит данные в памяти.
Что смотреть на графиках
Память, растущая монотонно — утечка в приложении. Ищите процесс, который увеличивается день ото дня и сбрасывается только при перезапуске.
Пики нагрузки в одно и то же время — почти всегда cron: бэкап, выгрузка, индексация. Если пик совпадает с рабочим временем, задачу стоит перенести на ночь.
Рост iowait — сервер ждёт диск. Частая причина на нагруженных базах.
Ровный высокий CPU круглосуточно — либо пора оптимизировать, либо пора расти: Выделенный сервер или VPS.
Часть 4. Мониторинг без установки
Иногда не нужны ни графики, ни панели — достаточно скрипта, который напишет в Telegram при проблеме.
nano /opt/check.sh
#!/bin/bash
BOT_TOKEN="$TG_TOKEN"
CHAT_ID="$TG_CHAT"
alert() {
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" -d text="$1" > /dev/null
}
DISK=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
[ "$DISK" -gt 90 ] && alert "⚠️ Диск заполнен на ${DISK}%"
MEM=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
[ "$MEM" -gt 90 ] && alert "⚠️ Память занята на ${MEM}%"
systemctl is-active --quiet nginx || alert "🔴 nginx не работает"
systemctl is-active --quiet mysql || alert "🔴 mysql не работает"
chmod +x /opt/check.sh
crontab -e
*/10 * * * * . /opt/tg.env && /opt/check.sh
Токен бота держите в отдельном файле /opt/tg.env с правами 600, а не в скрипте. Как получить токен и поднять бота: Telegram-бот 24/7 на сервере.
Такой скрипт закрывает три самые частые причины ночных падений: кончился диск, кончилась память, упала служба.
Что мониторить в первую очередь
| Метрика | Порог тревоги | Чем грозит |
|---|---|---|
| Свободное место на диске | меньше 10% | сервер перестаёт работать целиком |
| Память / своп | своп растёт | всё замедляется в разы |
| Load average (15 мин) | выше числа ядер | запросы встают в очередь |
| Доступность сайта | нет ответа 2 раза подряд | потеря клиентов |
| Срок SSL-сертификата | меньше 14 дней | браузер пугает посетителей |
| Бэкап не выполнился | пропуск одного дня | нечем восстанавливаться |
Последняя строка — та, про которую забывают. Мониторить нужно не только сервер, но и то, что копии действительно создаются: Бэкапы VPS.
Частые вопросы
Сколько ресурсов ест мониторинг? Uptime Kuma — около 150 МБ памяти. Netdata — от 100 МБ при уменьшенной истории. Скрипт на bash — ничего заметного.
Можно ли поставить мониторинг на тот же сервер? Графики — да. Проверку доступности — нет: она должна работать снаружи, иначе не сработает именно тогда, когда нужна.
Что такое load average и какое значение нормально? Это среднее число процессов, ожидающих выполнения. Норма — ниже количества ядер. Значение 4.0 на четырёх ядрах — полная загрузка без очереди, 8.0 — очередь вдвое длиннее, чем сервер успевает обрабатывать.
Почему память почти вся занята, хотя сайт не нагружен?
Linux использует свободную память под кэш файлов и отдаёт её приложениям по требованию. Смотреть нужно на available, а не на free.
Нужен ли отдельный сервер под мониторинг? Для проверки доступности — да, и хватит самого дешёвого тарифа. Одной машины за 5 € достаточно, чтобы следить за десятком сайтов.
Как понять, что пора расширять тариф? Три признака: память регулярно уходит в своп, load average стабильно выше числа ядер, диск заполнен больше чем на 80%. Один признак — оптимизация, два и больше — расширение.
Итог
Минимальная схема, которую стоит собрать в первый же день: внешняя проверка доступности с уведомлением в Telegram и скрипт, следящий за диском, памятью и ключевыми службами. Это десять минут работы.
Графики добавляются позже — когда появляется вопрос «почему вчера вечером тормозило». Без истории на него не ответить, а с ней причина обычно находится за пару минут.
Взять сервер под мониторинг за 5 € →

