Skip to content

Odoo Backup & Restore: Complete Guide (Database + Filestore)

DeployMonkey Team · March 22, 2026 13 min read

What Needs Backing Up

An Odoo backup has two parts:

  1. Database — All business data: contacts, invoices, products, configurations
  2. 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).dump

Filestore 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.gz

Automated 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>&1

Restore 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 odoo

Restore 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 Odoo

Backup 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 -u or changing versions
  • Monitor backup jobs: Alert if backup cron fails
  • Encrypt offsite backups: Use gpg --encrypt before 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.