Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Complete Odoo backup and restore strategy: database dumps, filestore backup, automated scheduling, cloud storage upload, and tested restore procedures.
.claude/skills/odoo-backup-strategy/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-12 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-13 | ✓→✓ | = Same ✓ | — | — |
A complete Odoo backup must include both the PostgreSQL database and the filestore (attachments, images). This skill covers manual and automated backup procedures, offsite storage, and the correct restore sequence to bring a down Odoo instance back online.
@odoo-backup-strategy and describe your server environment.bash#!/bin/bash # backup_odoo.sh DATE=$(date +%Y%m%d_%H%M%S) DB_NAME="odoo" DB_USER="odoo" FILESTORE_PATH="/var/lib/odoo/.local/share/Odoo/filestore/$DB_NAME" BACKUP_DIR="/backups/odoo" mkdir -p "$BACKUP_DIR" # Step 1: Dump the database pg_dump -U $DB_USER -Fc $DB_NAME > "$BACKUP_DIR/db_$DATE.dump" # Step 2: Archive the filestore tar -czf "$BACKUP_DIR/filestore_$DATE.tar.gz" -C "$FILESTORE_PATH" . echo "✅ Backup complete: db_$DATE.dump + filestore_$DATE.tar.gz"
bash# Run: crontab -e # Add this line: 0 2 * * * /opt/scripts/backup_odoo.sh >> /var/log/odoo_backup.log 2>&1
bash# Add to backup script after tar command: aws s3 cp "$BACKUP_DIR/db_$DATE.dump" s3://my-odoo-backups/db/ aws s3 cp "$BACKUP_DIR/filestore_$DATE.tar.gz" s3://my-odoo-backups/filestore/ # Optional: Delete local backups older than 7 days find "$BACKUP_DIR" -type f -mtime +7 -delete
bash# Step 1: Stop Odoo docker compose stop odoo # or: systemctl stop odoo # Step 2: Recreate and restore the database # (--clean alone fails if the DB doesn't exist; drop and recreate first) dropdb -U odoo odoo 2>/dev/null || true createdb -U odoo odoo pg_restore -U odoo -d odoo db_YYYYMMDD_HHMMSS.dump # Step 3: Restore the filestore FILESTORE=/var/lib/odoo/.local/share/Odoo/filestore/odoo rm -rf "$FILESTORE"/* tar -xzf filestore_YYYYMMDD_HHMMSS.tar.gz -C "$FILESTORE"/ # Step 4: Restart Odoo docker compose start odoo # Step 5: Verify — open Odoo in the browser and check: # - Can you log in? # - Are recent records visible? # - Are file attachments loading?
pg_restore --list backup.dump should complete without errors.pg_restore --clean against a non-existent database — always create the database first.odoo-bin shell before running a restore.rsync or restic rather than full tar.gz archives.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +18 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.