Перейти к содержанию

Страницы статуса

Страница Status: ваши страницы и объявления под ними

Страница статуса — это публичное лицо вашего мониторинга: страница, которую может открыть кто угодно — без входа и без cookie, — и которая сообщает, работают ли ваши сервисы, показывает до 90 дней ежедневной истории по каждому из них, содержит ваши объявления об инцидентах и техническом обслуживании и позволяет посетителям следить за ними по RSS или по электронной почте. Бейджи показывают тот же ответ в README; компактное представление умещается на странице интранета.

Она показывает только то, что вы на неё поместили: метку, которую вы дали каждому сервису, его состояние, его аптайм и время отклика. Названия мониторов, адреса, типы и идентификаторы никогда не покидают сервер — ни на странице, ни в бейдже, ни в письме.

1. Создайте страницу

Settings → Status pages → New page. Эта страница перечисляет ваши страницы статуса (открыть, изменить, удалить) с объявлениями под ними; редактор открывается по собственному маршруту (/settings/status/new, /settings/status/<id>). Публичное отображение находится по адресу /s/<address>.

Поле Что оно делает
Title Заголовок страницы («Home lab»).
Address Последняя часть URL, /s/<address>. Предлагается на основе заголовка; строчные буквы, цифры и дефисы, от 2 до 40 символов.
Description Одно предложение под заголовком. Необязательно.
Theme Дневная, ночная или по системной теме посетителя.
History Самое длинное окно, которое охватывает полоса истории (30, 60 или 90 дней). Полоса подстраивается под возраст данных страницы: она показывает столько дней, сколько самый старый сервис находится на мониторинге, от 7 дней до этого значения. Страница никогда не показывает больше этого значения — см. Бейджи.
Simple mode Простая страница: без сцены, без маскота, без анимации и без пасхальных яиц. Светлая или тёмная тема определяется системой посетителя, с переключателем в шапке; настройка Theme страницы игнорируется.
Published Выключено = черновик: страница, её бейджи и её логотип отвечают посетителям «not found», пока вы не включите её.

Затем отметьте мониторы, которые нужно показать. Для каждого задайте метку, которую увидят посетители (по умолчанию это имя монитора — вы можете предпочесть «Website» вместо «nginx-front-01») и, при желании, группу («Network», «Storage»). Группы становятся блоками на странице, в порядке, в котором вы расположите сервисы.

Сохраните — и ссылка готова к копированию. Страница обновляется сама каждую минуту.

Оформление

Раздел Look в редакторе одевает страницу в ваши цвета, не открывая её для произвольного кода:

Настройка Что она делает
Logo PNG, JPEG или WebP, до 256 КиБ, показывается рядом с заголовком. Лучше всего подходит квадратный. SVG отклоняется: он может содержать скрипт, а страница отдаётся с того же адреса, что и администрирование. Файл проверяется по содержимому, хранится в /data/status-pages/ и отдаётся только как изображение.
Accent Ink (по умолчанию), blue, teal, violet, rose или amber — верхняя линия, ссылки и кнопка подписки. Каждый цвет подобран так, чтобы оставаться читаемым днём и ночью.
Organisation website Ссылка http:// или https://, показываемая рядом с заголовком в виде имени хоста сайта.
Footer text Простой текст под страницей, до 280 символов: кто её ведёт, как с ним связаться. Переводы строк сохраняются; ничто не интерпретируется как HTML или Markdown.

Сцена

Настройка Scene рисует силуэт города позади баннера. Новые страницы начинают с Парижа; снимите отметку для простого баннера или включите Simple mode, чтобы отказаться от сцен вовсе. Выбирайте сколько угодно, в нужном вам порядке. В комплекте четыре сцены — четыре ночных города под луной и звёздами, с подсвеченной главной достопримечательностью: Париж (Эйфелева башня), Токио (Токийская башня), Нью-Йорк (Эмпайр-стейт-билдинг и Крайслер- билдинг) и Дубай (Бурдж-Халифа). Погода следует за страницей: звёздное небо, когда всё в порядке, облака при предупреждении, гроза, когда что-то лежит. Поскольку это ночные сцены, заголовок и статус поверх них всегда используют тёмные цвета, какой бы ни была тема страницы. Дубай заменил Маттерхорн, а страницы с удалённой сценой перенесены на ближайшую из четырёх (европейские города и античный мир — на Париж, Азия, море и космос — на Токио, Америка — на Нью-Йорк, Альпы и север — на Дубай), включая резервные копии и вызовы API. Если сцен больше одной, Rotation определяет, когда страница переходит к следующей: при каждом визите (по умолчанию), каждую минуту, каждые десять минут или каждый час. Сцены — это закрытый набор рисунков, поставляемый с DumbMonit, — ничего не загружается и не интерпретируется. Те же четыре города могут стоять и за вердиктом стены.

Намеренно нет пользовательского CSS или HTML: страница статуса публична и находится на том же origin, что и ваш интерфейс администратора, под той же политикой безопасности содержимого.

2. Что видят посетители

  • Баннер с ответом за одну секунду, считанным по сервисам: All systems operational, Partial outage (часть сервисов не работает или деградировала), Major outage (все не работают) или Scheduled maintenance. Открытый инцидент, при том что все сервисы по-прежнему отвечают, отображается как Incident in progress, с тоном в зависимости от его влияния.
  • Открытые объявления, сначала самое новое обновление, с хронологией обновлений под сворачиваемым блоком.
  • Каждый сервис с его плашкой состояния (Operational, Degraded, Down, Maintenance, No data), его полосой истории — один квадрат на день — его аптаймом за 24 ч, 7 дней, 30 дней и (на странице с 90 днями) 90 дней, и временем отклика для проб аптайма.
  • Past incidents — прошлые инциденты по дням за последние 30 дней.
  • Get updates: RSS-лента и форма подписки по электронной почте, если вы её настроили (см. Подписчики по электронной почте).

Полоса истории

Каждый квадрат — один день (UTC), тон зависит от аптайма за этот день: полный цвет при 99,5 % и выше, янтарный начиная с 95 %, красный ниже. День без единого измерения серый, а не зелёный — сервис, добавленный на прошлой неделе, имеет 83 серых дня, а не 83 идеальных. Наведите курсор на квадрат или сфокусируйте полосу и перемещайтесь стрелками (Home и End переходят к краям), чтобы прочитать дату, аптайм, минуты простоя и инциденты, затронувшие этот день. Слова есть и для программ чтения с экрана: состояние никогда не передаётся одним цветом.

Как определяется состояние:

Состояние Значение
Operational Последняя проба успешна (пробы аптайма) или монитор отчитался в пределах трёх периодов опроса.
Degraded Сейчас работает, но хотя бы одна проба завершилась неудачно за последний час.
Down Последняя проба неудачна, монитор перестал отчитываться или его конфигурация содержит ошибку.
Maintenance Окно обслуживания идёт, а сервис не работает: это ожидаемо, а не авария. Либо объявление на этой странице, либо окно обслуживания оповещений, охватывающее это монитор.
No data Ещё ни разу не опрашивалось или отключено.

Аптайм для проб (http, tcp, dns, ping, tls, heartbeats) — это доля успешных проверок по dumbmonit_probe_success; простой за день — это число неудачных проверок, умноженное на интервал пробы. Для остальных мониторов (SNMP, agent, Proxmox…) это доля пятиминутных слотов, в которых монитор отчитался хотя бы раз (dumbmonit_up), считая с первого измерения — монитор, добавленный вчера, не считается «недоступным» в предыдущие 89 дней, — а простой за день — это его молчаливые слоты.

3. Объявляйте об инцидентах и обслуживании

В Settings → Status pages, под списком страниц, Incidents and maintenance → New announcement (также Ctrl+K → Announce an incident).

  • У инцидента есть заголовок, влияние (minor показывает страницу как деградировавшую, major — как аварию), и он проходит через Investigating → Identified → Monitoring → Resolved. Публикуйте обновления по ходу дела: каждое содержит статус и сообщение и становится последней строкой, которую читают посетители. Resolve закрывает его итоговым сообщением; затем он переходит в «Past incidents» на 30 дней.
  • У окна обслуживания есть начало и конец, и оно проходит через Scheduled → In progress → Completed. Пока оно идёт, баннер сообщает «Scheduled maintenance», а сервисы, которые не работают, отображаются как Maintenance.

Окно обслуживания, запланированное в Alerts, делает то же самое для единственного монитора, который оно охватывает, без объявления: этот сервис отображается как Maintenance вместо красного, пока окно открыто, а общее состояние страницы говорит Maintenance, когда больше ничего не недоступно и не деградировало. Таким образом проявляются только окна, называющие монитор; название окна и комментарий остаются приватными.

Объявление показывается на одной странице или на всех страницах.

Подписчики по электронной почте

Посетители могут подписаться на ваши объявления по электронной почте, как только вы выберете канал email (SMTP) в редакторе, в разделе Email subscribers. Этот канал вы уже настроили в разделе Уведомления; используются его сервер и отправитель, но не его собственные получатели. Без него страница предлагает только RSS-ленту.

  • Двойное подтверждение (double opt-in). Посетитель вводит адрес; DumbMonit отправляет ссылку для подтверждения, и ничего больше не отправляется, пока по ней не перейдут. Запрос, так и не подтверждённый, забывается через два дня. Форма отвечает одной и той же фразой, независимо от того, новый ли адрес, ожидает подтверждения или уже подписан, поэтому она не сообщает никому, кто следит за вашей страницей.
  • Что отправляется. Письмо при создании объявления, при публикации обновления и при смене его статуса — как для инцидентов, так и для обслуживания, на этой странице (или на каждой странице, для объявления, показываемого на всех).
  • Отписка. Каждое письмо заканчивается ссылкой для отписки и содержит заголовки List-Unsubscribe и List-Unsubscribe-Post, поэтому Gmail, Apple Mail и другие предлагают собственную кнопку в один клик.
  • Ограничения. Публичная конечная точка подписки принимает пять запросов с одного адреса клиента и шестьдесят в сумме за 15 минут, а адрес в ожидании не получает письмо дважды в течение десяти минут: страницу нельзя превратить в почтовую пушку.
  • Редактор перечисляет подписчиков (подтверждённых или ожидающих) и удаляет любого из них.

Ссылки в этих письмах указывают на собственный домен страницы, если он есть (https://status.example.com/). Иначе они строятся из публичного URL политики уведомлений (или DUMBMONIT_PUBLIC_URL); если его нет — из адреса, которым вы пользовались при последнем сохранении страницы, — но никогда из запроса посетителя.

4. Поделитесь ссылкой

Страница находится по адресу https://your-server/s/<address>. Всё под /s/ и /api/public/ отдаётся без аутентификации; остальной DumbMonit остаётся за входом.

Панель Share в редакторе создаёт для вас приведённые ниже фрагменты, с предпросмотром.

Бейджи

Каждая опубликованная страница отдаёт SVG-бейджи — плоские, с белым текстом на сплошном цвете, читаемые как в светлой, так и в тёмной теме README на GitHub:

Бейдж URL
Page status /api/public/status/<address>/badge.svg
Page uptime /api/public/status/<address>/uptime.svg?days=30
Page response time /api/public/status/<address>/response.svg
Service status /api/public/status/<address>/components/<service>/badge.svg
Service uptime /api/public/status/<address>/components/<service>/uptime.svg?days=30
Service response time /api/public/status/<address>/components/<service>/response.svg

<service> — это метка сервиса в виде для URL: «Public API» превращается в public-api (второй «Public API» будет public-api-2). Это также key каждого сервиса в JSON-документе. days равно 1, 7, 30 (по умолчанию) или 90 и никогда не больше истории страницы: страница с 30 днями отклоняет бейдж на 90 дней. Аптайм и время отклика страницы — это среднее по её сервисам. Сервис, по которому ничего не измерено, показывает no data серым цветом.

В README:

[![Status](https://your-server/api/public/status/home-lab/badge.svg)](https://your-server/s/home-lab)
[![Uptime](https://your-server/api/public/status/home-lab/uptime.svg?days=30)](https://your-server/s/home-lab)
[![API](https://your-server/api/public/status/home-lab/components/public-api/uptime.svg)](https://your-server/s/home-lab)

Бейджи кешируются на минуту (Cache-Control: public, max-age=60), поэтому прокси изображений GitHub и ваши посетители ничего не стоят базе данных временных рядов.

Встраивание

/s/<address>/embed — компактное представление для iframe: общее состояние и по одной строке на сервис с его состоянием и 30 днями истории, а также ссылка на полную страницу в новой вкладке.

<iframe src="https://your-server/s/home-lab/embed"
        title="Home lab status" width="100%" height="320" style="border:0"></iframe>

Добавьте ?theme=light или ?theme=dark, чтобы подстроиться под страницу-хозяина, и ?history=0, чтобы скрыть полосы. Страница статуса и её embed — единственные адреса DumbMonit, которые сторонняя страница может встраивать во фрейм; всё остальное (включая страницы подтверждения и отписки) отвечает с frame-ancestors 'none' и X-Frame-Options: DENY.

Собственный домен

У страницы может быть собственный адрес, например status.example.com, так же, как это делает Uptime Kuma. Введите имя в поле Public domain редактора (значок i рядом с ним кратко описывает шаги) и сохраните. Когда запрос приходит в DumbMonit с этим именем в заголовке Host, DumbMonit показывает страницу в корне / и ничего больше: на этом имени экран входа, настройки, API, конечные точки агентов, метрики и другие страницы статуса отвечают 404 Not found, даже для вошедшего пользователя, и ни один cookie сессии не читается и не устанавливается. Отдаются только страница, её embed, её страницы подтверждения и отписки, её бейджи, лента и JSON-документ, а также собственные файлы интерфейса (/_app/, иконки).

Имя хранится в нижнем регистре, без https:// и без завершающего слэша; порт, путь или IP-адрес отклоняются. Две страницы не могут иметь одно имя, а адрес, по которому вы заходите в сам DumbMonit (или его публичный URL), не может быть доменом страницы — сохранение такого значения заблокировало бы вам доступ. Очистите поле, чтобы удалить домен; в любом случае страница остаётся по адресу /s/<address>.

Чтобы настроить:

  1. DNS. Создайте запись для имени (или публичное имя хоста Cloudflare Tunnel), указывающую на ваш обратный прокси.
  2. Прокси. Направьте имя на адрес DumbMonit, например https://dumbmonit:8080, не переписывая путь: прокси передаёт /, а не /s/<address>.
  3. Заголовок Host. Передавайте исходный заголовок Host дальше: именно так DumbMonit отличает домен страницы от собственного адреса. DumbMonit читает только Host; X-Forwarded-Host учитывается только от прокси, указанного в DUMBMONIT_TRUSTED_PROXIES.
  4. HTTPS обрабатывается прокси. DumbMonit ссылается на https://<domain>/ в письмах подписчикам, в RSS-ленте и в панели Share редактора.

Traefik (метки Docker) — заголовок Host передаётся по умолчанию:

labels:
  - traefik.enable=true
  - traefik.http.routers.status.rule=Host(`status.example.com`)
  - traefik.http.routers.status.entrypoints=websecure
  - traefik.http.routers.status.tls.certresolver=letsencrypt
  - traefik.http.services.status.loadbalancer.server.port=8080

Nginx Proxy Manager — добавьте Proxy Host с доменом status.example.com, схемой http, именем хоста для пересылки dumbmonit, портом 8080 и SSL-сертификатом. Больше ничего: он передаёт Host по умолчанию. Оставьте Custom locations пустым.

Cloudflare Tunnel — добавьте Public hostname status.example.com с сервисом https://dumbmonit:8080 и без пути. Туннель сохраняет Host посетителя; оставьте HTTP Host Header в расширенных настройках пустым.

Caddy — reverse_proxy передаёт Host дальше, и Caddy сам получает сертификат:

status.example.com {
    reverse_proxy dumbmonit:8080
}

Nginx — proxy_pass отправляет имя апстрима, если не указано иное, поэтому задайте заголовок:

server {
    listen 443 ssl;
    server_name status.example.com;
    # ssl_certificate … ;

    location / {
        proxy_pass https://dumbmonit:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Устранение неполадок.

  • Домен показывает экран входа или панель DumbMonit: заголовок Host не дошёл до DumbMonit — прокси заменил его именем апстрима (dumbmonit:8080). Добавьте proxy_set_header Host $host; (Nginx), уберите пользовательский HTTP Host Header (Cloudflare Tunnel) или уберите middleware, переписывающее Host (Traefik). Ничего приватного не раскрывается: панель по-прежнему запрашивает пароль.
  • Голое Not found на домене: прокси переписывает путь (отправляет /s/<address> или добавляет префикс) или домен в редакторе не совпадает с именем в браузере в точности. Передавайте путь без изменений.
  • Страница сообщает, что не существует: страница всё ещё черновик — опубликуйте её.
  • Вы больше не можете открыть интерфейс DumbMonit: вы заходите через домен страницы. Используйте собственный адрес DumbMonit или очистите Public domain страницы.

За обратным прокси

Собственный домен — самый простой способ открыть наружу только страницу статуса. Если вы предпочитаете сохранить путь /s/<address> на публичном имени, фильтруйте пути в прокси. Например, с Caddy:

status.example.com {
    @public path /s/* /api/public/* /_app/* /favicon.svg
    reverse_proxy @public dumbmonit:8080
    respond 404
}

С nginx:

location ~ ^/(s/|api/public/|_app/|favicon\.svg) {
    proxy_pass https://dumbmonit:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
}
location / { return 404; }

/_app/ содержит скрипты и стили интерфейса: странице они нужны для отрисовки. Передавайте X-Forwarded-Proto и X-Forwarded-Host, чтобы RSS-лента ссылалась на правильный адрес, и задайте публичный URL (см. выше), чтобы письма подписчикам тоже ссылались на него.

Лента и документ

  • GET /api/public/status/<address>/rss — RSS-лента инцидентов и окон обслуживания, один элемент на объявление с его последним обновлением.
  • GET /api/public/status/<address> — JSON-документ, из которого строится страница, если вы хотите построить свою: заголовок, описание и оформление страницы, общее состояние, у каждого сервиса key, label, state, аптайм (uptime_24h, uptime_7d, uptime_30d, uptime_90d), latency_ms и history (date, uptime_pct, down_minutes, incidents по дням), а также объявления.

Любой сайт может прочитать этот документ из браузера (он отправляется с Access-Control-Allow-Origin: * и без cookie). GET /api/public/status/<address>/banner.js — готовый скрипт, превращающий его в баннер: см. Баннер для сайта.

Документ кешируется на сервере на 30 секунд; бейджи, лента и embed читают один и тот же кешированный документ, поэтому ни один из них не может сказать больше, чем страница.