Перейти к основному содержимому
  1. Posts/
  2. Self-Hosting/

Dozzle - удобный просмотр логов Docker-контейнеров в реальном времени

·1373 слов·7 минут· loading · loading · ·
Stilicho2011
Автор
Stilicho2011
Пишу о homelab, self-hosting, автоматизации и open-source решениях
Оглавление
Self-Hosting - This article is part of a series.
Part : This Article
Tip

Если вам понравилась эта статья, вы можете стать спонсором на 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 и сразу показывает их логи.

Warning

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
Note

Если вы не используете 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
Note

Включайте 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 - мощная функция, которая требует аккуратной настройки авторизации, иначе это риск для безопасности.

Как начать использовать
#

  1. Поднимаем контейнер по docker-compose.yml выше, смонтировав docker.sock в режиме :ro.
  2. Открываем веб-интерфейс и проверяем, что видны логи всех контейнеров хоста (логи Traefik просто так не увидеть).
  3. Настроить авторизацию - simple через dozzle generate или forward-proxy через уже имеющийся SSO.
  4. При необходимости включить DOZZLE_ENABLE_ACTIONS для управления контейнерами из интерфейса.
  5. Если серверов несколько - поднять dozzle agent на остальных хостах и подключить их через DOZZLE_REMOTE_HOST.
  6. Закрыть сервис за reverse-proxy с SSL, как и остальные сервисы в этом блоге.

Заключение
#

Dozzle - один из тех инструментов, которые ставишь один раз и потом уже не представляешь, как же я жил без него (да нормально жил, скажу я тебе). Он не заменяет полноценный мониторинг и не хранит логи долго, зато решает основную задачу - быстро посмотреть, что происходит с контейнером прямо сейчас - без доступа к терминалу. Отлично дополняет уже знакомые по моему блогу Diun и панели управления вроде Komodo или Dockhand - вместе они закрывают большую часть повседневных задач по обслуживанию Docker-хоста (хотя они и сами могу показывать логи, если честно).

Self-Hosting - This article is part of a series.
Part : This Article

Related

Подключаем приложения к общей PostgreSQL и учимся её обслуживать. Часть 2

·1712 слов·9 минут· loading · loading
Вторая часть серии про единую PostgreSQL для домашнего сервера. Создаём в pgAdmin отдельного пользователя и базу данных с минимальными правами под конкретное приложение, подключаем Authentik к общей БД вместо его собственного контейнера, и разбираем базовое обслуживание - VACUUM, ANALYZE, REINDEX и когда это вообще нужно делать руками.

Diun - уведомления об обновлениях Docker-образов

··931 слово·5 минут· loading · loading
Подробная инструкция по установке и настройке Diun для отслеживания обновлений Docker-образов. Рассмотрены шаги по развертыванию, интеграции с уведомлениями и автоматизации мониторинга, чтобы своевременно обновлять контейнеры и повышать безопасность системы.

Начальная установка PostgreSQL и pgAdmin в Docker с помощью Docker Compose для новичков. Часть 1

··1894 слов·9 минут· loading · loading
Подробная инструкция по установке и настройке PostgreSQL на сервере. Рассмотрены шаги по установке, созданию пользователей и баз данных, настройке резервного копирования и базовой безопасности для стабильной и надёжной работы.