MAATRIX / Блог / Как установить и настроить Gatus на VPS

Как установить и настроить Gatus на VPS

MAATRIX

Когда сайт или API падает ночью, вы обычно узнаёте об этом последним — от клиента в чате поддержки. Uptime Kuma и Zabbix решают эту проблему, но тянут за собой веб-интерфейс, базу данных и лишние настройки, если нужно просто следить за десятком эндпоинтов. Gatus — компактная альтернатива: весь мониторинг описывается одним YAML-файлом, а сам сервис отдаёт готовую статус-страницу и шлёт алерты без танцев с бубном. Разберём, как поставить его на VPS, настроить проверки и вывести статус-страницу наружу.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Gatus и когда он нужен

Gatus — это открытый инструмент мониторинга на Go (проект TwiN/gatus), который периодически стучится в ваши эндпоинты — по HTTP, TCP, DNS, ICMP или через выполнение shell-команды — и проверяет ответ по условиям вроде [STATUS] == 200 или [RESPONSE_TIME] < 300. Результат хранится в памяти или в SQLite/PostgreSQL, а сверху крутится веб-интерфейс со статус-страницей — той самой, где зелёные и красные квадратики показывают историю доступности за последние часы.

Он не заменяет полноценный APM или Prometheus с десятками экспортёров, зато отлично закрывает типовую задачу: «я хочу знать, что сайт лежит, раньше, чем это заметят пользователи». Плюсы для VPS-эксплуатации:

  • конфиг — один YAML-файл, который удобно хранить в git и раскатывать через CI;
  • бинарник весит около 20 МБ, Docker-образ — тоже компактный, отдельная база не обязательна;
  • встроенная генерация статус-страницы без сторонних плагинов;
  • алерты сразу «из коробки» — Telegram, Slack, Discord, PagerDuty, email, вебхуки, ntfy.

Если вам нужен агентский мониторинг ресурсов (CPU, RAM, диск) — это не к Gatus, для этого лучше подойдёт связка Grafana и Prometheus или отдельный агент на самом сервере. Gatus решает именно blackbox-задачу: «отвечает ли сервис снаружи так, как должен».

Установка на VPS: бинарник, systemd, Docker

Проще всего запускать Gatus в Docker — так вы избегаете ручного управления зависимостями и обновлениями. Docker на сервере должен быть установлен заранее — процесс стандартный для любого свежего дистрибутива.

Минимальный docker-compose.yml:

services:
  gatus:
    image: twinproduction/gatus:latest
    container_name: gatus
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
    volumes:
      - ./config:/config
      - gatus-data:/data
    environment:
      - GATUS_CONFIG_PATH=/config

volumes:
  gatus-data:

Порт намеренно проброшен только на 127.0.0.1 — наружу статус-страницу отдаём через reverse proxy с SSL, об этом ниже. Создайте каталог config, положите туда config.yaml (пример — в следующем разделе) и поднимите контейнер:

mkdir -p gatus/config
cd gatus
docker compose up -d
docker compose logs -f gatus

Если предпочитаете нативный бинарник без Docker — скачайте актуальный релиз со страницы проекта на GitHub под вашу архитектуру, распакуйте в /usr/local/bin/gatus и опишите systemd-юнит:

# /etc/systemd/system/gatus.service
[Unit]
Description=Gatus uptime monitoring
After=network.target

[Service]
Type=simple
User=gatus
WorkingDirectory=/etc/gatus
ExecStart=/usr/local/bin/gatus
Restart=on-failure
RestartSec=5
Environment=GATUS_CONFIG_PATH=/etc/gatus/config.yaml

[Install]
WantedBy=multi-user.target
useradd -r -s /usr/sbin/nologin gatus
mkdir -p /etc/gatus && chown gatus:gatus /etc/gatus
systemctl daemon-reload
systemctl enable --now gatus

Для продакшена Docker-вариант обычно удобнее — проще обновлять образ (docker compose pull && docker compose up -d) и не нужно вручную следить за релизами бинарника.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Базовый конфиг: первые проверки

Всё поведение Gatus описывается в config.yaml. Начните с самого простого — проверки доступности сайта:

endpoints:
  - name: main-site
    url: "https://example.com"
    interval: 60s
    conditions:
      - "[STATUS] == 200"
      - "[RESPONSE_TIME] < 800"

interval — как часто дёргать эндпоинт, conditions — список условий, которые обязаны выполниться все сразу, иначе проверка считается упавшей. Доступные плейсхолдеры: [STATUS], [RESPONSE_TIME] (в миллисекундах), [BODY], [IP], [CONNECTED], [CERTIFICATE_EXPIRATION] и другие — полный список удобнее смотреть в README проекта, он периодически пополняется.

Полезная деталь: [RESPONSE_TIME] < 800 — это ориентир, не жёсткое правило физики. Реальный приемлемый порог зависит от вашего сервиса и локации VPS относительно пользователей — для API внутри одного дата-центра 800 мс может быть уже тревожным сигналом, а для сайта с внешним CDN — нормой. Настройте пороги под свою реальность, а не копируйте чужие цифры вслепую.

Перезапуск контейнера (или systemd-сервиса) подхватывает изменения конфига; Gatus также умеет отслеживать файл и перечитывать его на лету при web.write-timeout и включённом hot-reload — но для стабильности на проде проще перезапускать явно после правки.

Виды проверок: HTTP, TCP, DNS, ICMP, TLS

Gatus проверяет не только «жив ли HTTP», но и низкоуровневые вещи. Несколько практических примеров.

TCP-проверка (например, что порт SSH или база данных отвечают):

endpoints:
  - name: postgres-tcp
    url: "tcp://10.0.0.5:5432"
    interval: 30s
    conditions:
      - "[CONNECTED] == true"

DNS-проверка (резолвится ли домен и отдаётся ли ожидаемая запись) — удобно после переезда на новый DNS или смены хостинга:

endpoints:
  - name: domain-a-record
    url: "https://example.com"
    dns:
      query-name: "example.com"
      query-type: "A"
    conditions:
      - "[BODY] == 203.0.113.10"

ICMP-пинг для проверки, что хост в сети вообще отвечает:

endpoints:
  - name: server-ping
    url: "icmp://203.0.113.10"
    interval: 30s
    conditions:
      - "[CONNECTED] == true"

Отдельно стоит включить проверку срока действия TLS-сертификата — это дешёвая страховка от «сайт упал, потому что забыли продлить Let's Encrypt»:

    conditions:
      - "[STATUS] == 200"
      - "[CERTIFICATE_EXPIRATION] > 240h"

Если у вас уже настроено автопродление через certbot или Caddy, такая проверка — просто дополнительный контроль, что автоматика реально сработала и сертификат не просрочен.

Для проверок, которые не сводятся к запросу (например, «воркер обработал очередь за последний час»), есть тип type: dns для DNS и произвольные HTTP-эндпоинты health-check внутри вашего приложения — Gatus просто дёргает URL, а логику «здоров ли сервис» вы описываете в самом приложении.

Публикация статус-страницы через reverse proxy

По умолчанию Gatus слушает 8080 и отдаёт статус-страницу на /. Наружу лучше не светить порт напрямую — заведите домен вида status.example.com и проксируйте через Nginx или Caddy с TLS.

Вариант с Nginx (подробный разбор reverse proxy — в статье Nginx как reverse proxy на VPS):

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:8080;
        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;
    }
}

Вариант с Caddy проще — TLS выпускается автоматически без ручной настройки certbot:

status.example.com {
    reverse_proxy 127.0.0.1:8080
}

Если статус-страница не должна быть публичной (внутренний дашборд для команды), включите базовую авторизацию прямо в Gatus, без правки конфига nginx:

security:
  basic:
    username: "ops"
    password-bcrypt-base64: "JDJhJDEwJC..."  # bcrypt-хеш пароля, base64

Bcrypt-хеш пароля можно сгенерировать одной командой:

htpasswd -nbBC 10 "" "ваш-пароль" | tr -d ':\n' | sed 's/^\$2y/\$2a/' | base64

Также в блоке ui: можно задать заголовок страницы, логотип и favicon:

ui:
  title: "Статус сервисов — Example"
  header: "Example Inc. — статус"
  logo: "https://example.com/logo.png"

Не забудьте открыть 443/80 в файрволе, если ещё не сделали — быстрый чек-лист есть в статье про UFW на VPS.

Алерты: Telegram, Slack, история и хранилище

Мониторинг без уведомлений — это просто красивая страница, на которую никто не смотрит в 3 часа ночи. Настройка Telegram-алертов:

alerting:
  telegram:
    token: "123456789:AA...ваш-токен-бота"
    id: "-1001234567890"  # chat_id канала или группы
    default-alert:
      failure-threshold: 3
      success-threshold: 2
      send-on-resolved: true
      description: "Сервис недоступен"

failure-threshold: 3 означает, что алерт уйдёт только после трёх подряд неудачных проверок — это отсекает случайные сетевые всплески и не превращает канал в мусорку. send-on-resolved: true пришлёт отдельное сообщение, когда сервис снова заработал — без этого вы будете гадать, восстановилось ли всё само. Как создать бота и получить chat_id, подробно описано в статье алерты в Telegram на VPS.

Дальше в каждом эндпоинте достаточно подключить нужный тип алерта:

endpoints:
  - name: main-site
    url: "https://example.com"
    interval: 60s
    conditions:
      - "[STATUS] == 200"
    alerts:
      - type: telegram

Slack и Discord настраиваются аналогично — через свои вебхуки в секции alerting. По умолчанию история проверок хранится в памяти и теряется при перезапуске контейнера. Для сохранения истории между рестартами используйте SQLite или PostgreSQL:

storage:
  type: sqlite
  path: /data/gatus.db
ХранилищеКогда достаточноКогда нужно PostgreSQL
memory (по умолчанию)тестовый запуск, история не важна
sqliteодин инстанс Gatus, десятки эндпоинтовне подходит при нескольких репликах
postgresнужна история за месяцы, несколько инстансов пишут в одну базувысокая частота проверок, HA-схема

Для типового VPS с парой десятков проверок SQLite — разумный баланс: не требует отдельного контейнера с базой, а история сохраняется между обновлениями образа.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем Gatus отличается от Uptime Kuma?

Uptime Kuma управляется через веб-интерфейс с формами, Gatus — конфиг-first: всё описывается в YAML и живёт в git. Если хотите кликать мышкой — удобнее Uptime Kuma, если хотите версионировать мониторинг как код и раскатывать через CI — Gatus.

Можно ли мониторить несколько сайтов из разных стран сразу?

Да, но Gatus проверяет эндпоинты с того сервера, где сам запущен. Для мониторинга «доступности из разных регионов» нужно поднять несколько инстансов Gatus в разных локациях или использовать внешний multi-region сервис поверх него.

Сколько ресурсов нужно VPS под Gatus?

Для пары десятков HTTP/TCP-проверок с интервалом 30–60 секунд достаточно 1 vCPU и 512 МБ RAM с запасом — сервис лёгкий по дизайну. Точные цифры зависят от количества эндпоинтов и частоты опроса, замеряйте на своей нагрузке.

Как защитить статус-страницу, если она должна быть публичной, но без утечки внутренних деталей?

Уберите из публичного конфига проверки внутренних сервисов (баз данных, админок) в отдельный config.yaml с приватным инстансом, а на публичной странице оставьте только внешние проверки — сайт, API, CDN.

Что делать, если Gatus не резолвит DNS внутри Docker-контейнера?

Проверьте, что контейнер использует рабочий DNS-резолвер — добавьте dns: [8.8.8.8, 1.1.1.1] в docker-compose.yml или убедитесь, что хостовый /etc/resolv.conf корректен.

Нужен ли отдельный сервер под мониторинг или можно ставить рядом с проектом?

Для небольших проектов Gatus спокойно живёт на том же VPS. Но если мониторите этот же сервер — при его полном падении алерт просто не уйдёт. Для критичных проектов стоит выносить Gatus на отдельный VPS в другой локации.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →