Network UPS Tools (NUT) – это клиент-серверная система мониторинга и управления источниками бесперебойного питания (ИБП). Она позволяет одному компьютеру или серверу, подключенному к ИБП по USB, быть NUT-сервером, другие компьютеры выступают в роли клиентов и получают от него сигналы о состоянии батареи. При отключении сети электропитания и разряде батарей в ИБП, NUT рассылает команды на выключение всем клиентам. networkupstools.org
NUT – это набор консольных утилит и служб у которых нет GUI, но есть возможность установить GUI отдельно. В более простом виде для целей мониторинга можно использовать NUT Web GUI или подобные приложения. Управление можно организовать через Home Assistant.
Схема подключения.

Электропитание сервера выполняется через ИБП от розетки 220В. Управление ИБП через USB-кабель.
ИБП – IN3000RM-GA-KR-KS. Модели могут быть различные, главное чтоб в ИБП была возможность подключения через USB или COM-порт.
Сервер – Proxmox VE 9.
NUT – upsd 2.8.1. Устанавливается на Proxmox.
Архитектура NUT.
Краткое описание компонентов.
ИБП USB – источник бесперебойного питания, подключенный к серверу по USB. Передает состояние, напряжение, события и принимает команды управления.
nutdrv_qx – драйвер NUT для ИБП с протоколом Megatec. Обменивается данными с ИБП через USB и предоставляет их серверу NUT.
upsd – центральный сервер NUT (демон). Получает данные от драйвера и предоставляет их локальным и удаленным клиентам по TCP-порту 3493.
upsc – консольная утилита для просмотра состояния ИБП (напряжение, нагрузка, температура, статус и др.). Используется только для чтения данных.
upscmd – консольная утилита для отправки команд ИБП (тест батареи, управление зуммером, отключение нагрузки и др.). Требует соответствующих прав пользователя.
upsmon – служба мониторинга NUT. Следит за состоянием ИБП, реагирует на события (OB, LB и др.) и при необходимости выполняет корректное завершение работы сервера.
Web GUI – веб-интерфейс для мониторинга (а в некоторых реализациях – и управления) ИБП через upsd.
Установка NUT.
Обновляем информацию о пакетах в системе.
|
1 |
apt update |
Устанавливаем NUT.
|
1 |
apt install -y nut |
Обнаруживаем ИБП.
|
1 |
lsusb |
Можно выполнить до подсоединения USB и после, чтоб понять, какое устройство добавилось.
Можно посмотреть технические данные с ИБП, которые передаются по USB. Для этого из вывода нужно взять номера Bus 001 и Device 010 и подставить в команду. (номера у каждого разные)
|
1 |
lsusb -v -s 001:010 |
Определим какой драйвер NUT использовать для этого устройства чтоб потом его настроить.
|
1 |
nut-scanner |
nut-scanner нашел подходящий драйвер.
|
1 |
driver = "nutdrv_qx" |

Настройка.
Далее выполняется настройка. Так как нет графического интерфейса, настройка выполняется путем редактирования файлов конфигураций.
Порядок настройки обычно такой.
ups.conf – описываем ИБП и драйвер.
nut.conf – выбираем режим работы.
upsd.conf – настраиваем сервер NUT (при необходимости сетевого доступа).
upsd.users – создаем пользователей и назначаем права.
upsmon.conf – настраиваем мониторинг и автоматическое завершение работы.
Настройку выполним в таком порядке, потому что каждый следующий шаг зависит от предыдущего.
Перед настройкой конфигурационные файлы желательно забэкапить.
Настройки выполняются через MobaExterm. Этот менеджер позволяет получить прямой доступ к файлам через графическое меню (GUI) по SSH.
ups.conf
Это файл конфигурации ИБП. В нем указывается драйвер NUT, способ подключения (USB, COM и т.д.) и параметры подключения к ИБП.
Создаем минимальную конфигурацию.
Редактируем файл.
|
1 |
nano /etc/nut/ups.conf |
Удаляем из него всё и вставляем такое содержание.
|
1 2 3 4 5 6 |
maxretry = 3 [ups] driver = nutdrv_qx port = auto desc = "USB UPS" |

maxretry = 3 – это глобальная настройка NUT. Она определяет, сколько раз драйвер попытается подключиться к ИБП перед тем, как признать запуск неудачным.
[ups] – задает имя (или идентификатор) для ИБП.
driver = nutdrv_qx – указывает, какой драйвер NUT использовать для общения с ИБП.
port = auto – автоматическое определение порта подключения ИБП.
desc = «USB UPS» – простое текстовое описание (комментарий).
nut.conf
Это главный конфигурационный файл в NUT, который определяет режим работы системы.
Редактируем файл.
|
1 |
nano /etc/nut/nut.conf |
Оставляем в нем только 1 строку.
|
1 |
MODE=standalone |

None – NUT отключен. Драйверы, сервер и мониторинг не запускаются. Используется после установки по умолчанию.
Standalone – автономный режим. Один сервер подключен к ИБП и самостоятельно выполняет мониторинг и завершение работы. Наиболее распространенный вариант.
Netserver – сетевой сервер. Сервер с подключенным ИБП предоставляет информацию другим компьютерам по сети, но локальный мониторинг (upsmon) не используется.
Netclient – сетевой клиент. ИБП подключен к другому серверу NUT, а данный компьютер получает информацию о его состоянии по сети.
Драйвер.
Запускаем драйвер.
|
1 |
upsdrvctl start |

uplicate driver instance detected (PID file /run/nut/nutdrv_qx-ups.pid exists)!
Это означает, что экземпляр драйвера уже запущен. Скорее всего, он автоматически стартовал после изменения MODE=standalone или при загрузке службы. Поэтому upsdrvctl start обнаружил второй запуск и остановил его.
Остальные строки говорят о том, что связь с ИБП установлена.
Проверим, работает ли драйвер
|
1 |
ps aux | grep nutdrv_qx |
![]()
Драйвер может общаться с ИБП. Значит можно переходить к дальнейшим настройкам сервера.
upsd.conf
В этом файле конфигурация сервера NUT (upsd), определяющая, на каких сетевых интерфейсах и портах он принимает подключения клиентов.
|
1 |
nano /etc/nut/upsd.conf |

LISTEN 127.0.0.1 3493 – разрешает подключения только с этого же сервера (локально).
LISTEN 192.168.5.10 3493 – разрешает подключения по конкретному IP-адресу сервера в локальной сети (для клиентов, web-доступа и тп).
(192.168.5.10 это IP-адрес сервера в сети, у каждого свой)
После изменения конфигурации необходимо перезапускать службу.
|
1 |
systemctl restart nut-server.service |
Проверяем прослушивается ли порт.
|
1 |
ss -tlnp | grep 3493 |

upsd.users
Создаем пользователя для мониторинга.
Редактируем upsd.users.
|
1 |
nano /etc/nut/upsd.users |
Удаляем содержимое и вставляем следующие строки.
|
1 2 3 |
[monuser] password = Pass-135 upsmon primary |
[monuser] – имя пользователя NUT для подключения upsmon в сервер upsd.
password = Pass-135 – пароль. Он должен совпадать с паролем, указанным в строке MONITOR файла /etc/nut/upsmon.conf.
Остальное права пользователя.
upsmon – разрешает этому пользователю работать в программе upsmon.
primary – этот сервер является основным (Primary) и имеет право инициировать завершение работы системы. Потому что USB-кабель подключен именно к этому Proxmox. Он первым узнает о переходе ИБП на батарею и принимает решение о выключении.

После изменения файла перезапускаем службу.
|
1 |
systemctl restart nut-server.service |
Проверяем статус.
|
1 |
systemctl status nut-server.service |
Должно быть Active: active (running).

Права данного пользователя ограничены (режим чтения). Создание пользователя с расширенными возможностями далее под спойлером. Админские права не всегда нужны и настраиваются по необходимости.
Добавляем пользователя admin с разрешением полного доступа.
|
1 |
nano /etc/nut/upsd.users |
|
1 2 3 4 5 |
[admin] password = 135-Pass actions = SET actions = FSD instcmds = ALL |
[admin] – имя пользователя.
password = 135-Pass – пароль.
actions = SET – разрешение на изменение. Эта опция даёт пользователю право изменять переменные ИБП (например, ups.beeper.status или пороговые значения напряжения) через команду upsrw.
actions = FSD – право на «Forced Shutdown» (принудительное выключение). Позволяет пользователю инициировать немедленное отключение нагрузки на ИБП, даже если обычные условия для этого ещё не наступили.
instcmds = ALL – доступ ко всем командам. Даёт пользователю право выполнять любые мгновенные команды ИБП, такие как beeper.toggle, test.battery.start или load.off, через утилиту upscmd.
Сохраняем, выходим и перезапускаем службу.

Эта настройка даёт пользователю admin полные права на управление ИБП через NUT, что бывает необходимо для работы веб-интерфейсов и автоматизации.
Проверим, какие данные NUT получает от ИБП.
|
1 |
upsc ups |

Если данные отображаются – upsd работает.
Если ошибка.
Error: Connection failure: Connection refused
Это означает, что программа upsc не может подключиться к серверу NUT (upsd). Необходимо проверять всю цепочку настроек, перезапустить службы, проверить логи.
Смотрим логи и действуем по ситуации.
|
1 |
journalctl -u nut-server.service -b --no-pager |
upsmon.conf
Это служба мониторинга NUT. Она периодически опрашивает сервер upsd, следит за состоянием ИБП и принимает решения
Настраиваем upsmon.
|
1 |
nano /etc/nut/upsmon.conf |
В конце конфигурации добавляем строку.
|
1 |
MONITOR ups@localhost 1 monuser Pass-135 primary |
Эта строка настраивает мониторинг, указывая серверу NUT (точнее, службе upsmon), за каким ИБП следить, как это делать и какого пользователя для этого использовать.

ups@localhost – какой ИБП мониторить. ИБП (ups), который работает на локальном сервере (localhost).
1 – сколько ИБП должно быть в сети для нормальной работы (минимум 1).
monuser – имя пользователя для подключения. Это существующий пользователь, созданный в upsd.users.
Pass-135 – пароль этого пользователя.
primary – роль сервера в системе. primary означает, что этот сервер является главным. Именно он принимает решение о выключении и может инициировать его.
После изменений перезапускаем службы.
|
1 |
systemctl restart nut-server.service |
|
1 |
systemctl restart nut-monitor.service |
Проверяем статус.
|
1 |
systemctl status nut-monitor.service |
Просмотр конфига запуска службы.
|
1 |
systemctl cat nut-monitor.service |
Назначение остальных настроек.
MINSUPPLIES 1 – Минимальное количество ИБП, которые должны быть в сети, чтобы система считала питание нормальным. Если доступных ИБП меньше указанного числа – запускается процедура выключения .
SHUTDOWNCMD /sbin/shutdown -h +0 – команда, которая выполняется при необходимости выключить систему (выключение немедленно).
POLLFREQ 5 секунд – интервал опроса ИБП в нормальном режиме (когда питание от сети).
POLLFREQALERT 5 секунд – интервал опроса ИБП в аварийном режиме (когда ИБП на батарее). Более частое обновление данных для быстрой реакции.
HOSTSYNC 15 секунд – максимальное время ожидания, пока все клиенты NUT (другие серверы) подтвердят готовность к выключению.
DEADTIME 15 секунд – время в секундах, после которого ИБП считается недоступным (потеря связи), если от него нет ответа.
POWERDOWNFLAG /etc/killpower – файл-флаг, который создается перед выключением. Используется для синхронизации клиентов – они ждут появления этого файла, чтобы выключиться.
OFFDURATION 30 секунд – время, которое upsmon ждет после отправки команды на выключение ИБП (shutdown.return), чтобы убедиться, что ИБП выключился.
RBWARNTIME 43200 секунд (12 часов) – интервал, за который upsmon предупреждает о необходимости замены батареи (если ИБП поддерживает эту функцию).
NOCOMMWARNTIME 300 секунд (5 минут) – время ожидания перед отправкой предупреждения о потере связи с ИБП. Позволяет избежать ложных срабатываний при кратковременных сбоях.
FINALDELAY 5 секунд – задержка между отправкой команды upsmon на выключение и фактическим выполнением команды SHUTDOWNCMD. Нужна для того, чтобы клиенты успели получить последние обновления (статусы, команды).
MONITOR ups@localhost 1 monuser Pass-135 primary – настройка мониторинга (см выше).
Самый главный вопрос – где указывается процент батареи?
Нигде. И это особенность NUT. upsmon не умеет выключать сервер по правилу: «выключить при 15%». Он реагирует на события, которые сообщает ИБП.
OL – работа от сети (On Line).
OB – работа от батареи (On Battery).
LB – низкий уровень заряда батареи (Low Battery).
Именно событие LB инициирует завершение работы.
Если хочется выключать через 5 минут после пропадания питания, то это уже делает не upsmon, а upssched.
После настроек необходимо выполнить проверку.
Самый простой способ – отключить питание ИБП и смотреть статус. Увеличить нагрузку, чтоб батарея разрядилась быстрее.
|
1 |
watch -n2 upsc ups |
При появлении статуса OB LB, через несколько секунд upsmon должен начать процедуру завершения работы.
Команда проверки статуса.
|
1 |
upsc ups ups.status |
Отключение звукового сигнала.
Ручное управление ИБП на примере звукового сигнала.
Просмотр команд, которые поддерживает ИБП.
|
1 |
upscmd -l ups |

Просмотр текущего состояния звукового сигнала.
|
1 |
upsc ups ups.beeper.status |
Включение/отключение звукового сигнала.
|
1 |
upscmd -u admin -p 135-Pass ups beeper.toggle |
Если было disabled, станет enabled (или наоборот).

Выключение соседнего сервера по сети.
NUT умеет штатно отключать сервера по сети без использования дополнительных инструментов типо SSH-команд или скриптов. Это необходимо если различные сервера подключены к одному ИБП.
Получается такая схема.

Сетевая настройка.
Проверяем, что сервер раздает информацию по сети.
|
1 |
nano /etc/nut/upsd.conf |

где 192.168.5.10 – IP Proxmox с установленным NUT (у каждого свой).
Пользователь.
|
1 |
nano /etc/nut/upsd.users |
Пользователь уже создан выше.
Можно создать пользователя secondary для клиентов. У такого пользователя будут ограниченные права. Но не будем этого делать.
Firewall
Разрешить порт TCP 3493 между серверами, если они расположены в разных сетях.
192.168.5.20 (клиент) >> 192.168.5.10:3493 (сервер).
В данном случае расположение в одной сети.
NUT на клиенте.
На Linux-сервере 192.168.5.20 устанавливаем клиентскую часть NUT.
|
1 |
apt update |
|
1 |
apt install nut-client |
nut.conf
На клиенте NUT настраиваем режим работы.
|
1 |
nano /etc/nut/nut.conf |
Содержание.
|
1 |
MODE=netclient |
![]()
upsmon.conf
Настройка указывает службе upsmon на клиенте, за каким удалённым ИБП следить и как это делать.
|
1 |
nano /etc/nut/upsmon.conf |
Практически всё можно удалить и оставить несколько строк.

|
1 2 3 4 |
MONITOR ups@192.168.5.10 1 monuser Pass-135 secondary MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h now" POWERDOWNFLAG /etc/killpower |
где 192.168.5.10 – IP Proxmox с установленным NUT-сервером (у каждого свой).
Запускаем
|
1 |
systemctl enable nut-monitor |
|
1 |
systemctl restart nut-monitor |
Проверяем статус.
|
1 |
systemctl status nut-monitor.service |
Проверяем связь с сервером по IP.
|
1 |
upsc ups@192.168.5.10 |
Если выводится состояние ИБП – всё настроено корректно.

В выводе на клиенте виден статус OL, полученный от ИБП подключенного в сервер.
Проверка.
Отключаем электричество от сети 220В в ИБП. Primary увидит OB, начнет свой таймер.
Secondary видит переход OL >> OB, но ничего пока не выключает.
По уровню разряда или по таймеру через некоторое время на Primary выполнится shutdown.
Пока Primary выключается upsmon сообщает серверу NUT FSD (Forced Shutdown).
Secondary получает FSD и сразу выполняет shutdown -h now без всяких собственных таймеров.
NUT настроен, можно использовать в работе.
Итог.
NUT содержит всю необходимую логику для безопасного завершения работы серверов. После базовой настройки сервер автоматически отслеживает состояние ИБП, переходит в режим работы от батареи, а при достижении критического уровня заряда инициирует корректное завершение работы. При использовании режима Primary/Secondary этот же сигнал автоматически передается другим серверам сети, которые также выполняют завершение работы без каких-либо дополнительных скриптов.
Дополнительные скрипты не являются обязательной частью NUT. Они используются только для реализации собственной логики, отсутствующей в стандартном функционале. О том, как настраивать скрипты, написано на следующей странице.
Дополнение.
Проект на сайте GiHub.
NUT установлен по инструкции выше.
Установка Docker.
Выполняется на Proxmox, где установлен NUT-сервер.
Обновляем пакеты.
|
1 |
apt update |
Устанавливаем Docker
|
1 |
apt install -y docker.io |
Запускаем Docker.
|
1 |
systemctl start docker |
Включаем автозагрузку при старте ОС.
|
1 |
systemctl enable docker |
Запуск NUT Web GUI через Docker.
Тестовый сервер находится по IP-адресу 192.168.5.10. Указываем его в конфиге. (у каждого свой адрес).
|
1 2 3 4 5 6 7 8 9 10 |
docker run -d \ -p 9000:9000 \ -e UPSD_ADDR=192.168.5.10 \ -e UPSD_USER=monuser \ -e UPSD_PASS=Pass-135 \ -e RUST_LOG=info \ --user root \ --privileged \ --name nut-webgui \ ghcr.io/superioone/nut_webgui:latest |
Просмотр логов.
|
1 |
docker logs nut-webgui |
Если нужно остановить и удалить.
|
1 |
docker stop nut-webgui |
|
1 |
docker rm nut-webgui |
Добавляем внешний IP в upsd.conf.
|
1 |
nano /etc/nut/upsd.conf |
Добавляем в конфиг.
|
1 2 3 |
LISTEN 127.0.0.1 3493 LISTEN 192.168.5.10 3493 LISTEN 0.0.0.0 3493 |

Перезапускаем NUT-сервер
|
1 |
systemctl restart nut-server.service |
Проверяем что слушает порт.
|
1 |
ss -tlnp | grep 3493 |
Перезапускаем контейнер NUT Web GUI
|
1 |
docker restart nut-webgui |
Если не работает – проверяем логи.
|
1 |
docker logs nut-webgui |
Заходим через браузер.
|
1 |
http:// 192.168.5.10:9000 |
(вводить нужно IP своего сервера)
Отображается информация с ИБП.
