HADOOPT
TECHNOLOGIES
Schedule a Tech Consultation
Home
Services
Odoo ERP implementation Rollout, custom modules, migration and support. Web application development SaaS products, portals and internal platforms. Mobile application development Offline-first field apps and customer apps. AI development & automation LLM assistants, document processing, forecasting. Odoo version upgrades ↗ Move to a newer release, scoped and priced on its own site.
Products
OrgExp ↗ Budget, CAPEX and OPEX management.
Blog About Contact Schedule a Tech Consultation
Blog / Odoo 19: Complete Guide for Businesses
Odoo 19 7 min read

Installing Odoo 19 from source, Docker or packages

Installing Odoo 19 from source, the official Docker image or Debian/Ubuntu packages, plus production settings: workers, proxy mode, websocket, dbfilter.

· ERP practice 22 Sep 2026

Odoo 19 needs Python 3.10 or later and PostgreSQL 13 or later (15 or later, with the pgvector extension, if you want the AI features), plus wkhtmltopdf 0.12.6 for PDF reports. You can run it from a git checkout of the source, from the official Docker image, or from Odoo's Debian/Ubuntu packages, which target Ubuntu 24.04. Whichever you choose, production means multi-worker mode behind a reverse proxy, with proxy mode on, websocket traffic routed to port 8072, and the database manager locked down.

This is part 2 of our Odoo 19 guide. If you have not yet decided whether to host Odoo yourself at all, read part 3 on hosting first. Odoo Online needs none of this.

Odoo 19 system requirements

The minimums are written into the 19.0 source itself: MIN_PY_VERSION = (3, 10) and MIN_PG_VERSION = 13 in odoo/release.py. Odoo warns at startup if PostgreSQL is older. The requirements.txt file says the officially supported Python package versions are the ones shipped in Ubuntu 24.04 and Debian 12, so those are the safest operating systems to build on.

  • PostgreSQL: 13 or later. For AI agents and document search, the pgvector extension is required, and Odoo's documentation notes it is only available for PostgreSQL 15 and up. If AI is on your roadmap, start on 15 or 16 now rather than migrating the database later.
  • wkhtmltopdf: not installed by pip. Install version 0.12.6 by hand, or invoices and quotations print without headers and footers.
  • rtlcss: only if you use a right-to-left language such as Arabic or Hebrew.

Installing Odoo 19 from source

We use the source install on developer machines and on servers where we want exact control over the code, for example when custom modules are deployed through git. On Debian or Ubuntu the sequence is short.

$ git clone --branch 19.0 --single-branch https://github.com/odoo/odoo.git
$ cd odoo
$ sudo ./setup/debinstall.sh            # system packages from debian/control
$ sudo apt install postgresql postgresql-client
$ sudo -u postgres createuser -d -R -S $USER
$ python3 -m venv ~/venv-odoo19 && . ~/venv-odoo19/bin/activate
$ pip install -r requirements.txt
$ python3 odoo-bin --addons-path=addons -d mydb
Community from source. Enterprise customers also clone odoo/enterprise.

For Enterprise, clone the enterprise repository with the same branch and put its path first in --addons-path, ahead of the Community addons. Access to that repository comes with an Enterprise subscription. Keep custom modules in a third directory of their own, never inside the Odoo checkout, so that pulling Odoo's bug fixes is a clean git pull.

Running Odoo 19 with the official Docker image

The odoo image on Docker Hub is built by Odoo from the Community nightly package, on Ubuntu 24.04, with wkhtmltopdf included. It exposes ports 8069, 8071 and 8072 and expects a separate PostgreSQL container.

$ docker run -d -v odoo-db:/var/lib/postgresql/data \
    -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo \
    -e POSTGRES_DB=postgres --name db postgres:15
$ docker run -d -v odoo-data:/var/lib/odoo \
    -v /srv/odoo/config:/etc/odoo -v /srv/odoo/addons:/mnt/extra-addons \
    -p 8069:8069 --name odoo --link db:db -t odoo:19.0
Named volumes keep the database and filestore when containers are replaced.

Three paths matter. /var/lib/odoo holds the filestore, where every attachment lives; without a volume there, removing the container deletes your attachments. /etc/odoo holds odoo.conf. /mnt/extra-addons is where your custom modules go. In production we use Docker Compose with the same volumes and never the odoo/odoo password shown in the examples.

Two cautions. The image is Community; for Enterprise you mount the Enterprise addons yourself and add them to the addons path. And the standard postgres image does not include pgvector, so for AI features you need a PostgreSQL image with that extension built in.

Installing Odoo 19 from Debian/Ubuntu packages

The package route installs Odoo as a system service, creates the PostgreSQL user and starts the server for you. Odoo publishes a nightly repository for Community:

$ sudo apt install postgresql -y
$ wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor \
    -o /usr/share/keyrings/odoo-archive-keyring.gpg
$ echo 'deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/19.0/nightly/deb/ ./' \
    | sudo tee /etc/apt/sources.list.d/odoo.list
$ sudo apt-get update && sudo apt-get install odoo
Updates then arrive through the usual apt-get upgrade.

There is no nightly repository for Enterprise. Enterprise customers download the .deb from Odoo's download page (you must be logged in as a paying customer or partner) and install it with apt install ./file.deb. The Odoo 19 deb supports Ubuntu 24.04 (Noble). The configuration file is /etc/odoo/odoo.conf.

Packages suit a single-purpose server with few or no custom modules. Once you have a real custom codebase, we prefer source or Docker, because you control exactly which Odoo revision runs with which version of your code.

Production settings: workers, proxy mode, websocket, dbfilter

Out of the box Odoo runs with workers = 0: a single threaded process that is fine on a laptop and wrong for a business. Setting workers to a positive number switches on the multi-processing server (Linux only), which also starts a separate gevent worker for real-time traffic (Discuss, Live Chat, notifications) on gevent_port, 8072 by default.

[options]
workers = 9                  ; (CPUs x 2) + 1 as a ceiling
max_cron_threads = 1
limit_time_cpu = 600
limit_time_real = 1200
proxy_mode = True
dbfilter = ^%d$
list_db = False
admin_passwd = <long random string>

# nginx
location /websocket { proxy_pass http://127.0.0.1:8072; ... }
location /          { proxy_pass http://127.0.0.1:8069; ... }
The shape of a production config. Size workers from your own load, not from this.
  • Workers. Odoo's own rule of thumb is (number of CPUs × 2) + 1 as the upper limit, and roughly one worker per six concurrent users. Cron jobs need CPU too. Memory is the other limit: Odoo's documentation estimates about 150 MB for a light worker and about 1 GB for a heavy one.
  • Proxy mode. Put nginx (or another proxy) in front for HTTPS, and set proxy_mode = True so Odoo trusts the forwarded host, scheme and client IP. Only enable it behind a proxy you control.
  • Websocket. Route /websocket to port 8072 with the Upgrade and Connection headers set. If you skip this, chat and live notifications quietly stop working. Older guides and some config templates still mention longpolling_port; in 19 the option is gevent_port.
  • dbfilter. On a server with more than one database, especially with Website installed, dbfilter must be set so each hostname maps to one database. ^%d$ matches the database named after the first part of the domain.
  • Database manager. Once each hostname maps to a single database, set list_db = False, and change admin_passwd from its admin default. That password can create, copy and drop databases from the browser.

Backups are the last piece. Back up both the PostgreSQL database and the filestore together, keep copies off the server, and restore one to a test machine every so often to prove it works.

With Odoo running, the next decision is whether you should be running it at all. Part 3 compares Odoo Online, Odoo.sh and self-hosting. If you want a second pair of eyes on a production setup, get in touch.

Questions we get asked

What Python version does Odoo 19 need?

Odoo 19 requires Python 3.10 or later; the minimum is set in the source as MIN_PY_VERSION = (3, 10). Odoo's pinned dependencies follow the Python packages shipped with Ubuntu 24.04 and Debian 12, so the Python that comes with either distribution is the safest choice. Use a dedicated virtual environment per Odoo version so library versions do not clash.

Which PostgreSQL version should I use for Odoo 19?

Odoo 19 supports PostgreSQL 13 and later, and warns at startup on anything older. If you plan to use the Enterprise AI features, you need the pgvector extension, which Odoo documents as available only for PostgreSQL 15 and up. For a new server we would install PostgreSQL 15 or 16 so AI stays an option without migrating the database later.

Is the official Odoo Docker image Community or Enterprise?

The official odoo image on Docker Hub is Community. It is built from Odoo's Community nightly Debian package on Ubuntu 24.04 and includes wkhtmltopdf. To run Enterprise in Docker, mount the Enterprise addons from your subscription into the container and put that path first in the addons path, or build your own image that includes them.

What port does Odoo 19 use for websockets?

In multi-worker mode, Odoo 19 serves websocket traffic from a separate gevent worker on gevent_port, which defaults to 8072, while normal HTTP requests use 8069. Configure your reverse proxy to send requests for /websocket to port 8072 with the Upgrade and Connection headers, and enable proxy_mode. Without this, Discuss, Live Chat and live notifications stop updating.

How many workers should an Odoo 19 server have?

Odoo's guidance is to treat (CPUs × 2) + 1 as the maximum and to plan roughly one worker per six concurrent users, leaving CPU for scheduled jobs. Check memory too: Odoo estimates about 150 MB per light worker and around 1 GB per heavy one. Start from those figures, then adjust based on the CPU load and response times you actually see.

← Previous Getting started with Odoo 19: what changed and where to begin Next → Odoo 19 hosting: Odoo Online vs Odoo.sh vs on-premise
Keep reading
Odoo 19 Setting up companies, users and access rights in Odoo 19 6 min read Odoo 19 AI in Odoo 19: agents, AI fields and AI automation explained 7 min read Odoo 19 Setting up Odoo 19 CRM: leads, pipeline stages and lead scoring 7 min read