Updating MeshMonitor β
What happened to Auto-Upgrade?
As of v4.13, MeshMonitor no longer performs upgrades itself β the watchdog sidecar and unattended auto-apply feature have been retired. MeshMonitor still detects new releases and tells you exactly how to update for your deployment. See the retirement announcement for the full story, or jump to migrating from the old sidecar below.
MeshMonitor checks GitHub for new releases on a schedule and surfaces what it finds β it never modifies its own container, files, or database on your behalf. How you apply an update depends on how you deployed MeshMonitor; pick your platform below.
How update notifications work β
When a newer version is available, MeshMonitor shows an "Update available" banner in the UI with copy-pasteable instructions for your detected deployment method (Docker, LXC, Kubernetes, or bare metal), plus a link to the GitHub release notes. The banner is dismissible per-version.
Under the hood, the same check also fires an upgrade-available system event into the Automation Engine β headlessly, with no browser required. Wire it to a webhook, ntfy, Discord, Slack, or email notification so you find out the moment a release ships, without staring at the UI:
Go to Automations and create a new automation.
WHEN β trigger type System Event β event
upgrade-available.RULE β skip the condition (leave it unconditional) or add one if you only want to be notified above a certain priority.
THEN β action Apprise Notification (or Run Script / Send Message, if you'd rather post somewhere custom) with a message like:
textMeshMonitor {{ trigger.currentVersion }} β {{ trigger.latestVersion }} is available. {{ trigger.releaseUrl }}
See the Automation Engine guide for the full trigger/condition/action reference.
Disabling update checks β
Air-gapped deployments, or anyone who manages updates entirely through external tooling (CI/CD, Renovate, Kubernetes operators), can turn off the check entirely:
services:
meshmonitor:
environment:
- VERSION_CHECK_DISABLED=trueThis disables both the GitHub polling and the update banner. The upgrade-available automation event never fires either, since there's nothing to detect.
Docker Compose β
Pull the new image and recreate the container:
docker compose pull
docker compose up -dThat's it β your docker-compose.yml, .env, and the /data volume are untouched. MeshMonitor migrates its own database schema on startup.
Your image tag picks your update cadence
The tag in your image: line decides how often there is anything to pull: :latest follows stable releases (~weekly), :dev follows release candidates (~daily), and an exact tag like :4.13.0 never moves. This applies to manual pulls and Watchtower alike β Watchtower updates whatever tag the container runs. See the release-tracks FAQ entry for the full comparison.
Unattended updates with Watchtower β
If you want your MeshMonitor container to update itself automatically without running docker compose pull by hand, point Watchtower at it instead of building that logic into MeshMonitor. Watchtower is a dedicated, actively maintained tool for exactly this job β it owns the pull/recreate problem across the many different ways people run Docker (plain Compose, Portainer, Synology, Unraid), which is more than MeshMonitor could ever reliably do for itself.
containrrr/watchtower is archived
The original containrrr/watchtower image was archived in December 2025. Use the community-maintained continuation, nickfedor/watchtower β same environment variables, labels, volumes, and behavior, just a different image name.
Add a Watchtower service to your docker-compose.yml, scoped to only the meshmonitor container with a label so it doesn't touch anything else on your host:
services:
meshmonitor:
image: ghcr.io/yeraze/meshmonitor:latest
container_name: meshmonitor
restart: unless-stopped
labels:
# Opt this container in to Watchtower's watch list
- com.centurylinklabs.watchtower.enable=true
# ...your existing meshmonitor config (ports, volumes, environment)...
watchtower:
image: nickfedor/watchtower:1.14.2
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
# Only touch containers explicitly labeled watchtower.enable=true
- WATCHTOWER_LABEL_ENABLE=true
# Check for new images once a day (seconds)
- WATCHTOWER_POLL_INTERVAL=86400
# Remove old images after a successful update
- WATCHTOWER_CLEANUP=trueThen bring both services up:
docker compose up -dWatchtower will notice new ghcr.io/yeraze/meshmonitor images matching your existing tag (e.g. latest), pull them, and recreate the meshmonitor container in place β preserving its ports, volumes, and environment, since it clones the running container's own configuration rather than re-interpreting your compose file.
The trade-off, honestly: Watchtower needs the same Docker socket mount that the old sidecar did β that's root-equivalent access to your host's Docker daemon. Label-scoping (WATCHTOWER_LABEL_ENABLE=true + the com.centurylinklabs.watchtower.enable=true label) limits what it acts on, not what it could theoretically access. If that trade-off isn't right for your environment, docker compose pull && docker compose up -d on a schedule (cron, a CI job, or just by hand when the banner shows up) is just as valid.
The Docker Compose Configurator can generate this Watchtower block for you β enable the Watchtower (unattended updates) toggle under Additional Settings.
LXC / Proxmox β
LXC installs ship with meshmonitor-update, an in-place git-based updater baked into the template. Run it inside the container:
meshmonitor-updateIt pulls the latest code, rebuilds, and restarts the service for you. This is unchanged by the Auto-Upgrade retirement β it was never part of that subsystem.
Kubernetes / Helm β
Bump the image tag (or chart version, if you track the packaged chart) and apply:
helm upgrade meshmonitor ./helm/meshmonitor \
--set image.tag=4.13.0 \
--reuse-valuesOr, if you manage the Deployment directly:
kubectl set image deployment/meshmonitor meshmonitor=ghcr.io/yeraze/meshmonitor:4.13.0
kubectl rollout status deployment/meshmonitorFor hands-off updates, point a GitOps/update-automation tool at your manifests or chart values instead of scripting it yourself:
- Renovate β opens a PR whenever a new MeshMonitor image tag is published; you review and merge.
- Flux image automation β watches the registry and commits/updates the image tag directly, optionally gated by policy.
Both integrate with your existing PR/review/CD pipeline rather than reaching into the cluster the way the old sidecar reached into Docker.
Bare metal / from source β
cd /var/lib/meshmonitor/meshmonitor
# Stop the service
sudo systemctl stop meshmonitor
# Pull latest changes
git pull
git submodule update --init --recursive
# Reinstall dependencies and rebuild
npm install --legacy-peer-deps
npm run build
npm run build:server
# Restart the service
sudo systemctl start meshmonitorSee the full Deployment Guide for the complete bare-metal install and update process.
Migrating from the old Auto-Upgrade sidecar β
If you previously ran the docker-compose.upgrade.yml overlay or set AUTO_UPGRADE_ENABLED=true, clean up the leftover pieces:
Stop using the upgrade overlay. Drop
-f docker-compose.upgrade.ymlfrom however you start MeshMonitor:bash# Before docker compose -f docker-compose.yml -f docker-compose.upgrade.yml up -d # After docker compose up -dRemove the orphaned watchdog container. MeshMonitor never had Docker socket access itself, so it can't clean this up for you:
bashdocker rm -f meshmonitor-upgraderRemove
AUTO_UPGRADE_ENABLEDfrom your environment. It no longer does anything as of v4.13 β delete the line from yourdocker-compose.ymlenvironment block (or.envfile) and redeploy.Stale internal files are cleaned up automatically. On first v4.13 boot, MeshMonitor removes leftover
/data/.upgrade-trigger,/data/.upgrade-status, and the watchdog scripts it used to deploy to/data/.meshmonitor-internal/. No action needed on your part.Want unattended updates back? Set up the Watchtower recipe above β it's a drop-in replacement for what the sidecar used to do, minus the reconciliation bugs.
Related Documentation β
- Automation Engine β build the
upgrade-availablenotification recipe and anything else you want to automate. - Docker Compose Configurator β generate a
docker-compose.ymlwith the Watchtower toggle enabled. - Production Deployment β general production hardening and operations guidance.