Published on : 2026-10-05 11:25
       
       It was time.
       ‾‾‾‾‾‾‾‾‾‾‾‾
       My servers were running Ubuntu 24.04.4 LTS, and with Ubuntu 
       26.04.1 LTS available, I decided it was finally time to upgrade 
       them. Of course, upgrading several servers at once is a great way 
       to turn a quiet evening into an exciting troubleshooting session. 
       So I did what any cautious homelabber would do:
       
       I upgraded one server first.
       
       The test subject
       ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
       The first victim was lenovo1. I logged in, made sure everything 
       looked normal, and ran:
       
           do-release-upgrade
       
       That's it. The upgrade process did its thing and I waited. 
       And waited. And waited some more. Eventually it reached 100%.
       
       There was, however, one little bit of interaction required during 
       the upgrade.
       
       Ubuntu asked me what to do with my existing NUT configuration 
       files. Since I already had my UPS setup configured exactly the 
       way I wanted, I chose to keep my current versions. Three times. 
       I had to confirm that I wanted to keep:
       
           /etc/nut/nut.conf
           /etc/nut/ups.conf
           /etc/nut/upsmon.conf
       
       
 (DIR)  Installing and configuring NUT (Network UPS Tools) for your home lab
       
       The moment of truth
       ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
       I rebooted lenovo1. Time for the moment of truth. Did it boot? 
       Yes. I sshed to lenovo1 and was greeted with:
       
           Welcome to Ubuntu 26.04.1 LTS (GNU/Linux 
           7.0.0-38-generic x86_64)
       
       Nothing appeared to have exploded. This was the part where I could 
       have immediately started upgrading all the other machines.
       
       The rest of the herd
       ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
       Once lenovo1 survived the upgrade and rebooted successfully, I 
       proceeded with the rest:
       
           tiny
           nas
           lenovo2
           lenovo3
       
       I repeated the same process on each machine: do-release-upgrade. 
       Wait for 100%. Keep the existing NUT configuration when asked. 
       Reboot. Check that everything works.
       
       No downtime
       ‾‾‾‾‾‾‾‾‾‾‾
       The nice thing about having the servers behind Keepalived is that 
       I didn't have to take my public services offline while doing all 
       this.
       
       The services exposed to the outside world include:
       
        * Gemini
        * Gopher
        * Finger
        * HTTPS
       
       Normally, rebooting the server currently handling the traffic 
       would mean a little outage. But with Keepalived, the Virtual IP 
       can move to another node when one goes down. So I could upgrade 
       and reboot one server while another node continued handling the 
       traffic.
       
       No maintenance page. No "I'll be back soon." No angry users from 
       the 2 people who might actually notice that my Gopher server is 
       not online.
       
       The services stayed online while I worked through the cluster.
       
       I originally installed Keepalived after discovering that tiny was 
       a single point of failure for the entire cluster and I wrote about 
       that adventure here:
       
 (DIR)  Cluster Outage Postmortem: Missing Keepalived
       
       That little bit of redundancy turned out to be particularly 
       useful during this upgrade.
       
       My servers survived another major Ubuntu upgrade, the UPS 
       configuration survived intact, my public services stayed online, 
       and I didn't even have to reach for the rescue USB.
       
       I'll call that a BIG win.
       
 (DIR)  Back to my phlog