Is it really “no interruption”?
For your agents, effectively yes. The SDK’sRemoteCollectorSink buffers telemetry in memory and retries with backoff, and treats HTTP 429 as backpressure. During the few-second container swap of an update, agents buffer and re-send, so no agent call fails.
Two honest caveats:
- Cost telemetry is best-effort by design (it is not billing-of-record). A long daemon outage can drop some rows; a fast update swap does not.
- On a single node, a container recreate is not literally zero-downtime: the ingest endpoint and dashboard are unavailable for a few seconds. For true zero-downtime you need two daemon replicas behind a reverse proxy doing rolling restarts against shared Postgres (and migrations kept backward-compatible across the rollout). That is overkill for one box.
The release channel: pin to a minor, never :latest
The release workflow publishes three Docker tags per version, for example 0.24.0, 0.24, and latest. The overlay pins the daemon to the minor channel :0.24:
:0.24auto-gets bug-fix patches (0.24.1,0.24.2, …) but never a breaking major. You move to:0.25deliberately.:latestwould auto-pull the next major and run its migrations unattended. Do not auto-track:latestin production.
A minor channel tag exists for every published minor. If you’re running an older minor than
0.24, pin the overlay to that minor’s channel instead (for example :0.23) until you deliberately move up.Turn it on
The overlay (docker-compose.autoupdate.yml) layers on top of the daemon stack. From your deploy directory:
Always pass both
-f files together for later up, down, and logs, so Compose keeps the merged definition.
Tuning
Set these in your.env next to the Compose files:
Watchtower’s cadence is
WATCHTOWER_POLL_INTERVAL (default 3600, hourly) in the overlay.
Restore from a backup
Dumps live in thevoicegw-backups volume as voicegw-<timestamp>.sql. To roll back after a bad update:
1
Stop the daemon
Stop the daemon so nothing writes during the restore.
2
List available dumps
3
Restore the chosen dump
4
Pin to the known-good version and restart
Edit the image tag in
docker-compose.autoupdate.yml (for example :0.24.1), then bring the stack up: