CE is deliberately boring to operate: one container, one data directory, a handful of environment variables. This page covers the day-2 topics — how retention and verification actually behave, how to keep OBM itself safe, and how to get back in when you're locked out. For the install itself, start with the quickstart.
Schedules
Every database gets its own schedule: daily, weekly, monthly, or a cron expression — each
with its own timezone, so "2 AM" means the client's 2 AM. Backups run through a global
concurrency limit (GLOBAL_CONCURRENCY, default 2), so a fleet of schedules
firing at midnight doesn't stampede your Odoo servers. Long dumps are expected: the read
timeout defaults to an hour (READ_TIMEOUT=3600).
Retention: keep-rules
Two rules per database, usable together: keep N days and keep last N copies. They combine as a union — a backup survives as long as either rule still wants it — and the newest backup is never deleted, whatever the rules say. OBM prunes to these rules automatically, and a daily reconciliation pass cleans up any orphaned files on disk.
Verification
A backup doesn't count until it's verified. .zip archives get a CRC check of
every member plus a manifest check; db-only .dump files get their
pg_dump header checked. The archive's SHA-256 is then computed and recorded, and
its size is compared against previous runs so a suspiciously small backup stands out on the
dashboard. Corrupt archives are rejected, not quietly archived.
Downloads
Every stored backup can be downloaded from its database's page: the .zip
(database + filestore, restorable via Odoo's own database manager) or the smaller
.dump (database only, for pg_restore). OBM records a SHA-256 for
every archive — compare it with sha256sum after downloading if you want
end-to-end assurance. The restore paths are covered in
Restore a backup.
Back up OBM itself
A backup tool that can't survive its own host dying is an irony nobody needs. Three things matter:
# everything OBM CE needs to come back from zero:
.env # config incl. FERNET_KEY — keep a copy in your password manager
data/app.db # state: customers, instances, schedules, backup catalog
data/backups/ # the backup archives themselves -
.env, and above allFERNET_KEY— it encrypts every stored master password. Losing it means re-entering every master password by hand. Keep a copy in your password manager, and keep the file out of./dataso backups of the data directory never contain the key that unlocks them. -
data/app.db— the SQLite state: customers, instances, schedules, and the catalog of every backup taken. -
data/backups/— the payload. Sync it wherever your storage policy wants (rsync, restic, object storage…).
Recovery is: new host, clone the repo, restore .env and ./data,
docker compose up -d. Database migrations run automatically on start.
Locked out: ADMIN_FORCE_RESET
If you lose the admin password — or suspect a session has leaked:
# in .env — one-shot recovery
ADMIN_FORCE_RESET=true
docker compose up -d # re-applies ADMIN_PASSWORD_HASH, revokes all sessions
# then remove the line again
The flag is one-shot by intent: on startup it re-applies whatever
ADMIN_PASSWORD_HASH says (generate a fresh hash with
scripts/hash_password.py — single quotes, as in the
quickstart) and revokes existing sessions. Unset it
afterwards so a later restart doesn't silently reset the password again.
Reverse proxy & HTTPS
CE serves plain HTTP on port 8300 and expects your reverse proxy (Caddy, nginx, Traefik…) to terminate TLS. Two variables matter once a proxy is in front:
COOKIE_SECURE=true # session cookie only over HTTPS
FORWARDED_ALLOW_IPS=<proxy-ip> # trust X-Forwarded-For from the proxy only -
COOKIE_SECURE=truemarks the session cookieSecure, so browsers only send it over HTTPS. -
FORWARDED_ALLOW_IPStells OBM to trustX-Forwarded-Forfrom your proxy's address, so the login rate limiter keys on the real client IP instead of the proxy's. Only widen it when a proxy is actually in front.
The update check
Once a day, CE asks obm.projomania.com whether a newer release exists. The
request carries the edition and version string — nothing else — and it is the only phone-home
in the product. Opt out any time:
VERSION_CHECK=false Next steps
- Restore a backup — rehearse it before an incident makes you.
- CE vs Pro — alerts with a dead-man's switch, restore drills, GFS retention and off-site storage live in the hosted edition.