OBM

Install OBM CE in five minutes

Docker Compose install of the free Community Edition: generate the two secrets, start one container, protect your first database with the onboarding wizard — plus the two Odoo gotchas that bite everyone.

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/backup endpoint — 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

  1. Go to Customers → Add customer and give the customer a name (a customer is whoever the Odoo belongs to — a client, or just "us").
  2. Add the instance: its Odoo URL and its master password. The onboarding wizard connects and discovers the instance's databases live.
  3. Tick the databases you want protected.
  4. 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

  1. 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.
  2. 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