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

Установка с помощью Docker

DumbMonit работает как один контейнер: сервер dumbmonit (сбор данных, API, оповещения, веб-интерфейс) запускает собственную VictoriaMetrics для хранения временных рядов; её бинарный файл поставляется в образе. Конфигурация и состояние хранятся во встроенной базе данных SQLite. Один том, /data, содержит базу данных, секрет экземпляра и временные ряды.

  • Docker Engine с плагином Compose (команда docker compose version работает).
  • Машина, которая может обращаться к отслеживаемым мониторам. Достижимость самой машины с этих мониторов не требуется, кроме агентов, которые отправляют свои измерения на сервер по HTTP.
  • Свободный порт 8080 на хосте или другой порт на ваш выбор (см. ниже).

Это весь docker-compose.yml (файл .env не нужен); сохраните его в отдельном каталоге:

services:
dumbmonit:
image: ghcr.io/laupernoe/dumbmonit:latest
ports:
- "8080:8080"
volumes:
- dumbmonit-data:/data
# Or a host directory; on a SELinux host (Fedora, RHEL) add `:Z`:
# - ./dumbmonit:/data:Z
# environment:
# PUID: "1000" # owner of the files in /data (default 65532)
# PGID: "1000"
restart: unless-stopped
stop_grace_period: 30s
read_only: true
tmpfs: [/tmp]
# Starts as root only to give /data to user 65532 (or PUID/PGID), then
# drops root for good: a host directory works as it is. Remove `user` and
# `cap_add` to run as 65532 from the start (the files must belong to it).
user: "0:0"
cap_drop: [ALL]
cap_add: [CHOWN, DAC_READ_SEARCH, SETUID, SETGID]
security_opt: ["no-new-privileges:true"]
sysctls:
net.ipv4.ping_group_range: "0 2147483647"
volumes:
dumbmonit-data:
name: dumbmonit-data

Затем запустите:

Окно терминала
docker compose up -d

Загружается опубликованный образ; файловая система только для чтения, capabilities, PUID/PGID и sysctl ping_group_range объяснены в разделах Права доступа и каталог данных и Ping ICMP без capability. Параметры (порт, секрет, срок хранения, внешняя VictoriaMetrics, снимки экрана) — переменные окружения, которые вы добавляете сами.

Образ содержит бинарный файл VictoriaMetrics (/victoria-metrics-prod, из victoriametrics/victoria-metrics:v1.152.0). Если DUMBMONIT_VM_URL не задана, сервер запускает его как дочерний процесс, слушающий 127.0.0.1:8428, хранит ряды в /data/vm, перенаправляет его строки журнала в собственный журнал, перезапускает с нарастающей задержкой, если он падает, и останавливает при завершении работы. Ничего не публикуется: порт остаётся внутри контейнера.

Стоит знать две переменные: DUMBMONIT_VM_RETENTION (по умолчанию 12 месяцев; подойдут и 30d, и 2y) и DUMBMONIT_VM_MEMORY (256MB, бюджет её кэшей; увеличьте для сотен хостов). Остальное — в справочнике по конфигурации.

Чтобы использовать уже работающую у вас VictoriaMetrics, задайте в DUMBMONIT_VM_URL её адрес (http://host:8428): встроенная тогда не запускается, а /data/vm остаётся пустым.

Откройте https://<your-host>:8080. Браузер один раз предупредит о самоподписанном сертификате (см. HTTPS and encryption). Новый экземпляр показывает экран /setup, где вы создаёте первую учётную запись администратора (пароль не короче 12 символов).

Сначала экран запрашивает код настройки. Пока администратора нет, сервер при запуске выводит в журнал одноразовый код:

Окно терминала
docker compose logs dumbmonit | grep -A1 "setup code"
First-run setup code: K7XQ4-M9PRT

Он подтверждает, что создающий учётную запись администратора управляет сервером, поэтому кто-то другой в сети не сможет занять свежий экземпляр первым. Код хранится только в памяти, меняется при каждом перезапуске, пока нет администратора, а неверные попытки ограничиваются по частоте. Для автоматизированного развёртывания задайте DUMBMONIT_SETUP_CODE, чтобы выбрать код самостоятельно.

Экран входа

Затем добавьте первый монитор: см. Добавьте первый монитор.

Всё настраивается через переменные окружения; ни одна не обязательна. Добавьте нужные в environment: службы, как показано в разделе Дополнительные параметры.

ПеременнаяПо умолчаниюНазначение
DUMBMONIT_BIND0.0.0.0:8080Адрес прослушивания внутри контейнера.
PUID / PGID65532С user: "0:0": пользователь и группа, от имени которых работает сервер, и владелец файлов в /data (подробности). DUMBMONIT_PUID / DUMBMONIT_PGID тоже работают.
DUMBMONIT_DATA_DIR/dataБаза данных SQLite (dumbmonit.db), секрет экземпляра (secret.key) и данные встроенной VictoriaMetrics (vm/).
DUMBMONIT_VM_URL(не задана)URL внешней VictoriaMetrics. Если задан, встроенная не запускается.
DUMBMONIT_VM_RETENTION12Срок хранения во встроенной VictoriaMetrics: месяцы или 30d, 2y.
DUMBMONIT_VM_MEMORY256MBБюджет памяти кэшей встроенной VictoriaMetrics.
DUMBMONIT_VM_LISTEN127.0.0.1:8428Адрес прослушивания встроенной VictoriaMetrics внутри контейнера.
DUMBMONIT_SECRET(создаётся)Секрет экземпляра, шифрующий учётные данные мониторов и токены.
DUMBMONIT_MAX_CONCURRENT_PROBES64Число одновременных проверок, всех сборщиков вместе.
DUMBMONIT_PROBE_TIMEOUT_SECS10Максимальная длительность одной проверки.
DUMBMONIT_FLUSH_INTERVAL_SECS5Период записи в VictoriaMetrics.
DUMBMONIT_LOGinfoФильтр журнала (синтаксис tracing, например debug, dumbmonit=trace).
DUMBMONIT_AGENT_DIR/agentsБинарные файлы агентов, раздаваемые по адресу /download/….
DUMBMONIT_RESET_PASSWORD(пусто)Задайте 1, чтобы при запуске сбросить пароль и все сеансы.
DUMBMONIT_SETUP_CODE(создаётся)Код настройки, запрашиваемый /setup, пока нет администратора. Если не задан, при каждом запуске в журнал выводится случайный.
DUMBMONIT_COOKIE_SECURE(выкл.)Задайте 1 за обратным прокси с TLS, чтобы пометить cookie сеанса как Secure.
DUMBMONIT_ALERT_INTERVAL_SECS30Период проверки оповещений (не меньше 10).
DUMBMONIT_ALERT_HISTORY_DAYS90 днейСрок хранения истории оповещений. Об оговорке касательно её единицы измерения см. справочник по конфигурации.
DUMBMONIT_BACKUP_ENABLEDвкл.Плановые локальные резервные копии базы данных в /data/backups/. Настраиваются через DUMBMONIT_BACKUP_DIR, _INTERVAL_HOURS (24) и _KEEP (7); см. Резервное копирование и восстановление.

Полный список с подробностями — в справочнике по конфигурации. Имена EZYMONIT_* из времён до переименования по-прежнему читаются как запасной вариант; см. Обновление.

Сообщества SNMP, пароли и токены API шифруются с помощью AES-256-GCM ключом, производным от секрета экземпляра. При первом запуске DumbMonit создаёт этот секрет в /data/secret.key (внутри тома dumbmonit-data).

Если вы предпочитаете управлять секретом сами, задайте DUMBMONIT_SECRET в файле Compose (пример) (32 случайных символа или больше). Храните его в менеджере паролей.

Окно терминала
docker compose pull
docker compose up -d

Миграции базы данных выполняются при запуске. Данные VictoriaMetrics не затрагиваются.

Существующий docker-compose.yml продолжает работать как есть: образ по-прежнему работает от пользователя 65532. Новый файл добавляет user: "0:0" и строку cap_add, чтобы каталог хоста работал без подготовки (Права доступа); скопируйте эти две строки, если хотите перейти на bind mount.

С EzyMonit и с конфигурации из двух контейнеров

Заголовок раздела «С EzyMonit и с конфигурации из двух контейнеров»

До сентября 2026 года DumbMonit назывался EzyMonit и работал в двух контейнерах: сервер и отдельный сервис victoriametrics. Для обновления данные старого проекта нужно один раз перенести в новый том. Старый проект назывался ezymonit (его тома — ezymonit_ezymonit-data и ezymonit_vm-data; убедиться можно командой docker volume ls). Из старого каталога:

Окно терминала
docker compose down

Затем, с новым docker-compose.yml:

Окно терминала
docker volume create dumbmonit-data
docker run --rm -v ezymonit_ezymonit-data:/from -v dumbmonit-data:/to alpine cp -a /from/. /to/
docker run --rm -v ezymonit_vm-data:/from -v dumbmonit-data:/to alpine sh -c 'mkdir -p /to/vm && cp -a /from/. /to/vm/'
docker compose up -d

Каталог данных старой VictoriaMetrics имеет ту же структуру, что использует встроенная: конвертировать ничего не нужно. Альтернатива — оставить внешнюю VictoriaMetrics и указать на неё DUMBMONIT_VM_URL.

Что сервер делает сам при первом запуске:

  • Переменные EZYMONIT_* по-прежнему читаются как запасной вариант, с одним предупреждением при запуске на каждую переменную (EZYMONIT_X is deprecated, use DUMBMONIT_X).
  • /data/ezymonit.db переименовывается в dumbmonit.db.
  • Токены агентов ezym_… продолжают работать; новые имеют вид dmon_…. Агенты продолжают отправлять данные; когда будет удобно, заново выполните команду установки на каждой машине — она переносит старую службу на месте.
  • Имя cookie сеанса изменилось: всем придётся один раз войти заново. Настройка темы в браузере сохраняется.

Чего сервер не делает: префикс метрик изменился с ezymonit_ на dumbmonit_ без обратной совместимости. Старые ряды остаются в VictoriaMetrics под прежним именем и исчезают по истечении срока хранения; графики и встроенные правила начинаются заново с момента обновления. Пользовательские правила оповещений, в которых упоминаются метрики ezymonit_…, нужно отредактировать.

Один именованный том, dumbmonit-data, содержит всё:

ПутьСодержимое
dumbmonit.dbМониторы, правила, каналы, состояние оповещений, сеансы.
secret.keyСекрет экземпляра.
backups/Плановые локальные резервные копии: копия базы данных и секрета, по умолчанию ежедневно, хранится семь.
vm/Временные ряды VictoriaMetrics (по умолчанию срок хранения 12 месяцев).

DumbMonit по расписанию сам резервирует свою базу данных и экспортирует всю конфигурацию — мониторы, учётные данные, правила, каналы — в один файл, зашифрованный выбранной вами парольной фразой, который восстанавливается на свежий экземпляр. Оба способа описаны в разделе Резервное копирование и восстановление, вместе с тем, что делать перед обновлением, и единственным правилом о secret.key, которое стоит прочитать дважды.

Чтобы заархивировать сам том, вместе с графиками, остановите стек и упакуйте его в tar:

Окно терминала
docker compose stop
docker run --rm -v dumbmonit-data:/data -v "$PWD:/backup" alpine \
tar czf /backup/dumbmonit-data.tgz -C /data .
docker compose start

Чтобы восстановить, создайте том, распакуйте в него архив таким же образом, затем выполните docker compose up -d.

Если важен объём, --exclude=./vm делает архив небольшим: база данных и секрет — это настройка, а vm/ — только графики.

В файле Compose выше переменных нет намеренно. Чтобы изменить настройку, добавьте блок environment: (или строку в него) в dumbmonit: вашего docker-compose.yml и снова выполните docker compose up -d. Контейнер пересоздаётся; том с данными сохраняется.

Другой порт. Измените левую часть привязки; контейнер по-прежнему слушает на 8080:

ports:
- "8099:8080"

Собственный секрет вместо сгенерированного в /data/secret.key. Он шифрует учётные данные мониторов: потеряв его, придётся вводить их все заново.

environment:
DUMBMONIT_SECRET: replace-me-with-32-random-characters

Срок хранения и память встроенной VictoriaMetrics (месяцы или 30d / 2y; домашней лаборатории из нескольких десятков мониторов хватает 256 MB):

environment:
DUMBMONIT_VM_RETENTION: "24"
DUMBMONIT_VM_MEMORY: 512MB

Внешняя VictoriaMetrics; встроенная тогда не запускается:

environment:
DUMBMONIT_VM_URL: http://victoriametrics:8428

Потерян пароль. Добавьте строку ниже, выполните docker compose up -d, снова создайте первого администратора в интерфейсе (мониторы, правила и каналы сохраняются), затем удалите строку и ещё раз выполните docker compose up -d:

environment:
DUMBMONIT_RESET_PASSWORD: "1"

Снимки экрана при изменениях сайтов: безголовый Chromium рядом с сервером; см. ниже Снимки экрана при изменениях сайтов.

Другие переменные: справочник по конфигурации.

Монитор изменений сайтов всегда сравнивает видимый текст страниц. Для снимка экрана каждой новой версии нужен браузер, а в образе DumbMonit его нет: безголовый Chromium запускается как второй сервис, а DUMBMONIT_BROWSER_URL сообщает серверу, где его искать.

Добавьте эти строки в docker-compose.yml, затем выполните docker compose up -d:

services:
dumbmonit:
environment:
DUMBMONIT_BROWSER_URL: http://browser:9222
browser:
image: chromedp/headless-shell:stable
shm_size: 256m
restart: unless-stopped
  • browser — имя сервиса; в сети Compose http://browser:9222 ведёт к нему. Его порт никуда не публикуется: с ним общается только DumbMonit.
  • shm_size: 256m: Chromium рисует в /dev/shm, а 64 МБ по умолчанию в Docker слишком мало для длинной страницы.
  • Подойдёт любой Chromium, запущенный с --remote-debugging-port; здесь используется образ chromedp/headless-shell.

Без браузера всё остальное работает как обычно (сравнение текста, оповещения, копии «до/после»); у снимков просто нет изображения. Пока сервер не достаёт до браузера, в форме монитора для изменений сайта показывается заметка с этими строками. Если заметка остаётся после перезапуска, проверьте docker compose logs browser, что имя хоста в DUMBMONIT_BROWSER_URL совпадает с именем сервиса и что оба сервиса входят в один проект Compose.

UI и API обслуживаются на одном порту, который принимает только HTTPS (обычный HTTP-запрос получает перенаправление, см. HTTPS and encryption). Поэтому обратный прокси должен подключаться к контейнеру по HTTPS (https://dumbmonit:8080), с отключённой проверкой сертификата для этого участка или с доверенным сертификатом DumbMonit. WebSocket не используется: интерфейс опрашивает API, поэтому любой обратный прокси работает без особой настройки.

monit.example.com {
reverse_proxy https://127.0.0.1:8080 {
transport http {
tls_insecure_skip_verify
}
}
}
server {
listen 443 ssl;
server_name monit.example.com;
# ssl_certificate / ssl_certificate_key …
location / {
proxy_pass https://127.0.0.1:8080;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# После сбоя агенты отправляют накопившиеся пакеты:
client_max_body_size 16m;
}
}

Если прокси терминирует TLS, задайте DUMBMONIT_COOKIE_SECURE: "1", чтобы cookie сеанса отправлялась только по HTTPS. Задавайте её, только если все браузеры подключаются к DumbMonit по HTTPS: иначе браузер никогда не вернёт cookie, и войти будет невозможно.

Сервер никогда не работает от root. По умолчанию образ работает от пользователя 65532:65532, которому уже принадлежит именованный том, созданный Docker.

Bind mount (./dumbmonit:/data), напротив, сохраняет владельца каталога хоста, часто root, если его создал Docker. Поэтому файл Compose выше запускает контейнер от root (user: "0:0"). Сервер остаётся root лишь на мгновение: прежде чем открыть базу, запустить VictoriaMetrics или начать слушать сеть, он передаёт /data пользователю 65532:65532 (только записи, принадлежащие кому-то другому, не переходя по символическим ссылкам), навсегда отказывается от root и проверяет, что вернуть его нельзя. Четыре capabilities в cap_add нужны только для этого шага; после него не остаётся ни одной. no-new-privileges и корневая файловая система только для чтения остаются включёнными: /data и /tmp — единственные пути, доступные для записи.

Выбор владельца: PUID и PGID. С user: "0:0" укажите uid и gid, от имени которых работает сервер; файлы передаются им при запуске:

environment:
PUID: "1000"
PGID: "1000"

DUMBMONIT_PUID / DUMBMONIT_PGID тоже работают и имеют приоритет. Значение 0 отклоняется. В Unraid PUID=99 и PGID=100 соответствуют обычному владельцу appdata. Без user: "0:0" PUID/PGID игнорируются.

Без user: "0:0" (простой docker run -v ./data:/data или --user 1000:1000) владельцы не меняются, и /data должен быть уже доступен для записи. Если это не так, сервер останавливается и предлагает сначала --user 0:0, затем sudo chown -R 65532:65532 ./data на хосте для bind mount или, для именованного тома:

Окно терминала
docker run --rm -v dumbmonit-data:/data alpine chown -R 65532:65532 /data

На хосте, где SELinux работает в режиме enforcing (Fedora, RHEL, CentOS Stream, AlmaLinux…), контейнеру, включая root, отказывают в доступе к bind mount, пока у него нет метки контейнера. Добавьте :Z к тому или :z, если каталогом пользуются другие контейнеры:

volumes:
- ./dumbmonit:/data:Z

Без этого сервер останавливается с сообщением the host enforces SELinux and the volume has no container label. Именованные тома Docker помечает сам, им ничего не нужно.

Podman без root работает так же, с --user 0:0. Root в контейнере — это ваш собственный пользователь на хосте, а файлы bind mount получают uid 65532 контейнера, который хост показывает как один из ваших sub-uid (165531 при обычном /etc/subuid). Просматривайте их командой podman unshare ls -l ./dumbmonit. Чтобы вместо этого файлы остались за вашим uid, запустите контейнер от своего имени; тогда ни один владелец не меняется:

Окно терминала
podman run --userns keep-id --user "$(id -u):$(id -g)" -v ./dumbmonit:/data:Z …

Монитор ping отправляет ICMP-эхо. Вместо сырого сокета — которому нужна NET_RAW, а capability, выданная непривилегированному пользователю контейнера, всё равно непригодна, — он использует сокет ICMP echo, который Linux разрешает группам, перечисленным в net.ipv4.ping_group_range. Файл Compose задаёт этот sysctl внутри собственного сетевого пространства имён контейнера:

services:
dumbmonit:
sysctls:
net.ipv4.ping_group_range: "0 2147483647"

На хосте ничего не меняется. Docker 20.10 и новее сами задают этот диапазон в каждом контейнере; явные строки обеспечивают его на более старых версиях и в Podman. Без него проверка сообщает об ошибке конфигурации (показывается на мониторе, без уведомления), но не о ложном «хост недоступен». При использовании docker run передайте --sysctl net.ipv4.ping_group_range="0 2147483647". Пока сервер не может открыть ICMP-сокет, в форме монитора ping показывается заметка с этими строками.

Добавьте демо-монитор: оно генерирует поддельные измерения без какой-либо подготовки, так что графики, правила и уведомления можно опробовать сразу. Для реальных данных SNMP часто достаточно машины, на которой запущен Docker, — установите на ней snmpd (apt install snmpd, разрешите сообщество public в мосте Docker в /etc/snmp/snmpd.conf) и добавьте устройство SNMP с адресом хоста в этом мосту (по умолчанию 172.17.0.1): профиль определится автоматически, и появятся интерфейсы, память и процессы.

Разработчики могут добавить оверлей docker-compose.dev.yml, чтобы опубликовать встроенную VictoriaMetrics на :8428 хоста для прямых запросов MetricsQL:

Окно терминала
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d