Поднимаем сервер мониторинга Zabbix 7 + TimescaleDB в docker
Исходный сайт представленного материала: r4ven.me
Приветствую!
В данной инструкции мы с вами развернем популярную систему мониторинга Zabbix с использованием TimescaleDB – плагина для БД PostgreSQL, позволяющего эффективно работать с “временнЫми рядам”. Все это добро мы завернем внутрь docker контейнеров 🐳. Будет интересно 😉.
Напомню, что в одной из прошлых заметок мы обсуждали, что такое системы мониторинга в IT, какие виды бывают и немного узнали о популярных реализациях на сегодняшний день, среди которых – Zabbix.
Присоединяйтесь к нашему каналу в телеграм: t.me/r4ven_me, уведомления о новых постах приходят туда в день публикации. А если у вас есть вопросы или просто желание пообщаться по тематике – заглядывайте в чат: t.me/r4ven_me_chat.
Сразу прошу обратить внимание на то, что все действия описанные в данном руководстве вы делаете на свой риск и ответственность. Прошу это понимать. Мой блог – лишь площадка, где я рассказываю про свой опыт и делюсь своим мнением по каким-либо вещам и явлениям. Спасибо за понимание.Иван Чёрный
Введение
Особенностью инсталяции, описываемой в этой статье является не только развертывание системы мониторинга Zabbix в docker контейнерах, но и использование ее в связке с базой данных временных рядов – TimescaleDB.
Прежде чем мы начнем, давайте дадим несколько определений в качестве введения.
Zabbix — это открытая платформа для мониторинга сетей и серверов. Для хранения данных использует реляционные СУБД, например: PostgreSQL, MySQL, MariaDB, Oracle, SQLite и т.д.
Временные ряды в базах данных (time series) — это набор данных, упорядоченных по времени, где значения регистрируются через равные или неравные интервалы времени.
Базы данных временных рядов (time series database) — это специализированные базы данных, предназначенные для эффективного хранения, управления и анализа временных рядов. Часто это no sql базы данных.
TimescaleDB (TSDB) — это расширение для PostgreSQL, которое оптимизирует работу с временными рядами в данной СУБД, сохраняя при этом всю мощь и гибкость классических SQL like баз данных. С определенного времени Zabbix научился работать с данной СУБД.
Цитата из официальной документации Zabbix:
Zabbix supports TimescaleDB, a PostgreSQL-based database solution of automatically partitioning data into time-based chunks to support faster performance at scale.Zabbix.com
Для лучшего понимания причины выбора именно такой связки, рекомендую статью на Habr: Zabbix, временные ряды и TimescaleDB.
Прошу вас также обратить внимание на предупреждение из оф. документации Zabbix:
Warning: Currently, TimescaleDB is not supported by Zabbix proxy.Zabbix.com 09.2024
Уверен, что в будущем это поправят. А пока хватит трепа, переходим к делу🤵♂️.
Подготовка
Разворачивать Zabbix будем в среде дистрибутива Debian 12 💿 с установленным Docker engine 🐳. Если у вас еще нет готового Linux сервера, то рекомендую мои предыдущие статьи:
- Установка сервера Debian 12 в VirtualBox
- Начальная настройка Linux сервера на примере Debian
- Установка Docker engine на Linux сервер под управлением Debian
Также для дальнейшей работы нам понадобится пользователь с правами root.
Установка необходимых утилит
Сегодня нам понадобятся утилиты для взаимодействия с веб. Открываем терминал и устанавливаем систему контроля версий git
и утилиту curl
:
sudo apt update && sudo apt install -y git curl
Скачивание файлов проекта
Все файлы проекта находятся в моем репозитории на GitHub. Клонируем его с помощью установленной ранее утилиты git
по пути /opt/zabbix
:
sudo git clone https://github.com/r4ven-me/zabbix /opt/zabbix
docker-compose.yml – файл описания сервисов, запускаемых в docker контейнерах:
Секция NETWORK – определяет две виртуальные сети docker:
zbx_net_backend
– изолированная сеть для взаимодействия контейнеровpostgres-server,
zabbix-server
,zabbix-web
иzabbix-agent
;zbx_net_frontend
– сеть с доступом к контейнерам со стороны хостовой ОС: для контейнеровzabbix-server
иzabbix-web
.
Секция SERVICES – определяет параметры запускаемых сервисов/контейнеров:
postgres-server
– сервис СУБД TimescaleDB;zabbix-server
– сервис Zabbix сервера;zabbix-web
– сервис веб интерфейса для Zabbix сервера (под капотом nginx + php-fpm);zabbix-agent
– сервис агента Zabbix для сбора метрик с самого сервера Zabbix.
Секция SECRETS – определяет файлы, содержащие чувствительную информацию, которые прокидываются внутрь контейнеров postgres-server
, zabbix-server
и zabbix-web
:
POSTGRES_USER
(файл./env/.POSTGRES_USER
) – имя пользователь для базы данных Zabbix в СУБД TimescaleDB;POSTGRES_PASSWORD
(файл./env/.POSTGRES_PASSWORD
) – соответственно, пароль пользователя.
env – директория с файлами, содержащие переменные окружения, значения которых передаются внутрь контейнера при его запуске:
.env_db
– параметры дляpostgres-server
;.env_srv
– параметры дляzabbix-server
;.env_web
– параметры дляzabbix-web
;.env_agent
– параметры для локальногоzabbix-agent
;.POSTGRES_PASSWORD
– пароль пользователя в БД zabbix;.POSTGRES_USER
– имя пользователя в БД zabbix.
src – директория с исходными файлами для сборки кастомного контейнера zabbix-server с расширенным функционалом:
alertscripts
– директория с файлами для отправки уведомлений в Telegram:docker-entrypoint.sh
– скрипт подготовки окружения внутри контейнера (не изменялся);Dockerfile
– кастомизированный файл описания сборки образа;externalscripts
– директория со скриптом мониторинга делегирования домена.
При необходимости, отредактируйте блок deploy
у нужных сервисов в файле docker-compose.yml
, в зависимости от серверных ресурсов, которыми располагаете. По умолчанию используются самые минимальные значения.
Создание сервисного пользователя zabbix
В целях безопасности создаем ограниченные в правах группу и сервисного пользователя для запуска контейнеров zabbix:
sudo addgroup --system --gid 1995 zabbix sudo adduser --system --gecos "Zabbix monitoring system" \ --disabled-password --uid 1997 --ingroup zabbix \ --shell /sbin/nologin --home /opt/zabbix/zabbix_data zabbix
adgroup
– команда создания группы;
--system
– помечает группу, как системную и применяет к ней установленные политики;--gid 1995
– указывает явный идентификатор группы (GID) – в данном случае 1995 (именно такой GID задают разрабы Zabbix в своих контейнерах);zabbix
– название создаваемой группы;
adduser
– команда создания пользователя
--system
– помечает группу, как системную и применяет к ней установленные политики;--gecos
– позволяет задать описание пользователя;--disabled-password
– отключает пароль у пользователя (в таком случае под ним нельзя авторизоваться в системе с помощью пароля);--uid 1997
– указывает явный идентификатор пользователя (UID) – в данном случае 1997 (именно такой UID задают разрабы Zabbix в своих контейнерах);--ingroup zabbix
– добавляет пользователя в созданную ранее группу zabbix;--shell /sbin/nologin
– в качестве оболочки пользователя устанавливает nologin – под ней невозможно авторизоваться в системе;--home /opt/zabbix/zabbix_data
– задает домашний каталог пользователя, в нашем случае это директория с файлами сервисов zabbix;zabbix
– имя создаваемого пользователя.
Создание сервисного пользователя postgres
Теперь аналогичным образом создаем группу и пользователя для запуска контейнера TimescaleDB:
sudo addgroup --system --gid 70 postgres sudo adduser --system --gecos "PostgreSQL database" \ --disabled-password --uid 70 --ingroup postgres \ --shell /sbin/nologin --home /opt/zabbix/postgres_data postgres
Проверяем наличие всех нужных файлов и папок:
ls -l /opt/zabbix
Создание пароля для базы данных Postgres
По умолчанию в файле /opt/zabbix/env/.POSTGRES_PASSWORD
я задал для БД zabbix одноименный пароль. Но крайне рекомендую сгенерировать новый, например такой командой:
tr -cd "[:alnum:]" < /dev/urandom | head -c 30 \ | sudo tee /opt/zabbix/env/.POSTGRES_PASSWORD
Команда tr -cd
с помощью механизма перенаправления стандартных потоков получает на ввод латинские буквы и цифры (класс символов [:alnum:]
), генерируемые псевдоустройством /dev/urandom
. Затем команда head
, получая данные по конвейеру, с помощью ключа -c
отбирает 30 первых символов (байт). И в конце, полученная псевдорандомная строка передается на ввод команде tee
, запущенной от имени суперпользователя. Полученные данные tee
записывает в указанный файл (/opt/zabbix/env/.POSTGRES_PASSWORD
) и дублирует вывод в стандартный поток (stdout).
Не обращайте внимания на символ%
в конце строки моего примера. Это особенность командной оболочки ZSH, которая выводит его (или#
для root) при отсутствии символа перевода строки.
Запуск Zabbix стека с помощью docker compose
Старт Postgres сервера
Первым запускаем сервер СУБД, такой командой:
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d postgres-server
После загрузки образа и запуска контейнера смотрим его вывод:
sudo docker logs -f postgres-server
При успешном запуске, вы увидите подобное:
При первом старте, внутри контейнера выполняются скрипты подготовки окружения и базовой конфигурации СУБД в зависимости от параметров сервера. В одном из моих тестов такой скрипт выставлял параметр max_connections
равным 25
– чего недостаточно даже для импорта схемы БД zabbix и процесс выпадет в ошибку:
FATAL: sorry, too many clients already
Проверить значение max_connections
можно такой командой:
sudo grep 'max_connections' /opt/zabbix/postgres_data/postgresql.conf
Если у вас <=25
, то этот параметр необходимо увеличить. Открываем файл на редактирование любым консольным редактором, например, Vim/Neovim 😎:
sudo vim /opt/zabbix/postgres_data/postgresql.conf
max_connections = 25
max_connections = 200
Сохраняем файл, выходим из редактора.
Для применения изменений перезапускаем контейнер postgres-server
и проверяем текущее значение max_connections
:
sudo docker compose -f /opt/zabbix/docker-compose.yml restart postgres-server sudo docker exec -it postgres-server psql -U zabbix -c "SHOW max_connections;"
Все применилось, переходим к запуску контейнера zabbix-server
.
Старт Zabbix сервера
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d zabbix-server
sudo docker logs -f zabbix-server
При первом запуске, котейнер запустит создание базы. Это займет некоторое время. Вывод остановится на такой строке:
Creating 'zabbix' schema in PostgreSQL
Обязательно дождитесь завершения процедуры создания БД!
При успешном запуске вы должны увидеть что-то подобное:
Возможно в самом конце будет вывод, подобный этому:
256:20240922:121849.602 Zabbix agent item "system.cpu.util[,system]" on host "Zabbix server" failed: first network error, wait for 15 seconds 225:20240922:121855.944 item "Zabbix server:zabbix[vmware,buffer,pused]" became not supported: No "vmware collector" processes started. 225:20240922:121858.958 item "Zabbix server:zabbix[process,report writer,avg,busy]" became not supported: No "report writer" processes started. 225:20240922:121859.962 item "Zabbix server:zabbix[process,report manager,avg,busy]" became not supported: No "report manager" processes started. 256:20240922:121904.599 Zabbix agent item "system.users.num" on host "Zabbix server" failed: another network error, wait for 15 seconds 256:20240922:121919.602 Zabbix agent item "system.cpu.load[all,avg5]" on host "Zabbix server" failed: another network error, wait for 15 seconds 225:20240922:121928.010 item "Zabbix server:zabbix[connector_queue]" became not supported: connector is not initialized: please check "StartConnectors" configuration parameter 225:20240922:121929.016 item "Zabbix server:zabbix[process,connector manager,avg,busy]" became not supported: No "connector manager" processes started. 225:20240922:121930.021 item "Zabbix server:zabbix[process,connector worker,avg,busy]" became not supported: No "connector worker" processes started. 256:20240922:121934.600 temporarily disabling Zabbix agent checks on host "Zabbix server": interface unavailable
Проверяем статус запущенных контейнеров:
sudo docker ps
Создание схемы для TimescaleDB
Выводим созданный ранее пароль в терминал, скоро он нам понадобится. Затем подключаемся к оболочке контейнера zabbix-server
:
sudo cat /opt/zabbix/env/.POSTGRES_PASSWORD sudo docker exec -it zabbix-server bash
Теперь импортируем схему TimescaleDB с помощью SQL скрипта, который разработчики Zabbix любезно положили в системные файлы. При вводе команды импорта у нас запросят пароль от БД, который мы вывели на предыдущем шаге:
psql -h postgres-server -U zabbix zabbix < /usr/share/doc/zabbix-server-postgresql/timescaledb.sql
Процесс импорта представляет собой простое перенаправление содержимого SQL скрипта на вводе команды подключения к БД с помощью psql
.
Выходим из контейнера zabbix-server
и проверяем наличие информации о чанках (chunks) в Postgres:
exit sudo docker exec -it postgres-server \ psql -U zabbix -c "SELECT * FROM chunks_detailed_size('history')"
Если вывод у вас такой же, как на скрине выше, то все импортировалось успешно 🥳.
На этом этапе БД Postgres/TimesacleDB и Zabbix сервер готовы 😉.
Старт всего стека TimesacleDB + Zabbix server + Zabbix web + Zabbix agent
Останавливаем запущенные контейнеры и запускаем всю инсталляцию, включая Zabbix web и Zabbix agent:
sudo docker compose -f /opt/zabbix/docker-compose.yml down sudo docker compose -f /opt/zabbix/docker-compose.yml up -d
Проверяем все ли контейнеры запустились корректно:
sudo docker ps sudo docker compose -f /opt/zabbix/docker-compose.yml logs -f
Отлично. Теперь проверим работу самого Zabbix:
curl -I http://localhost:8080 nc -zv localhost 10051 ss -tulnap | grep -E '8080|10051'
Первой командой мы проверили доступность веб интерфейса из консоли, второй – доступность порта zabbix-server
, а третьей вывели порты, прослушиваемые хостовой ОС.
Доступ к веб интерфейсу Zabbix
Способ получения доступа к веб интерфейсу Zabbix зависит от условий, в которых вы разворачивали стек. Я опишу несколько очевидных вариантов.
1) Если Zabbix сервер развернут на локальной машине
Просто вбейте в браузере URL 😁😁😁:
http://127.0.0.1:8080/
2) Если Zabbix сервер развернут на удаленном сервере, который находится в локальной или VPN сети
В таком случае отредактируйте настройки сети для сервисов zabbix-server
и zabbix-web
в docker-compose.yml
файле.
Например, внутренний адрес моего сервера в сети VPN: 192.168.122.24
. Правлю docker-compose.yml
:
sudo vim /opt/zabbix/docker-compose.yml
sudo docker compose -f /opt/zabbix/docker-compose.yml down sudo docker compose -f /opt/zabbix/docker-compose.yml up -d sudo docker ps
На подключенном к VPN сети клиенте открываю в браузере такой URL:
http://192.168.122.24:8080/
3) Если Zabbix сервер развернут на удаленном сервере и не подключен к локальной или VPN сети
При таком раскладе можно прокинуть SSH порт либо открыть доступ напрямую или через обратный прокси, наподобие nginx. Я рассмотрю лишь первый случай, как самый простой. А еще потому, что два других выходят за рамки данной статьи 😜.
На клиенте открываем терминал и выполняем:
ssh -L 8080:127.0.0.1:8080 [email protected]
-L
– ключ перенаправления локального порта;8080
– порт, который будет слушать клиентская машина и перенаправлять его на8080
порт сервера;127.0.0.1
– адрес сервера, на котором он слушает порт;8080
– соответственно порт, на который перенаправляем;[email protected]
– пользователь и адрес SSH сервера.
Теперь открываем браузер и переходим по адресу: http://127.0.0.1:8080/
Доступ к веб интерфейсу будет пока открыта SSH сессия.
Для авторизации в веб интерфейсе используйте стандартные логин: Admin
и пароль: zabbix
Мои поздравления 😎! Zabbix сервер с TimescaleDB поднят и готов к работе 👷♂️.
Опционально
Чтобы не раздувать статью, ниже приведены ссылки на необязательные, но рекомендованные шаги инструкции 😉 на моем сайте r4ven.me.
- Минимальная начальная настройка Zabbix сервера
- Настройка автозапуска Zabbix стека с systemd
- Установка и запуск Zabbix agent в docker на удаленном хосте
- Настройка отправки уведомлений Zabbix в Telegram с графиком
Заключение
Фух..🤯 это была не самая простая статья. Особенно по объему перелопаченной информации. Но, мне кажется, оно того стоило. В итоге мы получили гибкий и легко переносимый проект системы мониторинга, работающий внутри docker контейнеров. А также мы настроили лаконичные, но информативные уведомления с графиками в Telegram, чтобы всегда быть в курсе состояния нашей инфраструктуры.
Хочется также отметить великолепную работу разработчиков Zabbix. В частности, актуальность и разнообразие docker образов и доступность файлов их сборки. После написания этой статьи, я их зауважал еще больше 👍.
Спасибо, что читаете 😊. Если возникли вопросы – приглашаю вас в Вороний чат, как вы догадались, в телеге 😅. У нас там дружное сообщество 🚶♀️🐧🚶🐧🚶♂️🐧. И обязательно подписывайтесь на основной телеграм канал: @r4ven_me, чтобы не пропустить публикации новых материалов на сайте.
Желаю успехов и нападающего прода! 😌
Используемые материалы
- Мой репозиторий zabbix сервера | GitHub
- Мой репозиторий zabbix агента | GitHub
- Временной ряд | Википедия
- Zabbix, временные ряды и TimescaleDB | Habr
- Использование TimescaleDB с Zabbix | Zabbix.com (EN)
- Исходные файлы docker, которые я адаптировал | GitHub
- Реестр docker образов TimescaleDB | Dockerhub
- Описание docker образа PostgresSQL | Dockerhub
- Исходные файлы docker образов TimescaleDB | GitHub
- Описание docker образа Zabbix server | Dockerhub
- Описание docker образа Zabbix web | Dockerhub
- Описание docker образа Zabbix agent | Dockerhub
- Исходный Dockerfile для Zabbix server | GitHub
- Исходные файлы Zabbix Notification Telegram | GitHub
- Описание работы скрипта Zabbix Notification Telegram | GitHub
- Инструкция по установке Zabbix Notification Telegram | GitHub