OBM CE is the free, self-hosted Community Edition: one Docker container that schedules, verifies and retains backups for any number of Odoo servers and databases — agentless, over HTTPS. This page takes you from nothing to a protected database in about five minutes.
Before you start
- Docker with the Compose plugin on the machine that will run OBM.
- Python 3 on that machine, for the two one-off secret-generation scripts.
-
Network reach from this machine to your Odoo instances. OBM talks to Odoo's standard
/web/database/backupendpoint — nothing is installed on the Odoo servers. - Each instance's master password, and its database manager reachable — see the two gotchas below before you type anything.
Step 1 — Clone and generate the two secrets
git clone https://github.com/ProjoMania/obm-ce.git && cd obm-ce
python3 scripts/gen_fernet_key.py # -> FERNET_KEY
python3 scripts/hash_password.py # -> ADMIN_PASSWORD_HASH (pick a password) gen_fernet_key.py prints the FERNET_KEY that encrypts instance
master passwords at rest. Treat it like a production credential and keep a copy in your
password manager — losing it means re-entering every master password.
hash_password.py asks for the admin password you want and prints its bcrypt hash.
Step 2 — Configure .env
cp .env.example .env # paste both values in
Paste FERNET_KEY and ADMIN_PASSWORD_HASH into .env.
One thing will save you a confusing login failure:
single-quote the bcrypt hash.
# a bcrypt hash contains $ characters — docker compose treats
# them as variable interpolation and silently mangles the value
ADMIN_PASSWORD_HASH='$2b$12$...'
Without the single quotes, Compose interpolates the $2b, $12…
fragments away, the stored hash never matches, and the login you just chose never works.
Step 3 — Start the container
docker compose up -d # pulls ghcr.io/projomania/obm-ce
Open http://localhost:8300 and sign in as admin with the password
you picked in step 1. Everything OBM stores — the SQLite database and the backup files —
lives under ./data/ next to the compose file.
Step 4 — Protect your first database
- Go to Customers → Add customer and give the customer a name (a customer is whoever the Odoo belongs to — a client, or just "us").
- Add the instance: its Odoo URL and its master password. The onboarding wizard connects and discovers the instance's databases live.
- Tick the databases you want protected.
- On each database's page, set a schedule (daily / weekly / monthly / cron, in your timezone) and retention keep-rules.
That's it. The next scheduled run takes it from there, and the dashboard shows live job progress, verification results and each archive's SHA-256.
Two Odoo gotchas that will bite you
- The instance must have
list_db = True. On Odoo 17/18/19 the backup endpoint itself checks the database against the listing, so an instance with listing disabled cannot be backed up over HTTP at all — and Odoo reports it with the same page as a wrong password. OBM detects this case and names it instead of leaving you guessing. - The first backup can SET the master password. If the instance still has
Odoo's default master password (
admin), the first backup request silently changes it to whatever you typed. Always register the instance's real master password — never a guess.
Next steps
- Operate OBM CE well — retention, verification, HTTPS, and backing up OBM itself.
- Restore a backup — the restore path is Odoo's own database manager; know it before you need it.
- CE vs Pro — what the hosted edition adds: restores, drills, alerts, off-site storage. The full CE source lives at github.com/ProjoMania/obm-ce.