UPDATE: An astute reader posted the following comment for anyone who may be attempting to implement this solution on a Raspberry Pi running with the pi-hole setup (see https://pi-hole.net/). The full comment:
I needed to use the info here: https://www.reddit.com/r/pihole/comments/hauphd/adding_apcupsd_ups_status_util_to_rpi_with/ in order to get it fully working. For some reason it wasn't able to launch the .cgi file until I aliased the nut directory. My lighttpd.conf has these differences:
server.modules = ( "modaccess", "modaccesslog", "modauth", "modalias", "modexpire", "modredirect", "modrewrite", "modfastcgi", "modsetenv", "modstatus" ) alias.url = ( "/nut" => "/usr/share/nut/www/")
and now nut works with lighttpd + pihole
We all know the importance of having a battery backup solution for your servers and network equipment; in a small company environment where cost is a factor, the purpose of the battery backup is somewhat different. Typically, the goal isn't all day (or even multi-hour) run time, but rather 20 - 30 minutes - long enough to cover short outages and notify and gracefully shut down the equipment in a longer outage. Again, YMMV of course depending on the needs of your organization. The purpose of these articles is to walk through configuring the
nut-server service on a Proxmox host server and the
nut-client service on a Linux guest, including email notification and graceful server shutdown for all VM's.
Recently, I had to replace an aging UPS with a new unit and based on cost, user reviews, and technical capability, I selected the Tripp Lite SMART1500RM2U. For our purposes we'll assume that our UPS unit is connected via USB to our Proxmox host server named
- Before plugging it in, let's start a persistent tail of
/var/log/messagesto ensure that the UPS gets picked up by the operating system. Open a new SSH session to the host and we'll tail the log file, watching for the USB entries. We should see output similar to the following:
root@vmserver [~]# tail -f /var/log/messages Oct 26 09:32:03 vmserver kernel: [149701.226307] usb 1-11: SerialNumber: 3122CVYSM88EC01815 Oct 26 09:32:03 vmserver kernel: [149701.275704] hid-generic 0003:09AE:3015.270B: hiddev0,hidraw0: USB HID v1.10 Device [Tripp Lite TRIPP LITE SMART1500RM2U ] on usb-0000:00:14.0-11/input0 Oct 26 09:32:17 vmserver kernel: [149715.705236] usb 1-11: USB disconnect, device number 36 Oct 26 09:32:18 vmserver kernel: [149716.051727] usb 1-11: new low-speed USB device number 37 using xhci_hcd Oct 26 09:32:18 vmserver kernel: [149716.209951] usb 1-11: New USB device found, idVendor=09ae, idProduct=3015, bcdDevice= 2.0a Oct 26 09:32:18 vmserver kernel: [149716.209960] usb 1-11: New USB device strings: Mfr=2, Product=3, SerialNumber=4 Oct 26 09:32:18 vmserver kernel: [149716.209965] usb 1-11: Product: TRIPP LITE SMART1500RM2U Oct 26 09:32:18 vmserver kernel: [149716.209969] usb 1-11: Manufacturer: Tripp Lite Oct 26 09:32:18 vmserver kernel: [149716.209972] usb 1-11: SerialNumber: 3122CVYSM88EC01815 Oct 26 09:32:18 vmserver kernel: [149716.259635] hid-generic 0003:09AE:3015.270C: hiddev0,hidraw0: USB HID v1.10 Device [Tripp Lite TRIPP LITE SMART1500RM2U ] on usb-0000:00:14.0-11/input0
From our log entries above, we can see that the UPS has been recognized by the operating system so we can now install and configure
lighttpd using apt-get:
root@vmserver [~]# apt-get install nut nut-client nut-server nut-cgi lighttpd Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: libltdl7 libnutscan1 libupsclient4 libusb-0.1-4 lighttpd-mod-deflate lighttpd-mod-openssl spawn-fcgi Suggested packages: rrdtool php-cgi php-fpm apache2-utils lighttpd-doc lighttpd-mod-authn-gssapi lighttpd-mod-authn-pam lighttpd-mod-authn-sasl lighttpd-mod-geoip lighttpd-mod-maxminddb lighttpd-mod-trigger-b4-dl lighttpd-mod-vhostdb-pgsql lighttpd-mod-webdav lighttpd-modules-dbi lighttpd-modules-ldap lighttpd-modules-lua lighttpd-modules-mysql nut-monitor nut-ipmi nut-snmp nut-xml The following NEW packages will be installed: libltdl7 libnutscan1 libupsclient4 libusb-0.1-4 lighttpd lighttpd-mod-deflate lighttpd-mod-openssl nut nut-cgi nut-client nut-server spawn-fcgi 0 upgraded, 12 newly installed, 0 to remove and 65 not upgraded. Need to get 2,360 kB/2,786 kB of archives. After this operation, 9,075 kB of additional disk space will be used. Do you want to continue? [Y/n]
3. I configured
nut using the steps in this article: https://techno-tim.github.io/posts/NUT-server-guide/. NOTE: If you're not rebooting the server, you'll need to restart
udev like so:
systemctl restart udev (it's not mentioned in the article).
4. Load the CGI module in the lighttpd configuration and restart lighttpd:
root@vmserver [/etc/nut]# lighttpd-enable-mod cgi Enabling cgi: ok Run "service lighttpd force-reload" to enable changes root@vmserver [/etc/nut]# service lighttpd force-reload
5. Check the UPS status by visiting http://<server name/IP>/cgi-bin/upsstats.cgi in your browser. You should see a page similar to the following:
6. Now that the nut server is functional, you can install the nut client on the Proxmox guest systems. On Linux, you can install the client with apt-get:
root@linuxappserver [~]# apt-get install nut-client Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: bash-completion libupsclient4 Suggested packages: nut-monitor The following NEW packages will be installed: bash-completion libupsclient4 nut-client 0 upgraded, 3 newly installed, 0 to remove and 28 not upgraded. Need to get 673 kB of archives. After this operation, 2,348 kB of additional disk space will be used. Do you want to continue? [Y/n]
7. Check the nut server with the
upsc tripplite@vmserver ups.status
You should get output similar to the following:
root@linuxappserver [/var/log]# upsc tripplite@vmserver ups.status Init SSL without certificate database OL
8. Modify the nut configuration files:
RUN_AS_USER root MONITOR firstname.lastname@example.org 1 admin secret slave MINSUPPLIES 1 SHUTDOWNCMD "/sbin/shutdown -h now" NOTIFYCMD /usr/sbin/upssched POLLFREQ 2 POLLFREQALERT 1 HOSTSYNC 15 DEADTIME 15 POWERDOWNFLAG /etc/killpower NOTIFYMSG ONLINE "UPS %s on line power" NOTIFYMSG ONBATT "UPS %s on battery" NOTIFYMSG LOWBATT "UPS %s battery 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 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
That covers the basic setup of server and client for Linux. I will finish addressing the Promox-specific pieces - including email notification and guest shutdown - in part 2 of this article.
If you have questions about the article or if you're trying to follow along and having problems, I'd be happy to help as best I can. Email me - email@example.com.