Настройка NUT и мониторинг ИБП в Proxmox

После установки Proxmox и запуска первых виртуальных машин у меня возникла необходимость в настройке поведения сервера при отключении питания.

После чтения интернетов была найдена интересная реализация, которую я успешно применил на своем сервере. ИБП в моем распоряжении, для справки, вот такой APC Smart-UPS C 1000, подключенный usb кабелем:

Суть реализации в настройке nut сервера и клиента прямо на машине с proxmox для контроля ИБП и поведения при изменении статуса батарей. Дополнительно же установим lxc контейнер с nut клиентом и веб-сервером Apache для мониторинга состояния ИБП без использования консоли.

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

Заходим в консоль машины, на которой установлен Proxmox (в моем случае версии 8.2.4) удобным способом и смотрим список usb устройств командой:

lsusb

Нам нужно найти наш ИБП и узнать его bus и device:

Теперь посмотрим детальную информацию, указав bus и device, в моем случае:

lsusb -v -s 1:3

Как видно, система распознает ИБП и можно приступать к установке nut:

apt install nut -y

Проверяем, видит ли nut наш ИБП:

nut-scanner -U

Перед правкой конфигов, на всякий случай, лучше сделать резервные копии всех этих файлов:

cp /etc/nut/nut.conf /etc/nut/nut.example.conf
cp /etc/nut/ups.conf /etc/nut/ups.example.conf
cp /etc/nut/upsd.conf /etc/nut/upsd.example.conf
cp /etc/nut/upsd.users /etc/nut/upsd.example.users
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf
cp /etc/nut/upssched.conf /etc/nut/upssched.example.conf
cp /etc/nut/upssched-cmd /etc/nut/upssched-cmd.example

Теперь перейдем к правке. Первый на очереди nut.conf:

nano /etc/nut/nut.conf

Удаляем все и добавляем:

MODE=netserver

Далее редактируем ups.conf:

nano /etc/nut/ups.conf

Удаляем все и добавляем:

pollinterval = 15
maxretry = 3

offdelay = 120
ondelay = 240

[apc]
# APC Smart-UPS C 1000
driver = usbhid-ups
port = auto
desc = "APC Smart-UPS C 1000"
vendorid = 051D
productid = 0003
serial = xxxxxxxxxxxx

Обратите внимание, что все данные по своему ИБП я брал из вывода команд, указанных выше. Сохраняем файл и можем протестировать драйвер:

upsdrvctl start

Если что-то неверно распознается, проверьте список совместимого оборудования чтобы узнать, какой драйвер использовать.

Отредактируем upsd.conf:

nano /etc/nut/upsd.conf

Дадим указание серверу отвечать на запросы из всех сетей. Удаляем все и добавляем:

LISTEN 0.0.0.0 3493
LISTEN :: 3493

Далее редактируем upsd.users:

nano /etc/nut/upsd.users

Настроим администратора и пользователя. Удаляем все и добавляем:

[upsadmin]
# Administrative user
password = ********
# Allow changing values of certain variables in the UPS.
actions = SET
# Allow setting the "Forced Shutdown" flag in the UPS.
actions = FSD
# Allow all instant commands
instcmds = ALL
upsmon master

[upsuser]
# Normal user
password = ********
upsmon slave

Замените звездочки на ваши пароли.

Редактируем upsmon.conf:

nano /etc/nut/upsmon.conf

Удаляем все и добавляем:

RUN_AS_USER root
MONITOR apc@localhost 1 upsadmin ******* master

MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 4
POLLFREQALERT 2
HOSTSYNC 15
DEADTIME 24
MAXAGE 24
POWERDOWNFLAG /etc/killpower

NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s on battery"
NOTIFYMSG LOWBATT "UPS %s battary is low"
NOTIFYMSG FSD "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK "Communications with UPS %s established"
NOTIFYMSG COMMBAD "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM "UPS %s is unavailable"
NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible"

NOTIFYFLAG ONLINE   SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT  SYSLOG+WALL+EXEC
NOTIFYFLAG FSD      SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK   SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD  SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM   SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL

RBWARNTIME 43200
NOCOMMWARNTIME 600

FINALDELAY 5

Не забудьте заменить звездочки на ваш пароль администратора во второй строчке.

Редактируем upssched.conf:

nano /etc/nut/upssched.conf

Удаляем все и добавляем:

CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock

AT ONBATT * START-TIMER onbatt 30
AT ONLINE * CANCEL-TIMER onbatt online
AT LOWBATT * EXECUTE onbatt
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdown
AT SHUTDOWN * EXECUTE powerdown

Нужно убедиться, что PIPEFN и LOCKFN указывают на существующую директорию. У меня ее не было, поэтому я ее создал.

mkdir /etc/nut/upssched/

Редактируем upssched-cmd:

nano /etc/nut/upssched-cmd

Удаляем все и добавляем:

#!/bin/sh
 case $1 in
       onbatt)
          logger -t upssched-cmd "UPS running on battery"
          ;;
       shutdowncritical)
          logger -t upssched-cmd "UPS on battery critical, forced shutdown"
          /usr/sbin/upsmon -c fsd
          ;;
       upsgone)
          logger -t upssched-cmd "UPS has been gone too long, can't reach"
          ;;
       *)
          logger -t upssched-cmd "Unrecognized command: $1"
          ;;
 esac

Сохраняем, затем предоставляем права:

chmod +x /etc/nut/upssched-cmd

Осталось перезагрузить систему, или, если нет такой возможности, перезагрузить сервисы командами:

service nut-server restart
service nut-client restart
systemctl restart nut-monitor
upsdrvctl stop
upsdrvctl start

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

upsc apc@localhost

и смотрим, показана ли информация о нашем ИБП:

Я решил установить параметр минимального времени работы на 10 минут и минимальный заряд на 50%:

upsrw -s battery.runtime.low=600 apc@localhost
upsrw -s battery.charge.low=50 apc@localhost

После ввода каждой команды будет запрошен логин и пароль, используйте логин upsadmin и пароль, который вы указывали при редактировании /etc/nut/upsmon.conf и /etc/nut/upsd.users. После ввода команд перезагружаем сервер.

Создание и настройка LXC контейнера для мониторинга ИБП

В принципе, на стороне сервера уже все настроено и сервер будет отключаться в соответствии с настройками nut, но для удобства можно настроить веб страничку с данными об ИБП. Я это сделал в отдельном lxc контейнере.

Характеристики: 1 ядро, 128мб ОЗУ, 2гб диск, ubuntu 24.04, автозапуск контейнера при загрузке. Для целей вебстранички этого достаточно, можно даже было настроить меньший объем дискового пространства, так как занято в итоге меньше половины.

Первым делом, после запуска контейнера, заходим в его консоль и выполняем обновление:

apt update && apt upgrade -y

Затем ставим openssh-server. В моем случае он уже был установлен. Если нет, то

apt install openssh-server -y

Далее изменим конфиг

nano /etc/ssh/sshd_config

Нужно раскомментировать или добавить следующие строчки:

PasswordAuthentication yes
PermitRootLogin yes

Сохраняем и перезапускаем openssh сервер:

systemctl restart ssh

Установим веб-сервер Apache, nut-cgi и nut клиент:

apt install apache2 nut-cgi nut-client -y

Сразу сделаем резервные копии всех редактируемых конфигов:

cp /etc/nut/nut.conf /etc/nut/nut.example.conf
cp /etc/nut/hosts.conf /etc/nut/hosts.example.conf
cp /etc/nut/upsset.conf /etc/nut/upsset.example.conf
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf

Редактируем /etc/nut/nut.conf:

nano /etc/nut/nut.conf

Удаляем все и добавляем:

MODE=netclient

Далее редактируем /etc/nut/hosts.conf:

nano /etc/nut/hosts.conf

Удаляем все и добавляем:

MONITOR apc@xxx.xxx.xxx.xxx "APC Smart-UPS C 1000"

где xxx.xxx.xxx.xxx это ip адрес вашего сервера Proxmox

Редактируем/etc/nut/upsset.conf:

nano /etc/nut/upsset.conf

Удаляем все и добавляем:

I_HAVE_SECURED_MY_CGI_DIRECTORY

Редактируем /etc/nut/upsmon.conf:

nano /etc/nut/upsmon.conf

Удаляем все и добавляем:

RUN_AS_USER root
MONITOR apc@xxx.xxx.xxx.xxx 1 upsuser ******* slave

где xxx.xxx.xxx.xxx это ip адрес вашего сервера Proxmox, а ******** это пароль юзера upsuser, настроенного на сервере с proxmox.

Далее вводим команду:

sudo a2enmod cgi

И перезапускаем веб сервер:

sudo systemctl restart apache2

Теперь можно перейти по адресу http://xxx.xxx.xxx.xxx/cgi-bin/nut/upsstats.cgi где xxx.xxx.xxx.xxx это ip вашего lxc контейнера и мониторить статус ИБП. В моем случае это выглядит так:

Для спокойствия я закрыл LXC контейнеру доступ в интернет через роутер.

Поделитесь с друзьями
Подписаться
Уведомить о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии