Skip to content
Rested
All guides
11 min readWritten and maintained by Rested

VPS backup restore test checklist: prove recovery before an outage

Run a realistic VPS backup restore test, validate the application rather than the archive, and turn the result into useful recovery evidence.

Start with a believable failure, not a generic test

Imagine a routine deployment corrupts your production database at 14:20. The VPS still boots, but the application serves errors and the last trustworthy transaction happened shortly before the deployment. That is a much better restore-test premise than “download a few files and see whether they open.” It forces you to choose a recovery point, assemble the application, and make a decision about lost data.

Write the scenario in one sentence before the test begins. Name what is unavailable, what is assumed lost, which backup copy remains reachable, and what “recovered” means to the business. A marketing site may be recovered when pages and the contact form work. A billing system is not recovered until authentication, recent customer records, scheduled work, and payment reconciliation have been checked.

Use a non-production destination. A restore rehearsal should not overwrite the live server or quietly connect a recovered application to production queues, email providers, payment gateways, or webhooks. Isolation makes mistakes cheap and lets the team inspect old data without creating new customer-facing side effects.

Record the recovery point before touching the backup

Choose a specific recovery point and write down why it is safe. “Latest” is ambiguous when several backup sets, hosts, or database dumps share storage. The newest filesystem snapshot might contain an incomplete application change, while an earlier database dump is the last known-good state. Capture timestamps, host identity, included paths, and any tag or job name used to identify the set.

Compare that timestamp with the scenario. If the selected snapshot predates the incident by three hours, the exercise has already exposed a three-hour data-loss window. That may be acceptable, or it may violate the service’s recovery point objective. Do not conceal the gap by picking a more convenient scenario after seeing the available backups.

Also verify that the recovery operator can reach the repository from the test environment. Storage access and the repository password are separate dependencies. A perfect backup is of little use if both credentials live only on the failed VPS or in the personal account of somebody who is unavailable.

Build an empty recovery target

The target should resemble a machine you could obtain during a real incident, not the carefully tuned production host. Record its operating-system version, architecture, disk space, network restrictions, and installed tools. If recovery depends on a particular package version or private image registry, the test should reveal that dependency.

Keep the target empty enough that restored data cannot be mistaken for leftovers. Old test databases, cached uploads, and forgotten configuration files can make an incomplete restore appear successful. Label the environment with the test date and scenario, then prevent it from receiving normal production traffic.

Before data transfer starts, note the time. Recovery time includes locating documentation, obtaining approval, retrieving credentials, creating infrastructure, restoring data, starting services, and validating the result. Measuring only the download gives a flattering number that nobody can use during an outage.

Restore the application in dependency order

Recover the components in the order the service actually needs them: infrastructure definition, system and application configuration, database-aware backup artifacts, user uploads, and then application services. The exact order varies, but it should be explicit. Starting everything at once turns one clear failure into a screen full of secondary errors.

Treat databases as applications, not ordinary directories. PostgreSQL, MySQL, and MongoDB have their own consistency and restore rules. A logical dump must be loaded into a compatible database service; a raw copy of live database files is not automatically a usable database backup. Keep the database isolated until checks pass, especially if the recovered application could run migrations on startup.

Restore to a separate location first when possible. That protects the current system, preserves evidence, and makes the recovered tree easy to inspect. Check ownership, permissions, symbolic links, extended attributes when relevant, and whether expected files are present—not merely whether some files arrived.

Validate behavior, data, and boundaries

A file count or checksum can establish that bytes were recovered, but it cannot establish that the service is usable. Start with a small set of application-level checks: can a user sign in, can the service read a representative old record, do recent uploads render, and can a read-only report complete? Choose checks that would quickly reveal a missing database, wrong encryption secret, broken permission, or stale configuration.

Inspect temporal boundaries. Find the newest expected database record and newest uploaded file, then compare their times with the chosen recovery point. If those components disagree by an hour, the application may start while presenting an inconsistent history. Record the mismatch rather than rounding everything to “roughly last night.”

Keep outbound integrations disabled or redirected. A recovered queue may contain unsent email, invoice, or webhook jobs from the past. Replaying them in a test can contact customers or create duplicate actions. The test should prove that such work can be reviewed and reconciled before production is reopened.

Measure the parts people usually forget

Mark when each phase ends: incident declaration, credential access, target readiness, data restore, service startup, technical validation, and business approval. The longest phase is often not data transfer. Waiting for a storage-account owner, finding an obsolete environment file, or rebuilding DNS knowledge can consume most of the recovery window.

Note who performed the test and who had to help. If the only successful recovery requires the person who designed the original server, the procedure is not yet transferable. On the next rehearsal, let a different operator drive while the author observes. Confusing steps belong in the runbook, not in one person’s memory.

Estimate production recovery separately from the lab result. A small sample restore can validate procedure, while a full-volume exercise provides stronger timing evidence. State which one you ran. Network throughput, database replay, integrity checks, and provider provisioning can all behave differently at production scale.

Close the test with evidence and owners

End with a short record: scenario, recovery point, backup source, restored components, validation performed, elapsed time, estimated data loss, failures, and the decision to pass or fail. Attach logs where they help, but do not make a hundred-page transcript the only evidence. A future responder needs conclusions and exact follow-up owners.

Turn every surprise into a dated action. Examples include moving a recovery password to team-controlled custody, adding an overlooked upload path, documenting a required package, separating a test webhook, or changing backup frequency. A failed rehearsal is useful when it changes the system; a passed rehearsal with untracked caveats is not.

Set the next test based on change and risk rather than an arbitrary annual ritual. Repeat after storage migrations, database upgrades, major deployment changes, ownership changes, or a meaningful increase in data volume. Between full exercises, smaller file and database restores can keep the mechanics familiar.

The checklist to use on test day

Keep the live checklist brief enough to follow under pressure. Detailed explanations can remain in the runbook, while the test record captures evidence and exceptions.

  • Define the failure scenario, recovery point objective, recovery time objective, and pass criteria.
  • Select and record an exact backup set; confirm repository access and recovery-key availability.
  • Create an isolated, empty target and disable real outbound integrations.
  • Restore configuration, database artifacts, persistent files, and services in dependency order.
  • Verify permissions, representative data, newest expected records, uploads, and application behavior.
  • Measure the entire recovery, including access, provisioning, validation, and approval time.
  • Document gaps with owners and dates, then schedule the next rehearsal after relevant changes.

Technical basis

First-party references

Technical claims and limitations in this guide were checked against these primary sources. Confirm version-specific behavior when designing a production recovery process.

Related from Rested

Common questions

Frequently asked questions

How often should I test a VPS backup restore?

Run a full test at a frequency justified by the service’s risk, and repeat it after major changes such as a database upgrade, storage migration, or ownership handoff. Use smaller selective restores between full exercises so recovery does not become unfamiliar.

Does a successful restic check replace a restore test?

No. Repository checks can find structural or data-integrity problems, but they do not prove that you backed up the right paths, can obtain credentials during an incident, or can start and validate the application within its recovery target.

Can I test a restore on the production VPS?

An isolated target is safer. Restoring over production can overwrite current data, and starting an old application state can send duplicate email, webhooks, or jobs. If a production component must be involved, define strict boundaries and a rollback plan first.

What evidence should a restore test produce?

Record the scenario, exact recovery point, components restored, checks performed, elapsed time by phase, observed data-loss window, result, and follow-up actions. The evidence should let another operator understand what was actually proven.