odooium.shOdooium.com ↗Sign in with GitHub
Operated by CDS · invitation only

Ship Odoo like software. Not like a server.

Odooium.sh is the deployment control plane for the Odoo systems CDS runs. Your developers push to a branch; a build runs, a staging environment updates, and production is promoted by a second person — the exact artifact staging tested, with the database untouched.

0
passwords — GitHub is the only identity
2
people to change production — a second project admin approves
1
receipt per action — who asked, what ran, what changed
0
AI on this platform — the brain lives on Odooium.com
mansour-foods · environments GET /v1/projects/mansour-foods/branches
Productionmain · a83f92cRunningpromoted by digest · Ramadan → Aya2 h ago
Stagingpos-rounding · 2b90ce4Buildingneutralised · no mail leaves01:42
Developmentfix-4790 · 9c7e1b2Attentiontest failed · previous build still serving15 m ago
job #8842 · deploy · triggered by a push to pos-rounding
✓ pull cds-eg/mansour-addons @ 2b90ce4 2.1s
✓ build image · compileall 214 files
⟳ healthcheck 1/3 — old container still serving
#8839 promotion to production · awaiting a second approver — not yours to sign
#8790 upgrade 18.0 → 19.0 on staging · 41 rules, 2 needed a human · production untouched · cutover gated on the restore test
Developmentdisposable · shell in the browser
→
Stagingbuilds on push · production-like data · keyed SSH, 12 h
→
Productionpromoted by digest · one admin · backup first · no shell
What it does

Everything a hosted Odoo needs, and nothing that pretends to be magic

Every action on this platform is a job with a receipt: who asked, what ran, how long it took, what changed. Nothing happens on a server without one.

Provision from an industry blueprint

A seven-step wizard turns a repository and an industry into a seeded, running staging environment — apps installed, company set up, pricelists loaded, master data uploaded, in that order. The same inputs produce the same database, every time.

7–9 minutes · zero AI in the loop

Push, build, deploy

A push to a staging branch builds and deploys itself. Authority comes from the branch, never from who pushed — though the push is recorded against them. A second push while one runs is recorded as skipped, not queued twice.

GitHub decides who pushes

Promotion by digest, backup first

Production runs the exact artifact staging tested — only the code moves, the database stays. A project admin promotes it, the control plane records who did, and a protected backup runs before the swap.

the container swap is the only downtime

Backups you have actually restored

Daily, weekly, monthly, offsite — to S3, SFTP or object storage of your choosing. Every week the newest copy is restored into a throwaway environment, booted and row-counted, attachments checked. An untested backup is not a backup.

a failed test blocks the next upgrade

Monitoring that costs the instance nothing

System, storage and HTTP panels drawn on demand from data that never leaves your server — no module inside Odoo, no cron, no queries against your database. Deploys and backups appear as markers, so "did it start after the deploy?" is answered by looking.

a silent server reads unknown, never healthy

Upgrades as a contract

The migration rules are a versioned library, snapshotted when the run starts, so nothing changes underneath a running upgrade. It repeats on staging until green; the cutover is gated on a passing restore test.

18.0 → 19.0, rehearsed before it is real
How a change reaches production

Four steps, and a refusal at every one that needs it

The interesting part of a control plane is not what it does — it is what it refuses to do, out loud, with the reason on it.

01 · PUSH

A branch builds itself

The webhook binds the push to the branch. A development branch gets a disposable environment; a staging branch rebuilds on a neutralised copy of production.

Refused: a second push mid-buildrecorded as skipped, never queued twice · the first build keeps running
02 · STAGE

Staging, with production-like data

Its own machine, real data, always neutralised — no mail leaves, no cron fires, no provider is called. Testers get a keyed 12-hour shell; production gets none.

Refused: a browser terminal on stagingkeyed SSH instead, per environment, audited · the environment keeps serving
03 · PROPOSE

Promotion by digest

The exact artifact staging tested is proposed for production — a digest, not a rebuild. A protected backup is taken first.

Refused: approving your own proposalthe Approve button is visibly disabled with the reason on it — not yours to sign · production keeps running
04 · APPROVE

A second project admin approves

The approval is recorded by the control plane against the exact digest proposed, and the proposer cannot be the approver. The swap is the only downtime; the database is untouched.

Refused: one person doing both halvesthe proposer is refused their own approval by name, and a grant added after the proposal does not make them a second person · every environment keeps serving
Security

Your server pulls its work, and checks it before running it

It writes a job. The agent on your machine pulls that job over an outboundconnection, checks the command exists in its own catalogue, that the job is bound to this host, that it has not expired and has not run before — and only then runs it. No inbound port is open to us.

Production is updated by a push to its own branch or by a project admin. A module update takes a protected backup first, and a failed update rolls back. Pushes to any other branch — builds, staging deploys — cannot reach production at all. What each command requires is decided on your own server, against a catalogue compiled into the runner it is checked by.

catalogue checked on the boxclosed catalogueappend-only trailtenant isolation, testedno models · no provider keys · no agent loop

If Odooium.com is unavailable, this platform keeps building, deploying and backing up — and loses its AI features. That is the right direction: the brain is optional, the hands are not.

The three authorities beside this text describe the design 015 archived on 2026-09-13 (OD-55). What survives, and what this page promises, is the box-side check: the agent pulls its work, verifies the command and the binding against its own catalogue, and only then runs it.

Approver keys — people, in hardware

A production write needs a person's signature, and the person who proposed cannot be the one who signs.

never held by the API
Policy signer — automated, scope-limited

Builds, staging deploys and the nightly backup. Its scope stops at production-class writes, and that stop is verified on the box, not promised by us.

cannot sign production
Management root — offline

Signs the command catalogue, the approver manifest and each environment's class. It never signs a runtime job: without it, the other two could be bypassed by changing the rules instead of forging a job.

never online · two named custodians
Who reaches what

Five groups, and every "no" is written down

Groups are assigned per project by the project's own admin. A group is a set of defaults; anything beyond it is an extra grant with a reason in the trail. Push rights stay on GitHub.

project adminManages people and access inside the project, settings, domains — and can propose a production change. Cannot bring a new person onto the platform: that is CDS's act.
maintainerOperations without people-powers: settings, staging restores, production log reads.
developerCode, builds and development environments. No production data.
testerStaging and UAT. Reads what they need, changes nothing in production.
auditorReads the access trail and the read-only screens. Never opens a database.
extra grantsAny single permission can be granted to one person, beyond their group — and every grant is a line in the trail with a reason.

There is no sign-up button, and that is deliberate

You cannot authenticate here without an invitation. Signing in with GitHub proves who you are; it does not grant you anything. Until someone has invited you — to a project, or to the platform itself — the sign-in page tells you exactly that, names who can invite you, and stops. An invitation is addressed to your email by the CDS team, and sign-in is GitHub.

Two acts, two authorities. CDS operates every server on this platform and invites every person onto it — picking someone from GitHub who has never been here is a platform act, and no project role grows into it. Once a person is on the platform, your project's own admin invites them into your project and manages their access there, without a ticket to us.

No pricing page, no billing, no wallet, no self-serve trial. This is the control plane for systems CDS already runs for you — the commercial arrangement lives in your contract, not in a checkout flow. If you are not a CDS customer yet, that conversation starts with people: cdsegypt.com.