Если вам понравилась эта статья, вы можете стать спонсором на Boosty.
Что такое Dozzle#
Dozzle - это лёгкое open-source веб-приложение для просмотра логов Docker-контейнеров в реальном времени, без баз данных, без сложной настройки и без хранения логов где-либо, кроме самого Docker.
Сайт проекта: dozzle.dev
Исходный код: github.com/amir20/dozzle
По сути, Dozzle - это удобная веб-обёртка над docker logs -f, только сразу для всех контейнеров хоста, с поиском, подсветкой и приятным интерфейсом, в котором легко ориентироваться, вместо голого терминала.
Основные возможности:
- Просмотр логов всех контейнеров в реальном времени через браузер
- Поиск и фильтрация по тексту и регулярным выражениям
- Подсветка уровней логирования и pretty-print для JSON-логов
- Статистика по контейнерам - CPU, память, сеть
- Запуск/остановка/перезапуск контейнеров прямо из интерфейса (опционально)
- Скачивание логов файлом
- Мультихост-режим - один Dozzle показывает логи с нескольких серверов сразу
Зачем нужен Dozzle#
Если у вас на сервере крутится больше пары контейнеров, рано или поздно наступает момент, когда нужно быстро посмотреть, что происходит - у Nextcloud, у Authentik, у только что упавшего сервиса и так далее. Вариантов немного:
- лезть по SSH и гонять
docker logs -f <container>по одному контейнеру за раз; - ставить полноценный стек мониторинга (Loki + Grafana, ELK) - долго, тяжело и возможно избыточно для домашнего сервера, с учетом сложности настройки;
- поставить Dozzle - один маленький контейнер, который сразу даёт веб-интерфейс со всеми логами хоста.
Dozzle - это не замена полноценному логированию с долгим хранением (для этого безусловно лучше подойдёт связка Loki/Mimir/Grafana), а быстрый и лёгкий инструмент «посмотреть, что происходит прямо сейчас» - и для домашнего сервера этого, как правило, более чем достаточно.
Кстати, если вы уже читали статью про Diun - это отличная пара инструментов: Diun сообщает, когда вышло обновление образа, а Dozzle помогает сразу посмотреть логи контейнера после того, как вы его обновили, и убедиться, что всё поднялось штатно.
Установка через Docker Compose#
Минимальный docker-compose.yml, который использовался в ролике:
services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # доступ к Docker API только для чтения
environment:
- TZ=Europe/Moscow
- DOZZLE_NO_ANALYTICS=true # отключаем отправку анонимной телеметрии
- DOZZLE_TAILSIZE=300 # сколько последних строк подгружать при открытии
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
proxy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.dozzle.entrypoints=web"
- "traefik.http.routers.dozzle.rule=Host(`dozzle.domain.ru`)"
- "traefik.http.middlewares.dozzle-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.dozzle.middlewares=dozzle-https-redirect"
- "traefik.http.routers.dozzle-secure.entrypoints=websecure"
- "traefik.http.routers.dozzle-secure.rule=Host(`dozzle.domain.ru`)"
- "traefik.http.routers.dozzle-secure.tls=true"
- "traefik.http.routers.dozzle-secure.service=dozzle"
- "traefik.http.services.dozzle.loadbalancer.server.port=8080"
- "traefik.docker.network=proxy"
networks:
proxy:
external: trueЗапуск сервиса:
docker compose up -dПосле запуска - открой в браузере https://dozzle.domain.ru. Никакой дополнительной настройки на этом этапе не требуется - Dozzle сам находит все запущенные на хосте контейнеры через Docker socket и сразу показывает их логи.
Docker socket (/var/run/docker.sock) даёт полный доступ к управлению Docker на хосте. Монтируйте его строго в режиме :ro, как в примере выше, а для дополнительной защиты рассмотрите вариант с установкой socket-proxy вроде tecnativa/docker-socket-proxy - об этом подробнее в разделе «Безопасность» ниже.
Совместимость с Traefik: сжатие ломает live-логи (SSE)#
Dozzle стримит логи в реальном времени через Server-Sent Events (SSE) - однонаправленный HTTP-поток данных от сервера к браузеру. Апгрейд WebSocket-соединений Traefik обрабатывает автоматически и без дополнительной настройки, но с SSE есть нюанс: если у вас включён compress middleware (часто добавляется глобально для всех сервисов, чтобы сжимать ответы), он может сломать именно этот поток - логи в интерфейсе просто перестанут обновляться в реальном времени, хотя сам Dozzle будет работать без ошибок.
Чтобы это исправить, нужно исключить text/event-stream из сжатия:
http:
middlewares:
middlewares-compress:
compress:
excludedContentTypes:
- text/event-streamИ применить этот middleware к роутеру Dozzle (или, если compress у вас уже общий для всех сервисов - просто добавить исключение в существующую конфигурацию).
Типичный блок лейблов для сервиса Dozzle с учётом этого нюанса выглядит примерно так:
services:
dozzle:
image: amir20/dozzle:latest
labels:
- traefik.enable=true
- traefik.http.routers.dozzle.rule=Host(`dozzle.domain.ru`)
- traefik.http.routers.dozzle.entrypoints=websecure
- traefik.http.routers.dozzle.tls.certresolver=letsencrypt
- traefik.http.services.dozzle.loadbalancer.server.port=8080Если вы не используете compress middleware глобально - можно ничего не менять, проблема проявляется только при его использовании. Но если после настройки Dozzle логи не обновляются в реальном времени и страницу приходится обновлять вручную - в первую очередь проверьте именно этот момент.
Настройка авторизации#
По умолчанию Dozzle не требует логина - это нормально, если сервис доступен только изнутри вашей сети или уже закрыт через reverse-proxy с отдельной авторизацией. Но у Dozzle есть и собственные встроенные варианты.
Простая авторизация (simple)#
Создаём пользователя через сам образ Dozzle:
docker run --rm -it -v ./data:/data amir20/dozzle generate --name "Admin" --email admin@domain.ru adminКоманда создаст файл data/users.yml с хешем пароля. В docker-compose.yml добавляем:
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data:/data
environment:
- DOZZLE_AUTH_PROVIDER=simpleАвторизация через reverse-proxy (forward-proxy)#
Если у вас уже настроен Authentik, Authelia или Keycloak (в блоге есть отдельная серия статей про Single Sign On) - логичнее не заводить ещё один отдельный логин, а пустить Dozzle через forward-auth того же прокси:
environment:
- DOZZLE_AUTH_PROVIDER=forward-proxy
- DOZZLE_AUTH_HEADER_USER=Remote-User # заголовок с именем пользователя, который прокидывает ваш проксиТак Dozzle будет доверять авторизации, уже выполненной на уровне Traefik/Authentik, и не потребует отдельного пароля.
Интерфейс и возможности#
После открытия веб-интерфейса доступны:
- список всех контейнеров хоста с индикатором статуса (running/exited/restarting);
- живой стрим логов с автоскроллом и поиском по тексту/regex прямо на лету;
- подсветка уровней логирования (
error,warn,infoи т.д.) и автоматическое форматирование JSON-строк логов в читаемый вид; - вкладка со статистикой контейнера - CPU, память, сеть, диск;
- скачивание лога контейнера файлом за выбранный период;
- при включённых Actions (см. ниже) - кнопки запуска, остановки и перезапуска контейнера прямо из интерфейса.
Actions - кнопки управления контейнером - по умолчанию выключены и включаются отдельно:
environment:
- DOZZLE_ENABLE_ACTIONS=trueВключайте Actions только если действительно нужно управлять контейнерами прямо из Dozzle, и обязательно держите сервис за авторизацией (simple или forward-proxy из раздела выше) - иначе любой, кто получит доступ к веб-интерфейсу, сможет остановить или перезапустить любой контейнер на хосте.
Мультихост-режим (агенты)#
Если у вас не один сервер, а несколько (например, Proxmox-кластер с парой нод плюс отдельный мини-ПК) - необязательно поднимать Dozzle на каждом из них. Можно поставить агент на удалённых хостах и подключить их к одному основному Dozzle.
На удалённом хосте:
services:
dozzle-agent:
image: amir20/dozzle:latest
container_name: dozzle-agent
command: agent
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 7007:7007
restart: unless-stoppedНа основном хосте, где стоит веб-интерфейс, добавляем переменную с адресом агента:
environment:
- DOZZLE_REMOTE_HOST=tcp://IP_ агента:7007|Имя-хоста-в-интерфейсеМожно перечислить несколько агентов через запятую - тогда в интерфейсе Dozzle появится переключатель между хостами, и логи со всех серверов будут доступны из одного окна браузера.
Безопасность#
- Монтируйте
docker.sockтолько в режиме:ro- Dozzle не нуждается в правах на запись для базового просмотра логов. - Если планируете использовать Actions (управление контейнерами) - обязательно включайте авторизацию, иначе это открытая дверь в управление всем Docker-хостом.
- Для дополнительной изоляции можно поставить между Dozzle и сокетом прокси вроде
tecnativa/docker-socket-proxy, который ограничивает, какие именно Docker API-эндпоинты доступны наружу. - Как и любой сервис с доступом к докер-сокету, не выставляйте Dozzle напрямую в интернет без reverse-proxy, SSL и авторизации.
Плюсы и минусы#
Плюсы#
- Бесплатно и с открытым исходным кодом.
- Действительно нулевая настройка - установил и сразу видишь логи.
- Лёгкий - минимальный расход ресурсов, отлично подходит для homelab.
- Мультихост-режим через агентов - логи со всех серверов в одном окне.
- Встроенная авторизация, при этом есть возможность закрыть доступ, в том числе через forward-proxy с уже имеющимся SSO.
Минусы#
- Логи не хранятся отдельно - Dozzle показывает то, что физически хранит сам Docker, и после ротации/удаления контейнера история пропадает.
- Не замена полноценному стеку логирования (Loki/Grafana, ELK) для долгого хранения и сложной аналитики.
- Actions - мощная функция, которая требует аккуратной настройки авторизации, иначе это риск для безопасности.
Как начать использовать#
- Поднимаем контейнер по
docker-compose.ymlвыше, смонтировавdocker.sockв режиме:ro. - Открываем веб-интерфейс и проверяем, что видны логи всех контейнеров хоста (логи Traefik просто так не увидеть).
- Настроить авторизацию - simple через
dozzle generateили forward-proxy через уже имеющийся SSO. - При необходимости включить
DOZZLE_ENABLE_ACTIONSдля управления контейнерами из интерфейса. - Если серверов несколько - поднять
dozzle agentна остальных хостах и подключить их черезDOZZLE_REMOTE_HOST. - Закрыть сервис за reverse-proxy с SSL, как и остальные сервисы в этом блоге.
Заключение#
Dozzle - один из тех инструментов, которые ставишь один раз и потом уже не представляешь, как же я жил без него (да нормально жил, скажу я тебе). Он не заменяет полноценный мониторинг и не хранит логи долго, зато решает основную задачу - быстро посмотреть, что происходит с контейнером прямо сейчас - без доступа к терминалу. Отлично дополняет уже знакомые по моему блогу Diun и панели управления вроде Komodo или Dockhand - вместе они закрывают большую часть повседневных задач по обслуживанию Docker-хоста (хотя они и сами могу показывать логи, если честно).





