A backup that hasn’t been verified is not a backup — it’s a wish. Every sysadmin has heard the horror story: months of automated backup jobs running silently, only to discover on recovery day that every single archive is corrupt, incomplete, or missing critical files. The problem isn’t that self-hosted backup tools are unreliable — Borg, Restic, and Kopia all use strong authenticated encryption. The problem is nobody tests until it’s too late.
This guide covers the tools and strategies that turn “hope your backups work” into a verifiable, automated process. We’ll look at Borgmatic, Restic’s built-in verification, Kopia’s consistency checks, and dedicated restore testing frameworks that catch problems before they become disasters.
Why Backup Verification Matters
Self-hosted infrastructure faces unique risks that cloud providers abstract away. Bit rot on spinning disks, network interruptions during S3 uploads, filesystem snapshots that capture partial writes, and storage backends that silently return I/O errors — all of these can produce backup files that look complete but contain corrupted or missing data.
The three pillars of backup verification are:
- Integrity checking — confirming that stored data hasn’t been corrupted since backup time. Every serious backup tool uses authenticated encryption (AEAD) or cryptographic checksums to detect tampering and bit rot.
- Consistency validation — ensuring that the backup represents a coherent state of the source system. A database dumped mid-transaction, or a filesystem captured while files were actively being written, produces internally inconsistent backups.
- Restore testing — the only definitive proof that a backup works is actually recovering data from it. Automated restore testing extracts a sample of files, verifies checksums, and reports any discrepancies.
Without all three, you’re flying blind. A backup job that reports “success” based solely on exit code tells you nothing about whether the data inside is actually usable.
Borgmatic: Automated Backup Orchestration with Built-In Verification
Borgmatic (2,224 stars, last updated April 2026) is a configuration-driven wrapper around BorgBackup (13,222 stars) that adds automated scheduling, retention policies, and — critically — built-in verification hooks.
How Borgmatic Verifies Backups
Borgmatic runs three verification layers automatically:
borg check— validates repository metadata, archive index consistency, and segment file integrity using CRC32 checksums and HMAC authentication tags- Extract testing — periodically extracts a random subset of archived files to a temporary directory and compares them against expected checksums
- Hook-based validation — runs custom scripts (database dumps, application health checks) before and after backup creation
| |
The consistency section is where Borgmatic shines. Unlike running borg check manually, Borgmatic schedules different check types at different frequencies — lightweight repository checks run often, while expensive extract tests run quarterly to avoid impacting production storage.
docker Deployment
| |
Schedule the container via cron or systemd timer:
| |
Restic: Built-In Integrity with Cryptographic Proofs
Restic (33,165 stars, last updated April 2026) is written in Go and supports a wide range of backends: local filesystem, SFTP, REST server, S3-compatible storage, Backblaze B2, Azure Blob, and Google Cloud Storage.
Restic’s Verification Commands
Restic uses authenticated encryption (XSalsa20-Poly1305) for all stored data. Every blob is encrypted with a unique key and includes a MAC for tamper detection.
Full repository check:
| |
Specific snapshot verification:
| |
The --read-data-subset flag is critical for large repositories. A 10TB repository check might take hours with full read, but --read-data-subset=10% validates a random 10% sample in a fraction of the time — catching most corruption issues without the full I/O cost.
Automated Restore Testing with Restic
| |
Docker Deployment
Restic’s official image includes the binary but requires you to mount configuration:
| |
Kopia: Fast Verification with Client-Side Deduplication
Kopia (13,038 stars, last updated April 2026) is a cross-platform backup tool written in Go that combines deduplication, compression, and encryption with a unique content-addressable storage model. It includes both CLI and a web-based GUI.
Kopia’s Verification Approach
Kopia stores data in content-addressed blobs with BLAKE2b-256 hashing. Every piece of data is identified by its hash, making it impossible to serve corrupted content — the hash simply won’t match.
| |
The --verify-files-percent flag works similarly to Restic’s --read-data-subset but operates at the file level — it actually extracts and checksums 25% of files in the snapshot, providing stronger guarantees than a metadata-only check.
Automated Kopia Verification
| |
Docker Deployment with GUI
Kopia’s unique advantage is its built-in web UI, which is useful for monitoring verification status:
| |
Comparison: Backup Verification Tools
| Feature | Borgmatic + Borg | Restic | Kopia |
|---|---|---|---|
| Encryption | AES-256-CTR-HMAC | XSalsa20-Poly1305 | AES-256-GCM |
| Hash algorithm | HMAC-SHA256 | Poly1305 MAC | BLAKE2b-256 |
| Metadata check | borg check | restic check | kopia repository validate |
| Full data read check | ✅ borg check --repository-only off | ✅ restic check reads all blobs | ✅ kopia snapshot verify |
| Partial sampling | ❌ Not built-in | ✅ --read-data-subset=10% | ✅ --verify-files-percent=25 |
| Extract testing | ✅ Borgmatic extract test | Manual restore to temp dir | Manual via snapshot restore |
| Automated scheduling | ✅ YAML config | Requires cron/systemd | Built-in scheduler + cron |
| Backend support | SSH, local, rclone | S3, SFTP, REST, B2, Azure, GCS | S3, B2, GCS, Azure, SFTP, WebDAV |
| Web UI | ❌ CLI only | ❌ CLI only | ✅ Built-in web GUI |
| Retention policies | ✅ Flexible (daily/weekly/monthly) | ✅ forget --keep-* flags | ✅ Policies with keep-latest, keep-hourly |
| Compression | lz4, zstd, lzma | none (by design) | zstd, s2, deflate |
| Language | Python | Go | Go |
| Stars | 2,224 (wrapper) / 13,222 (Borg) | 33,165 | 13,038 |
Additional Verification Tools and Strategies
Beyond the three main backup engines, several supplementary tools strengthen your verification posture:
Vorta — Desktop GUI for Borg
Vorta provides a desktop GUI for Borg with integrated scheduling and log monitoring. While it doesn’t add new verification methods beyond borg check, it makes monitoring easier for non-technical users and surfaces errors in a GUI rather than requiring log parsing.
| |
Restic Browser — Interactive Repository Explorer
restic-browser is an Electron-based GUI for browsing Restic repositories. It lets you inspect snapshots, verify individual files, and estimate recovery times — useful for pre-disaster-recovery planning.
Database-Specific Verification
For database backups, generic file integrity checks are insufficient. A .sql dump can be byte-perfect but contain logically inconsistent data. Use database-specific tools:
| |
Storage Backend Health Monitoring
Your backup is only as reliable as the storage it sits on. Monitor the underlying storage:
| |
See our guides on MinIO S3 storage and NAS solutions for storage infrastructure that supports reliable backup targets.
Choosing the Right Verification Strategy
The best approach depends on your infrastructure scale and tolerance for false negatives:
Small setups (1-3 servers, < 500GB): Restic with weekly check --read-data-subset=10% and monthly restore-to-temp testing. The low overhead makes frequent verification practical, and the S3 backend support means offsite copies are easy.
Medium setups (5-20 servers, 1-10TB): Borgmatic with automated consistency checks. The YAML-driven scheduling handles retention and verification at scale, and Borg’s deduplication keeps storage costs down for large datasets.
Large setups (20+ servers, 10TB+): Kopia with its content-addressable model and built-in scheduler. The web UI provides visibility across multiple backup sources, and the --verify-files-percent flag offers tunable verification depth without overwhelming I/O.
Regardless of tool, the golden rule remains: an untested backup is not a backup. Schedule verification as rigorously as you schedule the backup itself, and set up alerting so you hear about failures during business hours — not at 3 AM on a Sunday when you’re trying to restore production.
FAQ
How often should I verify my backups?
For production systems, run lightweight integrity checks (metadata-only) weekly and full data read checks monthly. For critical databases or compliance-regulated data, add weekly restore-to-temp testing. The verification frequency should be proportional to how much data you’d lose if the backup turned out to be corrupt — daily verification for systems with RPO under 1 hour, weekly for less critical workloads.
What’s the difference between integrity check and restore testing?
An integrity check confirms that stored data hasn’t been corrupted — it validates checksums, MAC tags, and repository structure. Restore testing goes further by actually extracting data to a temporary location and verifying that the recovered files are usable. Integrity checks catch bit rot and storage corruption; restore testing catches logical errors like incomplete database dumps, permission issues, and missing dependencies.
Can backup verification impact production performance?
Full data read checks do generate I/O and network traffic, especially for large repositories. Use sampling flags (--read-data-subset, --verify-files-percent) to reduce impact. Schedule heavy verification during off-peak hours. Borgmatic’s approach of running different check types at different frequencies — lightweight checks often, extract tests rarely — is designed specifically to balance confidence with performance.
Does encryption affect verification speed?
Yes, but the impact is usually small. Restic’s XSalsa20-Poly1305 and Kopia’s AES-256-GCM both have hardware acceleration on modern CPUs. Borg’s AES-256-CTR-HMAC is slightly slower but still achieves hundreds of MB/s on typical server hardware. The bottleneck is usually disk I/O or network bandwidth to the storage backend, not cryptographic overhead.
What happens if verification detects corruption?
Most backup tools will report which blobs or segments are corrupted but cannot repair them — the data is already lost at that point. The correct response is: (1) immediately create a fresh backup from the live system, (2) investigate the root cause (failing disk, network issue, storage backend problem), (3) if you have multiple backup targets, cross-reference to see if the corruption is isolated to one backend, and (4) for critical data, restore from the most recent known-good snapshot while the fresh backup runs.
Is it safe to run backup verification on production servers?
Yes, if you use sampling. Running restic check with --read-data-subset=10% on a production server reads only a fraction of the backup data and typically completes in minutes. Full extract tests should run on a separate host that has read-only access to the backup repository, not on the production server. For Kopia, the web UI server can run on a monitoring host while backups execute from production servers.