saved.sh

Quickstart

From nothing to a restorable backup of a Postgres database.

This walks the local path: a worker on your own machine, so the database credential never leaves your network. It takes about ten minutes.

1. Create a workspace

Sign up and create one. A workspace is the tenant: members, permissions, quotas and billing all belong to it, and nothing crosses between workspaces. No card is required, and a new workspace starts with credit against real usage.

2. Install the CLI

curl -fsSL https://saved.sh/cli.sh | sh
saved login

saved login uses a device code. It prints a code, you approve it in the browser, and the session lands in a local config file. Every later command acts on exactly one workspace, the one your session is scoped to.

saved workspace list
saved workspace switch <name>

3. Provision a worker

A worker is a credential, not a machine. Provisioning gives you a config file to put on the host that can reach your database.

saved worker provision prod-worker-1

Then install and run the worker binary on that host:

curl -fsSL https://saved.sh/worker.sh | sh
saved-worker --config ./config.yaml

The worker credential is shown once. It is what lets a machine claim work in your workspace, so treat it like a database password, and if it leaks, rotate it with saved worker rotate rather than deleting the worker.

4. Generate an encryption key

Backups are encrypted before they leave the machine, with a key we never see.

gpg --quick-generate-key "backups@example.com" default default never
gpg --armor --export backups@example.com > ./keys/prod.asc

Keep the private half somewhere you will still have it after the incident that makes you need it. We hold only the public key. If you lose the private key, your backups are unreadable by you and by us.

5. Declare the backup

Write it in a file and apply it, rather than clicking through a form:

saved.yaml
workers:
  - name: prod-worker-1

backups:
  - name: prod-db
    kind: local
    sourceType: postgres
    worker: prod-worker-1
    schedule: "0 2 * * *"
    compression:
      enabled: true
      algo: gzip
      level: 6
    retention:
      keepLast: 10
      expireAfter: 90d
    encryptionPublicKey:
      valueFrom:
        file: ./keys/prod.asc
saved apply -f saved.yaml

apply reconciles what the file declares. It never deletes what the file omits. Removing a backup is saved backup delete, deliberately, so a typo in a filename cannot destroy a retention policy.

6. Run it now

Don't wait for 02:00 to find out whether it works.

saved backup trigger prod-db
saved run list --backup prod-db

7. Prove you can get it back

A backup you have never restored is a hypothesis.

saved artifact list --backup prod-db
saved restore <artifact-id> --output ./restore-test

Restore is client-side: the artifact is downloaded and decrypted on your machine, with your private key. We are not in the path and could not be.

Next

On this page