I do not want a home server that never updates, but I also do not want every container to update itself at 3 a.m. The useful middle ground is to separate low-risk services from services that can change data, schemas, or device behavior.

My update process starts by checking image digests without pulling anything. When a new image appears, it has to remain stable for a delay window before it becomes a candidate. A newer digest resets that timer instead of letting an unstable tag move through immediately.

The update groups I use

  • Infrastructure services such as Traefik and AdGuard can update after a short delay.
  • Normal applications can update after a backup check and delay.
  • MariaDB, Home Assistant, Zigbee2MQTT, and Z-Wave JS UI stay manual. Those services can involve migrations, radio networks, or behavior changes that deserve supervision.

Before an update applies, the services with important state need a fresh backup. That includes Home Assistant, MariaDB, Vaultwarden, Obsidian sync, MQTT, and the radio services. If the backup is too old, the update should stop instead of making a risky change more convenient.

sudo domum-core updates check
sudo domum-core updates status
sudo domum-core updates apply homeassistant --dry-run

I also keep an eye on image age. Manual does not mean forgotten. If an image has been sitting too long, that is a reminder to review it, read the release notes, and plan the maintenance window.

The goal is not full automation. The goal is avoiding both extremes: reckless updates and an unmaintained server that slowly becomes harder to recover.

— Franco