Сервисы: HTTP, TCP, DNS, ping, TLS, NTP, SMTP, SQL, MQTT, WebSocket
Одиннадцать мониторов следят за сервисами, а не за оборудованием, в духе Uptime Kuma: веб-страница, порт, DNS-имя, хост, сертификат, сервер времени, почтовый релей, база данных, брокер MQTT, конечная точка WebSocket. Для каждого сервиса на странице его монитора отображаются полоса истории, время отклика и процент доступности.
Последние пять идут дальше простого открытия соединения: они начинают настоящую сессию на родном протоколе сервиса. В этом разница между «порт 5432 открыт» и «база данных по-прежнему принимает мою учётную запись и отвечает на запрос». NTP находится посередине: один запрос и один ответ на собственном протоколе NTP, чего достаточно, чтобы прочитать часы сервера без сессии.
Как определяется состояние сервиса
Заголовок раздела «Как определяется состояние сервиса»Сервис может отвечать и при этом быть недоступным: 500, отсутствующее ключевое слово, просроченный
сертификат. Поэтому эти мониторы записывают точку при каждой проверке, а probe_success
равен 1 или 0, вместо того чтобы молчать, как аппаратное устройство. Именно это
позволяет вычислять процент доступности: avg_over_time(dumbmonit_probe_success[30d]).
| Ситуация | Что происходит |
|---|---|
| Неверная опция или адрес, ICMP-сокеты запрещены (см. Ping) | Ошибка конфигурации: ничего не записывается, страница монитора показывает ошибку, оповещения «недоступен» нет. |
Соединение отклонено, тайм-аут, TLS отклонён, 500, ключевое слово отсутствует, полная потеря пакетов, пароль отклонён, запрос не выполнен | probe_success = 0: сбой фиксируется, датируется и учитывается. |
| Всё в порядке | probe_success = 1. |
У каждого монитора свой тайм-аут (timeout_seconds, по умолчанию 5 с, максимум 60 с),
меньший, чем DUMBMONIT_PROBE_TIMEOUT_SECS сервера: если бы проверку прервал
планировщик, она не смогла бы записать свой ноль.
Встроенные правила, применяемые ко всем одиннадцати: Сервис недоступен (3 минуты), Сервис
нестабилен (более шести смен состояния за тридцать минут), Медленный сервис (более
3 с в течение десяти минут). Для каждой проверки, читающей сертификат — http,
tls, smtp, mqtt, websocket: Сертификат скоро истечёт (14 дней) и
Сертификат истёк.
Отклонённый пароль никогда не считается сбоем сервиса: он записывается как
reason="auth", чтобы оповещение указывало, что нужно исправить.
Метрики
Заголовок раздела «Метрики»Все метрики — gauge, все с префиксом dumbmonit_, и все помечены
probe="http|tcp|dns|ping|tls|smtp|postgres|mysql|mqtt|websocket|ntp" в дополнение
к target, host и tag_*.
| Метрика | Мониторы | Значение |
|---|---|---|
probe_success | все | 1, если сервис отвечает корректно, иначе 0. |
probe_duration_seconds | все | Общая длительность проверки. |
probe_failure_info | все | Присутствие (1) с меткой reason: dns, connect, timeout, tls, cert_expired, status, keyword, json, body, packet_loss, record, auth, protocol, query, payload. |
probe_http_status_code | http, websocket | Полученный код статуса. |
probe_http_first_byte_seconds | http | Время до заголовков ответа. |
probe_http_content_bytes | http | Размер тела. |
probe_http_security_header{header} | http | 0/1 для каждой метки header (только https): HSTS, nosniff, CSP, X-Frame-Options, frame-ancestors. |
probe_connect_seconds | все, кроме dns и ping | Установление соединения (для баз данных включая вход). |
probe_tls_handshake_seconds | tls, http, smtp, mqtt, websocket | Только согласование TLS. |
probe_tls_version_info | tls, http, smtp, mqtt, websocket | Присутствие; метка version. |
probe_ssl_cert_expiry_days | tls, http, smtp, mqtt, websocket | Дней до истечения, отрицательное значение, если сертификат истёк. |
probe_ssl_cert_valid | tls, http, smtp, mqtt, websocket | 1, если цепочка ведёт к известному удостоверяющему центру. |
probe_ssl_cert_issuer_info | tls, http, smtp, mqtt, websocket | Присутствие; метка issuer. |
probe_dns_lookup_seconds | dns | Время разрешения. |
probe_dns_answer_records | dns | Записи запрошенного типа. |
probe_dns_answer_fingerprint | dns | При включённой опции «Alert when the answer changes»: 32-битный отпечаток отсортированного ответа. Само его значение ничего не означает; значение имеют только его изменения. |
probe_icmp_rtt_seconds, _min_seconds, _max_seconds | ping | Среднее, наименьшее и наибольшее время кругового обхода. |
probe_icmp_packet_loss_ratio | ping | Потери от 0 до 1. |
probe_icmp_packets_sent, probe_icmp_packets_received | ping | Отправленные и полученные эхо-запросы. |
probe_smtp_greeting_seconds | smtp | Время до баннера 220. |
probe_smtp_ehlo_seconds | smtp | Время кругового обхода команды EHLO. |
probe_smtp_capabilities | smtp | Объявленные расширения. |
probe_smtp_authenticated | smtp | 1, когда AUTH прошла успешно. |
probe_sql_query_seconds | postgres, mysql | Только выполнение запроса. |
probe_sql_rows | postgres, mysql | Возвращённые строки. |
probe_sql_value | postgres, mysql | Первый столбец первой строки, если это число. |
probe_mqtt_connack_seconds | mqtt | Время до CONNACK. |
probe_mqtt_suback_seconds | mqtt | Время до SUBACK. |
probe_mqtt_message_bytes | mqtt | Размер сохранённого (retained) сообщения. |
probe_mqtt_message_value | mqtt | Его содержимое, если это число. |
probe_ws_handshake_seconds | websocket | Открывающее рукопожатие. |
probe_ntp_offset_seconds | ntp | Смещение между локальными часами и сервером. |
probe_ntp_delay_seconds | ntp | Сетевая задержка кругового обхода. |
probe_ntp_stratum | ntp | Расстояние до эталонных часов (16: не синхронизирован). |
probe_ntp_leap_indicator | ntp | От 0 до 3 (предупреждение о високосной секунде, 3 = часы не синхронизированы). |
probe_ntp_root_delay_seconds | ntp | Накопленная задержка до корня иерархии. |
probe_ntp_root_dispersion_seconds | ntp | Накопленная дисперсия до корня. |
probe_ntp_reference_info | ntp | Присутствие; метка reference_id. |
probe_ws_message_bytes | websocket | Размер первого полученного фрейма. Присутствует, только когда проверка отправляет сообщение или ожидает ответ (опции send / expect). |
Веб-сайт или веб-API (HTTP) — проверяет, что страница или API отвечает с правильным кодом статуса, правильным содержимым и действительным сертификатом. Примеры: веб-сайт, страница проверки работоспособности приложения, REST API, интерфейс самостоятельно размещённого сервиса.
Настройка
Заголовок раздела «Настройка»- В поле адреса вставьте полный URL отслеживаемой страницы. Без «http://» или «https://» предполагается HTTPS.
- Предпочитайте лёгкую страницу, не требующую входа, например страницу проверки работоспособности приложения («/health», «/status»), а не главную страницу.
- Если страница требует аутентификации, заполните учётные данные: имя пользователя и пароль дают базовую аутентификацию, токен отправляется как «Bearer».
- По умолчанию подходит любой код статуса от 200 до 299. Чтобы пойти дальше, потребуйте ключевое слово на странице или определённое значение в JSON-ответе.
- При работе по HTTPS сертификат читается автоматически: вас предупредят до его истечения.
Учётные данные: нет, имя пользователя / пароль (базовая аутентификация) или API-токен
(Authorization: Bearer).
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
method | HTTP method | GET | GET подходит почти для всех случаев. HEAD позволяет не загружать страницу, когда важен только код статуса. Варианты: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS. |
accepted_status | Accepted status codes | 200-299 | Коды или диапазоны, считающиеся нормальными, через запятую. Любой другой код считается сбоем. Пример: 200-299,301,404. |
keyword | Expected keyword | (пусто) | Текст, который должен присутствовать на странице. Если его нет, сервис считается недоступным, даже если страница отвечает. |
keyword_absent | Keyword must be absent | false | Инвертирует проверку: наличие ключевого слова сигнализирует о сбое. Полезно для страницы с ошибкой, отвечающей кодом 200. |
keyword_case_sensitive | Match keyword case | false | По умолчанию регистр букв не учитывается. |
json_path | JSON path to check | (пусто) | Для JSON-ответа: путь к проверяемому значению. Заполняйте вместе с ожидаемым значением, никогда одно без другого. Пример: $.status. |
json_expect | Expected JSON value | (пусто) | Значение, которое должен иметь указанный выше JSON-путь, например «ok» или «true». |
headers | Extra headers | (пусто) | Один или несколько заголовков «Name: value», разделённых «|». Не помещайте сюда секреты: опции видны на графиках. |
body | Request body | (пусто) | Содержимое, отправляемое с запросом, для методов, которые его ожидают (POST, PUT…). |
follow_redirects | Follow redirects | true | Отключите, чтобы отслеживать сам редирект, например 301 на HTTPS. |
max_redirects | Maximum redirects followed | 10 | От 1 до 20. Не действует, если редиректы не выполняются. |
insecure_tls | Accept an unverifiable certificate | false | Проверка больше не завершается ошибкой на самоподписанном сертификате или выданном частным удостоверяющим центром. |
allow_private_targets | Allow loopback and link-local targets | false | По умолчанию проверка отклоняет адреса, доступные только самому хосту DumbMonit (127.0.0.1, ::1, 169.254.x.x). Включите, чтобы отслеживать сервис, работающий на хосте DumbMonit. Частные адреса локальной сети (10.x, 192.168.x) разрешены всегда. |
check_certificate | Read the certificate | true | При работе по HTTPS также записывает дату истечения сертификата, чтобы вас предупредили до его истечения. |
max_body_bytes | Maximum bytes read | 524288 | Сверх этого остальная часть страницы не загружается. Ключевое слово и JSON-путь ищутся только в этой части. |
user_agent | Announced identity (User-Agent) | DumbMonit/<version> | Имя, которым проверка представляется серверу. Измените его, если сервер фильтрует роботов. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Сетевой порт (TCP) — проверяет, что порт принимает соединения: SSH, база данных, файловое хранилище, игровой сервер, сетевой принтер.
Настройка
Заголовок раздела «Настройка»- В поле адреса укажите хост и порт через двоеточие: «nas.home.lan:22» или «192.168.1.5:445».
- IPv6-адрес берите в квадратные скобки: «[fd00::1]:445».
- Можно также оставить адрес без порта и указать его в опции «Port»: нужно одно из двух.
- Проверяется только открытие соединения: никакие данные сервису не отправляются, поэтому на него это не влияет.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
port | Port | (пусто) | Порт для открытия, если адрес ещё не содержит его в виде «host:port». Нужно одно из двух. |
allow_private_targets | Allow loopback and link-local targets | false | По умолчанию проверка отклоняет адреса, доступные только самому хосту DumbMonit (127.0.0.1, ::1, 169.254.x.x). Включите, чтобы отслеживать сервис, работающий на хосте DumbMonit. Частные адреса локальной сети (10.x, 192.168.x) разрешены всегда. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Доменное имя (DNS) — проверяет, что имя разрешается и указывает на правильный адрес. Примеры: ваше доменное имя, внутреннее имя, обслуживаемое вашим Pi-hole или AdGuard, MX-запись.
Настройка
Заголовок раздела «Настройка»- В поле адреса напишите разрешаемое имя без «http://»: «www.example.com».
- По умолчанию проверка запрашивает у системного резолвера IPv4-адрес (запись A). При необходимости выберите другой тип записи в опциях.
- Чтобы отслеживать собственный DNS-сервер, введите его IP-адрес в поле «DNS server to query»: проверка завершится ошибкой, если он перестанет отвечать.
- Чтобы обнаружить подмену или ошибку конфигурации, перечислите в «Expected values» адреса, которые должен содержать ответ.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
record_type | Record type | A | A для IPv4-адреса, AAAA для IPv6, MX для почты, CNAME для псевдонима… Варианты: A, AAAA, CNAME, MX, TXT, NS, SOA, SRV, PTR, CAA. |
resolver | DNS server to query | (пусто) | IP-адрес резолвера, порт необязателен. Пусто: системный резолвер. Удобно для проверки собственного DNS-сервера. Пример: 1.1.1.1 или 10.0.0.1:5353. |
expect | Expected values | (пусто) | Значения, которые все должны присутствовать в ответе, через запятую. Пусто: проверяется только разрешение. |
expect_mode | Comparison | contains | contains: каждое ожидаемое значение должно присутствовать где-либо в ответе. exact: ответ должен содержать эти значения и ничего больше. |
forbid | Forbidden values | (пусто) | Значения, которых в ответе быть не должно, через запятую. Проверяются раньше ожидаемых. |
alert_on_change | Alert when the answer changes | false | Записывает отпечаток отсортированного ответа и оповещает при каждом его изменении, без необходимости указывать ожидаемые значения. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Проверка того, что отвечает зона
Заголовок раздела «Проверка того, что отвечает зона»Одного expect достаточно, чтобы поймать запись, которая исчезла. Он не ловит запись,
которая была добавлена: взломанная зона часто сохраняет легитимную A и ставит рядом
вторую, и клиент затем попадает на любую из них случайным образом.
expect_mode = exactотклоняет любое значение, не покрытое ожиданием. Порядок не важен — в DNS его нет.forbidперечисляет значения, которые никогда не должны возвращаться: адрес прежнего хоста, просроченную проверочнуюTXT, выведенный из эксплуатации почтовый сервер. Оно проверяется первым, поэтому имеет приоритет надexpect.
Оба сравнения нечувствительны к регистру, игнорируют завершающую точку в имени и
кавычки вокруг TXT и считают ожидаемое значение найденным, если оно встречается
внутри записи — поэтому MX совпадает по mail.example.com, и вам не нужно
копировать его приоритет.
Оповещение об изменении ответа
Заголовок раздела «Оповещение об изменении ответа»Записывать ожидаемые значения не всегда удобно: имя, обслуживаемое CDN, записи, которыми управляет кто-то другой, или просто зона, об изменении которой вы хотите знать. Отметьте Alert when the answer changes: тогда каждая проверка записывает отпечаток ответа, а встроенное правило DNS answer changed срабатывает, когда он отличается от предыдущего. Оповещение закрывается само через час; новый ответ с этого момента становится эталонным.
Отпечаток охватывает значения ответа, отсортированные и без дубликатов,
включая цепочку CNAME: round-robin, возвращающий те же адреса
в другом порядке, его не меняет, как и TTL. Имя, ответ на которое
меняется при каждом запросе (большой пул вроде pool.ntp.org или географический DNS,
отвечающий по-разному от одного резолвера к другому), оповещало бы
постоянно: для таких имён оставьте опцию выключенной или опрашивайте один фиксированный резолвер.
Доступный хост (ping) — отправляет несколько ICMP-эхо-запросов и измеряет время отклика и потерю пакетов. Примеры: домашний роутер или шлюз, точка доступа Wi-Fi, принтер, машина без агента или SNMP, удалённый хост.
Настройка
Заголовок раздела «Настройка»- В поле адреса напишите имя хоста или IP-адрес: «192.168.1.1» или «router.home.lan».
- При каждом опросе проверка отправляет четыре эхо-запроса и измеряет время отклика, а также долю потерянных пакетов.
- По умолчанию недоступным считается только полная потеря; частичная потеря остаётся видна на графиках. Уменьшите «Tolerated loss», чтобы получать предупреждения раньше.
- Если DumbMonit работает в Docker, сохраните строки
sysctls:из поставляемого docker-compose.yml в сервисе dumbmonit: они позволяют непривилегированному пользователю контейнера открывать сокеты ICMP echo. Никаких capability не требуется.
services: dumbmonit: sysctls: net.ipv4.ping_group_range: "0 2147483647"Вне Docker то же самое делает sysctl -w net.ipv4.ping_group_range="0 2147483647" на
хосте, также работает и raw-сокет (NET_RAW, root).
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
count | Number of echoes | 4 | Пакетов, отправляемых при каждом опросе, от 1 до 20. |
packet_timeout_ms | Wait per packet (ms) | 1000 | Время, отведённое на каждый ответ, от 50 до 10 000 мс. |
interval_ms | Gap between two echoes (ms) | 100 | Пауза между двумя эхо-запросами, от 0 до 5 000 мс. |
payload_bytes | Payload size (bytes) | 56 | Данные, переносимые каждым эхо-запросом, от 0 до 1 400 байт. |
ip_version | IP version | auto | «auto» берёт первый разрешённый адрес; принудительно выберите 4 или 6, если у хоста есть оба и один не отвечает. Варианты: auto, 4, 6. |
loss_threshold_percent | Tolerated loss (%) | 100 | При превышении этого процента потерянных пакетов хост считается недоступным. 100: учитывается только полная потеря, частичная остаётся видна на графиках. |
timeout_seconds | Timeout (seconds) | 5 | Общий бюджет времени на опрос, от 1 до 60. Отклоняется, если не покрывает «number of echoes × wait per packet». |
TLS-сертификат — проверяет, что сертификат действителен, и предупреждает до его истечения, на любом зашифрованном порту. Примеры: почтовый сервер (IMAPS, SMTPS), обратный прокси, каталог LDAPS, брокер MQTT, интерфейс администрирования.
Настройка
Заголовок раздела «Настройка»- В поле адреса напишите хост и, если это не 443, порт зашифрованного сервиса: «mail.example.com:993», «ldap.home.lan:636».
- Проверка открывает зашифрованное соединение, читает предъявленный сертификат и сразу закрывает его: с приложением никакие данные не обмениваются.
- Она записывает число дней до истечения, издателя и версию TLS. Входящие в комплект правила оповещений предупреждают за четырнадцать дней, а затем при истечении.
- Если к сервису обращаются по IP-адресу, а сертификат содержит имя, введите это имя в «Server name (SNI)».
- Для сертификата, выданного вашим собственным удостоверяющим центром, отметьте «Accept an unverifiable certificate»: дата истечения по-прежнему отслеживается.
Рукопожатие завершается, даже когда сертификат отклонён: это
позволяет прочитать дату истечения уже просроченного сертификата. Вердикт
проверки находится в probe_ssl_cert_valid.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
server_name | Server name (SNI) | (пусто) | Доменное имя, сообщаемое серверу и проверяемое в сертификате. Задайте его, когда адрес — это IP за обратным прокси. |
insecure_tls | Accept an unverifiable certificate | false | Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается. |
allow_private_targets | Allow loopback and link-local targets | false | По умолчанию проверка отклоняет адреса, доступные только самому хосту DumbMonit (127.0.0.1, ::1, 169.254.x.x). Включите, чтобы отслеживать сервис, работающий на хосте DumbMonit. Частные адреса локальной сети (10.x, 192.168.x) разрешены всегда. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Почтовый релей (SMTP) — открывает настоящую сессию на почтовом сервере: приветствие, EHLO, STARTTLS и вход, если вы его указали. Примеры: SMTP-релей вашего провайдера, локальный Postfix или msmtp, Proxmox Mail Gateway, порт submission почтового сервера.
Настройка
Заголовок раздела «Настройка»- В поле адреса напишите почтовый сервер и порт, если он не стандартный: «smtp.example.com» или «smtp.example.com:2525».
- Выберите шифрование, которое использует ваш релей: STARTTLS для порта submission 587, TLS для порта 465, None для релея в вашей собственной сети, слушающего порт 25.
- Чтобы проверить, что релей по-прежнему принимает вашу учётную запись, заполните учётные данные: тогда проверка выполнит AUTH и сообщит об отклонённом пароле именно как о нём, а не как о сбое.
- Ничего не отправляется: проверка останавливается после приветствия, расширений и необязательного входа, затем завершает соединение. Ни одно сообщение не попадает в очередь.
- Чтобы получить предупреждение при исчезновении расширения, укажите его в «Expected extension»: релей, переставший объявлять STARTTLS, будет отправлять вашу почту открытым текстом.
Учётные данные: нет, либо имя пользователя и пароль, отправляемые через AUTH PLAIN (или
AUTH LOGIN, когда сервер предлагает только его). Они отправляются после шифрования
соединения и после оценки сертификата: релей, цепочку которого
невозможно проверить, их никогда не получает.
При TLS или STARTTLS сертификат читается так же, как это делает проверка TLS — истечение, издатель, версия протокола — поэтому почтовый релей — это ещё и сертификат, об истечении которого вас предупредят.
Что она не может обнаружить
Заголовок раздела «Что она не может обнаружить»Что почта действительно уходит. Релей, который принимает каждую сессию, а затем откладывает всё, здесь отвечает идеально; вместо этого следите за его очередями (см. страницу Proxmox Mail Gateway). Она также никогда не отправляет сообщение, поэтому ничего не говорит о фильтрации получателей, SPF или DKIM.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
security | Encryption | starttls | STARTTLS начинает открытым текстом и повышает защиту (порт 587), TLS шифрует с первого байта (порт 465), None не шифрует никогда (порт 25) и подходит только для релея в вашей собственной сети. |
port | Port | (пусто) | Используется, если адрес его не задаёт. Пусто: 587 для STARTTLS, 465 для TLS, 25 без шифрования. |
helo_name | Name announced (EHLO) | dumbmonit | Имя, которым проверка представляется. Строгий релей отклоняет имя, которое не может разрешить. |
expect_capability | Expected extension | (пусто) | Расширение, которое сервер должен объявить в ответе на EHLO, например STARTTLS или AUTH. Пусто: ожиданий нет. |
server_name | Server name (SNI) | (хост) | Доменное имя, сообщаемое серверу и проверяемое в сертификате. Задайте его, когда адрес — это IP. |
insecure_tls | Accept an unverifiable certificate | false | Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается. |
allow_private_targets | Allow loopback and link-local targets | false | См. «Addresses the checks refuse» ниже. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Причины сбоев
Заголовок раздела «Причины сбоев»reason | Что произошло |
|---|---|
connect | Порт закрыт или релей недоступен. |
protocol | Что-то ответило, но не SMTP — либо отклонило соединение, EHLO или STARTTLS, который сам объявило. |
auth | Учётная запись отклонена (535, 530, 534). С релеем всё в порядке; не в порядке учётные данные. |
payload | Расширение, указанное в «Expected extension», не объявлено. |
tls, cert_expired | То же значение, что и для проверки TLS. |
PostgreSQL
Заголовок раздела «PostgreSQL»База данных PostgreSQL — подключается, аутентифицируется и выполняет один запрос: сигнал о том, что база данных работает, но больше не отвечает. Примеры: база данных за Nextcloud или Immich, рекордер Home Assistant, база данных приложения, экземпляр TimescaleDB.
Настройка
Заголовок раздела «Настройка»- На сервере создайте учётную запись для мониторинга и дайте ей не больше чем право подключаться: CREATE ROLE dumbmonit LOGIN PASSWORD ‘a-long-password’;
- Убедитесь, что эта учётная запись может обращаться к серверу с машины DumbMonit, что обычно означает ещё одну строку в pg_hba.conf с последующей перезагрузкой конфигурации.
- В поле адреса напишите сервер и порт, если он не 5432: «db.home.lan» или «db.home.lan:5433».
- Запрос по умолчанию — SELECT 1, он не читает ни одной таблицы: ничего больше выдавать не нужно. Время соединения и время запроса записываются отдельно.
- Чтобы следить за чем-то своим, замените запрос на такой, который возвращает одно число, и оно станет графиком: длина очереди, число строк, задержка репликации.
Учётные данные: имя пользователя и пароль, обязательны. База данных никогда не отслеживается анонимно, поэтому форма не предлагает ничего другого.
Что она не может обнаружить
Заголовок раздела «Что она не может обнаружить»Задержку репликации, затянувшуюся блокировку, постоянно растущую таблицу. Всё это
находится в административных представлениях самого движка — напишите запрос сами, и
возвращаемое им число станет probe_sql_value, графиком, по которому можно оповещать.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
port | Port | 5432 | Используется, если адрес его не задаёт. |
database | Database | postgres | База данных, открываемая при подключении. Учётной записи мониторинга должно быть разрешено подключаться к ней. |
query | Query | SELECT 1 | Выполняется при каждой проверке. Запрос по умолчанию не читает ни одной таблицы, поэтому учётной записи не нужны привилегии, кроме подключения. Запрос, возвращающий одно число, превращает его в график. |
expect | Expected value | (пусто) | Значение, которое должен содержать первый столбец первой строки. Пусто: проверяется только успешность запроса. |
sslmode | Encryption | prefer | prefer шифрует, когда сервер это предлагает, require отказывается подключаться без шифрования, verify-full дополнительно проверяет сертификат и имя, disable не шифрует никогда. |
allow_private_targets | Allow loopback and link-local targets | false | См. «Addresses the checks refuse» ниже. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
MySQL и MariaDB
Заголовок раздела «MySQL и MariaDB»База данных MySQL или MariaDB — подключается, аутентифицируется и выполняет один запрос: сигнал о том, что база данных работает, но больше не отвечает. Примеры: база данных за WordPress, Nextcloud или Kimai, база данных приложения, MariaDB в Docker.
Настройка
Заголовок раздела «Настройка»- На сервере создайте учётную запись для мониторинга вообще без привилегий: CREATE USER ‘dumbmonit’@’%’ IDENTIFIED BY ‘a-long-password’;
- Проверьте, что учётная запись может подключаться с машины DumbMonit: шаблон хоста localhost принимал бы только соединения, установленные на самом сервере.
- В поле адреса напишите сервер и порт, если он не 3306: «db.home.lan» или «db.home.lan:3307».
- Запрос по умолчанию — SELECT 1, он не читает ни одной таблицы: ничего больше выдавать не нужно. Время соединения и время запроса записываются отдельно.
- Чтобы следить за чем-то своим, замените запрос на такой, который возвращает одно число, и оно станет графиком: длина очереди, число строк, задержка репликации.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
port | Port | 3306 | Используется, если адрес его не задаёт. |
database | Database | (пусто) | База данных, открываемая при подключении. Пусто: никакая, этого достаточно для запроса по умолчанию. |
query | Query | SELECT 1 | Выполняется при каждой проверке. Запрос по умолчанию не читает ни одной таблицы, поэтому учётной записи не нужны привилегии, кроме подключения. Запрос, возвращающий одно число, превращает его в график. |
expect | Expected value | (пусто) | Значение, которое должен содержать первый столбец первой строки. Пусто: проверяется только успешность запроса. |
sslmode | Encryption | prefer | prefer шифрует, когда сервер это предлагает, require отказывается подключаться без шифрования, verify-full дополнительно проверяет сертификат и имя, disable не шифрует никогда. |
allow_private_targets | Allow loopback and link-local targets | false | См. «Addresses the checks refuse» ниже. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Причины сбоев, оба движка
Заголовок раздела «Причины сбоев, оба движка»reason | Что произошло |
|---|---|
connect | Порт закрыт, сервер недоступен либо отклонил соединение по причине, не связанной с учётной записью (запускается, слишком много соединений). |
auth | Учётная запись отклонена: неверный пароль, нет строки в pg_hba.conf, шаблон хоста не покрывает машину DumbMonit. |
query | Подключение и аутентификация прошли, но запрос завершился ошибкой: отсутствует таблица, база данных в режиме только чтения, синтаксическая ошибка. |
payload | Запрос выполнился, но вернул не то значение, которое ожидалось. |
timeout | Соединение или запрос не завершились вовремя — случай «работает, но медленно». |
Брокер MQTT — подключается к брокеру, подписывается на топик и может ждать retained-сообщение. Примеры: Mosquitto, брокер за Home Assistant, Zigbee2MQTT, датчики ESPHome.
Настройка
Заголовок раздела «Настройка»- В поле адреса напишите брокер и порт, если он не стандартный: «broker.home.lan» или «broker.home.lan:1884».
- Отметьте «Encrypted connection» для брокера, слушающего порт 8883, и заполните учётные данные, если нужна учётная запись.
- Подключение само по себе уже стоит отслеживать: брокер, отклоняющий вашу учётную запись или переставший отвечать, — причина, по которой весь дом замолчал.
- Чтобы пойти дальше, укажите топик: тогда проверка подписывается на него, а брокер, отклонивший подписку, сообщает вам, что учётная запись потеряла права доступа.
- Отмечайте «Expect a retained message» только для топика, который его содержит, обычно это топик доступности. Топик, в который публикуют время от времени, выглядит молчащим для только что подключившегося клиента.
Что она не может обнаружить
Заголовок раздела «Что она не может обнаружить»Что конкретный датчик перестал передавать данные. Retained-сообщение, которое читает проверка, — это то, что сохранил брокер, возможно, трёхнедельной давности — MQTT не ставит на него метку времени. Для контроля свежести следите за автоматизацией, которая его использует, или применяйте heartbeat.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
tls | Encrypted connection | false | Шифрует сессию с первого байта, как это делают брокеры на порту 8883. |
port | Port | (пусто) | Используется, если адрес его не задаёт. Пусто: 1883 открытым текстом, 8883 с шифрованием. |
topic | Topic | (пусто) | Топик, на который подписывается проверка. Пусто: только подключение, что уже говорит вам, что брокер жив и принимает вашу учётную запись. |
expect_message | Expect a retained message | false | Сообщение должно прийти в этот топик до истечения тайм-аута. Сразу приходят только retained-сообщения: топик, в который лишь время от времени публикуют, будет выглядеть молчащим. |
expect | Expected content | (пусто) | Текст, который должно содержать это сообщение. Его заполнение подразумевает ожидание сообщения. |
client_id | Client identifier | (выводится) | Имя, сообщаемое брокеру. По умолчанию выводится из монитора, поэтому две проверки никогда не отключают друг друга. |
server_name | Server name (SNI) | (хост) | Доменное имя, сообщаемое брокеру и проверяемое в сертификате. Задайте его, когда адрес — это IP. |
insecure_tls | Accept an unverifiable certificate | false | Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается. |
allow_private_targets | Allow loopback and link-local targets | false | См. «Addresses the checks refuse» ниже. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Причины сбоев
Заголовок раздела «Причины сбоев»reason | Что произошло |
|---|---|
connect | Порт закрыт или брокер недоступен. |
auth | CONNACK отклонил учётную запись, либо брокер отклонил подписку — список контроля доступа больше не покрывает этот топик. |
protocol | Что-то ответило, но не говорит на MQTT 3.1.1, либо брокер отклонил идентификатор клиента. |
payload | В топик не пришло retained-сообщение, либо его содержимое не включает ожидаемый текст. |
WebSocket
Заголовок раздела «WebSocket»Конечная точка WebSocket — выполняет рукопожатие upgrade и может отправить фрейм и дождаться ответного: это сбой другого рода, чем у обычной HTTP-страницы. Примеры: API Home Assistant, живая панель мониторинга, поток логов, конечная точка за обратным прокси.
Настройка
Заголовок раздела «Настройка»- В поле адреса вставьте полную конечную точку: «wss://home.example.com/api/websocket». Без схемы предполагается wss.
- Проверка выполняет всё открывающее рукопожатие и проверяет ответ, который сервер вычисляет из отправленного ему ключа: обратный прокси, потерявший заголовок Upgrade, обнаруживается здесь, тогда как HTTP-проверка по-прежнему видела бы здоровый 200.
- Для большинства конечных точек больше ничего не требуется. Статус, отличный от 101, сообщается вместе с кодом, поэтому 401 из-за просроченного токена не принимают за сбой.
- Чтобы пойти дальше, заполните «Expected content» фрагментом первого фрейма, который сервер отправляет сам, например приветствием API Home Assistant.
- Если конечная точка молчит, пока к ней не обратятся, поместите сообщение в «Frame to send», а то, что должен содержать ответ на него, — в «Expected content».
Учётные данные: нет, имя пользователя и пароль (отправляются как базовая HTTP-аутентификация в
открывающем запросе) или токен (отправляется как Authorization: Bearer).
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
path | Path | (из адреса) | Путь открывающего запроса. Берётся из адреса, если тот его содержит. |
port | Port | (пусто) | Используется, если адрес его не задаёт. Пусто: 443 для wss, 80 для ws. |
send | Frame to send | (пусто) | Текстовый фрейм, отправляемый после открытия соединения. Пусто: ничего не отправляется. |
expect | Expected content | (пусто) | Текст, который должен содержать полученный фрейм. Если пусто и нечего отправлять, проверяется только открывающее рукопожатие. |
subprotocol | Subprotocol | (пусто) | Значение Sec-WebSocket-Protocol. Проверка завершается ошибкой, если сервер выбирает другое. |
origin | Origin | (пусто) | Значение заголовка Origin, которое некоторые серверы требуют перед переключением протокола. |
server_name | Server name (SNI) | (хост) | Доменное имя, сообщаемое серверу и проверяемое в сертификате. Задайте его, когда адрес — это IP. |
insecure_tls | Accept an unverifiable certificate | false | Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается. |
allow_private_targets | Allow loopback and link-local targets | false | См. «Addresses the checks refuse» ниже. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Причины сбоев
Заголовок раздела «Причины сбоев»reason | Что произошло |
|---|---|
connect | Порт закрыт или хост недоступен. |
status | Конечная точка ответила чем-то, отличным от 101; код находится в probe_http_status_code. |
protocol | Она ответила 101, но её Sec-WebSocket-Accept не соответствует отправленному ключу, она выбрала другой подпротокол либо сразу закрыла соединение. |
payload | Ни один фрейм не пришёл, либо он не содержит ожидаемого текста. |
Сервер времени NTP — отправляет один SNTP-запрос и читает ответ: смещение, задержку кругового обхода, stratum и индикатор високосной секунды. Примеры: роутер или NAS, выступающий локальным сервером времени, внутренний NTP-сервер (chrony, ntpd), публичный сервер из пула, используемый как эталон.
Настройка
Заголовок раздела «Настройка»- В поле адреса напишите имя или IP-адрес сервера: «pool.ntp.org» или «192.168.1.1». Используется UDP-порт 123, если опция «Port» не указывает иное.
- Проверка отправляет один SNTP-запрос и читает ответ: состояние между опросами не сохраняется, и на сервер ничего не записывается.
- Она записывает смещение между часами сервера и хоста DumbMonit, задержку кругового обхода, stratum и индикатор високосной секунды.
- Сервер, отвечающий stratum 16 или чей индикатор високосной секунды показывает «unsynchronized», так и не смог синхронизироваться: проверка считает его недоступным независимо от смещения.
- Уменьшите «Tolerated offset», чтобы получать предупреждения раньше, чем при 100 мс; увеличьте его для сервера, находящегося на нескольких пересылках от эталонных часов.
Учётные данные: нет.
| Ключ | Название | По умолчанию | Справка |
|---|---|---|---|
port | Port | 123 | UDP-порт NTP-сервера. |
offset_threshold_ms | Tolerated offset (ms) | 100 | При превышении этого смещения часов сервер считается недоступным. Несинхронизированный сервер (stratum 16) всегда завершается ошибкой, независимо от этого значения. |
allow_private_targets | Allow loopback and link-local targets | false | См. «Addresses the checks refuse» ниже. |
timeout_seconds | Timeout (seconds) | 5 | Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60. |
Причины сбоев
Заголовок раздела «Причины сбоев»reason | Что произошло |
|---|---|
connect | Не удалось открыть UDP-сокет, либо ответ пришёл с неожиданного адреса. |
timeout | Ответ не пришёл в пределах тайм-аута. |
protocol | Ответ не был корректным NTP-пакетом либо пришёл не от сервера (неверный режим). |
unsynchronized | Сервер ответил stratum 16 или 0 («kiss-o’-death», который также называет причину в логе), либо его индикатор високосной секунды показывает «unsynchronized». |
clock_offset | Измеренное смещение превышает «Tolerated offset». |
Адреса, которые проверки отклоняют
Заголовок раздела «Адреса, которые проверки отклоняют»Проверки, подключающиеся к указанному вами адресу — HTTP, TCP, TLS, NTP, SMTP,
PostgreSQL, MySQL, MQTT, WebSocket — сообщают то, что видят, — а это же, слово в слово, делает server-side request
forgery. Чтобы администратор мониторинга не мог читать сервисы, доступные только
хосту DumbMonit (встроенная база метрик на 127.0.0.1:8428,
служба метаданных облачного провайдера на 169.254.169.254), проверки по
умолчанию отклоняют:
- адреса loopback (
127.0.0.0/8,::1); - link-local-адреса (
169.254.0.0/16,fe80::/10), включая облачный адрес метаданных, и неопределённый адрес (0.0.0.0,::).
Частные диапазоны локальной сети (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7)
разрешены всегда: их мониторинг — смысл домашней лаборатории.
Правило применяется к введённому вами адресу, к каждому адресу, в который
разрешается имя хоста (проверяется повторно в момент соединения, поэтому имя, меняющее
свой ответ, не проскользнёт), и к каждому редиректу, по которому следует HTTP-проверка.
Отклонённый адрес отображается как ошибка конфигурации на цели — оповещение о недоступности
не отправляется — с указанием опции, которую нужно включить: allow_private_targets. Включите её для
цели, которая действительно отслеживает сервис на самом хосте DumbMonit.
Редирект на отклонённый адрес сообщается как неудачное измерение
(reason="connect"), потому что изменился отслеживаемый сервис, а не
конфигурация.
Значения, найденные по json_path, никогда не выводятся в сообщении о сбое
длиннее 32 символов.
Типичные ошибки
Заголовок раздела «Типичные ошибки»| Симптом | Вероятная причина |
|---|---|
| Ping показывает ошибку конфигурации | В файле Compose отсутствует sysctl net.ipv4.ping_group_range. См. выше. |
HTTP недоступен с reason="keyword" | Ключевое слово ищется только в первых max_body_bytes, без учёта регистра, если не задан keyword_case_sensitive. |
HTTP недоступен с reason="tls" | Самоподписанный сертификат или частный удостоверяющий центр: задайте insecure_tls. |
Проверка показывает ошибку конфигурации с упоминанием allow_private_targets | Адрес — loopback или link-local. См. «Addresses the checks refuse» выше. |
TCP недоступен, хотя telnet host port работает с вашего ноутбука | Контейнер DumbMonit не может достичь хоста (сеть Docker, файрвол). Проверьте изнутри сети контейнера. |
DNS недоступен с reason="record" | Ответ не содержит все значения, перечисленные в expect. |
Ping недоступен с reason="packet_loss" | Потери выше loss_threshold_percent; некоторые устройства ограничивают частоту ICMP. |
DNS недоступен с reason="record", хотя expect совпадает | expect_mode равен exact, и ответ содержит лишнее значение, либо сработал forbid. |
SMTP недоступен с reason="protocol" при security = starttls | Релей не объявляет STARTTLS на этом порту. Используйте tls для 465, none для обычного локального релея. |
Проверка базы данных недоступна с reason="auth" | Учётная запись существует, но ей нельзя подключаться с машины DumbMonit: проверьте pg_hba.conf или часть host у пользователя MySQL. |
Проверка базы данных недоступна с reason="query" | Подключение и вход прошли. База данных работает, но отказывается выполнять работу: только чтение, отсутствует таблица, восстановление. |
MQTT недоступен с reason="payload" на топике, где явно есть трафик | Только retained-сообщения доходят до только что подписавшегося клиента. Публикуйте в этот топик с флагом retain или снимите отметку «Expect a retained message». |
WebSocket недоступен с reason="protocol" после 101 | Что-то на пути отвечает на upgrade, не говоря на WebSocket, — обычно правило обратного прокси, поглощающее заголовок Upgrade. |