Uptime Kuma: Мониторинг сайта и сервера в реальном времени

Вы настроили Nginx, оптимизировали PHP-FPM, защитили сайт и настроили автоматические бэкапы. Но как вы узнаете, что сайт упал, если это произойдет в 3 часа ночи? Сервисы вроде UptimeRobot решают эту задачу, но их бесплатные тарифы сильно урезаны, а данные хранятся на чужих серверах.

В этом руководстве мы развернем Uptime Kuma — красивую, мощную и полностью бесплатную систему мониторинга с открытым исходным кодом. Мы установим её через Docker, подключим к домену через Nginx, настроим уведомления в Telegram и создадим публичную статус-страницу.

Почему Uptime Kuma, а не сторонние сервисы?

  • Без лимитов: мониторьте хоть 100 сайтов и сервисов с интервалом проверки в 20 секунд
  • Приватность: данные о доступности вашего сайта хранятся только у вас
  • Множество протоколов: HTTP(s), TCP Port, Ping, DNS Record, Docker Containers, Push-мониторинг
  • Красивый UI: интерфейс в стиле современных SaaS-платформ, есть темная тема
  • Статус-страницы: можно сделать публичную страницу типа status.custom-code.ru для пользователей

Шаг 1: Установка Uptime Kuma через Docker Compose

Поскольку мы уже используем Docker, установка займет 2 минуты. Создадим отдельную папку для сервиса:

mkdir -p /opt/uptime-kuma
cd /opt/uptime-kuma
nano docker-compose.yml

Вставьте следующую конфигурацию:

version: '3.8'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    volumes:
      - ./data:/app/data
    ports:
      - "3001:3001"

Запустите контейнер:

docker compose up -d

Проверьте, что контейнер работает: docker ps. Если вы видите статус Up, Uptime Kuma слушает порт 3001. Если контейнер падает с кодом 137, читайте наше руководство по устранению OOMKilled — скорее всего, не хватает RAM.

Шаг 2: Настройка Nginx Reverse Proxy для Uptime Kuma

Открывать панель мониторинга по IP и порту :3001 небезопасно. Настроим доступ по домену (например, status.custom-code.ru) с HTTPS.

Создайте конфиг Nginx:

sudo nano /etc/nginx/sites-available/uptime-kuma

Добавьте блок сервера:

server {
    listen 80;
    server_name status.custom-code.ru;

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Поддержка WebSocket (нужно для实时 обновлений в Kuma)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Активируйте сайт и получите SSL-сертификат через Certbot (подробно этот процесс описан в статье про Nginx reverse proxy):

sudo ln -s /etc/nginx/sites-available/uptime-kuma /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

sudo certbot --nginx -d status.custom-code.ru

Теперь панель Uptime Kuma доступна по адресу https://status.custom-code.ru. При первом заходе создайте аккаунт администратора.

Шаг 3: Добавление мониторов

Перейдите в Dashboard и нажмите Add New Monitor. Разберем три самых полезных типа проверок для вашего стека.

1. Мониторинг WordPress-сайта (HTTP(s))

  • Friendly Name: Custom Code Main Site
  • URL: https://custom-code.ru
  • Interval: 60 seconds
  • Expected Status Code: 200
  • Advanced: Включите «Ignore TLS/SSL error» только если у вас самоподписанный сертификат. Включите «Max. Redirects», если сайт делает редиректы.

2. Мониторинг базы данных (TCP Port)

Чтобы знать, если MySQL «упал» или перегружен:

  • Type: TCP Port
  • Hostname: 127.0.0.1
  • Port: 3306
  • Interval: 30 seconds

3. Мониторинг самого сервера (Ping)

  • Type: Ping
  • Hostname: IP-адрес вашего VPS
  • Interval: 60 seconds

Шаг 4: Настройка уведомлений в Telegram

Мониторинг бесполезен, если вы не узнаете о проблемах. Настроим уведомления в Telegram.

1. Создайте бота:

  • Напишите @BotFather в Telegram, отправьте /newbot
  • Получите HTTP API Token
  • Найдите своего бота в поиске Telegram и нажмите Start
  • Узнайте свой Chat ID через бота @userinfobot

2. Подключите в Uptime Kuma:

  • Settings → Notifications → Add Notification → Telegram
  • Вставьте Bot Token и Chat ID
  • Нажмите Test — вы должны получить тестовое сообщение
  • Сохраните и назначьте уведомление на нужные мониторы (вкладка Edit у каждого монитора → Notification)

Шаг 5: Публичная статус-страница

Uptime Kuma позволяет создать красивую страницу со статусом всех сервисов, которую можно показать клиентам или пользователям.

  • Перейдите в Status PagesAdd New Status Page
  • Укажите Title (например, «Custom Code Status») и slug (status)
  • Добавьте мониторы на страницу
  • Включите опцию Published

Теперь ваша статус-страница доступна по адресу https://status.custom-code.ru/status. Вы можете добавить её в футер сайта или в раздел «О нас».

Шаг 6: Push-мониторинг (для сложных скриптов)

Иногда нужно проверить не доступность сайта, а факт выполнения задачи. Например, вы настроили скрипт бэкапов и хотите знать, если он не отработал.

  • Создайте монитор типа Push в Uptime Kuma
  • Скопируйте сгенерированный URL (например, https://status.custom-code.ru/api/push/xxxxx)
  • Добавьте в конец вашего bash-скрипта бэкапа одну строку:
# В конце wp-backup.sh
curl -s https://status.custom-code.ru/api/push/xxxxx?status=up\&msg=OK\&ping=

Если скрипт не выполнится (упадет по ошибке), Uptime Kuma не получит сигнал и отправит вам уведомление в Telegram.

Чек-лист настройки мониторинга

  • ✅ Uptime Kuma развернут в Docker и доступен по домену
  • ✅ Настроен HTTPS через Let’s Encrypt
  • ✅ Добавлены мониторы: HTTP для сайта, TCP для БД, Ping для сервера
  • ✅ Подключены Telegram-уведомления
  • ✅ Создана и опубликована публичная статус-страница
  • ✅ Настроен Push-мониторинг для критичных cron-задач

Что делать, если проблемы не решаются?

Ложные срабатывания (False Positives)

Если Uptime Kuma шлет уведомления, что сайт упал, но на самом деле он работает, увеличьте Retries (количество попыток) в настройках монитора с 3 до 5. Также проверьте, не блокирует ли Fail2ban или Cloudflare IP-адрес вашего сервера, с которого Kuma отправляет запросы (если Kuma и сайт на одном VPS, используйте 127.0.0.1 вместо внешнего домена).

Ошибки SSL/TLS в мониторе

Если монитор HTTP(s) показывает ошибку сертификата, хотя в браузере всё работает, убедитесь, что в настройках монитора не стоит галочка «Ignore TLS/SSL error» (если сертификат валидный). Если вы используете самоподписанные сертификаты для внутренних сервисов — галочку нужно поставить.

Uptime Kuma не запускается после перезагрузки сервера

Убедитесь, что в docker-compose.yml указан параметр restart: always. Также проверьте, что Docker сам запускается при старте ОС: sudo systemctl enable docker.

База данных Uptime Kuma повреждена

Все данные Uptime Kuma хранятся в папке /opt/uptime-kuma/data в файле kuma.db (SQLite). Регулярно копируйте этот файл в ваши бэкапы. Если база повредилась, можно восстановить её из последней копии или использовать встроенный инструмент восстановления: docker exec -it uptime-kuma node extra/repair-database.js.

Итог

Uptime Kuma закрывает последнюю дыру в мониторинге вашего сервера. Вы больше не узнаете об падениях сайта от пользователей или хостера — Telegram-бот сообщит вам об этом через 30 секунд после инцидента. А публичная статус-страница повысит доверие к вашему проекту, показывая, что вы контролируете инфраструктуру.