В данной инструкции мы с вами развернем популярную систему мониторинга Zabbix с использованием TimescaleDB — плагина для БД PostgreSQL, позволяющего эффективно работать с «временнЫми рядам». Все это добро мы завернем внутрь docker контейнеров 🐳. Будет интересно 😉.
Напомню, что в одной из прошлых заметок мы обсуждали, что такое системы мониторинга в IT, какие виды бывают и немного узнали о популярных реализациях на сегодняшний день, среди которых — Zabbix.
🖐️Эй!
Подписывайтесь на наш телеграм @r4ven_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:
Warning: Currently, TimescaleDB is not supported by Zabbix proxy.
Zabbix.com 09.2024
Уверен, что в будущем это поправят. А пока хватит трепа, переходим к делу🤵♂️.
Подготовка
Разворачивать Zabbix будем в среде дистрибутиваDebian 12 💿 с установленным Docker engine 🐳. Если у вас еще нет готового Linux сервера, то рекомендую мои предыдущие статьи:
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:
По умолчанию в файле /opt/zabbix/env/.POSTGRES_PASSWORD я задал для БД zabbix одноименный пароль. Но крайне рекомендую сгенерировать новый, например такой командой:
BASH
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 сервера
Первым запускаем сервер СУБД, такой командой:
BASH
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d postgres-server
Нажмите, чтобы развернуть и увидеть больше
После загрузки образа и запуска контейнера смотрим его вывод:
BASH
sudo docker logs -f postgres-server
Нажмите, чтобы развернуть и увидеть больше
При успешном запуске, вы увидите подобное:
При первом старте, внутри контейнера выполняются скрипты подготовки окружения и базовой конфигурации СУБД в зависимости от параметров сервера. В одном из моих тестов такой скрипт выставлял параметр max_connections равным 25 — чего недостаточно даже для импорта схемы БД zabbix и процесс выпадет в ошибку:
BASH
FATAL: sorry, too many clients already
Нажмите, чтобы развернуть и увидеть больше
Проверить значение max_connections можно такой командой:
Все применилось, переходим к запуску контейнера zabbix-server.
Старт Zabbix сервера
Запускаем его такой командой:
BASH
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d zabbix-server
Нажмите, чтобы развернуть и увидеть больше
Смотрим вывод контейнера:
BASH
sudo docker logs -f zabbix-server
Нажмите, чтобы развернуть и увидеть больше
При первом запуске, котейнер запустит создание базы. Это займет некоторое время. Вывод остановится на такой строке:
PLAINTEXT
Creating 'zabbix' schema in PostgreSQL
Нажмите, чтобы развернуть и увидеть больше
Обязательно дождитесь завершения процедуры создания БД!
При успешном запуске вы должны увидеть что-то подобное:
Возможно в самом конце будет вывод, подобный этому:
PLAINTEXT
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
Нажмите, чтобы развернуть и увидеть больше
Не обращаем на него внимания.
Проверяем статус запущенных контейнеров:
BASH
sudo docker ps
Нажмите, чтобы развернуть и увидеть больше
Все ок — идем дальше.
Создание схемы для TimescaleDB
Выводим созданный ранее пароль в терминал, скоро он нам понадобится. Затем подключаемся к оболочке контейнера zabbix-server:
Теперь импортируем схему TimescaleDB с помощью SQL скрипта, который разработчики Zabbix любезно положили в системные файлы. При вводе команды импорта у нас запросят пароль от БД, который мы вывели на предыдущем шаге:
Первой командой мы проверили доступность веб интерфейса из консоли, второй — доступность порта zabbix-server, а третьей вывели порты, прослушиваемые хостовой ОС.
Отлично, все работает 🎉🎉🎉.
Доступ к веб интерфейсу Zabbix
Способ получения доступа к веб интерфейсу Zabbix зависит от условий, в которых вы разворачивали стек. Я опишу несколько очевидных вариантов.
Клик по спойлеру для просмотра инструкции
Если Zabbix сервер развернут на локальной машине
Просто вбейте в браузере URL 😁😁😁:
BASH
http://127.0.0.1:8080/
Нажмите, чтобы развернуть и увидеть больше
Если Zabbix сервер развернут на удаленном сервере, который находится в локальной или VPN сети
В таком случае отредактируйте настройки сети для сервисов zabbix-server и zabbix-web в docker-compose.yml файле.
Например, внутренний адрес моего сервера в сети VPN: 192.168.122.24. Правлю docker-compose.yml:
BASH
sudo vim /opt/zabbix/docker-compose.yml
Нажмите, чтобы развернуть и увидеть больше
zabbix-server:
zabbix-web:
Перезапускаю все контейнеры:
BASH
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:
BASH
http://192.168.122.24:8080/
Нажмите, чтобы развернуть и увидеть больше
Если Zabbix сервер развернут на удаленном сервере и не подключен к локальной или VPN сети
При таком раскладе можно прокинуть SSH порт либо открыть доступ напрямую или через обратный прокси, наподобие nginx. Я рассмотрю лишь первый случай, как самый простой. А еще потому, что два других выходят за рамки данной статьи 😜.
На клиенте открываем терминал и выполняем:
BASH
ssh -L 8080:127.0.0.1:8080 user@example.com
Нажмите, чтобы развернуть и увидеть больше
Где (по порядку):
-L – ключ перенаправления локального порта;
8080 – порт, который будет слушать клиентская машина и перенаправлять его на 8080 порт сервера;
127.0.0.1 – адрес сервера, на котором он слушает порт;
8080 – соответственно порт, на который перенаправляем;
user@example.com – пользователь и адрес SSH сервера.
В моём примере команда такая:
Теперь открываем браузер и переходим по адресу: http://127.0.0.1:8080/
Доступ к веб интерфейсу будет пока открыта SSH сессия.
Для авторизации в веб интерфейсе используйте стандартные логин: Admin и пароль: zabbix
Если вы увидели такое:
Мои поздравления 😎! Zabbix сервер с TimescaleDB поднят и готов к работе 👷♂️.
Опционально
Ниже приведены необязательные, но рекомендованные шаги инструкции 😉.
Минимальная начальная настройка Zabbix сервера
Клик на спойлер
Не буду сильно вдаваться в подробности настройки Zabbix, т.к. это тема не одной статьи 🤯. Покажу лишь как поменять язык интерфейса, создать нового пользователя с админскими правами, отключить стандартного Admin и настроить локальный Zabbix agent для мониторинга самого Zabbix сервера.
Все действия отображены в картинках и особо в комментариях не нуждаются 😏.
Смена языка
Создание новго пользователя
И перезаходим в интерфейс уже под новым пользователем:
Отключение стандартного пользователя Admin
Подключение локального Zabbix agent
Данный агент был поднят нами, в момент запуска всей инсталяции и доступен по доменному имени zabbix-agent внутри сети контейнеров.
Тут обязательно выбираем «Подключаться через» — DNS:
Теперь переходим на страницу «Мониторинг» — «Проблемы». Через несколько минут проблема с доступностью локального zabbix-agent должна решиться:
Настройка автозапуска Zabbix стека с systemd
Клик на спойлер
В начале статьи мы создали сервисного пользователя zabbix. Используем его для безопасного запуска сервисов стека Zabbix.
Настройка sudoers для запуска Zabbix от сервисного пользователя
Разрешаем пользователю zabbix запуск и остановку сервисов, описанных в нашем docker-compose.yml, от имени привилегированной группы docker с помощью sudo.
Корректируем .env файл — файл с параметрами Zabbix агента.
BASH
sudo vim /opt/zabbix-agent/.env
Нажмите, чтобы развернуть и увидеть больше
Тут обязательно задаем существующий IP адрес хоста, на котором сервис Zabbix agent будет ожидать подключений. Также указываем хостнейм агента и адрес Zabbix сервера.
Нюанс. Если у вас на сервере примонтировано множество внешних разедлов, необходимо их добавить в блок volume в docker-compose.yml, чтобы Zabbix агент их обнаружил.
Добавление Zabbix агента на Zabbix сервер
Тут почти все в картинках 😇.
Переходим в «Мониторинг» — «Узлы сети» и через некоторое время:
Уря!🥳🥳🥳
Настройка отправки уведомлений Zabbix в Telegram с графиком
Клик на спойлер
А теперь интересное 🧐. Для реализации возможности отправки аварийных уведомлений в Telegram с графиками, я пересобрал контейнер zabbix-server, добавив в него интерпретатор Python, специальный venv и файлы из GitHub репозитория разработчика xxsokolov — данный способ отмечен на официальном сайте Zabbix, как валидный 👌.
В инструкции ниже, рассмотрен вариант использования моего образа: r4venme/zabbix-server-pgsql:alpine-7.0.3, но вы также можете собрать собственный. Все файлы для сборки вы найдете в скачанном репозитории из начала статьи, в папке src.
Приступаем к настройке.
Создание типа оповещения (веб интерфейс)
Имя (произвольное): Alerter
Тип: Скрипт
Имя скрипта: zbxTelegram.py
Параметры скрипта:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
Далее переходим на вкладку шаблоны и добавляем 2 штуки: для проблем и для восстановления:
Дальше переходим в «Права доступа». Вот тут по-хорошему, необходимо сначала настроить ограниченные группы и роли пользователей. Но это тонкий процесс, и он тоже выходит за рамки статьи. Для быстрого решения я выдаю сервисному пользователю «суперадминские» права, т.к. для работы скрипта нужны права на чтение для узлов сети и шаблонов. Тут уже на ваше усмотрение.
И в конце клик на основной «Добавить»:
Настройка условий оповещений (веб интерфейс)
Идем в «Действия триггеров» и создаем новое:
Задаем имя и добавляем условие. В условии указываем 2 шаблона, как на скрине:
Далее переходим на вкладку «Операции» и там добавляем 2 действия: для «Операции» и «Операции восстановления»:
Указываем адресата — нашего сервисного пользователя, у которого прописывали ID группы/чата в телеге. Тут же указываем способ отправки: тот, что мы создали ранее:
Примерно так:
Правка docker-compose.yml (консоль сервера)
Возвращаемся на сервер и открываем на редактирование:
BASH
sudo vim /opt/zabbix/docker-compose.yml
Нажмите, чтобы развернуть и увидеть больше
Правим сервис zabbix-server, блок image. Текущую строку комментируем, и расскоменнтирываем строку с адресом собранного мной образа:
После запуска создаем папку скриптов алармов, из докер контейнера zabbix-server копируем туда конфиг файл скрипта отправки уведомлений в телегу и меняем его владельца:
Идем в веб интерфейс по пути: «Мониторинг» — «Проблемы». Через несколько минут, агент получит статус «Недоступен», появится проблема на соответствующей веб панели и вам должно прийти уведомление в Telegram.
Сообщение пришло, отлично. Теперь запускаем агента:
Через несколько минут он восстановится в веб панели и в телеграм придет соответствующее уведомление:
Прэлэсть 🤤.
Заключение
Фух..🤯 это была не самая простая статья. Особенно по объему перелопаченной информации. Но, мне кажется, оно того стоило. В итоге мы получили гибкий и легко переносимый проект системы мониторинга, работающий внутри docker контейнеров. А также мы настроили лаконичные, но информативные уведомления с графиками в Telegram, чтобы всегда быть в курсе состояния нашей инфраструктуры.
Хочется также отметить великолепную работу разработчиков Zabbix. В частности, актуальность и разнообразие docker образов и доступность файлов их сборки. После написания этой статьи, я их зауважал еще больше 👍.
Спасибо, что читаете 😊. Если возникли вопросы — приглашаю вас в Вороний чат, как вы догадались, в телеге 😅. У нас там дружное сообщество 🚶♀️🐧🚶🐧🚶♂️🐧. И обязательно подписывайтесь на основной телеграм канал: @r4ven_me, чтобы не пропустить публикации новых материалов на сайте.
Порекоммендуете какие-нибудь полезные статьи по Zabbix? А то развернуть то это пол дела, а то и меньше, а вот дальше, что с ним делать… Система то довольно комплексная, и тут без поллитра не воткнуть… Что-то, где объясняется философия, архитектура системы и рекомендации по построению своей системы мониторинга…
Иван Чёрный:
Добрый день. Согласен, система не самая простая. Рекомендую начать изучение с официальной документации, которая к слову, хорошо переведена на русский язык: https://www.zabbix.com/documentation/6.0/ru/manual (в данном случае документация к 6-й версии Zabbix, но тут разница не велика). Особенно хочу обратить внимание на страницу с определениями: https://www.zabbix.com/documentation/6.0/ru/manual/definitions — по опыту скажу, самое важное уяснить в голове сущности Zabbix, которыми оперирует данная система мониторинга в процессе работы.
Для получения представления — этого более, чем достаточно. Далее ищите примеры настройки, по конкретным задачам, которые интересны вам. Вот несколько примеров, которыми я недавно занимался:
Вероятно ничего нового для вас не рассказал, но и вся загвоздка тут в том, что рассказывать можно оочень долго. В данном случае я придерживаюсь принципа от «частного к общему». Т.е. возникла задача настроить мониторинг какого-то сервиса или события — нашел подходящую статью и попробовал настроить аналогично.
📝 Примечание
Константин Князев:
Доброго времени суток! Подскажите, а вы не собирали образ OpenConnect последней версии для архитектуры arm64? Имею с этим сложности и уже довольно давно долблюсь с этим
Иван Чёрный:
Добрый день. Не было такой необходимости. Возможно изучу вопрос.
📝 Примечание
Антон:
Добрый день. Не подскажите если на сервере уже стоит PostgreSQL? Но версия для 1с, соответственно пользователь postgres уже создан, но с другими uid и gid, будет ли сервер бд в контейнере работать корректно и навредит ли работающей бд непосредственно на сервере?
Иван Чёрный:
Добрый день. Желательно подобные манипуляции предварительно обкатать в тестовой среде.
Docker по умолчанию ориентируется на uid:gid пользователя. Т.е. если в хостовой системе у пользователя postgres uid:gid = 1001:1001, а в контейнере 70:70, то владельцем файлов контейнера postgres будет числовые идентификаторы 70:70, либо того пользователя, который имеет эти идентификаторы.
В вашем случае сервисному пользователу для контейнера postgres можно дать другое имя, например postgres-docker, и указать идентификаторы uid:gid = 70:70 (если они не заняты). В таком случае придется скорректировать параметр user для сервиса postgres в docker-compose.yml, указав в значении просто цифры 70:70.
Ну и отредактировать соответствующие файл юнита systemd и файл sudoers, изменив имя на postgres-docker.
Если все же решите экспериментировать в продуктивной среде, то обязательно сделайте бэкап базы 1с перед внесением каких либо существенных изменений в систему.
Антон:
Большое спасибо за столь подробный ответ.
Антон:
Добрый день, после запуска контейнера сервера бд в логах пишет: «initdb: error: could not change permissions of directory «/var/lib/postgresql/data»: Operation not permitted fixing permissions on existing directory /var/lib/postgresql/data … chmod: /var/lib/postgresql/data: Operation not permitted The files belonging to this database system will be owned by user «postgres». This user must also own the server process.» Пробовал создать директорию руками и поменять владельца на 70:70, результат тот же.
Иван Чёрный:
Добрый день. Предположу, что проблема uid gid который в контейнере. Возможно поможет явное указание переменных окружения контейнера: PUID и PGID в compose файле.
Постараюсь найти время и провести тесты у себя.
Антон:
Прошу прощения, на самом деле просто домашняя папка пользователя postgres не создалась. После создания вручную, с запуском контейнера от имени пользователя с uid и gid 70:70 всё прекрасно заработало. Огромное спасибо за материал и советы!