APC Back UPS 700 on Ubuntu 1804
Having an uninterruped power supply for my server is important. I use an inexpensive one: The APC Back-UPS BX 700 and it works well. If I had to buy a new one, I'd use the one with the proper Schuko-connection for Germany. The so called "Kaltgeräte-Ausgänge - IEC 320 C16" / "Appliance couplers" are a little flimsy and tend to disconnect.
apcupsd not in Ubuntu 18.04
Your server needs to know the status of the UPS in order to do a nice shutdown before the battery is empty. apcupsd is the daemon of choice for ubuntu. I was disappointed to see that this package does not exist any more. (UPDATE: The reason it did not exist was that I did not have universe repository installed.
sudo add-apt-repository universe would have provided the old apcupsd.)
nut is the successor
The new package is nut and it looks complicated on first sight. Nut will act as a server for multiple clients that can monitor the current state of the UPS, which sounds like a bit of overkill at first, but thinking about it, …, well I guess this is the proper unix-way of doing it. The instructions I found were a little outdated and after some trial an error I found a nice configuration that works for me. It is surprisingly easy.
At first, I become root and create a btrfs-snapshot of my system just in case I mess up and need to roll back.
$ sudo -i $ btrfs subvolume snapshot / /snapshots/beforenut
Then I install the package
$ apt install nut
This will install both, the
nut-client and the
[apc700] driver = usbhid-ups port = auto desc = "APC Back-UPs 700"
I can test this setting to see if it works.
$ service nut-server restart Init SSL without certificate database battery.charge: 100 battery.charge.low: 10 battery.charge.warning: 50 battery.date: 2001/09/25 battery.mfr.date: 2015/11/01 battery.runtime: 788 battery.runtime.low: 120 battery.type: PbAc battery.voltage: 13.7 battery.voltage.nominal: 12.0 device.mfr: American Power Conversion device.model: Back-UPS XS 700U device.serial: 3B1544X17148 device.type: ups driver.name: usbhid-ups driver.parameter.pollfreq: 30 driver.parameter.pollinterval: 2 driver.parameter.port: auto driver.parameter.synchronous: no driver.version: 2.7.4 driver.version.data: APC HID 0.96 driver.version.internal: 0.41 input.sensitivity: medium input.transfer.high: 300 input.transfer.low: 140 input.transfer.reason: input voltage out of range input.voltage: 234.0 input.voltage.nominal: 230 ups.beeper.status: enabled ups.delay.shutdown: 20 ups.firmware: 924.Z3 .I ups.firmware.aux: Z3 ups.load: 36 ups.mfr: American Power Conversion ups.mfr.date: 2015/11/01 ups.model: Back-UPS XS 700U ups.productid: 0002 ups.realpower.nominal: 390 ups.serial: 3B1544X17148 ups.status: OL ups.test.result: No test initiated ups.timer.reboot: 0 ups.timer.shutdown: -1 ups.vendorid: 051d
Now I need to configure the client
[upsmon] password = pass upsmon master
RUN_AS_USER nut MONITOR apc700@localhost 1 upsmon pass master
And restart the services.
$ service nut-server restart $ service nut-client restart $ service nut-client status
You can see it's active and running. This is pretty much it. Events get logged in
/var/log/syslog and the server will be shutdown when the battery is low.
Bonus: E-Mail notification
As a little extra, I like to get notified with an email message when events occur.
I create a script that does that. Prequisite: Have a mail transfer agent installed. I use postfix.
$ cd /bin/ $ emacs /notifyme
#!/bin/bash echo -e "Subject:UPS system event on my server \n\n $*" | sendmail email@example.com
Make the file executable
$ chmod ug+x notifyme $ chown root:nut notifyme
You can try if you really receive an email by calling
$ /bin/notifyme "This is a test"
Now I can add the
+EXEC flag to the events I want to get an email for.
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+EXEC NOTIFYFLAG NOCOMM SYSLOG+WALL+EXEC NOTIFYFLAG NOPARENT SYSLOG+WALL+EXEC
Don't forget to remove the
# at the beginning of the lines.
Now restart the services and unplug the UPS to see if it works.
$ service nut-server restart $ service nut-client restart
I am aware that this email is only of limited use. If there is a outage, my switch and internet service will most likely be down, too. However it's good to get notified when a cable disconnects or my battery needs to be replaced.