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

Страница статуса — это публичное лицо вашего мониторинга: страница, которую может открыть кто угодно — без входа и без cookie, — и которая сообщает, работают ли ваши сервисы, показывает до 90 дней ежедневной истории по каждому из них, содержит ваши объявления об инцидентах и техническом обслуживании и позволяет посетителям следить за ними по RSS или по электронной почте. Бейджи показывают тот же ответ в README; компактное представление умещается на странице интранета.
Она показывает только то, что вы на неё поместили: метку, которую вы дали каждому сервису, его состояние, его аптайм и время отклика. Названия мониторов, адреса, типы и идентификаторы никогда не покидают сервер — ни на странице, ни в бейдже, ни в письме.
1. Создайте страницу
Заголовок раздела «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. Что видят посетители
Заголовок раздела «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. Объявляйте об инцидентах и обслуживании
Заголовок раздела «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. Поделитесь ссылкой
Заголовок раздела «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:
[](https://your-server/s/home-lab)[](https://your-server/s/home-lab)[](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>.
Чтобы настроить:
- DNS. Создайте запись для имени (или публичное имя хоста Cloudflare Tunnel), указывающую на ваш обратный прокси.
- Прокси. Направьте имя на адрес DumbMonit, например
https://dumbmonit:8080, не переписывая путь: прокси передаёт/, а не/s/<address>. - Заголовок Host. Передавайте исходный заголовок
Hostдальше: именно так DumbMonit отличает домен страницы от собственного адреса. DumbMonit читает толькоHost;X-Forwarded-Hostучитывается только от прокси, указанного вDUMBMONIT_TRUSTED_PROXIES. - 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=8080Nginx 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 читают один и тот же кешированный документ, поэтому ни один из них не может сказать больше, чем страница.