Перейти к содержимому

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

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

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

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

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 в редакторе одевает страницу в ваши цвета, не открывая её для произвольного кода:

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

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

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

  • Баннер с ответом за одну секунду, считанным по сервисам: 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. Объявляйте об инцидентах и обслуживании

Заголовок раздела «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); если его нет — из адреса, которым вы пользовались при последнем сохранении страницы, — но никогда из запроса посетителя.

Страница находится по адресу 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 читают один и тот же кешированный документ, поэтому ни один из них не может сказать больше, чем страница.