Задача клиента: розничная сеть без мониторинга
К нам обратился владелец розничной сети «ПродМаркет» — 12 продуктовых магазинов в Московской области. Клиент столкнулся с типичной, но крайне болезненной проблемой: серверы и кассовые узлы в магазинах периодически выходили из строя, а единственный IT-специалист узнавал об этом только когда звонили раздражённые продавцы. Иногда простой длился часами — касса не работала, продажи останавливались, покупатели уходили к конкурентам.
Ситуация на момент обращения:
- 12 магазинов с локальными серверами (кассовое ПО, 1С, Wi-Fi контроллеры)
- Центральный офис с основным сервером баз данных и бухгалтерии
- Ноль мониторинга — IT-специалист узнавал о сбоях исключительно по звонкам из магазинов
- Среднее время реакции на инцидент — 2-3 часа
- Потери из-за простоев — по оценке клиента, до 150 000 рублей в месяц
Клиент хотел получить систему, которая мгновенно оповещает о любых проблемах, показывает состояние всей инфраструктуры на одном экране и позволяет предупреждать сбои до того, как они повлияют на бизнес.
Проведённый аудит и предложенное решение
Мы провели полный аудит инфраструктуры клиента: побывали в трёх магазинах, изучили серверное оборудование, каналы связи между точками и текущие средства администрирования. По результатам аудита мы предложили внедрить Zabbix 7 — одну из самых зрелых и функциональных систем мониторинга с открытым исходным кодом.
Версия 7, выпущенная в 2024 году, стала значительным шагом вперёд в области производительности и автоматизации. Для данного проекта были особенно важны следующие нововведения:
- Переработанный веб-интерфейс — быстрая загрузка дашбордов, улучшенная навигация, поддержка тёмной темы
- Улучшенный механизм Proxy — поддержка пассивных и активных прокси-групп для балансировки нагрузки
- Новые типы элементов данных — расширенная поддержка Prometheus-метрик и браузерного мониторинга
- Оптимизация работы с БД — значительное ускорение операций с историей данных при использовании TimescaleDB
- Расширенный API — новые методы для управления конфигурацией через автоматизацию
В ходе аудита мы обнаружили, что в каждом магазине работает по 2-4 устройства: кассовый сервер (Debian Linux), коммутатор, Wi-Fi точка доступа и иногда IP-камера. В головном офисе — основной сервер базы данных, файловый сервер и маршрутизатор. Суммарно — около 50 устройств, которые никто не контролировал. Мы также выяснили, что VPN-каналы между магазинами и офисом работают нестабильно — пропадают на 5-15 минут несколько раз в день. Это определило выбор архитектуры с локальными Proxy-серверами в каждом магазине.
Спроектированная архитектура: компоненты и их взаимодействие
Исходя из распределённой структуры сети клиента, мы спроектировали многоуровневую архитектуру мониторинга:
- Zabbix Server — центральный процесс в головном офисе, собирающий данные, обрабатывающий триггеры и отправляющий оповещения
- Zabbix Frontend — веб-интерфейс на PHP для управления и визуализации, доступный IT-отделу
- PostgreSQL Database — хранилище конфигурации и исторических данных
- Zabbix Agent 2 — лёгкий агент, установленный на каждом сервере в магазине и офисе
- Zabbix Proxy — промежуточные серверы в каждом магазине для надёжного сбора данных даже при нестабильном VPN-канале
Агенты на серверах собирают метрики (CPU, RAM, диски, сеть) и отправляют их на локальный Proxy в магазине. Proxy буферизирует данные и передаёт на центральный Zabbix Server в офисе. Сервер обрабатывает триггеры и при необходимости отправляет уведомления через Telegram. Для инфраструктуры клиента (около 50 хостов) одного центрального сервера было достаточно.
Планирование ресурсов
Мы подготовили план ресурсов с запасом на рост:
| Параметр | До 100 хостов | 100-500 хостов | 500+ хостов |
|---|
| CPU | 2 ядра | 4 ядра | 8+ ядер |
| RAM | 4 ГБ | 8 ГБ | 16+ ГБ |
| Диск | 50 ГБ SSD | 200 ГБ SSD | 500+ ГБ NVMe |
| База данных | PostgreSQL 15 | PostgreSQL 15 | PostgreSQL 15 + TimescaleDB |
Центральный сервер Zabbix мы разместили на существующем сервере в офисе — 4 ядра, 8 ГБ RAM, SSD. В качестве СУБД рекомендовали PostgreSQL — она показывает лучшую производительность и поддерживает TimescaleDB для сжатия исторических данных.
Вот наше решение: установка Zabbix 7 на Debian 12
Мы приступили к установке всех компонентов на чистый Debian 12 (Bookworm). Использовали связку Zabbix Server + PostgreSQL + Nginx.
Подготовка системы и подключение репозитория
Обновили систему и установили необходимые пакеты:
# Обновление системы
apt update && apt upgrade -y
# Установка необходимых пакетов
apt install -y wget gnupg2 lsb-release software-properties-common
# Добавление репозитория Zabbix 7
wget https://repo.zabbix.com/zabbix/7.0/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.0+debian12_all.deb
dpkg -i zabbix-release_latest_7.0+debian12_all.deb
apt update
Установили основные компоненты:
# Установка Zabbix сервера, фронтенда и агента
apt install -y zabbix-server-pgsql zabbix-frontend-php php8.2-pgsql \
zabbix-nginx-conf zabbix-sql-scripts zabbix-agent2
# Установка PostgreSQL
apt install -y postgresql postgresql-client
Проверили корректность установки:
dpkg -l | grep zabbix
zabbix_server --version
Настройка базы данных PostgreSQL
Создали пользователя и базу данных для Zabbix:
# Переключаемся на пользователя postgres
sudo -u postgres psql
-- Создаём пользователя
CREATE USER zabbix WITH PASSWORD 'STRONG_PASSWORD_HERE';
-- Создаём базу данных
CREATE DATABASE zabbix OWNER zabbix;
-- Устанавливаем расширение для TimescaleDB (опционально)
-- \c zabbix
-- CREATE EXTENSION IF NOT EXISTS timescaledb;
\q
Импортировали начальную схему:
# Импорт схемы (занимает 1-3 минуты)
zcat /usr/share/zabbix-sql-scripts/postgresql/server.sql.gz | \
sudo -u zabbix psql zabbix
Настроили пароль в конфигурации Zabbix Server:
# Редактируем конфигурацию
nano /etc/zabbix/zabbix_server.conf
# Находим и устанавливаем параметры:
DBPassword=STRONG_PASSWORD_HERE
DBHost=localhost
DBName=zabbix
DBUser=zabbix
Настройка Nginx и PHP для веб-интерфейса
Сконфигурировали Nginx для фронтенда:
# Редактируем конфигурацию Nginx
nano /etc/zabbix/nginx.conf
# Раскомментируем и настраиваем:
listen 80;
server_name zabbix.example.com;
Настроили параметры PHP:
# Редактируем PHP-FPM конфигурацию
nano /etc/zabbix/php-fpm.conf
# Проверяем параметры:
php_value[max_execution_time] = 300
php_value[memory_limit] = 256M
php_value[post_max_size] = 32M
php_value[upload_max_filesize] = 16M
php_value[max_input_time] = 300
php_value[date.timezone] = Europe/Moscow
Запустили все службы:
# Запуск и включение служб
systemctl enable --now zabbix-server zabbix-agent2 nginx php8.2-fpm
# Проверка статуса
systemctl status zabbix-server
systemctl status nginx
Прошли мастер первоначальной настройки, сменили пароль по умолчанию и создали отдельные учётные записи для IT-специалистов клиента.
Подключение хостов и настройка шаблонов мониторинга
После установки центрального сервера мы приступили к подключению всех устройств сети клиента — серверов в магазинах, офисного оборудования и сетевых устройств.
Этот этап оказался самым трудоёмким — нужно было установить агенты на серверы во всех 12 магазинах, часть из которых находилась в 40-50 километрах от офиса. Мы подготовили скрипт автоматической установки и настройки агента, который IT-специалист клиента мог запустить через SSH на каждом сервере. Весь процесс подключения одного магазина занимал 15-20 минут: установка агента, регистрация в Zabbix, привязка шаблонов и проверка сбора данных. За два рабочих дня все 12 магазинов были подключены к мониторингу.
Установка Zabbix Agent 2 на серверы в магазинах
На каждый сервер в магазинах мы установили Zabbix Agent 2 — новую версию агента на Go с поддержкой плагинов:
# На Debian/Ubuntu целевого хоста
wget https://repo.zabbix.com/zabbix/7.0/debian/pool/main/z/zabbix-release/zabbix-release_latest_7.0+debian12_all.deb
dpkg -i zabbix-release_latest_7.0+debian12_all.deb
apt update
apt install -y zabbix-agent2
# Настройка агента
nano /etc/zabbix/zabbix_agent2.conf
Мы применили следующую конфигурацию:
# IP-адрес Zabbix сервера
Server=192.168.1.10
# Для активных проверок
ServerActive=192.168.1.10
# Уникальное имя хоста (должно совпадать с именем в веб-интерфейсе)
Hostname=web-server-01
# Разрешаем удалённые команды (опционально)
AllowKey=system.run[*]
# Таймаут выполнения проверок
Timeout=10
# Запуск и автозагрузка агента
systemctl enable --now zabbix-agent2
# Проверка работоспособности
zabbix_agent2 -t system.uptime
Для Windows-систем в офисе использовали MSI-установщик с аналогичными параметрами (C:\Program Files\Zabbix Agent 2\zabbix_agent2.conf).
Добавление хостов и привязка шаблонов
Для каждого хоста настроили мониторинг: Data collection → Hosts → Create host:
- Host name — совпадает с Hostname в конфигурации агента
- Visible name — «Магазин №3 — Кассовый сервер»
- Groups — группы по магазинам и типам устройств
- Interfaces — Agent interface с IP-адресом и портом 10050
Шаблоны для Linux-серверов:
- Linux by Zabbix agent — CPU, память, диски, сеть, процессы
- Zabbix agent — состояние агента
- Nginx by Zabbix agent — для серверов с Nginx
- PostgreSQL by Zabbix agent 2 — для серверов с PostgreSQL
Пользовательские шаблоны для кассового ПО
Встроенных шаблонов оказалось недостаточно — клиенту требовался мониторинг кассового ПО. Мы создали пользовательский шаблон:
- Template name: Custom Web Application
- Groups: Templates/Applications
Добавили элемент данных для мониторинга отклика кассы:
- Name: Application response time
- Type: HTTP agent
- Key: app.response.time
- URL: http://localhost:8080/health
- Type of information: Numeric (float)
- Update interval: 30s
Для мониторинга специфических метрик использовали UserParameter:
# В zabbix_agent2.conf или в /etc/zabbix/zabbix_agent2.d/custom.conf
UserParameter=app.connections,ss -tn state established | grep :8080 | wc -l
UserParameter=app.queue.length,redis-cli llen task_queue 2>/dev/null || echo 0
UserParameter=app.disk.usage[*],df -P $1 | tail -1 | awk '{print $5}' | tr -d '%'
systemctl restart zabbix-agent2
# Проверка с сервера
zabbix_get -s 192.168.1.20 -k app.connections
Настройка триггеров, дашбордов и оповещений
Ключевое требование клиента — мгновенно узнавать о проблемах и видеть состояние всей сети на одном экране. Мы настроили систему триггеров с разными уровнями серьёзности, создали наглядные дашборды и подключили оповещения в Telegram.
Помимо стандартных триггеров на CPU, память и диски, мы создали бизнес-триггеры, специфичные для розничной сети: мониторинг доступности кассового ПО, контроль VPN-туннелей между магазинами и офисом, отслеживание состояния UPS (источников бесперебойного питания). Мы также настроили корреляцию событий — если VPN-туннель до магазина падает, Zabbix не генерирует десятки алертов по каждому хосту в этом магазине, а создаёт одну проблему «Магазин N недоступен» с агрегированной информацией.
Триггеры, адаптированные под бизнес клиента
Мы настроили триггеры, ориентированные на критичные для розничной сети события:
# Высокая загрузка CPU (более 90% в течение 5 минут)
Name: CPU utilization is too high on {HOST.NAME}
Severity: High
Expression: min(/Linux by Zabbix agent/system.cpu.util,5m)>90
# Диск заполнен более чем на 90%
Name: Disk space is critically low on {HOST.NAME}
Severity: Disaster
Expression: last(/Linux by Zabbix agent/vfs.fs.size[/,pused])>90
# Сервис не отвечает
Name: {HOST.NAME} is unreachable
Severity: Disaster
Expression: max(/Linux by Zabbix agent/agent.ping,3m)=0
# Мало свободной памяти (менее 10%)
Name: Lack of free memory on {HOST.NAME}
Severity: Warning
Expression: last(/Linux by Zabbix agent/vm.memory.util)>90
# Высокая нагрузка на диск (iowait)
Name: High disk IO wait on {HOST.NAME}
Severity: Warning
Expression: avg(/Linux by Zabbix agent/system.cpu.util[,iowait],10m)>30
Уровни серьёзности настроили с учётом приоритетов клиента: Disaster (касса не работает) вызывает немедленный звонок, High — Telegram с требованием реакции, Warning — для планового обслуживания.
Дашборд «Обзор сети магазинов»
Создали специальный дашборд для видимости всех 12 магазинов на одном экране:
- Problems — список текущих проблем с фильтрацией по серьёзности
- Host availability — карта доступности хостов по магазинам
- Graph (classic) — графики загрузки CPU и памяти кассовых серверов
- Top hosts — топ хостов по загрузке ресурсов
- Map — топологическая карта сети с расположением магазинов
Также создали топологическую карту в Monitoring → Maps со всеми магазинами, офисом и связями между ними. Состояние каждого магазина отображается цветом иконки.
Telegram-бот и email-оповещения
Настроили email через SMTP Яндекса (Alerts → Media types → Email) и создали Telegram-бота для мгновенных оповещений IT-отделу:
curl -s https://api.telegram.org/bot<TOKEN>/getUpdates | python3 -m json.tool
Шаблон информативного сообщения:
Subject: [{TRIGGER.SEVERITY}] {TRIGGER.NAME} on {HOST.NAME}
Body:
Проблема: {TRIGGER.NAME}
Хост: {HOST.NAME} ({HOST.IP})
Серьёзность: {TRIGGER.SEVERITY}
Время: {EVENT.DATE} {EVENT.TIME}
Текущее значение: {ITEM.LASTVALUE}
Описание: {TRIGGER.DESCRIPTION}
Event ID: {EVENT.ID}
Теперь IT-специалист получает Telegram-уведомление за секунды вместо часов ожидания звонка из магазина.
Автообнаружение сети и SNMP-мониторинг оборудования
Помимо серверов, в магазинах клиента были коммутаторы, Wi-Fi точки и другое оборудование. Мы настроили автоматическое обнаружение устройств.
Автоматическое обнаружение стало одной из самых полезных функций для клиента. Когда в магазине №9 заменили неисправный коммутатор на новый, Zabbix обнаружил его автоматически через Network Discovery и начал мониторинг без какого-либо вмешательства IT-специалиста.
Автообнаружение хостов в сети
Для каждой подсети настроили правила обнаружения: Data collection → Discovery:
- IP range: 192.168.1.1-254
- Update interval: 1h
- Checks: Zabbix agent, SNMP, ICMP ping
Действия для обнаруженных хостов: автоматическое добавление в группу «Discovered hosts» и привязка шаблона. Новое оборудование в магазине подхватывается автоматически.
Для облачных сред Zabbix 7 поддерживает обнаружение через API: VMware vCenter, AWS CloudWatch, Azure Monitor.
Мониторинг коммутаторов и Wi-Fi через SNMP
Сетевое оборудование подключили через SNMP:
apt install -y snmp snmp-mibs-downloader
# Проверка доступности SNMP на устройстве
snmpwalk -v2c -c public 192.168.1.1 sysDescr
Для каждого устройства создали хост с SNMP-интерфейсом и привязали соответствующий шаблон:
- Cisco IOS by SNMP — для Cisco
- MikroTik by SNMP — для RouterOS
- Generic by SNMP — универсальный шаблон
- HP Enterprise Switch by SNMP — для HP/Aruba
Шаблоны автоматически обнаружили интерфейсы и создали метрики для каждого порта: трафик, ошибки, состояние, скорость.
Распределённый мониторинг через Zabbix Proxy
Для надёжного мониторинга 12 магазинов мы развернули Zabbix Proxy в каждой точке — VPN-каналы между магазинами и офисом иногда нестабильны, а Proxy буферизирует данные.
Решение с Proxy оказалось стратегически верным: уже через неделю после запуска один из магазинов потерял VPN-связь с офисом на 4 часа из-за проблем у интернет-провайдера. Zabbix Proxy в магазине продолжал собирать данные в локальный буфер, и когда связь восстановилась, все метрики за период offline были автоматически отправлены на центральный сервер. Ни один элемент данных не был потерян — IT-специалист увидел полную картину, включая период недоступности канала.
Установка Proxy в магазинах
На каждом сервере магазина установили Proxy с SQLite:
# Установка
apt install -y zabbix-proxy-sqlite3
# Конфигурация
nano /etc/zabbix/zabbix_proxy.conf
Мы применили следующую конфигурацию:
# Режим работы: 0 — активный
ProxyMode=0
# Адрес Zabbix сервера
Server=zabbix.example.com
# Уникальное имя прокси
Hostname=proxy-office-spb
# Путь к базе данных SQLite
DBName=/var/lib/zabbix/proxy.db
# Частота отправки данных
DataSenderFrequency=5
# Буферы
ProxyLocalBuffer=2
ProxyOfflineBuffer=24
# Процессы сбора данных
StartPollers=10
StartPollersUnreachable=3
systemctl enable --now zabbix-proxy
Оптимизация производительности и бэкапы
Для стабильной долгосрочной работы выполнили оптимизации:
Housekeeper — очистка старых данных:
# В zabbix_server.conf
HousekeepingFrequency=1
MaxHousekeeperDelete=10000
Оптимизация PostgreSQL:
# В postgresql.conf
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 64MB
maintenance_work_mem = 512MB
wal_buffers = 64MB
checkpoint_completion_target = 0.9
random_page_cost = 1.1
Настроили ежедневное резервное копирование:
# Бэкап конфигурации Zabbix
pg_dump -U zabbix --schema-only zabbix > /backup/zabbix_schema_$(date +%Y%m%d).sql
# Бэкап конфигурационных данных
pg_dump -U zabbix -t hosts -t items -t triggers -t actions \
-t media -t users zabbix > /backup/zabbix_config_$(date +%Y%m%d).sql
Результаты внедрения
Проект занял 2 недели — от аудита до полностью работающей системы мониторинга. Вот измеримые результаты, которых мы достигли для клиента:
- Время реакции на инциденты сократилось с 2-3 часов до 5-10 минут благодаря Telegram-оповещениям и дашбордам
- Под мониторингом — 48 хостов (серверы, коммутаторы, Wi-Fi точки) во всех 12 магазинах и офисе
- Предотвращённые инциденты — за первый месяц триггеры предупредили о 3 заполняющихся дисках и 2 проблемах с памятью до того, как они привели к сбоям
- Снижение потерь от простоев — с 150 000 до менее 20 000 рублей в месяц
- Распределённая архитектура — Zabbix Proxy в каждом магазине гарантирует сбор данных при нестабильных каналах связи
- Автообнаружение — новые устройства подхватываются автоматически
- Окупаемость проекта — менее одного месяца с учётом предотвращённых простоев
Особенно показательным стал случай через 10 дней после запуска: триггер «Disk space critically low» сработал на кассовом сервере в магазине №7 — диск был заполнен на 92%. IT-специалист клиента увидел Telegram-уведомление, подключился удалённо и обнаружил, что логи кассового ПО росли бесконтрольно. Проблема была решена за 15 минут — вместо падения кассы и потери продаж на несколько часов. Клиент оценил эффект ёмко: «Раньше мы тушили пожары, теперь предотвращаем их».
IT-специалист типографии получил подробную документацию по системе и двухдневное обучение от наших инженеров. Через две недели он самостоятельно добавил новый магазин в мониторинг за 30 минут — установил агент и Proxy, настроил хосты в веб-интерфейсе. Система масштабируется прозрачно и не требует нашего участия для типовых операций.