| name | frappe-ops-backup |
| description | Use when configuring backups, restoring sites, encrypting backup files, scheduling automated backups, or planning disaster recovery. Prevents data loss from missing backups, failed restores, and unencrypted sensitive data. Covers bench backup, bench restore, backup encryption, S3/remote storage, scheduled backups, disaster recovery procedures. Keywords: backup, restore, encryption, S3, scheduled backup, disaster recovery, bench backup, bench restore, how to backup, restore database, backup failed, data recovery, automated backup..
|
| license | MIT |
| compatibility | Claude Code, Claude.ai Projects, Claude API. Frappe v14-v16. |
| metadata | {"author":"OpenAEC-Foundation","version":"2.0"} |
Backup & Disaster Recovery
Frappe provides built-in backup and restore commands via bench. ALWAYS back up before updates, migrations, or any destructive operation. A backup that has never been test-restored is NOT a backup.
Quick Reference
bench backup
bench backup --with-files
bench --site mysite.com backup --with-files
bench backup --with-files --compress
bench backup --only "Sales Invoice,Purchase Invoice"
bench backup --exclude "Error Log,Activity Log"
bench backup --backup-path /mnt/backups/
bench --site mysite.com restore /path/to/backup.sql.gz
bench --site mysite.com restore /path/to/backup.sql.gz \
--with-public-files /path/to/files.tar \
--with-private-files /path/to/private-files.tar
bench setup backups
What Gets Backed Up
| Component | Default | With --with-files | Location |
|---|
| Database (SQL dump) | YES | YES | sites/{site}/private/backups/ |
| Site config | YES | YES | sites/{site}/private/backups/ |
| Public files | NO | YES | sites/{site}/public/files/ |
| Private files | NO | YES | sites/{site}/private/files/ |
Backup file naming: {datetime}_{hash}_{site}-database.sql.gz
Backup Decision Tree
What do you need to back up?
|
+-- Quick database snapshot before a change?
| +-- bench backup (database only, fast)
|
+-- Full backup before upgrade or migration?
| +-- bench backup --with-files --compress
|
+-- Automated daily backups?
| +-- bench setup backups (cron-based)
| +-- OR S3 Backup Settings (cloud storage)
|
+-- Offsite / cloud backup?
| +-- S3 Backup Settings DocType (built-in)
| +-- OR custom script with rclone/aws-cli
|
+-- Partial backup (specific DocTypes)?
| +-- bench backup --only "DocType1,DocType2"
|
+-- Disaster recovery?
| +-- Full backup + files + tested restore procedure
| +-- See Disaster Recovery section below
bench backup: All Options
bench backup [OPTIONS]
--backup-path PATH
--backup-path-db PATH
--backup-path-conf PATH
--backup-path-files PATH
--backup-path-private-files PATH
--only, --include, -i DOCTYPES
--exclude, -e DOCTYPES
--ignore-backup-conf
--with-files
--compress
--verbose
Safety feature: If backup fails (any exception), partial files are automatically deleted to avoid consuming disk space with incomplete backups.
bench restore: All Options
bench --site [site-name] restore [OPTIONS] SQL_FILE_PATH
--db-root-username USERNAME
--db-root-password PASSWORD
--db-name NAME
--admin-password PASSWORD
--install-app APP_NAME
--with-public-files PATH
--with-private-files PATH
--force
CRITICAL: Downgrades are NOT supported. Restoring a backup from a newer version onto an older version triggers a warning. NEVER use --force to bypass this unless you understand the consequences.
Automated Backups
Cron-Based (bench setup backups)
bench setup backups
S3 Backup Settings (Built-in DocType)
Configure in ERPNext: Settings > S3 Backup Settings
| Field | Description |
|---|
| Enable | Toggle automated S3 backups |
| S3 Bucket Name | Target bucket |
| AWS Access Key ID | IAM credentials |
| AWS Secret Access Key | IAM secret |
| Region | AWS region (e.g., eu-west-1) |
| Frequency | Daily, Weekly |
| Backup Files | Include public/private files |
from frappe.integrations.offsite_backup_utils import send_email
import frappe
from frappe.integrations.doctype.s3_backup_settings.s3_backup_settings import take_backups_s3
take_backups_s3()
Custom Backup Script
#!/bin/bash
set -e
BENCH_DIR="/home/frappe/frappe-bench"
BACKUP_DIR="/mnt/backups/frappe"
RETENTION_DAYS=30
S3_BUCKET="s3://my-frappe-backups"
DATE=$(date +%Y-%m-%d_%H%M)
cd $BENCH_DIR
bench backup --with-files --compress --backup-path "$BACKUP_DIR/$DATE/"
aws s3 sync "$BACKUP_DIR/$DATE/" "$S3_BUCKET/$DATE/"
find "$BACKUP_DIR" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} +
aws s3 ls "$S3_BUCKET/$DATE/" || echo "WARNING: S3 sync failed!"
Backup Encryption
Encrypt Backups at Rest
bench backup --with-files --compress
gpg --symmetric --cipher-algo AES256 \
sites/mysite/private/backups/latest-database.sql.gz
gpg --decrypt backup.sql.gz.gpg > backup.sql.gz
bench --site mysite.com restore backup.sql.gz
Encrypt with OpenSSL
openssl enc -aes-256-cbc -salt -pbkdf2 \
-in backup.sql.gz -out backup.sql.gz.enc
openssl enc -d -aes-256-cbc -pbkdf2 \
-in backup.sql.gz.enc -out backup.sql.gz
ALWAYS store encryption keys/passwords separately from backups. NEVER store the decryption key in the same location as the encrypted backup.
Restore Procedures
Full Site Restore
sudo supervisorctl stop all
bench --site mysite.com restore \
/path/to/20240115_backup-database.sql.gz \
--db-root-password YOUR_DB_ROOT_PASSWORD \
--admin-password NEW_ADMIN_PASSWORD
bench --site mysite.com restore \
/path/to/20240115_backup-database.sql.gz \
--with-public-files /path/to/20240115_backup-files.tar \
--with-private-files /path/to/20240115_backup-private-files.tar
bench --site mysite.com migrate
bench --site mysite.com clear-cache
sudo supervisorctl start all
Restore to New Site
bench new-site staging.example.com \
--db-root-password YOUR_DB_ROOT_PASSWORD \
--admin-password STAGING_PASSWORD
bench --site staging.example.com restore \
/path/to/production-backup.sql.gz \
--with-public-files /path/to/files.tar \
--with-private-files /path/to/private-files.tar
bench --site staging.example.com migrate
Docker Restore
docker cp backup.sql.gz frappe-backend:/tmp/
docker compose exec backend \
bench --site mysite.com restore /tmp/backup.sql.gz \
--db-root-password $DB_ROOT_PASSWORD
docker compose exec backend rm /tmp/backup.sql.gz
Backup Verification
ALWAYS test restores regularly. A backup is only valid if it can be successfully restored.
#!/bin/bash
set -e
BACKUP_SQL="/mnt/backups/frappe/latest/database.sql.gz"
TEST_SITE="backup-test.localhost"
BENCH_DIR="/home/frappe/frappe-bench"
cd $BENCH_DIR
bench new-site $TEST_SITE --db-root-password $DB_ROOT_PASSWORD --admin-password test
bench --site $TEST_SITE restore $BACKUP_SQL --db-root-password $DB_ROOT_PASSWORD
bench --site $TEST_SITE migrate
bench --site $TEST_SITE console <<'EOF'
import frappe
count = frappe.db.count("User")
print(f"User count: {count}")
assert count > 0, "No users found — backup may be corrupt"
print("Backup verification PASSED")
EOF
bench drop-site $TEST_SITE --db-root-password $DB_ROOT_PASSWORD --force
echo "Backup verification complete"
Multi-Site Backup Strategy
#!/bin/bash
set -e
BENCH_DIR="/home/frappe/frappe-bench"
cd $BENCH_DIR
for site in $(bench --site all list-apps 2>/dev/null | grep -oP '^\S+'); do
echo "Backing up $site..."
bench --site "$site" backup --with-files --compress
done
Disaster Recovery Plan Template
1. PREVENTION
- Automated daily backups (bench setup backups OR S3)
- Offsite copies (S3, GCS, or remote server)
- Encrypted backups for sensitive data
- Backup retention: minimum 30 days
2. DETECTION
- Monitor backup cron job (check /var/log/syslog)
- Verify backup file sizes (alert if < expected)
- Weekly automated restore test
3. RECOVERY (RTO target: < 4 hours)
a. Provision new server (or use standby)
b. Install Frappe/ERPNext (same version as backup)
c. Restore from latest verified backup
d. Run migrations
e. Update DNS to point to new server
f. Verify functionality
4. DOCUMENTATION
- Backup locations and credentials
- Encryption key storage (separate from backups)
- Step-by-step restore procedure
- Contact list for escalation
Version Differences
| Feature | v14 | v15 | v16 |
|---|
--compress flag | Yes | Yes | Yes |
--only / --exclude | Yes | Yes | Yes |
| S3 Backup Settings | Yes | Yes | Yes |
| Site-level logs | v13+ | Yes | Yes |
partial-restore command | No | Yes | Yes |
Reference Files
Related Skills
frappe-ops-deployment — Production deployment (includes backup in update workflow)
frappe-ops-performance — Performance tuning
frappe-ops-bench — Bench CLI reference
frappe-ops-upgrades — Version upgrade procedures (backup required)