Setting up Daily Off-Site Backups and Automated Restore Tests for Production Sites
Ivan
Lead Engineer & Strategist at Softlimes

Why WordPress Backup Plugins Stored on the Same Disk Fail When Needed
When we onboard a new hosting client and ask about their backup strategy, they often point to a WordPress backup plugin configured by a previous developer. When we inspect the server, we find thirty gigabytes of uncompressed .zip files sitting inside /wp-content/uploads/backups/ on the exact same disk as the live website.
Storing backups on the production server violates basic disaster recovery rules. First, those huge archives fill up disk inodes and slow down the server. Second, if the cloud provider suffers a volume failure or an attacker gains access to the web root, your live site and your backups disappear together.
Implementing the 3-2-1 Backup Rule With Encrypted Object Storage
At Softlimes, we run backups at the infrastructure level outside the web application. We follow a strict 3-2-1 architecture: three copies of your data, stored across two separate cloud providers, with at least one immutable off-site copy in a different geographic region.
Every night (and hourly for high-volume transactional databases), our backup daemon streams compressed, client-side AES-256 encrypted snapshots using Restic to an isolated Amazon S3 or Backblaze B2 bucket configured with Object Lock.
- Use --single-transaction flags on MySQL/MariaDB and pg_dump on PostgreSQL so database dumps are consistent without locking live tables.
- Enforce S3 Object Lock (WORM) retention rules so even a compromised server key cannot delete or overwrite existing backup snapshots.
- Retain hourly database snapshots for 48 hours, daily snapshots for 30 days, weekly for 12 weeks, and monthly for 1 year.
- Monitor backup completion via dead-man switch alerts that page our engineers if a scheduled backup fails to check in on time.
Why an Untested Backup Is Just a Wish
Having green checkmarks in a backup log does not mean you can actually recover your business under pressure. We have audited legacy systems where nightly backups ran for two years, only for the owner to discover during an outage that the SQL dump file was zero bytes due to an expired database user password.
A backup system is only as good as its last verified restore. Our infrastructure pipeline automatically spins up an isolated ephemeral container every week, pulls the latest encrypted off-site snapshot, imports the database, and boots the application.
Measuring Recovery Time Objective (RTO) and Recovery Point Objective (RPO)
Our automated restore test runs a headless check against the restored container to confirm that database tables contain recent rows and the homepage renders HTTP 200, then logs the exact time required to complete the recovery.
Knowing with certainty that we can restore a complete production database and file tree to a fresh server in under twenty minutes gives business owners real peace of mind.
Each weekly restore verification sends a structured pass-or-fail report with database row counts and boot timings to our operations channel. You never have to wonder whether your disaster recovery plan works in practice.
Related Softlimes Service
Monitoring and Backups
See how our engineering team scopes, builds, and supports this workflow in production.
Related articles by Ivan
Zero-Downtime Website Migration Checklist for DNS, SSL, Databases, and Email
Moving a production website or online store to a new server without losing orders or breaking company email requires careful preparation. Here is the exact migration checklist our infrastructure team follows.
How We Fix Core Web Vitals LCP, INP, and CLS on Heavy WordPress and WooCommerce Sites
Installing three conflicting caching plugins will not fix failing Core Web Vitals scores in Google Search Console. We walk through the exact engineering fixes for LCP, INP, and CLS on WordPress and WooCommerce.
Redis Object Caching, PHP-FPM Tuning, and CDN Rules for High-Traffic Launches
Default Linux server configurations crash under sudden PR spikes or product launches even when CPU usage looks low. Here is how we tune Nginx, PHP-FPM process pools, Redis, and edge caching for peak traffic.