Operate an active-passive pair
Share or replicate persistent state while ensuring that only one VOTPort instance writes it.
On this page
VOTPort supports one live instance and a passive standby. Both hosts need the same release, configured paths, and access to the received and outbound files. Plan and rehearse promotion before relying on failover.
Shared storage
The live instance persists state in data/, /received, and /outbound. A standby that takes over those same paths sees the existing links, tenants, settings, receipt identity, and resumable uploads.
- Keep
data/on storage with exactly one writer, such as a block volume that moves with the service. SQLite on NFS is unsupported. /receivedand/outboundmay use shared network storage under the storage guide's requirements.- Fence the previous host before promoting the standby. Two hosts writing one database can corrupt it.
An exclusive lock on data/lock prevents overlapping writers on supported local or shared block storage. /received/.vot-stage/writer.lock is a permanent inode holding a server-coordinated exclusive kernel lock. The diagnostic heartbeat in .vot-stage/.votport-lease refreshes every 30 seconds; an old timestamp or a different wall clock never authorizes takeover.
A clean stop releases the kernel lock. After a crash, follow the NAS lock-recovery rules. Never unlink the lock file: doing so can create independent lock inodes and overlapping writers. Stop or fence the old host first. Ownership loss stops writes and preserves recovery state; a blocked hard-NFS operation can remain in the kernel, so do not infer safety from elapsed time. See direct receiving ownership.
Replicated standby
When the data volume cannot move between hosts, run the standby in replica mode:
votport standby
Configure these variables on that host:
| Variable | Value |
|---|---|
VOTPORT_STANDBY_SOURCE |
The live instance's HTTPS origin |
VOTPORT_REPLICA_TOKEN |
The token configured under System / Standby replica on the live instance |
VOTPORT_DATA_DIR |
The standby's persistent data directory |
VOTPORT_STANDBY_INTERVAL_SECS |
Pull interval, default 60 seconds |
The standby pulls and validates database and identity snapshots, staging the latest successful snapshot for its next normal boot. It does not open the live database or write to the receive root.
Replica mode reports healthy through /healthz while successful pulls remain within two intervals. /readyz stays unavailable and reports replica lag. Do not place a replica-mode process in a serving proxy pool.
Promote and recover
- Fence or stop the old live instance and confirm that it cannot resume writing.
- Check the standby's replica lag and the availability of the shared receive and outbound paths.
- Stop the replica process, then start
votportnormally with the same data directory. - Check readiness, sign in again, and verify an existing link and a representative transfer before directing traffic to it.
Promotion rotates administrative session credentials; receipt and native-transfer identities carry over. Changes after the last successful replica pull are outside the recovered snapshot, and uploads in that window may need to start again. Choose the interval around the amount of recent work you can afford to recover manually.
If promotion is interrupted during restoration, finish a normal VOTPort boot before returning that directory to standby mode. Upgrade the standby binary before the live binary: it refuses snapshots from a newer database schema.
Monitor the pair
Monitor /readyz, replica lag, and the votport_lease_held and votport_lease_age_seconds metrics. A proxy can health-check a shared-volume standby once it starts serving; a replica-mode standby must first be promoted. Use /healthz for proxy liveness so a drained instance can continue serving downloads while it shuts down gracefully.