← All projects

odoo-backup-app

● Python ★ 1 ⑂ 0 Last updated: June 1, 2026

Odoo Backup Orchestrator

Self-hosted backup orchestration for one or many Odoo instances — scheduled, audited, notified, and cloud-synced.

MIT License CI Docker Image Docs GitHub Stars Python 3.12 Made with Vue 3


What it does

Odoo Backup Orchestrator is a lightweight, self-hostable service that:

  • Schedules backups for one or many Odoo instances using flexible cron expressions
  • Supports two backup strategies: Odoo's built-in /web/database/backup endpoint or direct pg_dump (with optional filestore archive)
  • Verifies every backup for integrity immediately after creation
  • Enforces retention policies automatically — with a safety net that prevents deleting the last copy
  • Delivers notifications via SMTP email and Telegram when jobs succeed or fail
  • Syncs backups to the cloud (Google Drive, Dropbox, OneDrive) with optional remote retention
  • Audits every action to an immutable log

All configuration is done through a clean, responsive web UI. No YAML editing, no crontab wrangling.


Screenshots

Dashboard Instance Detail Job Editor
Dashboard Instance Job

Features

  • Multi-instance management — manage backups for any number of Odoo installations from a single pane
  • Two backup methods — Odoo endpoint (zero-dependency) or pg_dump (faster, no master password needed)
  • Flexible DB selection — single database, hand-picked list, or auto-discover all
  • Filestore archiving — optionally bundle the Odoo filestore alongside the database dump
  • Visual cron builder — build schedules in plain English or write raw cron; live next-run preview
  • Timezone-aware UI — all schedules stored in UTC, displayed in your configured timezone
  • Integrity verification — every backup is verified after creation (ZIP integrity or pg_restore --list)
  • Retention enforcement — keep-last-N or delete-older-than-N-days, with an inviolable safety net
  • SMTP + Telegram notifications — multiple channels, per-instance bindings, per-event toggles
  • Cloud sync — Google Drive, Dropbox, OneDrive; per-instance, per-provider configuration
  • Password recovery — configurable email-based reset flow
  • Audit log — immutable record of every action taken by the app or the admin
  • Single-image Docker deploy — one docker compose up -d and you're running

Quickstart

git clone https://github.com/cagatayuresin/odoo-backup-app.git
cd odoo-backup-app
cp .env.example .env
# Edit .env and set OB_SECRET_KEY + OB_SESSION_SECRET before production use.
docker compose up -d
# Visit http://localhost:8080 — login: admin / admin

On first login you will be prompted to change the default password. Do not skip password recovery setup — losing the password without it means losing access to your data.


Configuration

All runtime configuration is done via environment variables passed to the Docker services:

Variable Default Description
OB_DATA_DIR /data Path to persistent storage volume
OB_SECRET_KEY auto-generated Seed for deriving the Fernet encryption key
OB_SESSION_SECRET auto-generated HMAC key for signed session cookies
OB_APP_BASE_URL http://localhost:8080 Public URL used in reset links and reverse-proxy deployments
OB_SESSION_COOKIE_SECURE false Set true when served behind HTTPS
OB_REDIS_URL redis://redis:6379/0 Celery broker + result backend
OB_LOG_LEVEL INFO Python logging level

Full configuration reference → docs/installation.md


Deployment Options

Docker Compose

cp .env.example .env
docker compose up -d --build

Use the published GitHub Container Registry image:

OB_IMAGE=ghcr.io/cagatayuresin/odoo-backup-app:latest docker compose up -d

Helm

helm upgrade --install odoo-backup ./charts/odoo-backup-app \
  --namespace odoo-backup --create-namespace \
  --set secrets.secretKey="$(openssl rand -hex 32)" \
  --set secrets.sessionSecret="$(openssl rand -hex 32)"

Plain Kubernetes YAML

kubectl apply -f k8s/namespace.yaml
cp k8s/secret.example.yaml /tmp/odoo-backup-secret.yaml
# Edit /tmp/odoo-backup-secret.yaml and replace placeholder secrets.
kubectl apply -f /tmp/odoo-backup-secret.yaml
kubectl apply -f k8s/pvc.yaml
kubectl apply -f k8s/redis.yaml
kubectl apply -f k8s/app.yaml

Deployment guide → docs/deployment.md


Architecture

┌─────────────────────────────────────────────┐
│  Browser (Vue 3 SPA + Bulma)                │
└──────────────────┬──────────────────────────┘
                   │ HTTP/JSON
┌──────────────────▼──────────────────────────┐
│  web  ─  FastAPI (uvicorn)                  │
│          • REST API (auth, instances, jobs,  │
│            backups, channels, cloud)        │
│          • Serves built Vue SPA             │
└──────┬───────────────────────┬──────────────┘
       │ Celery tasks          │ SQLAlchemy
┌──────▼──────┐  ┌─────────┐  ┌▼────────────┐
│  worker     │  │  beat   │  │ SQLite DB   │
│  (Celery)   │  │ (Beat+  │  │ /data/db/   │
│             │  │ redbeat)│  │ app.sqlite  │
└──────┬──────┘  └────┬────┘  └─────────────┘
       │              │
┌──────▼──────────────▼──────────────────────┐
│  redis:7-alpine (broker + result backend)  │
└────────────────────────────────────────────┘

Detailed architecture → docs/architecture.md


Development

# Clone and enter the repo
git clone https://github.com/cagatayuresin/odoo-backup-app.git
cd odoo-backup-app

# Install pre-commit hooks
pip install pre-commit && pre-commit install

# Start the full dev stack (hot-reload on backend + Vite HMR on frontend)
make dev-up

# Backend tests
make docker-test

# All quality checks
make audit

See docs/architecture.md for the full developer guide.


Roadmap

  • Restore from UI — trigger a pg_restore or Odoo database restore directly from the Backups page
  • Multi-user support — role-based access (admin / viewer) with per-instance permissions
  • S3 / MinIO cloud backend — in addition to Drive, Dropbox, and OneDrive
  • Slack / webhook notifications — generic outbound webhook for custom integrations
  • Backup diff reporting — size trend charts on the Dashboard

License

MIT — see LICENSE.

Copyright © 2026 Çağatay Üresin