uDocs

Настройка ИБП на сервере Proxmox

Использование источника бесперебойного питания в домашнем сервере, управление и мониторинг. Рассмотрим пример настройки примитивных протоколов Megatec / Q1 / Mustek.

Настройка ИБП на сервере Proxmox

ИБП (UPS — Uninterruptible Power Supply) в домашнем сервере — это не просто "коробка с батарейкой". Это элемент инфраструктуры, который защищает данные, оборудование и обеспечивает корректное завершение работы системы при отключении электричества.

Основные типы протоколов ИБП

  1. USB HID Power Device (лучший вариант)
  • Драйвер: usbhid-ups
  • Особенности:
    • стандарт USB
    • работает "из коробки" в Linux
    • не требует драйверов производителя
  • Плюсы:
    • стабильность
    • полная поддержка параметров
    • минимум настроек
  • Используется в:
    • APC
    • Eaton
    • CyberPower (новые модели)
  1. Megatec / Voltronic / Q1 / Mustek
  • Драйвер: nutdrv_qx
  • Особенности:
    • USB → Serial внутри
    • ИБП использует простой текстовый протокол
  • Минусы:
    • требуется подбор параметров: subdriver, protocol
    • возможны ошибки автоопределения
  • Плюсы:
    • дешёвые ИБП
  1. Проприетарные протоколы
  • Особенности:
    • работают только с ПО производителя
    • могут не поддерживаться в Linux
  • Минусы:
    • нестабильность
    • отсутствие NUT-драйвера
  1. SNMP / Network UPS
  • Драйвер: snmp-ups
  • Особенности:
    • ИБП подключён к сети
    • не требует USB
  • Плюсы:
    • удобно в стойках и NAS
    • централизованный мониторинг

Поиск ИБП в системе

Рассмотрим настройку на примере Proxmox VE 9, но на дистрибутивах основанных на Debian все будет аналогично. Подключите ИБП к серверу по USB и подключитесь по SSH.

Дальнейшие команды будут выполняться из под пользователя root, для выполнения под обычным пользователем иногда понадобится использовать sudo

Проверка определился ли ИБП в системе

lsusb

Если ваш ИБП HID UPS — он обычно определяется как HID UPS Battery, Power Device, usbhid, например:

Bus 001 Device 005: ID 1234:5678 APC UPS

Если ИБП использует протоколы Megatec / Voltronic / Q1 / Mustek, то устройство будет назваться примерно как в нашем случае (бюджетный ИБП EXEGATE NEO Smart 850):

Bus 001 Device 005: ID 0665:5161 Cypress Semiconductor USB to Serial

Значения ID это vendorId и productId, они понадобятся нам для дальнейшей настройки.

Установка и настройка NUT

Network UPS Tools — это популярный бесплатный программный комплекс с открытым исходным кодом, предназначенный для мониторинга и управления источниками бесперебойного питания.

apt update
apt install nut -y
find /etc/nut/ -maxdepth 1 -name "*.conf" -exec cp -v {} {}.bak \;

После установки сразу делаем резервную копию всех файлов конфигурации NUT.

В файле nut.conf нужно найти и раскомментировать строку MODE или добавить, если ее нет.

nano /etc/nut/nut.conf
MODE=standalone

MODE=standalone означает драйвер + upsd + upsmon на одной машине

Настройка UPS

В файле ups.conf пропишите конфигурацию вашего ИПБ, добавив в конце файла следующую секцию.

Можете указать vendorid и productid, которые вам выдала команда lsusb, но обычно это не нужно.

/etc/nut/ups.conf
[myups] # любое имя для вашего ИБП
    driver = usbhid-ups
    port = auto
    vendorid = 1234
    productid = 5678

Проверка драйвера

~# upsdrvctl stop
~# upsdrvctl start
Network UPS Tools - UPS driver controller 2.8.1
Network UPS Tools - Generic Q* USB/Serial driver 0.36 (2.8.1)
USB communication driver (libusb 1.0) 0.46
Using protocol: Mustek 0.08

Настройка сервера (upsd)

Определяем по какому адресу и порту NUT будет отдавать данные. Найдите в файле LISTEN и исправьте ее или добавьте в конец:

/etc/nut/upsd.conf
LISTEN 127.0.0.1 3493 # для локального доступа 
# LISTEN 0.0.0.0 3493 # для доступа в сети

Добавляем пользователя для управления состоянием. Добавьте в конец файла:

/etc/nut/upsd.users
[monuser] # можете указать любой логин
  password = password # укажите свой пароль
  upsmon primary

Перезапускаем сервисы и проверяем:

systemctl restart nut-driver
systemctl restart nut-server
upsc myups@localhost # вместо myups укажите имя вашего ИБП, которое вы прописали в /etc/nut/ups.conf

Последняя команда должна вывести информацию о драйвере и показатели ИБП:

Init SSL without certificate database
battery.voltage: 13.4
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.flag.ignoresab: enabled
driver.flag.norating: enabled
driver.flag.novendor: enabled
driver.name: nutdrv_qx
driver.parameter.pollfreq: 15
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.productid: 5161
driver.parameter.protocol: mustek
driver.parameter.subdriver: cypress
driver.parameter.synchronous: auto
driver.parameter.vendorid: 0665
driver.state: quiet
driver.version: 2.8.1
driver.version.data: Mustek 0.08
driver.version.internal: 0.36
driver.version.usb: libusb-1.0.28 (API: 0x100010a)
input.frequency: 50.0
input.voltage: 236.4
input.voltage.fault: 236.4
output.voltage: 237.5
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 18
ups.productid: 5161
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0665

Мониторинг NUT

Далее настроим NUT монитор, который будет сообщать системе о состоянии и отправлять сигнал выключения при низком заряде аккумулятора. Если вы создали резервную копию файла, то удобней очистить текущий upsmon.conf и указать только нужные параметры:

/etc/nut/upsmon.conf
RUN_AS_USER nut # пользователь, под которым работает nut

# Главная строка конфигурации, указывает какой ИБП мониторить
# myups@localhost - имя ИБП и адрес сервера, укажите свое имя, которое создавали в файле /etc/nut/ups.conf
# 1 - это вес источника, для одного ИБП всегда 1
# upsmon password - логин и пароль, который создавали в файле /etc/nut/upsd.users
# primary - сервер имеет право инициировать завершение работы UPS

MONITOR myups@localhost 1 upsmon password primary

MINSUPPLIES 1 # Сколько источников питания должно оставаться доступными

SHUTDOWNCMD "/sbin/shutdown -h now" # Команда, которую выполнит NUT при необходимости выключить сервер

POLLFREQ 5 # Как часто upsmon опрашивает upsd
POLLFREQALERT 5 # Частота опроса во время аварии

HOSTSYNC 15 # После получения сигнала на завершение работы сервер ждёт пока остальные серверы тоже подтвердят завершение
DEADTIME 15 # Время после, которого ИБП считается потерянным

POWERDOWNFLAG /etc/killpower # Файл-маркер для финального выключения UPS

RBWARNTIME 43200 # Как часто сообщать о замене батареи. 43200 секунд = 12 часов
NOCOMMWARNTIME 300 # Как часто сообщать о потери связи с ИБП - каждые 5 минут

FINALDELAY 5 # Финальный таймер. После принятия решения о выключении сервера еще ожидает 5 секунд

# Рекомендуется добавить дополнительные уведомления с системный лог
NOTIFYCMD /usr/sbin/upssched

NOTIFYFLAG ONLINE SYSLOG
NOTIFYFLAG ONBATT SYSLOG
NOTIFYFLAG LOWBATT SYSLOG
NOTIFYFLAG FSD SYSLOG
NOTIFYFLAG COMMOK SYSLOG
NOTIFYFLAG COMMBAD SYSLOG
NOTIFYFLAG SHUTDOWN SYSLOG

После сохранения конфигурации проверяем ее, перезапускаем сервис и проверяем статус.

upsmon -D
systemctl status nut-monitor

Если вы указали неверные данные подключения к ИБП или допустили другую ошибку, то upsmon -D выведет предупреждение об этом

Мониторинг на втором сервере

Сейчас на сервере настроен NUT, который напрямую работает с UPS через USB. Этот сервер получает все данные от источника питания и публикует их в сеть через сервис upsd. По сути, он становится центральной точкой, которая знает текущее состояние UPS и реагирует на изменения, например переход на батарею или низкий заряд.

Кроме этого, к нему могут подключаться другие серверы в сети. Они не имеют прямого доступа к UPS, но через NUT получают все те же данные с главного сервера и могут корректно реагировать на отключение питания, например завершать работу. Таким образом один сервер с UPS может управлять питанием сразу нескольких машин в сети.

Проверка и создание пользователя

На сервере к которому подключен UPS по USB проверьте что в файле /etc/nut/upsd.conf у вас указано LISTEN 0.0.0.0 3493, для того чтобы NUT был доступен внутри локальной сети.

Мы уже создали выше пользователя monuser, но у него "роль" primary, такой пользователь может управлять UPS и лучше для клиентов NUT создать другого пользователя с более низкими правами.

Откройте файл с пользователями и добавьте в конец еще одного:

/etc/nut/upsd.users
[readuser] # можете указать любой логин
  password = password # укажите пароль
  upsmon secondary # тут уже не primary, а secondary

Перезапускаем сервисы:

systemctl restart nut-server
systemctl restart nut-monitor

Теперь подключаемся ко второму серверу.

Настройка NUT клиента

На втором сервере устанавливаем NUT клиент и сразу проверям подключение к основному серверу:

apt install nut-client
upscmd -l myups@192.168.10.2 # укажите название ИБП и адрес первого сервера

Читать данные о состоянии ИБП внутри сети можно без логина и пароля, если вы специально не запретили это в настройках.

Если связь есть, то аналогичным образом создаем резевные копии конфигурации и настраиваем nut.conf и upsmon.conf.

/etc/nut/nut.conf
MODE=netclient # ключевой момент, теперь тут режим клиента
/etc/nut/upsmon.conf
# myups - название UPS на сервере
# 192.168.1.10 - адрес сервера
# 1 - это вес источника, для одного ИБП всегда 1
# readuser - логин второго пользовтеля
# password - пароль
# secondary - "роль" не должна быть primary
MONITOR myups@192.168.1.10 1 readuser password secondary

# остальные команды как на сервере
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h now"
RUN_AS_USER nut

Проверяем конфигурация, перезапускам сервис и смотрим статус сервиса:

systemctl restart nut-client
upsmon -D
systemctl restart nut-monitor
systemctl status nut-monitor

Проверка

Можете попробовать отключить ИБП от сети и после этого в системных логах на серверах проверить записи:

journalctl -u nut-monitor -f

В логах должны быть записи со статусом OB - питание от батареи.

Мониторинг ИБП

Так же как и второй сервер вы можете получать данные от NUT по сети и в зависимости от ситуации настроить уведомления и автоматизации.

Список статусов NUT необходимые для мониторинга

  • OL — питание от сети (On Line), всё нормально
  • OB — работа от батареи (On Battery)
  • LB — низкий заряд батареи (Low Battery)
  • CHRG — заряд батареи
  • DISCHRG — разряд батареи
  • BYPASS — питание в обход UPS (через bypass)
  • TRIM — понижение напряжения (AVR снижает напряжение)
  • BOOST — повышение напряжения (AVR повышает напряжение)
  • OFF — UPS выключен / нагрузка отключена
  • OVER — перегрузка
  • FSD — forced shutdown (принудительное отключение по NUT)

Комбинации тоже возможны, например:

  • OB LB — работа от батареи + критически низкий заряд
  • OL CHRG — питание от сети + зарядка батареи
  • OB DISCHRG — работа от батареи + разряд

Home Assistant

Установите стандартную интеграцию Network UPS Tools (NUT) и укажите настройки подключения: название ИБП и адрес сервера.

Prometheus и Grafana

Существует множество экспортеров метрик NUT в Prometheus, рассмотрим один из них и развернем его в докере. Экспортеры обычно легковесные, можно развернуть без докера прямо на сервере, подробнее в документации на GitHub.

docker-compose.yaml
services:
  exporter-nut:
    container_name: exporter-nut
    image: ghcr.io/druggeri/nut_exporter:latest
    restart: unless-stopped
    ports:
      - "9995:9995"
    environment:
      - NUT_SERVER=192.168.10.2 # сервер с ИБП
      - NUT_PORT=3493 # порт, который указывали в настройках NUT
    command:
      - "--web.listen-address=:9995"

После запуска контейнера docker compose up -d проверяем что метрики отдаются по адресу докер сервера: http://192.168.10.1:9995/ups_metrics

Обратите внимание что по адресу /metrics отдает свои метрики, а метрики NUT он отдает по /ups_metrics

Настраиваем Prometheus, добавим в секцию scrape_configs конфигурацию экспортера.

nano /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: nut
    metrics_path: /ups_metrics
    static_configs:
      - targets: ['192.168.10.139:9995'] # адрес и порт сервера с докер контейнером
        labels:
          ups: "primary"

Перезапускаем

systemctl restart prometheus

Через несколько секунд проверяем в веб-интерфейсе Prometheus в разделе Status / Target health что метрики пошли.

В Grafana импортируйте подходящий для вас дашборд или настройте свой.

Рекомендуемые записи

Готовые решения для домашнего сервера

Готовые решения для домашнего сервера

Краткий обзор готовых решений для домашнего сервера.
Adguard Home — домашний DNS сервер

Adguard Home — домашний DNS сервер

Установим и настроим локальный DNS-сервер Adguard Home и настроим домены внутри домашней сети.
Облачная виртуальная машина за 150р. в месяц

Облачная виртуальная машина за 150р. в месяц

Бесплатная виртуальная машина и хранилище S3 на 15ГБ на тарифе Free Tier от cloud.ru
Выбор оборудования для домашнего сервера

Выбор оборудования для домашнего сервера

Рассмотрим варианты от одноплатных компьютеров до VPS – что подойдет именно вам?