What Needs Backing Up
An Odoo backup has two parts:
- Database — All business data: contacts, invoices, products, configurations
- Filestore — Attachments, images, report PDFs, uploaded files
You need BOTH for a complete restore. A database backup without filestore means missing attachments and images.
Manual Backup
Database Backup (pg_dump)
# Full backup (custom format — supports parallel restore)
pg_dump -U odoo -Fc odoo > /backups/odoo_$(date +%Y%m%d_%H%M%S).dump
# Full backup (SQL — human-readable)
pg_dump -U odoo odoo | gzip > /backups/odoo_$(date +%Y%m%d_%H%M%S).sql.gz
# Docker
docker compose exec db pg_dump -U odoo -Fc odoo > /backups/odoo_$(date +%Y%m%d).dumpFilestore Backup
# Filestore location (check data_dir in odoo.conf)
# Default: /var/lib/odoo/.local/share/Odoo/filestore/dbname/
tar -czf /backups/filestore_$(date +%Y%m%d).tar.gz \
/var/lib/odoo/.local/share/Odoo/filestore/odoo/
# Docker
docker compose exec odoo tar -czf - /var/lib/odoo/filestore/odoo \
> /backups/filestore_$(date +%Y%m%d).tar.gzAutomated Backup Script
#!/bin/bash
# /opt/scripts/odoo-backup.sh
set -euo pipefail
BACKUP_DIR="/backups/odoo"
DB_NAME="odoo"
DB_USER="odoo"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# Database backup
echo "[$(date)] Starting database backup..."
pg_dump -U "$DB_USER" -Fc "$DB_NAME" > "$BACKUP_DIR/db_${DATE}.dump"
echo "[$(date)] Database backup complete: db_${DATE}.dump"
# Filestore backup
echo "[$(date)] Starting filestore backup..."
tar -czf "$BACKUP_DIR/filestore_${DATE}.tar.gz" \
/var/lib/odoo/.local/share/Odoo/filestore/"$DB_NAME"/
echo "[$(date)] Filestore backup complete: filestore_${DATE}.tar.gz"
# Cleanup old backups
find "$BACKUP_DIR" -name "*.dump" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
echo "[$(date)] Cleaned up backups older than $RETENTION_DAYS days"
# Optional: Upload to S3
# aws s3 cp "$BACKUP_DIR/db_${DATE}.dump" s3://my-backups/odoo/
# aws s3 cp "$BACKUP_DIR/filestore_${DATE}.tar.gz" s3://my-backups/odoo/
echo "[$(date)] Backup complete!"# Add to crontab (daily at 2 AM)
0 2 * * * /opt/scripts/odoo-backup.sh >> /var/log/odoo-backup.log 2>&1Restore Procedures
Restore to Same Server
# Stop Odoo first
systemctl stop odoo
# Restore database (drop and recreate)
dropdb -U odoo odoo
createdb -U odoo odoo
pg_restore -U odoo -d odoo /backups/db_20260322.dump
# Restore filestore
rm -rf /var/lib/odoo/.local/share/Odoo/filestore/odoo/
tar -xzf /backups/filestore_20260322.tar.gz -C /
# Start Odoo
systemctl start odooRestore to Different Server
# On new server:
# 1. Install same Odoo version
# 2. Create database
createdb -U odoo odoo
# 3. Restore
pg_restore -U odoo -d odoo /backups/db_20260322.dump
# 4. Copy filestore to correct location
tar -xzf filestore_20260322.tar.gz -C /
# 5. Update odoo.conf with new server settings
# 6. Start OdooBackup Best Practices
- 3-2-1 Rule: 3 copies, 2 different media, 1 offsite (S3, Google Cloud, another server)
- Test restores: Periodically restore to a test server to verify backups work
- Backup before upgrades: Always backup before running
-uor changing versions - Monitor backup jobs: Alert if backup cron fails
- Encrypt offsite backups: Use
gpg --encryptbefore uploading to cloud storage
DeployMonkey Backups
DeployMonkey includes automated daily backups with one-click restore. Backups include both database and filestore, with configurable retention and offsite storage. The AI agent monitors backup health and alerts you if a backup fails.