среда, 26 августа 2026 г.

Установка zabbix в контейнер Docker. Мониторинг хоста через agent

Создаем директорию для контейнера zabbix
# mkdir /mnt/data/docker_projects/zabbix

Создаем конфигурацию PostgreSQL
# nano /mnt/data/docker_projects/zabbix/postgresql.conf
listen_addresses = '*'
port = 5432
max_connections = 100
shared_buffers = 1GB
effective_cache_size = 3GB
maintenance_work_mem = 256MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 500
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 64MB
min_wal_size = 1GB
max_wal_size = 4GB


В интерфейсе portainer переходим в окружение local.
Выбираем пункты меню Stacks --> + Add Stack.
Прописываем имя в поле Name - zabbix/
Оставляем выбор метода задания параметров Web editor.
В поле редактора конфига вносим конфигурацию:
x-logging: &default-logging
  driver: json-file
  options:
    max-size: "50m"
    max-file: "3"
services:
  postgresql:
    image: postgres:16-alpine
    container_name: zabbix-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: SecurePassword123
      POSTGRES_DB: zabbix
    volumes:
      - /mnt/data/docker_projects/zabbix/data_pgsql:/var/lib/postgresql/data:z
      - /mnt/data/docker_projects/zabbix/postgresql.conf:/etc/postgresql/postgresql.conf
    networks:
      - zabbix-net
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U zabbix -d zabbix"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    cpus: 1.5
    mem_limit: 2g
    logging: *default-logging
  zabbix-server:
    image: zabbix/zabbix-server-pgsql:ubuntu-7.0-latest
    container_name: zabbix-server
    restart: unless-stopped
    environment:
      TZ: Europe/Samara
      DB_SERVER_HOST: postgresql
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: SecurePassword123
      POSTGRES_DB: zabbix
      ZBX_CACHESIZE: 512M
      ZBX_HISTORYCACHESIZE: 128M
      ZBX_VALUECACHESIZE: 256M
      ZBX_STARTPOLLERS: 20
      ZBX_STARTTRAPPERS: 10
      ZBX_STARTDISCOVERERS: 5
    volumes:
      - /mnt/data/docker_projects/zabbix/data_zabbix_server:/var/lib/zabbix:z
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "10051:10051"
    depends_on:
      postgresql:
        condition: service_healthy
    networks:
      - zabbix-net
    cpus: 1.5
    mem_limit: 2g
    logging: *default-logging
 
  zabbix-web:
    image: zabbix/zabbix-web-apache-pgsql:ubuntu-7.0-latest
    container_name: zabbix-web
    restart: unless-stopped
    environment:
      PHP_TZ: Europe/Samara
      ZBX_SERVER_HOST: zabbix-server
      DB_SERVER_HOST: postgresql
      POSTGRES_USER: zabbix
      POSTGRES_PASSWORD: SecurePassword123
      POSTGRES_DB: zabbix
    ports:
      - "8080:8080"
    depends_on:
      zabbix-server:
        condition: service_started
      postgresql:
        condition: service_healthy
    networks:
      - zabbix-net
    cpus: 0.5
    mem_limit: 512m
    logging: *default-logging
networks:
  zabbix-net:
    driver: bridge


Открываем порт 8080 для zabbix:
# firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload

Открываем WEB-интерфейс http://IP:8080/
Логин / пароль по умолчанию: Admin / zabbix
Сразу меняем пароль в разделе User settings --> Profile --> Change password // новый_пароль
Перезаходим в Zabbix Admin / новый_пароль

Zabbix агент на хостовой машине:
Добавить репозиторий Zabbix на хостовую машину и настроить агента zabbix
# rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest.el9.noarch.rpm
# dnf clean all
# dnf install zabbix-agent -y

Настроить конфигурацию агента, что бы он в ативном режиме отправлял данные на сервер.
# nano /etc/zabbix_agentd.conf
Главные директивы:
  ServerActive=127.0.0.1:10051
  Hostname=rossyp
  RefreshActiveChecks=60

Заводим агента Zabbix в работу:
# systemctl enable zabbix-agent
# systemctl start zabbix-agent
# systemctl status zabbix-agent


В Интерфейсе Zabbix необходимо корректно прописать host, на который будут поступать данные от агента.
В активном режиме (Active Mode) агент сам инициирует соединение. Вот так прописывается хост:
Data collection → Hosts → Create host.
Host name: точное значение параметра Hostname из конфига агента rossyp.
Templates: шаблон Linux by Zabbix agent active.
Host groups: Linux servers.

Docker. Установка. Portainer CE. Установка.

1. Установка docker


1.1. Проверяем установку docker
# docker --version
# systemctl status docker

1.2 Устанавливаем docker, если его нет
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

2. Меняем root директорию docker, что бы docker не забивал корень (папку по умолчанию: /var/lib/docker/)
# mkdir -p /etc/docker
# nano /etc/docker/daemon.json
Содержимое:
{
  "data-root": "/mnt/data/docker",
  "default-address-pools": [
    {
      "base": "172.30.0.0/16",
      "size": 24
    }
  ]
}
# systemctl enable --now docker
После запуска docker все его файлы будут складываться в /mnt/data/docker
IP адреса контейнеров будут браться из 172.30.0.0/16 нарезаясь по /24.

3. Создаем папку проектов docker рядом с самой директорией для docker
# mkdir -p /mnt/data/docker_projects

4. Создаем docker контейнер с Portainer
# docker volume create portainer_data
Запускаем
# docker run -d \
  --name portainer \
  --restart=unless-stopped \
  -p 9443:9443 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v portainer_data:/data \
  portainer/portainer-ce:latest
Проверяем работу
# docker ps | grep portainer

5. Открываем порт 9443 для доступ извне:
# firewall-cmd --permanent --add-port=9443/tcp
# firewall-cmd --reload
# firewall-cmd --list-all

6. Подключаемся к серверу по WEB-интерфейсу
https://10.0.1.60:9443
Браузер заругается на сертификат, делаем исключение для сайта и продолжаем. Придумываем пароль как минимум из 12 символов



В поле "Setup token" нужно ввести токен, который генерируется при старте контейнера без пользователя.
Это поле нужно посмотреть в консоле сервера и найти строчку где встречаается "setup_token=..."
Пример:
# docker logs portainer
...
2026/08/01 03:52PM INF github.com/portainer/portainer/api/cmd/portainer/main.go:256 > no administrator account configured; admin initialization and backup restore require this setup token in the X-Setup-Token header. Start with --no-setup-token to disable. | setup_token=19af87915ebf5626320257f13245744b2d3c7da57a288107fa87edeb8fb0096c
2026/08/01 03:52PM INF github.com/portainer/portainer/api/chisel/service.go:228 > generated a new Chisel private key file | private-key=/data/chisel/private-key.pem
...
Если не успеть войти в Portainer при старте за 5 минут, вход заблокируется и будет предупреждение:


Не беда, перезапускаем контейнер и у нас есть новые 5 минут для того что бы придумать пароль и ввести стартовый токен.
После успешной авторизации должны увидеть панель Portainer. Нажимаем Get Started и начинаем работать.





вторник, 26 мая 2026 г.

Запуск скрипта-сервиса на Python для непрерывной работы через systemd

Для примера далее рассматривается скрипт "/home/korolev/autocall_process.py"
Скрипт Python должен работать в бесконечном цикле примерно так:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import subprocess
from psycopg2 import sql
from datetime import datetime, time
<... функция work() и другие ...>
def main():
    while True:
        work()
        # Пауза перед следующей итерацией
        time.sleep(CHECK_INTERVAL)
if __name__ == "__main__":
    main()


После отладки, делаем сам скрипт исполняемым:
# chmod +x /home/korolev/autocall_process.py
Создаем unit системы systemd:
# nano /etc/systemd/system/autocall.service
[Unit]
Description=AutoCall Dialer Service Freeswitch
After=network.target postgresql.service freeswitch.service
Wants=postgresql.service freeswitch.service
[Service]
Type=simple
User=korolev
Group=korolev
WorkingDirectory=/home/korolev
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /home/korolev/autocall_process.py
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=autocall
[Install]
WantedBy=multi-user.target


Так как скрипт работает от пользователя korolev, но должен обращаться к ПО Freeswitch, работающее под пользователем freeswitch, добавляем пользователя korolev в группу freeswitch
# usermod -aG freeswitch korolev

Запускаемся:
# systemctl daemon-reload
# systemctl start autocall.service
# systemctl enable autocall.service


Следить за логами теперь можно через системный журнал так:
# journalctl -u autocall.service -f