Uptime Kuma: мониторинг и статус-страница за 30 минут

Что такое Uptime Kuma и почему стоит использовать

Uptime Kuma — open-source инструмент для мониторинга доступности сервисов с приятным веб-интерфейсом. Если честно, это одна из лучших self-hosted замен платным UptimeRobot, Pingdom и StatusPage.io — при этом абсолютно бесплатная.

Возможности:

  • Мониторинг HTTP(S), TCP, DNS, PING, Docker, SQL, MQTT, gRPC
  • Уведомления в Telegram, Slack, Discord, Email, Webhook — более 90 интеграций из коробки
  • Публичная статус-страница для клиентов — больше никаких звонков «а у вас сайт работает?»
  • Мониторинг SSL-сертификатов с заблаговременным уведомлением об истечении
  • Поддержка нескольких пользователей и 2FA
  • Встроенные графики времени отклика и аптайма — сразу видно, где просадки
  • Минимальные требования смешные: 256 МБ RAM и 1 vCPU

Uptime Kuma написан на Node.js и хранит данные в SQLite — никаких внешних зависимостей, никакой отдельной БД. Один контейнер Docker, пять минут — и система уже работает.

Установка через Docker Compose

Мы всегда ставим через Docker Compose с монтированием тома — так данные переживут пересоздание контейнера:

# Создание директории
mkdir -p /opt/uptime-kuma && cd /opt/uptime-kuma

# docker-compose.yml
version: '3.8'
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: always
    ports:
      - "3001:3001"
    volumes:
      - ./data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock:ro  # для Docker мониторинга
    environment:
      - TZ=Europe/Moscow

# Запуск
docker compose up -d

# Проверка
docker logs uptime-kuma

Откройте http://your-server:3001 в браузере. При первом входе система попросит создать учётную запись администратора. Сразу же включите 2FA в настройках безопасности — не откладывайте на потом.

Настройка Nginx reverse proxy с SSL

Для боевого использования Uptime Kuma нужно спрятать за Nginx с Let's Encrypt — вот конфиг, который мы применяем:

# /etc/nginx/sites-available/status.example.com
server {
    listen 443 ssl http2;
    server_name status.example.com;

    ssl_certificate /etc/letsencrypt/live/status.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/status.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        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;
    }
}

server {
    listen 80;
    server_name status.example.com;
    return 301 https://$server_name$request_uri;
}

WebSocket-подключение (Upgrade и Connection headers) — обязательно. Без него дашборд просто не будет обновляться в реальном времени, и вы это сразу почувствуете.

Настройка мониторов

После установки добавьте мониторы для своих сервисов. Вот основные типы, которые мы используем чаще всего:

HTTP(S) монитор — проверка веб-сайта:

  • URL: https://example.com
  • Метод: GET
  • Ожидаемый код ответа: 200
  • Интервал: 60 секунд
  • Количество попыток: 3 — уведомление придёт только после трёх неудачных проверок подряд, случайные сбои не беспокоят
  • Ключевое слово: «Добро пожаловать» — проверяет не только доступность, но и содержимое страницы

TCP монитор — проверка порта:

  • Хост: 10.0.1.10
  • Порт: 1433 (SQL Server)
  • Интервал: 30 секунд

DNS монитор — проверка DNS-записей:

  • Хост: example.com
  • Тип записи: A
  • DNS-сервер: 8.8.8.8
  • Ожидаемый ответ: 1.2.3.4 — если IP вдруг изменится, сразу получите уведомление

Docker монитор — проверка контейнера:

  • Контейнер: postgres-db
  • Проверяет статус контейнера напрямую через Docker socket

Каждому монитору назначайте теги для группировки на статус-странице: «Веб-сайты», «Базы данных», «Инфраструктура». Потом скажете себе спасибо, когда мониторов станет за 30.

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

Telegram — самый быстрый канал уведомлений для российских IT-команд, на практике проверено. Настраивается за 10 минут:

Шаг 1: Создайте бота через @BotFather в Telegram, получите токен.

Шаг 2: Получите Chat ID. Отправьте любое сообщение боту, затем откройте: https://api.telegram.org/bot<TOKEN>/getUpdates — найдите chat.id в ответе JSON.

Шаг 3: В Uptime Kuma идём в Settings → Notifications → Setup Notification:

  • Тип: Telegram
  • Bot Token: ваш токен
  • Chat ID: ID чата или группы — для группы это отрицательное число, не перепутайте
  • Включите «Apply on all existing monitors» — иначе придётся назначать уведомление каждому монитору вручную
# Проверка бота через curl
curl -s "https://api.telegram.org/bot123456:ABC-DEF/sendMessage" \
  -d "chat_id=-1001234567890" \
  -d "text=Тест уведомления Uptime Kuma" \
  -d "parse_mode=HTML"

Uptime Kuma шлёт уведомления при каждой смене статуса: DOWN — сервис упал, UP — поднялся. В сообщении есть имя монитора, время отклика и длительность простоя. Всё что нужно дежурному в три ночи.

Уведомления в корпоративный чат

Для командной работы создайте группу в Telegram, добавьте бота и используйте Chat ID группы — это отрицательное число. У нас обычно настроены три канала уведомлений:

  • Telegram-группа «Мониторинг» — все уведомления, видят дежурные
  • Личный Telegram руководителя — только критичные сервисы, выбираются галочкой на конкретных мониторах
  • Email — резервный канал на случай, если с Telegram что-то пойдёт не так

Создание публичной статус-страницы

Статус-страница — это публичная витрина состояния ваших сервисов для клиентов. Вместо того чтобы отвечать на звонки «а у вас сайт работает?», просто даёте ссылку. Работает 24/7, без вашего участия.

Создание: Settings → Status Pages → New Status Page.

Настройки:

  • Title: Статус сервисов ITfresh
  • Slug: /status (страница будет доступна по адресу https://status.example.com/status)
  • Theme: Auto — подстраивается под тему браузера или системы пользователя
  • Show powered by: Off — убираем ссылку на Uptime Kuma, клиентам это незачем знать
  • Custom CSS: для брендирования под корпоративный стиль — логотип, цвета, шрифты

Добавьте группы мониторов на страницу — клиент сразу видит структуру:

  • Группа «Веб-сервисы»: корпоративный сайт, клиентский портал, API
  • Группа «Почта»: SMTP, IMAP, Webmail
  • Группа «Инфраструктура»: VPN, DNS — но не выносите внутренние сервисы на публичную страницу, клиентам это не нужно

Статус-страница открывается без логина и пароля. Посетитель видит аптайм за последние 90 дней, текущий статус каждого сервиса и историю инцидентов. Плюс можно заранее публиковать объявления о плановых работах (Maintenance) с точным временем начала и окончания — клиенты будут знать, что происходит, и не будут звонить в панике.

Мониторинг SSL-сертификатов

Просроченный SSL — это, пожалуй, самая обидная причина простоя. Всё работает, сертификат просто забыли продлить. Uptime Kuma сама проверяет срок действия для каждого HTTPS-монитора, и мы в своей практике давно перестали следить за этим вручную.

Настройка: в параметрах HTTPS-монитора раздел «Certificate Expiry Notification»:

  • Уведомить за 30 дней — есть время спокойно всё продлить
  • Уведомить за 14 дней — второй звонок, если первый проигнорировали
  • Уведомить за 7 дней — уже серьёзно, откладывать некуда

А вот с самоподписанными сертификатами на внутренних сервисах, до которых снаружи не достучаться по HTTP, придётся чуть повозиться отдельно:

# Добавьте TCP-монитор с проверкой сертификата
# Или используйте скрипт для отправки в Uptime Kuma через Push Monitor

#!/bin/bash
# check_cert.sh — проверка сертификата и Push в Uptime Kuma
HOST="internal-service.local"
PORT=443
PUSH_URL="https://status.example.com/api/push/abc123"

EXPIRY=$(echo | openssl s_client -servername $HOST -connect $HOST:$PORT 2>/dev/null | \
  openssl x509 -noout -enddate | cut -d= -f2)

EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))

if [ $DAYS_LEFT -gt 7 ]; then
  curl -s "${PUSH_URL}?status=up&msg=SSL+OK:+${DAYS_LEFT}+days+left"
else
  curl -s "${PUSH_URL}?status=down&msg=SSL+EXPIRING:+${DAYS_LEFT}+days+left"
fi

Скрипт запускайте через cron каждые 6 часов — этого вполне достаточно.

Бэкап и обновление

Все данные Uptime Kuma живут в одном SQLite-файле. Бэкап элементарный:

# Бэкап данных
tar czf /backup/uptime-kuma-$(date +%Y%m%d).tar.gz /opt/uptime-kuma/data/

# Автоматический бэкап через cron
0 3 * * * tar czf /backup/uptime-kuma-$(date +\%Y\%m\%d).tar.gz /opt/uptime-kuma/data/ && find /backup/ -name 'uptime-kuma-*' -mtime +30 -delete

# Обновление до последней версии
cd /opt/uptime-kuma
docker compose pull
docker compose up -d

# Проверка версии
docker logs uptime-kuma 2>&1 | head -5

Ещё есть встроенный экспорт прямо из веб-интерфейса: Settings → Backup → Export. Получаете JSON со всеми мониторами, уведомлениями и статус-страницами. Мы пользуемся этим каждый раз, когда переезжаем на другой сервер — занимает минуты.

Мониторинг самого Uptime Kuma

Классический вопрос: кто следит за самим монитором? Если Uptime Kuma упадёт, вы узнаете об этом последним. Поэтому нужен внешний надсмотрщик. Бесплатных вариантов хватает:

  • UptimeRobot Free — 50 мониторов бесплатно, проверка каждые 5 минут, для подстраховки более чем достаточно
  • Второй экземпляр Uptime Kuma на другом VPS или сервере, который мониторит первый — надёжно и привычно
  • Простой скрипт на cron внешнего сервера: проверяет доступность через curl и кидает алерт в Telegram, если что-то пошло не так

Часто задаваемые вопросы

Жёсткого лимита нет. На практике один экземпляр с 1 ГБ RAM без проблем тянет 500+ мониторов с интервалом 60 секунд. Если мониторов больше тысячи и интервал 30 секунд — поднимайте RAM до 2 ГБ и убедитесь, что SQLite лежит на SSD, иначе начнутся тормоза на дисковых операциях.

Да, без проблем. Ставите Uptime Kuma внутри корпоративной сети. Для публичной статус-страницы либо пробрасываете порт 3001 через Nginx на внешний IP, либо поднимаете Cloudflare Tunnel — второй вариант проще, если с внешними IP всё сложно. Ещё один путь — Push Monitor: внутренний скрипт сам стучится в Uptime Kuma по HTTPS и отправляет статус, наружу ничего открывать не нужно.

Uptime Kuma — это не замена Zabbix, и путать их не стоит. Zabbix — серьёзная система мониторинга инфраструктуры: CPU, RAM, диски, сеть, метрики. Uptime Kuma заточена под одно — проверять доступность сервисов и показывать красивую статус-страницу клиентам. Мы используем оба инструмента вместе: Zabbix смотрит внутрь, Uptime Kuma — наружу.

Здесь выручает Push Monitor. Создаёте монитор типа «Push» — Uptime Kuma генерирует URL. Ваш скрипт по расписанию отправляет GET-запрос на этот URL с параметром ?status=up или ?status=down. Если запросы перестали приходить в течение заданного интервала — монитор сам уходит в DOWN. Удобно для задач, которые сложно проверить снаружи.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#Uptime Kuma#мониторинг#статус-страница#uptime monitoring#Telegram уведомления#проверка доступности#SSL мониторинг#бесплатный мониторинг
Комментарии 0

Оставить комментарий

загрузка...