Your backups exist.
Do they restore?

restore-drill restores your latest Postgres backup every night in a throwaway container, checks the data is really there, and tells you the morning it breaks — not the day you need it.

$ restore-check run --source /backups --pattern '*.dump' --fresh-table sales.orders --fresh-column created_at restore-check: PASS backup /backups/db.dump (24.9 KB, modified 2026-10-08T12:58:43+00:00) format custom postgres 16-alpine restore OK in 0.2s freshness sales.orders.created_at: newest 2026-10-08 12:57:43.311038+00, age 7m (max 1d) OK tables 2 tables, ~5,001 rows top tables by rows (estimate after ANALYZE) sales.orders 5,000 public.stale 1

Why

Real restores, not file checks

pg_restore into a fresh database, then tables, row counts and the newest records are checked. A file that exists is not a backup that works.

Your data never leaves your servers

The check runs on your infrastructure in a container with no network. Only pass/fail and metrics are reported — no table names, no rows.

Proof for audits and clients

Recovery time (RTO) is measured on every run. A monthly restore report for SOC 2, ISO 27001 or a client's security questionnaire is planned for the cloud version.

How it works

  1. Run one command on a server that has Docker: docker run mrvi0/restore-drill run --source s3://bucket/prefix
  2. Point it at your S3 bucket or backup folder. It picks the newest dump, restores it into postgres:<your version> and removes the container afterwards.
  3. Get a Telegram alert when something breaks. Exit code 0/1, so it fits any cron or CI.

Works with dumps from any tool: pg_dump (custom, tar, plain SQL, gzipped), your own cron script, or a backup service that writes to S3.

Open source today, cloud next

CLI available

Free open source

Restore, freshness and table checks, RTO, JSON output, Telegram alerts.

Starter planned

$29 / month

5 databases, nightly checks, an alert when a check did not run, restore history.

Agency planned

$79 / month

20 databases, monthly restore reports for your clients with your logo.

Get early access

Not ready? Run the open-source CLI on your own backup in two minutes.

FAQ

Do you see my data?

No. The restore runs on your server, in a container without network access. Only pass/fail and metrics such as restore time and row counts are reported.

Which databases?

PostgreSQL today. MySQL is next on the roadmap.

What is available now?

The open-source CLI and Docker image work today. The cloud version — missed-run alerts, history, dashboards and reports — is in development; founding members get it first.

Why not just test restores by hand?

Because it happens once, before an audit. Dumps break silently: a missing role, an extension that is not installed, a cron job that wrote an empty file for three weeks.