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.