client

boring-backup.rb

The easiest way to back up PostgreSQL databases for small projects

boring-backup is a gem with a single purpose — back up a database and upload it somewhere. It is fast and efficient: it doesn't write to disk, so it can run in environments with limited disk space.

# install
$ bundle add boring-backup
$ bundle exec bb install
# configure

Edit config/initializers/boring_backup.rb:

BoringBackup.configure do |config|
  config.sentinel_key = '12345678-abcd-1234-abcd-abcdef123456'

  config.register(:s3) do |store|
    store.bucket = Settings.aws.bucket
    store.region = Settings.aws.region
    store.access_key_id = Settings.aws.access_key_id
    store.secret_access_key = Settings.aws.secret_access_key
  end
end
# run

You can trigger the backup from a recurring job or run it manually.

Solid Queue recurring job
# config/recurring.yml
production:
  boring_backup:
    class: BoringBackup::BackupJob
    schedule: every day at 3am
manually
$ bundle exec bb backup
Boring Backup  db_name
 s3     2.5 MB in 1.8s  → database/db_name/2026/07/16-03-00-12.dump

Backed up to 1 store(s).

observer

boring-backup Sentinel

A watchdog that notifies you when backups stop running

Your backups run on a schedule, and when they quietly start failing, nothing tells you.

boring-backup Sentinel is the outside observer that keeps watch. The boring-backup gem notifies the Sentinel after every run. If a notification doesn't arrive on time, the Sentinel alerts you (webhook/slack).

Why it can't live in your app

A process that died cannot report that it died. Whatever runs your backup is the last thing you should trust to tell you the backup stopped. That's the whole reason to watch from outside.

Other features

  • Size anomaly detection — get alerted if your database size suddenly changes.
  • That's all. No need to overcomplicate simple things.