Pro: offsite backups

Local backups (control-plane DB + every app volume, daily, 7-day retention) are free and automatic. Pro adds an offsite copy: encrypted on your box before it ever leaves, pushed to a bucket you control.

Get a Pro license

Buy Pro on the pricing page — Polar emails you a license key immediately at checkout.

Configure

Add these to ~/.smallcloud/config.json:

{
  "proLicenseKey": "the key from your Polar receipt",
  "backupPassphrase": "a long random passphrase — write it down, it's not recoverable",
  "s3": {
    "endpoint": "https://s3.us-west-2.amazonaws.com",
    "region": "us-west-2",
    "bucket": "your-backup-bucket",
    "accessKeyId": "...",
    "secretAccessKey": "..."
  }
}

Any S3-compatible provider works — AWS S3, Cloudflare R2, Backblaze B2. For R2/B2, set endpoint to the provider's S3-compatible URL and region to whatever they document (R2 typically uses "auto").

Back up

$ smallcloud backup --to-s3
✓ Backup written to ~/.smallcloud/data/backups/2026-08-26
  volumes: sc-data-myapp
✓ Pushed 2 file(s) to s3://your-backup-bucket/2026-08-26/

Every file is encrypted client-side (AES-256-GCM, key derived from backupPassphrase) before upload — your bucket provider never sees plaintext.

Restore

$ smallcloud restore --from-s3 --yes            # latest
$ smallcloud restore --from-s3 2026-08-20 --yes  # a specific date

This is destructive — it stops your Smallcloud services, overwrites the current control-plane database, and restores every app volume from the backup. Apps whose container image no longer exists need a fresh smallcloud deploy afterward; their data is already back.

How the encryption works

Each file gets a random salt and IV; the key is derived from your passphrase via scrypt. Format: [salt][iv][auth tag][ciphertext], AES-256-GCM — tampering or a wrong passphrase fails the auth-tag check instead of silently returning garbage. Lose the passphrase and the backups are unrecoverable by design; nobody, including us, can recover them for you.

More guides