Пошаговая инструкция · Самостоятельная установка
Как установить Zabbix на сервер
Пошаговая инструкция для самостоятельной установки. Установим Zabbix 7.0 LTS через официальный Docker Compose, закроем базу данных, включим HTTPS и настроим первую проверку с уведомлением об ошибке.
Что подготовить и как читать инструкцию #
Zabbix хранит показатели и события в PostgreSQL, сервер выполняет проверки, а веб-интерфейс показывает графики и проблемы. Установим эти компоненты на одной машине. Дополнительно запустим Agent 2 для первой активной проверки: она помогает убедиться, что сбор данных работает. Затем подключим сайт и доставку уведомлений.
Используем Ubuntu 26.04 LTS как Docker-хост. Официальная документация поддерживает установку Zabbix в контейнерах; это позволяет не подменять пакеты для старой Ubuntu пакетами на новой ОС. Выбрана стабильная LTS-ветка 7.0.31. Наличие документации 8.0 не означает, что версия уже пригодна для такой установки: здесь образы development не используются.
Команды выполняйте в терминале сервера после подключения по SSH, если шаг не указывает другое место. sudo даёт команде права администратора. Действия в браузере выполняйте на своём компьютере. Домены, IP-адреса и значения ВАШ_ПАРОЛЬ из примеров заменяйте своими до выполнения команды.
Двигайтесь по одному шагу и проверяйте результат перед следующим. Блок с <<EOF или другим именем завершения копируйте целиком: он записывает содержимое одного файла. При работе в nano сохраняйте файл клавишами Ctrl+O, Enter и выходите Ctrl+X. Если прервали SSH-сеанс, снова перейдите в указанный каталог; переменные предыдущего сеанса потребуется задать заново.
Настройка внешнего доступа использует обратный прокси Nginx и Certbot для Nginx. Приложение остаётся доступным на локальном порту; снаружи открыт его HTTPS-домен.
Дополнительные официальные источники: Официальный образ Agent 2 и переменные, Настройка активных проверок агента, Почтовые уведомления, Замена портов в Compose, Docker Engine на Ubuntu.
Шаг 1. Установите инструменты #
Git скачивает официальный комплект, Python применяет настройки файлов, openssl создаёт пароль базы.
sudo apt update
sudo apt install -y git python3 openssl curlapt завершился без ошибок.
Шаг 2. Скачайте закреплённый комплект Zabbix #
Получим ветку 7.0 и переключим её на конкретный коммит. Все дальнейшие команды выполняются из /opt/zabbix.
sudo install -d -o "$USER" -g "$(id -gn)" /opt/zabbix
git clone --branch 7.0 --single-branch https://github.com/zabbix/zabbix-docker.git /opt/zabbix
cd /opt/zabbix
git checkout --detach 32578dac48f7de44d250a2cea0117f26ffa8fbe0Текущий каталог верный; checkout выбранной ревизии успешен.
Шаг 3. Закрепите версии образов #
Скрипт меняет только .env: выбирает Zabbix 7.0.31/PostgreSQL 16.15 и два Compose-файла. Проверка внутри скрипта остановит его, если ожидаемые параметры не найдены.
umask 077
python3 - <<'PYCONF'
from pathlib import Path
import re
p = Path('.env')
s = p.read_text()
for key, value in {'ZBX_IMAGE_TAG': 'alpine-7.0.31',
'POSTGRESQL_IMAGE_TAG': '16.15-alpine'}.items():
s, n = re.subn(r'^' + key + r'=.*$', key + '=' + value, s, flags=re.M)
assert n == 1, key
s += '\nCOMPOSE_PROJECT_NAME=zabbix\nCOMPOSE_FILE=compose_pgsql.yaml:compose.local.yaml\n'
p.write_text(s)
PYCONFВерсии записаны; нет ошибки assert для параметров .env.
Шаг 4. Создайте реквизиты PostgreSQL #
Compose передаёт базе секреты файлами из env_vars. Каталог закрыт для посторонних, файлы доступны контейнеру по чтению. Это не пароль пользователя веб-панели.
printf 'zabbix\n' > env_vars/.POSTGRES_USER
openssl rand -hex 32 > env_vars/.POSTGRES_PASSWORD
chmod 700 env_vars
chmod 444 env_vars/.POSTGRES_USER env_vars/.POSTGRES_PASSWORD
chmod 600 .envОба файла секретов созданы, пароль не пуст; .env защищён.
Шаг 5. Подготовьте настройки Zabbix server #
Создадим каталог экспорта с владельцем контейнера и файл настроек server. Дополнительные Java/SNMP-функции в этом первом сценарии отключены.
sudo install -d -o 1997 -g 0 zbx_env/var/lib/zabbix/export
cat > env_vars/.env_srv_override <<'EOF'
ZBX_JAVAGATEWAY_ENABLE=false
ZBX_STARTJAVAPOLLERS=0
ZBX_ENABLE_SNMP_TRAPS=false
EOFКаталог export создан с UID 1997, серверный override сохранён.
Шаг 6. Укажите часовой пояс веб-интерфейса #
Отдельный override задаёт PHP_TZ для отображения времени. Используйте свой часовой пояс, если Europe/Moscow вам не подходит.
cat > env_vars/.env_web_override <<'EOF'
PHP_TZ=Europe/Moscow
ZBX_SERVER_NAME=Мониторинг компании
EOFВеб-настройка сохранена отдельно от server.
Шаг 7. Сохраните локальный Compose override #
Откройте nano compose.local.yaml и вставьте YAML. !override заменяет прежние порты, привязывая их к localhost. Agent2 в примере наблюдает контейнер monitoring-container; для наблюдения физической ОС позже нужен её отдельный агент.
services:
zabbix-server:
ports: !override
- target: 10051
published: "10051"
host_ip: 127.0.0.1
protocol: tcp
zabbix-web-nginx-pgsql:
ports: !override
- target: 8080
published: "8080"
host_ip: 127.0.0.1
protocol: tcp
zabbix-agent2:
image: zabbix/zabbix-agent2:alpine-7.0.31
init: true
restart: unless-stopped
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_ACTIVESERVERS: zabbix-server:10051
ZBX_ACTIVE_ALLOW: "true"
ZBX_PASSIVE_ALLOW: "false"
ZBX_HOSTNAME: monitoring-container
networks:
- backendФайл сохранён с правильными отступами; порты не публикуются на внешний IP.
Шаг 8. Проверьте конфигурацию #
Compose использует два файла, заданных в .env. Если он не понимает !override, обновите Compose до поддерживаемой версии по общей подготовке.
cd /opt/zabbix
docker compose config --quietconfig --quiet завершился без ошибки.
Шаг 9. Скачайте контейнеры #
Загрузим согласованные версии компонентов. Пользовательские данные пока отсутствуют.
docker compose pullpull завершился успешно.
Шаг 10. Запустите Zabbix #
Первый запуск выполняет подготовку базы. Не прерывайте его повторным запуском другой версии.
docker compose up -dКонтейнеры созданы.
Шаг 11. Дождитесь подготовки базы и сайта #
Проверим в том числе одноразовый server-db-init; успешное завершение init нормально. Постоянные server и web должны работать.
docker compose ps -a
docker compose logs --tail=100 server-db-init zabbix-server
curl -fsS http://127.0.0.1:8080/pingНет ошибки инициализации, /ping отвечает.
Шаг 12. Откройте первый вход через SSH-туннель #
Следующую команду выполняйте на своём компьютере, заменив user/SERVER_IP учётной записью и IP сервера. Оставьте терминал открытым; в браузере откройте http://127.0.0.1:18080. Порт веб-панели не нужно открывать в Интернет для этого входа.
# На своём компьютере: замените user и SERVER_IP
ssh -L 18080:127.0.0.1:8080 user@SERVER_IPСтраница Zabbix открывается через локальный 18080.
Шаг 13. Смените первоначальный пароль #
Войдите начальной записью Admin с паролем zabbix и сразу смените его в профиле на уникальный. Для ежедневного наблюдения позднее создайте обычную запись.
Вход с новым паролем работает; стандартный больше не подходит.
Шаг 14. Сохраните сайт Nginx #
Установите Nginx и Certbot по подготовке Ubuntu, если ещё не установили. Откройте sudo nano /etc/nginx/sites-available/zabbix и вставьте файл ниже. Замените все домены своими. Nginx передаёт приложению домен, адрес клиента и протокол; Upgrade и Connection сохраняют WebSocket. До получения сертификата условие $scheme блокирует обычные HTTP-запросы кодом 403, чтобы вход не происходил без шифрования.
/etc/nginx/sites-available/zabbixmap $http_upgrade $zabbix_connection_upgrade {
default upgrade;
"" close;
}
server {
listen 80;
server_name monitor.example.org;
client_max_body_size 100m;
location / {
if ($scheme = http) { return 403; }
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $zabbix_connection_upgrade;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}
Сохраните Ctrl+O, Enter, Ctrl+X. В файле пока нет путей к сертификатам: Nginx сможет проверить его до выпуска HTTPS.
Шаг 15. Подключите сайт и проверьте HTTP #
Ссылка подключает сохранённый сайт. nginx -t проверяет все настройки сервера; && разрешает перечитать их только при успешной проверке. curl проверяет ответ для вашего домена. При ошибке остановитесь, исправьте указанную строку и повторите проверку.
sudo ln -sfn /etc/nginx/sites-available/zabbix /etc/nginx/sites-enabled/zabbix
sudo nginx -t && sudo systemctl reload nginx
curl -I http://monitor.example.org/Ожидается successful от nginx -t и HTTP 403 для обычного запроса: до HTTPS это намеренная блокировка. DNS должен указывать на сервер, TCP 80/443 — быть доступен у провайдера. Ничего не вводите в форму входа по HTTP.
Шаг 16. Получите сертификат и включите HTTPS #
Каждое имя из команды должно указывать на этот сервер. Certbot проверит домены, сам добавит сертификат в сайт Nginx и включит перенаправление HTTP → HTTPS. Укажите свою почту при запросе и подтвердите условия Let’s Encrypt. Это отдельное действие после успешной проверки HTTP.
sudo /snap/bin/certbot --nginx -d monitor.example.org --redirectCertbot сообщил об успешной установке. Откройте HTTPS-адрес со своего компьютера: браузер не должен предупреждать о сертификате. Для закрытой панели используйте разрешённый IP. При ошибке исправьте DNS, в том числе AAAA, либо доступ к TCP 80; не повторяйте запросы выпуска подряд.
Шаг 17. Проверьте продление сертификата #
Certbot из snap создаёт службу автоматического продления. Dry-run выполняет пробное продление: настоящие сертификаты не заменяются. Затем проверьте, что таймер планирует следующий запуск. Сохраняйте доступ к TCP 80 для следующих проверок домена.
sudo /snap/bin/certbot renew --dry-run
systemctl list-timers --all 'snap.certbot.renew*'Пробное продление успешно, у таймера есть следующий запуск. Если тест не прошёл, проверьте /var/log/letsencrypt/letsencrypt.log; сначала исправьте причину. После этого можно создавать учётную запись и приглашать пользователей.
Шаг 18. Добавьте тестовый узел наблюдения #
В интерфейсе создайте host с именем monitoring-container, точно совпадающим с ZBX_HOSTNAME. Назначьте подходящий Linux-шаблон активного Agent2; этот агент обращается к server сам. Дождитесь данных в Latest data.
Появляются свежие значения с правильным host. Метрики относятся контейнеру, не всей ОС физического сервера.
Шаг 19. Проверьте одно уведомление #
Подключите тестовый Media type email по данным SMTP, добавьте свой адрес пользователю и действие для выбранной тестовой проблемы. Проверяйте безопасный тестовый trigger, не выключая рабочий сервер.
В журнале видно отправку и фактическое письмо; после восстановления тестовой проблемы приходит нужное восстановительное уведомление.
Шаг 20. Проверьте журналы и закрытые порты #
Эти команды помогают отделить проблему Agent2, server, базы или HTTPS. Внутренние 8080/10051/5432 не должны слушать внешний интерфейс в выбранной схеме.
cd /opt/zabbix
docker compose logs --tail=100 zabbix-agent2 zabbix-server postgres-server
sudo ss -ltnp | grep -E ':(8080|10051|5432|10050)\b'
sudo journalctl -u nginx --since '30 minutes ago'Нет повторных ошибок подключения; внутренние порты локальные.
Шаг 21. Создайте согласованную копию #
Скрипт временно останавливает запись, выгружает базу, сохраняет конфигурацию и возвращает сервисы через trap. Рабочие файлы PostgreSQL в архив не копируются: вместо них используется pg_dump. Перенесите результат в закрытое внешнее хранилище.
cd /opt/zabbix
(
set -eu
BACKUP="/opt/zabbix-backups/$(date +%Y%m%d-%H%M%S)"
install -d -m 700 "$BACKUP"
trap 'docker compose start zabbix-server zabbix-web-nginx-pgsql zabbix-agent2' EXIT
docker compose stop zabbix-server zabbix-web-nginx-pgsql zabbix-agent2
docker compose exec -T postgres-server sh -c \
'pg_dump -U "$(cat /run/secrets/POSTGRES_USER)" -Fc zabbix' > "$BACKUP/zabbix.dump"
sudo tar --exclude=zbx_env/var/lib/postgresql/data \
-czf "$BACKUP/files.tar.gz" .env env_vars zbx_env compose*.yaml
sudo tar -czf "$BACKUP/nginx-tls.tar.gz" /etc/nginx/sites-available/zabbix /etc/letsencrypt
sudo chmod 600 "$BACKUP"/*
)В каталоге /opt/zabbix-backups есть дамп, архив и nginx-tls.tar.gz без ошибок.
Шаг 22. Подготовьте файлы на тестовой машине #
Далее работайте только на отдельной машине той же версии с пустой базой. Замените /path/to/restored-backup реальным каталогом копии и восстановите архив. Права env_vars должны позволять контейнеру читать секреты.
cd /opt/zabbix
BACKUP=/path/to/restored-backup
sudo tar -xzf "$BACKUP/files.tar.gz" -C /opt/zabbix
sudo chown -R "$USER":"$(id -gn)" env_vars
sudo chown "$USER":"$(id -gn)" .env
chmod 700 env_varsФайлы и владельцы восстановлены на тестовом сервере.
Шаг 23. Верните дамп базы #
На тестовом сервере запустите PostgreSQL и импортируйте дамп. Не выполняйте pg_restore поверх действующей рабочей базы мониторинга.
docker compose up -d postgres-server
# Дождитесь healthy у postgres-server в docker compose ps
docker compose exec -T postgres-server sh -c \
'pg_restore -U "$(cat /run/secrets/POSTGRES_USER)" -d zabbix --no-owner --exit-on-error' \
< "$BACKUP/zabbix.dump"pg_restore завершился без ошибки.
Шаг 24. Проверьте восстановленный мониторинг #
Запустите комплект на тестовой машине, откройте панель и проверьте host, настройки и исторические значения. Реальную отправку уведомлений в тестовой среде ограничьте.
Настройки внешнего доступа храните вместе с копией приложения: /etc/nginx/sites-available/zabbix и /etc/letsencrypt содержат сайт и сертификаты с закрытыми ключами. Архивируйте их с sudo в закрытое хранилище. После восстановления подключите сайт через sites-enabled, выполните sudo nginx -t, затем перечитайте Nginx. Для ошибки 502 сначала проверьте локальное приложение и /var/log/nginx/error.log; для сертификата — /var/log/letsencrypt/letsencrypt.log и таймер продления.
docker compose up -d
docker compose ps -aНастройки и данные вернулись; комплект работает без ошибок.