Skip to main content
Once the daemon runs on your own box (see Deploy to a VPS), you can have it pull and apply new patch releases on its own. This page sets that up with an opt-in Compose overlay that adds a release-channel pin, Watchtower, and rolling Postgres backups.

Is it really “no interruption”?

For your agents, effectively yes. The SDK’s RemoteCollectorSink 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.24 auto-gets bug-fix patches (0.24.1, 0.24.2, …) but never a breaking major. You move to :0.25 deliberately.
  • :latest would auto-pull the next major and run its migrations unattended. Do not auto-track :latest in 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:
The overlay file in the repository still pins mahimairaja/voicegateway:0.10. Until that is bumped, the file you just downloaded puts you on a channel twelve minors behind what this page describes. Edit its image: line to :0.24 before you bring the stack up, and re-check it on your next pull.
That starts three things alongside the daemon: 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 the voicegw-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:
Migrations run on daemon startup and are forward-only. The Compose healthcheck gates a bad boot, but the database is shared state: keep the backups (and ideally a periodic host-level snapshot of the box) so a migration regression is always recoverable.

Opting back out

Bring the stack up with only the base file to drop Watchtower and the backup sidecar and return to a manually-pinned daemon: