Odoo Backup Automation: Bash Scripts and Cron Setup

18.12.2025
18:32

Backup is a critical task for any ERP system. Data loss in Odoo can mean losing transaction history, customer database, financial reports, and entire business processes. Automated backups ensure that in case of hardware failure, accidental deletion, or cyberattack, you can restore the system with minimal losses.

In this guide, we'll build a complete automated backup system for Odoo: configure bash scripts for backing up PostgreSQL database and files, automate the process with cron, organize rotation of old backups, and set up remote backup storage.

Prerequisites

To follow this guide, you'll need:

  • Working Odoo installation (version 14+)
  • PostgreSQL database for Odoo
  • Root or sudo access to the server
  • Basic knowledge of bash and cron
  • Additional disk space (minimum 2x database size)
  • Optional: remote server for storing backups

Check current database size:

Login to PostgreSQL:

sudo -u postgres psql

Check database size:

\l+

Exit:

\q

Example output:

                                                List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Size    
-----------+----------+----------+-------------+-------------+-----------
 odoo      | odoo     | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 2458 MB

Backup System Structure

Create main backup directory:

sudo mkdir -p /var/backups/odoo/{db,filestore}

Create scripts directory:

sudo mkdir -p /opt/scripts

Set permissions:

sudo chown -R $USER:$USER /var/backups/odoo

Directory structure:

/var/backups/odoo/
├── db/           # PostgreSQL database dumps
└── filestore/    # Odoo files archives

Database Backup Script

Create the main script for PostgreSQL backup:

sudo nano /opt/scripts/odoo_backup_db.sh

Add the following code:

#!/bin/bash

#############################################
# Odoo Database Backup Script
# Author: THE.Hosting
# Version: 1.0
#############################################

# Configuration
DB_NAME="odoo"                              # Database name
DB_USER="odoo"                              # PostgreSQL user
BACKUP_DIR="/var/backups/odoo/db"          # Backup directory
RETENTION_DAYS=7                            # Keep backups for N days
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql.gz"
LOG_FILE="/var/log/odoo_backup.log"

# Logging function
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log_message "========================================="
log_message "Starting database backup"
log_message "Database: $DB_NAME"

# Check if backup directory exists
if [ ! -d "$BACKUP_DIR" ]; then
    log_message "ERROR: Directory $BACKUP_DIR does not exist"
    exit 1
fi

# Create database dump
log_message "Creating database dump..."
if sudo -u postgres pg_dump "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log_message "Dump created successfully: $BACKUP_FILE"
    log_message "Backup size: $BACKUP_SIZE"
else
    log_message "ERROR: Failed to create database dump"
    exit 1
fi

# Remove old backups
log_message "Removing backups older than $RETENTION_DAYS days..."
DELETED_COUNT=$(find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f -mtime +$RETENTION_DAYS -print -delete | wc -l)
log_message "Deleted old backups: $DELETED_COUNT"

# Count total backups
TOTAL_BACKUPS=$(find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f | wc -l)
log_message "Total backups in storage: $TOTAL_BACKUPS"

# Check available disk space
DISK_USAGE=$(df -h "$BACKUP_DIR" | awk 'NR==2 {print $5}')
log_message "Disk usage: $DISK_USAGE"

log_message "Backup completed successfully"
log_message "========================================="

exit 0

Make the script executable:

sudo chmod +x /opt/scripts/odoo_backup_db.sh

Test the script:

sudo /opt/scripts/odoo_backup_db.sh

Expected output:

[2024-12-13 10:30:15] =========================================
[2024-12-13 10:30:15] Starting database backup
[2024-12-13 10:30:15] Database: odoo
[2024-12-13 10:30:15] Creating database dump...
[2024-12-13 10:30:48] Dump created successfully: /var/backups/odoo/db/odoo_20241213_103015.sql.gz
[2024-12-13 10:30:48] Backup size: 856M
[2024-12-13 10:30:48] Removing backups older than 7 days...
[2024-12-13 10:30:48] Deleted old backups: 0
[2024-12-13 10:30:48] Total backups in storage: 1
[2024-12-13 10:30:48] Disk usage: 45%
[2024-12-13 10:30:48] Backup completed successfully
[2024-12-13 10:30:48] =========================================

Odoo Filestore Backup Script

Odoo stores uploaded files (attachments, product images, documents) in the filestore directory. These files also need backup.

sudo nano /opt/scripts/odoo_backup_filestore.sh

Add the code:

#!/bin/bash

#############################################
# Odoo Filestore Backup Script
# Author: THE.Hosting
# Version: 1.0
#############################################

# Configuration
DB_NAME="odoo"                              # Database name (for archive name)
ODOO_DATA_DIR="/var/lib/odoo/.local/share/Odoo"  # Odoo data path
BACKUP_DIR="/var/backups/odoo/filestore"   # Backup directory
RETENTION_DAYS=7                            # Keep backups for N days
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/filestore_${DB_NAME}_${TIMESTAMP}.tar.gz"
LOG_FILE="/var/log/odoo_backup.log"

# IMPORTANT: ODOO_DATA_DIR path depends on Odoo installation method
# Package installation (apt): /var/lib/odoo/.local/share/Odoo
# Docker: may be /odoo/.local/share/Odoo or other
# Check data_dir parameter in odoo.conf file

# Logging function
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log_message "========================================="
log_message "Starting filestore backup"
log_message "Source: $ODOO_DATA_DIR"

# Check if data directory exists
if [ ! -d "$ODOO_DATA_DIR" ]; then
    log_message "ERROR: Directory $ODOO_DATA_DIR does not exist"
    exit 1
fi

# Check if backup directory exists
if [ ! -d "$BACKUP_DIR" ]; then
    log_message "ERROR: Directory $BACKUP_DIR does not exist"
    exit 1
fi

# Create archive
log_message "Creating filestore archive..."
if tar -czf "$BACKUP_FILE" -C "$(dirname "$ODOO_DATA_DIR")" "$(basename "$ODOO_DATA_DIR")"; then
    BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log_message "Archive created successfully: $BACKUP_FILE"
    log_message "Archive size: $BACKUP_SIZE"
else
    log_message "ERROR: Failed to create archive"
    exit 1
fi

# Remove old backups
log_message "Removing backups older than $RETENTION_DAYS days..."
DELETED_COUNT=$(find "$BACKUP_DIR" -name "filestore_${DB_NAME}_*.tar.gz" -type f -mtime +$RETENTION_DAYS -print -delete | wc -l)
log_message "Deleted old backups: $DELETED_COUNT"

# Count total backups
TOTAL_BACKUPS=$(find "$BACKUP_DIR" -name "filestore_${DB_NAME}_*.tar.gz" -type f | wc -l)
log_message "Total backups in storage: $TOTAL_BACKUPS"

log_message "Filestore backup completed"
log_message "========================================="

exit 0

Make executable:

sudo chmod +x /opt/scripts/odoo_backup_filestore.sh

Test the script:

sudo /opt/scripts/odoo_backup_filestore.sh

Combined Full Backup Script

Create a main script that runs both processes sequentially:

sudo /opt/scripts/odoo_backup_filestore.sh
#!/bin/bash

#############################################
# Main Odoo Full Backup Script
# Author: THE.Hosting
# Version: 1.0
#############################################

LOG_FILE="/var/log/odoo_backup.log"

log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log_message "========================================="
log_message "STARTING FULL ODOO BACKUP"
log_message "========================================="

# Database backup
log_message "Starting database backup..."
/opt/scripts/odoo_backup_db.sh
DB_EXIT_CODE=$?

if [ $DB_EXIT_CODE -eq 0 ]; then
    log_message "Database backup: SUCCESS"
else
    log_message "Database backup: ERROR (code: $DB_EXIT_CODE)"
fi

# Filestore backup
log_message "Starting filestore backup..."
/opt/scripts/odoo_backup_filestore.sh
FS_EXIT_CODE=$?

if [ $FS_EXIT_CODE -eq 0 ]; then
    log_message "Filestore backup: SUCCESS"
else
    log_message "Filestore backup: ERROR (code: $FS_EXIT_CODE)"
fi

# Final status
log_message "========================================="
if [ $DB_EXIT_CODE -eq 0 ] && [ $FS_EXIT_CODE -eq 0 ]; then
    log_message "FULL BACKUP: COMPLETED SUCCESSFULLY"
    log_message "========================================="
    exit 0
else
    log_message "FULL BACKUP: COMPLETED WITH ERRORS"
    log_message "========================================="
    exit 1
fi

Make executable:

sudo chmod +x /opt/scripts/odoo_backup_full.sh

Cron Automation Setup

Configure automatic backup execution via cron.

Create cron job:

sudo crontab -e

Add the following lines:

# Full Odoo backup every day at 2:00 AM
0 2 * * * /opt/scripts/odoo_backup_full.sh >> /var/log/odoo_backup_cron.log 2>&1

# Alternative: database backup every 6 hours
# 0 */6 * * * /opt/scripts/odoo_backup_db.sh >> /var/log/odoo_backup_cron.log 2>&1

# Alternative: backup only on weekdays
# 0 2 * * 1-5 /opt/scripts/odoo_backup_full.sh >> /var/log/odoo_backup_cron.log 2>&1

Cron schedule explanation:

┌───────────── minute (0 - 59)
│ ┌─────────── hour (0 - 23)
│ │ ┌───────── day of month (1 - 31)
│ │ │ ┌─────── month (1 - 12)
│ │ │ │ ┌───── day of week (0 - 6) (Sunday=0)
│ │ │ │ │
│ │ │ │ │
* * * * * command to execute

Schedule examples:

# Every day at 3:30 AM
30 3 * * * /opt/scripts/odoo_backup_full.sh

# Every Sunday at midnight
0 0 * * 0 /opt/scripts/odoo_backup_full.sh

# Every 12 hours
0 */12 * * * /opt/scripts/odoo_backup_full.sh

# Twice a day (8:00 and 20:00)
0 8,20 * * * /opt/scripts/odoo_backup_full.sh

# First day of every month at 1:00 AM
0 1 1 * * /opt/scripts/odoo_backup_full.sh

Check active cron jobs:

sudo crontab -l

Monitor cron logs:

System cron log:

sudo tail -f /var/log/syslog | grep CRON

Our backup log:

tail -f /var/log/odoo_backup_cron.log

Remote Server Backup Transfer

For additional security, configure automatic backup transfer to a remote server via rsync.

SSH Key Setup for Automatic Authentication

Since cron backup tasks will run as root, create SSH key as root user:

Switch to root user:

sudo su -

Generate SSH key:

ssh-keygen -t rsa -b 4096 -f /root/.ssh/backup_key -N ""

Copy key to remote server:

ssh-copy-id -i /root/.ssh/backup_key.pub user@remote-server.com

Test connection:

ssh -i /root/.ssh/backup_key user@remote-server.com "echo 'Connection successful'"

Exit from root:

exit

Remote Transfer Script

sudo nano /opt/scripts/odoo_backup_remote.sh
#!/bin/bash

#############################################
# Remote Backup Transfer Script
# Author: THE.Hosting
# Version: 1.0
#############################################

# Configuration
LOCAL_BACKUP_DIR="/var/backups/odoo"
REMOTE_USER="backup"
REMOTE_HOST="backup-server.example.com"
REMOTE_DIR="/backups/odoo"
SSH_KEY="/root/.ssh/backup_key"
LOG_FILE="/var/log/odoo_backup.log"

log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log_message "========================================="
log_message "Starting remote backup transfer"

# Check SSH connection
if ! ssh -i "$SSH_KEY" -o BatchMode=yes -o ConnectTimeout=5 "${REMOTE_USER}@${REMOTE_HOST}" "echo 'Connected'" > /dev/null 2>&1; then
    log_message "ERROR: Cannot connect to remote server"
    exit 1
fi

# Sync database backups
log_message "Syncing database backups..."
if rsync -avz --progress -e "ssh -i $SSH_KEY" \
    "$LOCAL_BACKUP_DIR/db/" \
    "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/db/"; then
    log_message "Database backups synced successfully"
else
    log_message "ERROR: Failed to sync database backups"
fi

# Sync filestore backups
log_message "Syncing filestore backups..."
if rsync -avz --progress -e "ssh -i $SSH_KEY" \
    "$LOCAL_BACKUP_DIR/filestore/" \
    "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/filestore/"; then
    log_message "Filestore backups synced successfully"
else
    log_message "ERROR: Failed to sync filestore backups"
fi

log_message "Remote transfer completed"
log_message "========================================="

exit 0

Make executable:

sudo chmod +x /opt/scripts/odoo_backup_remote.sh

Add to crontab:

sudo crontab -e
# Transfer to remote server 30 minutes after backup
30 2 * * * /opt/scripts/odoo_backup_remote.sh >> /var/log/odoo_backup_cron.log 2>&1

Restore from Backup

Database Restore

List available backups:

ls -lh /var/backups/odoo/db/

Select backup file:

BACKUP_FILE="/var/backups/odoo/db/odoo_20241213_103015.sql.gz"

Stop Odoo:

sudo systemctl stop odoo

Create backup of current database just in case:

sudo -u postgres pg_dump odoo | gzip > /tmp/odoo_before_restore.sql.gz

Drop current database:

sudo -u postgres dropdb odoo

Create new empty database:

sudo -u postgres createdb -O odoo odoo

Restore from backup:

gunzip -c "$BACKUP_FILE" | sudo -u postgres psql odoo

Verify restoration:

sudo -u postgres psql -d odoo -c "SELECT count(*) FROM res_users;"

Start Odoo:

sudo systemctl start odoo

Filestore Restore

Stop Odoo:

sudo systemctl stop odoo

Select archive:

BACKUP_FILE="/var/backups/odoo/filestore/filestore_odoo_20241213_103020.tar.gz"

Backup current filestore:

sudo tar -czf /tmp/filestore_before_restore.tar.gz -C /var/lib/odoo/.local/share Odoo

Remove current filestore:

sudo rm -rf /var/lib/odoo/.local/share/Odoo

Restore from archive:

sudo tar -xzf "$BACKUP_FILE" -C /var/lib/odoo/.local/share/

Restore permissions:

sudo chown -R odoo:odoo /var/lib/odoo/.local/share/Odoo

Start Odoo:

sudo systemctl start odoo

Automated Restore Script

sudo nano /opt/scripts/odoo_restore.sh
#!/bin/bash

#############################################
# Odoo Restore from Backup Script
# Author: THE.Hosting
# Version: 1.0
#############################################

# Usage: ./odoo_restore.sh <db_backup_file> <filestore_backup_file>

if [ $# -ne 2 ]; then
    echo "Usage: $0 <db_backup.sql.gz> <filestore_backup.tar.gz>"
    exit 1
fi

DB_BACKUP="$1"
FS_BACKUP="$2"
DB_NAME="odoo"

echo "========================================="
echo "ODOO RESTORE FROM BACKUP"
echo "========================================="
echo "Database: $DB_BACKUP"
echo "Filestore: $FS_BACKUP"
echo ""
read -p "Continue? (yes/no): " CONFIRM

if [ "$CONFIRM" != "yes" ]; then
    echo "Cancelled by user"
    exit 0
fi

# Stop Odoo
echo "Stopping Odoo..."
sudo systemctl stop odoo

# Restore database
echo "Restoring database..."
sudo -u postgres dropdb "$DB_NAME"
sudo -u postgres createdb -O odoo "$DB_NAME"
gunzip -c "$DB_BACKUP" | sudo -u postgres psql "$DB_NAME"

# Restore filestore
echo "Restoring filestore..."
sudo rm -rf /var/lib/odoo/.local/share/Odoo
sudo tar -xzf "$FS_BACKUP" -C /var/lib/odoo/.local/share/
sudo chown -R odoo:odoo /var/lib/odoo/.local/share/Odoo

# Start Odoo
echo "Starting Odoo..."
sudo systemctl start odoo

echo "========================================="
echo "RESTORE COMPLETED"
echo "========================================="

Make executable:

sudo chmod +x /opt/scripts/odoo_restore.sh

Usage:

sudo /opt/scripts/odoo_restore.sh \
    /var/backups/odoo/db/odoo_20241213_103015.sql.gz \
    /var/backups/odoo/filestore/filestore_odoo_20241213_103020.tar.gz

Backup Integrity Verification

Create a script for regular backup verification:

sudo nano /opt/scripts/odoo_backup_verify.sh
#!/bin/bash

#############################################
# Odoo Backup Integrity Verification Script
# Author: THE.Hosting
# Version: 1.0
#############################################

BACKUP_DIR="/var/backups/odoo"
LOG_FILE="/var/log/odoo_backup_verify.log"

log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log_message "========================================="
log_message "Starting backup integrity check"

# Check database backups
log_message "Checking database backups..."
DB_BACKUPS=$(find "$BACKUP_DIR/db" -name "*.sql.gz" -type f)
DB_COUNT=0
DB_CORRUPTED=0

for backup in $DB_BACKUPS; do
    DB_COUNT=$((DB_COUNT + 1))
    if gunzip -t "$backup" 2>/dev/null; then
        log_message "✓ OK: $(basename $backup)"
    else
        log_message "✗ CORRUPTED: $(basename $backup)"
        DB_CORRUPTED=$((DB_CORRUPTED + 1))
    fi
done

log_message "Checked DB backups: $DB_COUNT, corrupted: $DB_CORRUPTED"

# Check filestore backups
log_message "Checking filestore backups..."
FS_BACKUPS=$(find "$BACKUP_DIR/filestore" -name "*.tar.gz" -type f)
FS_COUNT=0
FS_CORRUPTED=0

for backup in $FS_BACKUPS; do
    FS_COUNT=$((FS_COUNT + 1))
    if tar -tzf "$backup" >/dev/null 2>&1; then
        log_message "✓ OK: $(basename $backup)"
    else
        log_message "✗ CORRUPTED: $(basename $backup)"
        FS_CORRUPTED=$((FS_CORRUPTED + 1))
    fi
done

log_message "Checked filestore backups: $FS_COUNT, corrupted: $FS_CORRUPTED"

# Final report
TOTAL_CORRUPTED=$((DB_CORRUPTED + FS_CORRUPTED))
if [ $TOTAL_CORRUPTED -eq 0 ]; then
    log_message "========================================="
    log_message "ALL BACKUPS ARE HEALTHY"
    log_message "========================================="
    exit 0
else
    log_message "========================================="
    log_message "CORRUPTED BACKUPS FOUND: $TOTAL_CORRUPTED"
    log_message "========================================="
    exit 1
fi

Make executable:

sudo chmod +x /opt/scripts/odoo_backup_verify.sh

Add weekly verification to crontab (Mondays at 9:00 AM):

sudo crontab -e
# Verify backup integrity every Monday at 9:00 AM
0 9 * * 1 /opt/scripts/odoo_backup_verify.sh >> /var/log/odoo_backup_cron.log 2>&1

Monitoring and Notifications

Email Notifications Setup

Install mail utility:

sudo apt install mailutils

Modify script for email notifications:

sudo nano /opt/scripts/odoo_backup_notify.sh
#!/bin/bash

# Configuration
EMAIL="admin@example.com"
LOG_FILE="/var/log/odoo_backup.log"

# Check last backup status
if tail -20 "$LOG_FILE" | grep -q "COMPLETED SUCCESSFULLY"; then
    echo "Odoo backup completed successfully" | mail -s "✓ Odoo Backup Success" "$EMAIL"
else
    echo "ERROR during Odoo backup. Check logs: $LOG_FILE" | mail -s "✗ Odoo Backup FAILED" "$EMAIL"
fi

Add to crontab after main backup:

# Notification 5 minutes after backup
5 2 * * * /opt/scripts/odoo_backup_notify.sh

Prometheus Monitoring (Optional)

Create metrics file:

sudo nano /opt/scripts/odoo_backup_metrics.sh
#!/bin/bash

# Export metrics for Prometheus node_exporter textfile collector
METRICS_FILE="/var/lib/node_exporter/textfile_collector/odoo_backup.prom"

# Backup counts
DB_COUNT=$(find /var/backups/odoo/db -name "*.sql.gz" | wc -l)
FS_COUNT=$(find /var/backups/odoo/filestore -name "*.tar.gz" | wc -l)

# Last backup timestamp (Unix timestamp)
LAST_BACKUP=$(find /var/backups/odoo/db -name "*.sql.gz" -printf '%T@\n' | sort -n | tail -1 | cut -d. -f1)

# Total backup size (in bytes)
TOTAL_SIZE=$(du -sb /var/backups/odoo | awk '{print $1}')

# Write metrics
cat > "$METRICS_FILE" << EOF
# HELP odoo_backup_db_count Number of database backups
# TYPE odoo_backup_db_count gauge
odoo_backup_db_count $DB_COUNT

# HELP odoo_backup_filestore_count Number of filestore backups
# TYPE odoo_backup_filestore_count gauge
odoo_backup_filestore_count $FS_COUNT

# HELP odoo_backup_last_timestamp Unix timestamp of last backup
# TYPE odoo_backup_last_timestamp gauge
odoo_backup_last_timestamp $LAST_BACKUP

# HELP odoo_backup_total_size_bytes Total size of all backups in bytes
# TYPE odoo_backup_total_size_bytes gauge
odoo_backup_total_size_bytes $TOTAL_SIZE
EOF

Add to crontab (every 5 minutes):

*/5 * * * * /opt/scripts/odoo_backup_metrics.sh

Troubleshooting Common Issues

Problem: "Permission denied" when creating backup

Solution:

Check backup directory permissions:

ls -la /var/backups/odoo

Fix permissions (750 is more secure than 755 as backups contain sensitive data):

sudo chown -R root:root /var/backups/odoo
sudo chmod -R 750 /var/backups/odoo

Problem: pg_dump cannot find database

Solution:

Check if database exists:

sudo -u postgres psql -l | grep odoo

Test connection:

sudo -u postgres psql -d odoo -c "SELECT version();"

If database in Docker container:

docker exec -t container_name pg_dump -U odoo odoo | gzip > backup.sql.gz

Problem: Not enough disk space

Solution:

Check free space:

df -h /var/backups

Clean old backups manually:

find /var/backups/odoo -name "*.gz" -mtime +30 -delete

Reduce retention in script (change RETENTION_DAYS=3 instead of 7)

Problem: Backup takes too long

Solution:

Use parallel compression pigz instead of gzip:

sudo apt install pigz

Replace gzip with pigz in script. Example:

sudo -u postgres pg_dump odoo | pigz > backup.sql.gz

Problem: Cron not running

Solution:

Check if cron is running:

sudo systemctl status cron

Start cron:

sudo systemctl start cron

Verify crontab syntax:

crontab -l

Check cron logs:

sudo tail -f /var/log/syslog | grep CRON

Quick Setup Checklist

Step 1. Create directories:

sudo mkdir -p /var/backups/odoo/{db,filestore}
sudo mkdir -p /opt/scripts

Step 2. Create scripts (copy scripts from the guide above)

Step 3. Make executable:

sudo chmod +x /opt/scripts/odoo_backup_*.sh
sudo chmod +x /opt/scripts/odoo_restore.sh

Step 4. Test manually:

sudo /opt/scripts/odoo_backup_full.sh

Step 5. Configure cron:

sudo crontab -e

Add line:

0 2 * * * /opt/scripts/odoo_backup_full.sh >> /var/log/odoo_backup_cron.log 2>&1

Step 6. Verify after a few days:

ls -lh /var/backups/odoo/db/
ls -lh /var/backups/odoo/filestore/

Conclusion

You've configured a complete automated backup system for Odoo. Your data is now protected from loss, and in case of any failure, you can quickly restore system operation.

Recommendations:

  • Regularly check logs: tail -f /var/log/odoo_backup.log
  • Periodically test restoration on a test server
  • Keep at least one backup on a remote server
  • Configure backup success monitoring
  • Document the restoration procedure for your team

Additional improvements:

  • Configure incremental backups to save space
  • Use GPG encryption for backups
  • Integrate with cloud storage (S3, Google Cloud Storage)
  • Configure PostgreSQL replication for hot standby

Other articles

18.12.2025
209
Knowledge base / Instructions
Installing DataLife Engine via SSH: Professional Setup Without FTP
18.12.2025
267
Knowledge base / Instructions
Installing Odoo with Docker on Ubuntu: Complete Guide
18.12.2025
229
Knowledge base / Automatic installation of scripts
How to Install Odoo on a VPS in Just a Few Minutes