Всем привет! Сегодня я хочу поделиться полным руководством по развертыванию на своем сервере замечательного open-source инструмента для мониторинга — Uptime Kuma.

Пример итогового результата.
Пример итогового результата.

Если вы устали от ограничений и ценников облачных сервисов вроде UptimeRobot и хотите полный контроль над своими данными, а также красивые дашборды и уведомления в Telegram — это решение для вас. Мы пройдем весь путь: от пустого сервера на Ubuntu до полностью рабочего, защищенного и автоматически запускаемого сервиса мониторинга.

Наш план:

  1. Подготовим сервер и установим Docker.

  2. Запустим Uptime Kuma в Docker-контейнере.

  3. Настроим Nginx как обратный прокси, чтобы получить доступ по доменному имени.

  4. Получим и настроим бесплатный SSL-сертификат от Let's Encrypt для безопасного HTTPS-соединения.

Что нам понадобится:

  • Сервер с Ubuntu (подойдет любая свежая LTS-версия).

  • Доменное имя, которое уже указывает на IP-адрес вашего сервера. В нашем примере мы будем использовать status.your-domain.com.

Поехали!

Шаг 1: Подготовка сервера и установка Docker

Начнем с основ. Если у вас уже есть Docker и Docker Compose, этот шаг можно пропустить.

Сначала обновим списки пакетов и установим все необходимое для работы Docker.

# Обновляем пакеты
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# Добавляем GPG-ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Добавляем репозиторий Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Устанавливаем Docker Engine и Docker Compose
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    

Чтобы не вводить sudo каждый раз при работе с Docker, добавим нашего пользователя в группу docker.

sudo usermod -aG docker ${USER}

Важно: После выполнения этой команды нужно выйти из системы и зайти снова, чтобы изменения вступили в силу.

Шаг 2: Запускаем Uptime Kuma в Docker

Использовать docker-compose — это хорошая практика. Вся конфигурация хранится в одном файле, ее легко читать и изменять.

  1. Создадим отдельную папку для нашего проекта и перейдем в нее.

    mkdir uptime-kuma
    cd uptime-kuma 
  2. Создадим конфигурационный файл docker-compose.yml.

    nano docker-compose.yml  
  3. Вставим в него следующее содержимое:

          version: '3.3'
    
    services:
      uptime-kuma:
        image: louislam/uptime-kuma:1
        container_name: uptime-kuma
        volumes:
          - ./uptime-kuma-data:/app/data
        ports:
          - "3001:3001"
        restart: always
        
    • volumes: Самая важная часть. Мы "пробрасываем" папку uptime-kuma-data с нашего сервера внутрь контейнера. В ней будут храниться все настройки и история мониторинга. Данные не потеряются даже при удалении контейнера.

    • restart: always: Эта директива заставит Docker автоматически запускать контейнер после перезагрузки сервера или в случае сбоя. То, что нам нужно!

  4. Сохраняем файл (Ctrl+X, Y, Enter) и запускаем наш сервис в фоновом режиме:

    docker-compose up -d

Вуаля! Uptime Kuma уже работает. Вы можете проверить это, перейдя в браузере по адресу http://<IP-вашего-сервера>:3001. Вы должны увидеть экран первоначальной настройки.

Шаг 3: Настраиваем Nginx как обратный прокси

Доступ по IP и порту — это некрасиво и неудобно. Давайте сделаем так, чтобы наш сервис был доступен по домену status.your-domain.com. Для этого нам понадобится Nginx.

  1. Установим Nginx.

    sudo apt install nginx -y
  2. Разрешим трафик в брандмауэре.

    sudo ufw allow 'Nginx Full'  
  3. Теперь создадим конфигурационный файл Nginx для нашего сайта.

    sudo nano /etc/nginx/sites-available/status.your-domain.com
  4. Добавим в него конфигурацию для перенаправления запросов на наш контейнер.

          server {
        listen 80;
        server_name status.your-domain.com;
    
        location / {
            proxy_pass http://localhost: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;
            
            # Эти строки нужны для корректной работы WebSocket
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
        
  5. Активируем наш сайт, создав символическую ссылку.

    sudo ln -s /etc/nginx/sites-available/status.your-domain.com /etc/nginx/sites-enabled/ 
  6. (Рекомендуется) Чтобы избежать конфликтов, отключим стандартный сайт Nginx.

    sudo rm /etc/nginx/sites-enabled/default
  7. Проверим конфигурацию и перезапустим Nginx.

    sudo nginx -t
    # Если видим "syntax is ok" и "test is successful", то всё отлично
    sudo systemctl reload nginx 

На этом этапе Uptime Kuma уже должен быть доступен по адресу http://status.your-domain.com (к примеру у меня дашборд доступен по Peak Line Service Health ). Остался последний штрих — безопасность.

Шаг 4: Добавляем HTTPS с помощью Let's Encrypt

Никто не любит сайты без замочка в адресной строке. Исправим это с помощью бесплатного сертификата от Let's Encrypt и утилиты Certbot.

  1. Установим Certbot и его плагин для Nginx.

    sudo apt install certbot python3-certbot-nginx -y
  2. Запустим Certbot. Он все сделает сам: получит сертификат, автоматически изменит конфигурацию Nginx и настроит автообновление.

    sudo certbot --nginx -d status.your-domain.com

    Certbot задаст пару вопросов: попросит ввести email и согласиться с условиями. В конце он спросит, нужно ли перенаправлять все HTTP-запросы на HTTPS. Смело выбирайте вариант 2 (Redirect) — это наиболее безопасный вариант.

А что, если что-то пошло не так? Гайд по решению проблем

Идеальный мир существует только в туториалах. В реальности всегда что-то может пойти не по плану. Если вы столкнулись с ошибкой, не паникуйте. Вот чек-лист для поиска и устранения самых частых проблем.

Проблема №1: Сайт не открывается вообще (Connection Timed Out)

Это значит, что ваш запрос просто не доходит до сервера.

  1. Проверьте DNS: Убедитесь, что ваш домен status.your-domain.com действительно указывает на IP-адрес вашего сервера. Самый простой способ — команда ping:

    ping status.your-domain.com

    IP-адрес в ответе должен совпадать с IP вашего сервера. Если нет — идите в панель управления вашего домена и исправляйте A-запись.

  2. Проверьте брандмауэр (Firewall): Nginx для работы требует открытые порты 80 (HTTP) и 443 (HTTPS). Проверим, открыты ли они:

    sudo ufw status

    Если в списке нет 80/tcp (ALLOW), 443/tcp (ALLOW) или Nginx Full (ALLOW), добавьте правило:

    sudo ufw allow 'Nginx Full'

Проблема №2: Ошибка 502 Bad Gateway

Эта ошибка — классика жанра при настройке обратного прокси. Она означает, что Nginx работает, но не может связаться с приложением, которое находится "за ним" (в нашем случае — с контейнером Uptime Kuma).

  1. Проверьте, запущен ли контейнер:

    docker ps
  2. Вы должны увидеть в списке контейнер с именем uptime-kuma и статусом Up. Если его нет, или он постоянно перезапускается (restarting), нужно смотреть его логи.

  3. Посмотрите логи контейнера: Логи — это глаза и уши Docker. Они расскажут, почему контейнер не может запуститься.

    # Если вы в папке с docker-compose.yml
    docker-compose logs -f
    
    # Или по имени контейнера
    docker logs -f uptime-kuma
        

    Ищите в выводе слова Error, failed или permission denied. Часто проблема бывает связана с правами на папку с данными.

  4. Проверьте связь внутри сервера: Убедимся, что с самого сервера Uptime Kuma доступен по внутреннему порту 3001.

    curl -I http://localhost:3001 

    Вы должны получить ответ HTTP/1.1 200 OK или HTTP/1.1 302 Found. Если видите Connection refused, значит, проблема точно в контейнере. Возвращайтесь к пункту 2.

Проблема №3: Ошибка 400 Bad Request при переходе по HTTPS

Эта ошибка обычно возникает после попытки настроить SSL. Она означает, что Nginx получил HTTPS-запрос, но не был готов его обработать как положено (например, не нашел сертификаты).

  1. Проверьте конфигурацию Nginx: Самое главное — убедиться, что Certbot правильно изменил ваш файл конфигурации. Откройте /etc/nginx/sites-available/status.your-domain.com и сравните его с эталонным конфигом. Особое внимание уделите строкам listen 443 ssl; и путям к файлам сертификатов (ssl_certificate и ssl_certificate_key).

  2. Посмотрите логи ошибок Nginx: Nginx очень подробно пишет о своих проблемах.

          tail -f /var/log/nginx/error.log
        

    Запустите эту команду и попробуйте обновить страницу в браузере. В логе, скорее всего, появится ошибка, указывающая на конкретную проблему.

    • "cannot load certificate": Проверьте, что файлы сертификатов действительно существуют по путям, указанным в конфиге (/etc/letsencrypt/live/status.your-domain.com/...).

    • "bind() to 0.0.0.0:443 failed (98: Address already in use)": Это значит, что какой-то другой процесс уже занял порт 443. Используйте команду sudo ss -tlnp | grep ':443' чтобы найти "захватчика" и остановить его.

После внесения любых исправлений в конфигурацию Nginx не забывайте проверять синтаксис и перезагружать его:

sudo nginx -t
sudo systemctl reload nginx 

Надеюсь, этот небольшой гайд по выживанию поможет вам справиться с любыми трудностями.

Заключение

Вот и все! Откройте в браузере https://status.your-domain.com. Вы увидите работающий, защищенный и красивый сервис мониторинга, который принадлежит только вам.

Что мы получили в итоге:

  • Uptime Kuma, работающий в изолированном Docker-контейнере.

  • Сервис доступен по вашему домену через защищенное HTTPS-соединение.

  • Контейнер автоматически запускается после перезагрузки сервера.

  • SSL-сертификат будет обновляться автоматически.

Теперь можно заходить в панель, создавать свой первый монитор и настраивать уведомления в любимый мессенджер. Надеюсь, это руководство было полезным! Успешных вам деплоев

Комментарии (12)


  1. NZaur
    05.07.2025 20:25

    Тоже недавно ставил это чудо. Алерты в Слак летят. Только Nginx тоже запихнул в композ.

    Хороший гайд!


    1. cyberscoper Автор
      05.07.2025 20:25

      Спасибо. Рад стараться :)
      Будут еще статьи.


  1. m1skam
    05.07.2025 20:25

    /саркамз-on

    # Обновляем пакеты
    sudo apt update

    Видимо не судьба :( в терминале на macos - выдало ошибку.

          version: '3.3'
    
    services:
      uptime-kuma:

    Так и запишем, docker-compose начинать с 6 пробелов.

    /сарказм-off

    Если серьезно, то чем это лучше prometheus + blackbox-exporter + grafana? Ну кроме того, что понятно, что меньше настраивать, хотя я думаю, что допустим в VSCode даже на бесплатном copilot, как только вы начнете вводить конфигурацию с prometheus в docker compose файле, он половину всего сам напишет и еще и кофе предложит сделать, хотя про кофе это может только в платной версии, не уверен.


    1. aik
      05.07.2025 20:25

      Видимо не судьба :( в терминале на macos - выдало ошибку.

      А причём тут макос если речь про убунту?

      чем это лучше prometheus + blackbox-exporter + grafana?

      Проще ставится, проще настраивается. Заметно проще. Не надо пытаться всё копать экскаватором, когда вполне достаточно лопаты.


      1. Frankenstine
        05.07.2025 20:25

        А может лучше сразу zabbix?


        1. aik
          05.07.2025 20:25

          Я же сказал - зачем экскаватор, если можно лопатой? Кума - простенькая и красивая "пинговалка". А заббикс - это система мониторинга не для средних умов. Перестанет хватать кумы - тогда можно уже и на заббиксы смотреть, и на графаны, и на что там ещё выше порекомендовали.

          Но для дома для семьи кумы за глаза и за уши. Хотя вот инструкция как раз на самом интересном месте обрывается, имело бы смысл несколько примеров мониторов привести, рассказать про то, как оповещения настраивать... Тогда бы может и минусов меньше ставили.


          1. Frankenstine
            05.07.2025 20:25

            Я же сказал - зачем экскаватор, если можно лопатой?

            Сначала вы копаете лопатой, а потом понимаете что надо было смотреть в будущее и сразу пригонять экскаватор.


            1. aik
              05.07.2025 20:25

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

              Энтерпрайз-решения дома хороши только тогда, когда ты ими пользуешься на работе и тебе они привычны. Либо у тебя домашний энтерпрайз.


            1. Alexufo
              05.07.2025 20:25

              Прематуре оптимизейшн из ве рут оф олл ивил)


  1. Alexufo
    05.07.2025 20:25

    Если у вас докер коспоуз уже, ну так контейнеризируйте там же и nginx и certbot


  1. mltk
    05.07.2025 20:25

    1. Ставим докер и докер композ

    2. Через докер композ поднимаем 2 контейнера: uptime kuma и Caddy (Caddy -- простецкий enterprise ready веб-сервер с автоматическим подкапотным выпуском и обновлением letsencrypt сертификатов)

      Всё!

    О чём ещё можно мечтать для ~хоумлаббинга?..


    1. Alexufo
      05.07.2025 20:25

      Не люблю caddy поскольку все равно если нужна тонкая настройка..а ты работаешь с вебом, у тебя задача изучать второй конфиг caddy дополнительно к nginx.. А у caddy справка тоже не мизер.

      Да, он морально устарел, но увеличивать стек когда ты все равно работаешь с nginx на проде..