How to install Odoo 20on Ubuntu, Windows, macOS and Docker
Odoo 20 needs Python 3.12 or later and PostgreSQL 16 or later. Pick the install method that fits your job, copy commands checked against Odoo's 20.0 documentation, and go from a test install to a production server behind Nginx.
# Ubuntu 24.04 ships Python 3.12 and PostgreSQL 16sudo apt install -y git postgresqlsudo -u postgres createuser -d -R -S $USERgit clone --branch 20.0 --single-branch --depth 1 https://github.com/odoo/odoo.gitcd odoo && sudo ./setup/debinstall.shpython3 odoo-bin --addons-path=addons -d odoo20INFO odoo20 odoo.modules.loading: Modules loaded.Odoo 20 at a glance
- Python
- 3.12 or later
- Raised from 3.10 in Odoo 20
- PostgreSQL
- 16 or later
- Raised from 13 in Odoo 20
- Best server OS
- Ubuntu 24.04 LTS
- Debian 13 also meets both minimums
- Default ports
- 8069 and 8072
- Web client, plus live chat with workers
Is Odoo 20 available yet?
Checked 26 Sep 2026 against the official channels
- Source code (opens in a new tab)20.0 branch on GitHubAvailable
- Documentation (opens in a new tab)Odoo 20.0 install docsAvailable
- Linux packages (opens in a new tab)Ubuntu 24.04 .deb, Fedora 42 .rpmAvailable
- Windows installer (opens in a new tab)Community nightly buildAvailable
- Official Docker image (opens in a new tab)No odoo:20 tag yetNot yet
04Check and fix
Pick a method, check the requirements, and decide where Odoo will run.
Which Odoo 20 installation method should you choose?
Choose by the job, not by the shortest command list. A source install suits development, Ubuntu 24.04 behind Nginx suits production, the Windows installer suits a quick evaluation, and Odoo Online or Odoo.sh suit teams that do not want to run servers.
Testing Odoo 19 and Odoo 20 on the same machine? Run them side by side.
What are the Odoo 20 system requirements?
Odoo 20 requires Python 3.12 or later and PostgreSQL 16 or later. Odoo's installation documentation records both changes for version 20: Python moves up from 3.10, and PostgreSQL moves up from 13. Check these two before you type anything else.
Python
Required3.12 or later
The 20.0
requirements.txtalso carries pins for Python 3.13 and 3.14.PostgreSQL
Required16.0 or later
Up from PostgreSQL 13 in Odoo 19.
wkhtmltopdf
For PDF reports0.12.6
Not installed by pip. Needed for headers and footers on printed reports.
pgvector
AI features onlyPostgreSQL extension
Works with PostgreSQL 15 and up, so any Odoo 20 database qualifies.
rtlcss
Right-to-left onlyNode.js package
For Arabic, Hebrew and Persian interfaces.
Ports
Defaults8069 and 8072
8069 serves the web client. 8072 carries live chat and notifications when workers are on.
Which operating systems meet the minimums out of the box?
The 20.0 requirements file is pinned against the Python packages in Ubuntu 24.04 (Noble) and Debian 13 (Trixie). Those two give a clean install with no extra repositories.
Ubuntu 24.04 LTS
ReadyPython 3.12PostgreSQL 16
Debian 13 (Trixie)
ReadyPython 3.13PostgreSQL 17
macOS with Homebrew
Ready for developmentPython python@3.12PostgreSQL postgresql@16
Windows 10 and 11
Testing onlyPython InstallerPostgreSQL Installer
Ubuntu 22.04 LTS
Needs newer packagesPython 3.10PostgreSQL 14
Debian 12 (Bookworm)
Needs newer packagesPython 3.11PostgreSQL 15
Debian 12 catches people
It ran Odoo 19 fine, but it ships PostgreSQL 15 (opens in a new tab) and Python 3.11 (opens in a new tab), both below the Odoo 20 minimum. For production, use Ubuntu 24.04 LTS or Debian 13. On a host you cannot rebuild, add the PostgreSQL apt repository (opens in a new tab) for PostgreSQL 16 and treat the Python gap as a reason to migrate the server.
Sizing a server
A laptop with 2 cores and 4 GB of RAM is enough for learning and module development. For production, size by workers and users: Odoo's deployment guide (opens in a new tab) gives a rule of thumb of (CPUs × 2) + 1 workers, with one worker serving about 6 concurrent users. PostgreSQL needs its own memory on top.
Before you install Odoo 20: decide where it will run
Answer three questions first: where Odoo will run, how it will be installed, and whether this environment is for development, testing or production. A laptop is a good learning environment and a poor production architecture.
- Q1
Where will it run?
A laptop, a VPS, a container host, or Odoo's own cloud.
- Q2
How will it be installed?
From source, from an official package, or as a container.
- Q3
What is it for?
Development, testing, or production. Each needs different safeguards.
Four terms this guide uses
- Source installation
- Odoo running directly from a Git checkout with
odoo-bin, instead of from an installed package. Odoo's documentation calls it the convenient choice for module developers: the code is directly accessible and several versions can run side by side. - Packaged installation
- Odoo installed as a system service from a
.deb,.rpmor Windows installer. The Linux packages expect PostgreSQL on the same host by default. - Odoo Enterprise
- A set of additional addons that run on top of the Odoo Community server. It is not a separate server, which changes how you install it.
- Filestore
- The folder where Odoo keeps attachments and binary fields on disk. A backup that only covers PostgreSQL is not a complete backup.
Commands for each platform, checked against Odoo's 20.0 documentation.
How do you install Odoo 20 on Ubuntu 24.04 from source?
Five steps: PostgreSQL 16, a database role, the 20.0 source, the Python dependencies, and the first run. Ubuntu 24.04 ships Python 3.12 and PostgreSQL 16, so no third-party repositories are needed. This is the setup we recommend for anyone writing custom modules.
- 5 steps
- Ubuntu 24.04 LTS
- Python 3.12
- PostgreSQL 16
Step 1: Check Python and install PostgreSQL 16
Confirm the Python version, then install and start PostgreSQL. On Ubuntu 22.04
psql --versionprints 14.x, which means you need the PostgreSQL apt repository before you continue.bash python3 --version # Ubuntu 24.04 ships Python 3.12 sudo apt update sudo apt install -y postgresql postgresql-client sudo systemctl enable --now postgresql psql --version # should print 16.xStep 2: Create a PostgreSQL role for Odoo
Odoo refuses to connect as the
postgressuperuser, so it needs its own role. Naming the role after your Linux login lets Odoo connect locally without a password: right for a development machine, wrong for production.bash sudo -u postgres createuser -d -R -S $USER createdb $USERStep 3: Clone the Odoo 20 source
--single-branchskips every other version and--depth 1skips the history, which keeps the clone small. Drop--depth 1if you plan to send patches upstream. On a production server, pin a specific commit so an untested upstream change cannot arrive with a routine pull.bash sudo apt install -y git mkdir -p ~/odoo20 && cd ~/odoo20 git clone --branch 20.0 --single-branch --depth 1 https://github.com/odoo/odoo.git cd odooStep 4: Install the Python dependencies
Pick one route and stay with it. Mixing apt packages and pip gives you two copies of every library and no certainty about which one loads.
bash # from the odoo folder sudo ./setup/debinstall.shOdoo's documentation names distribution packages as the preferred way to install dependencies. The script reads
debian/controland installs the matchingpython3-*packages with apt.bash # build libraries so pip can compile psycopg2, lxml, python-ldap and Pillow sudo apt install -y python3.12-venv python3.12-dev build-essential \ libpq-dev libxml2-dev libxslt1-dev libldap2-dev libsasl2-dev \ libssl-dev libjpeg-dev zlib1g-dev libffi-dev python3.12 -m venv ../venv source ../venv/bin/activate python -m pip install --upgrade pip setuptools wheel pip install -r requirements.txtUse this when several Odoo versions share one machine: one virtual environment per version. Odoo's documentation warns that pip can pull in broken or insecure dependencies, so pin what you deploy.
Step 5: Run Odoo 20 and sign in
If you used the virtual environment, activate it first. Wait for the log line
odoo.modules.loading: Modules loaded., openhttp://localhost:8069, and sign in with emailadminand passwordadmin. Change that password before anything else, even on a laptop.bash python3 odoo-bin --addons-path=addons -d odoo20To stop the server press Ctrl+C. To start it again, activate the virtual environment if you use one, then run the same command from the
odoofolder.
How do you install Odoo 20 with the official Linux package?
Install PostgreSQL, then install the Odoo 20 package from Odoo's nightly repository or a downloaded file, and Odoo runs as a system service. Odoo's documentation states the 20 .deb supports Ubuntu 24.04 (Noble) and the .rpm supports Fedora 42.
sudo apt install -y postgresql
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/20.0/nightly/deb/ ./' | sudo tee /etc/apt/sources.list.d/odoo.list
sudo apt-get update && sudo apt-get install odooapt-get upgrade keeps the install current. The repository carries the Community edition only.
sudo apt install -y postgresql
sudo apt install ./odoo_20.0.latest_all.deb
sudo systemctl status odooCommunity builds are on the nightly server (opens in a new tab). Enterprise packages come from the Odoo download page (opens in a new tab) and need a paying on-premise customer or partner login.
sudo dnf install -y postgresql-server
sudo postgresql-setup --initdb --unit postgresql
sudo systemctl enable --now postgresql
sudo dnf install -y ./odoo_20.0.latest.noarch.rpm
sudo systemctl enable --now odooDownload the .rpm from the nightly server (opens in a new tab). Odoo's documentation also describes a nightly dnf repository for automatic updates.
What the package sets up for you
- Service
odoo, running as theodoosystem user- Config file
/etc/odoo/odoo.conf- Log file
/var/log/odoo/odoo-server.log- Data and filestore
/var/lib/odoo- Database role
odoo, created during install
sudo systemctl status odoo
sudo tail -f /var/log/odoo/odoo-server.logInstalling Enterprise from a package?
There is no nightly repository for Odoo Enterprise. Download the Enterprise package from the Odoo download page while logged in as a paying customer or partner.
How do you set up Odoo 20 Enterprise from source?
Clone two repositories and put the Enterprise path first in --addons-path. The Enterprise repository holds extra addons only; the server itself lives in the Community repository. GitHub access to Enterprise comes with an Odoo subscription or partner account.
cd ~/odoo20
git clone --branch 20.0 --single-branch https://github.com/odoo/odoo.git
git clone --branch 20.0 --single-branch https://github.com/odoo/enterprise.git
cd odoo
python3 odoo-bin --addons-path=../enterprise,addons -d odoo20Why the order matters
Odoo's documentation requires the Enterprise path to come before the other paths so the right modules load. If Enterprise apps are missing from the Apps menu, check this first.
Licensing differences are covered in our Odoo Community vs Enterprise guide.
How do you install Odoo 20 on Windows?
Use the official Odoo 20 Windows installer for testing, and keep production on Linux. Odoo's documentation offers Windows packaging for testing or single-user local instances and discourages production deployment on Windows.
For testing and single-user use
Odoo's deployment guide also notes that the multi-processing (workers) server is not available on Windows, so a Windows install always runs the single-process threaded server.
Download the installer
Get the Community build from the nightly server (opens in a new tab), or any edition from the Odoo download page (opens in a new tab).
Run it
On Windows 8 and later a "Windows protected your PC" warning may appear. Choose More info, then Run anyway.
Finish the wizard
Accept the UAC prompt and go through the steps. Odoo launches automatically at the end of the installation.
Open Odoo
Go to
http://localhost:8069and create your first database.
Developing custom modules on Windows
A source install works on Windows too: Python 3.12 from python.org with Add Python to PATH ticked, PostgreSQL 16, the Build Tools for Visual Studio when a dependency needs compiling, then the 20.0 clone and pip install -r requirements.txt. In practice, most Windows developers we work with run Odoo in WSL2 with Ubuntu 24.04 and follow the Ubuntu steps above.
How do you install Odoo 20 on macOS?
macOS is a solid Odoo 20 development platform, with Homebrew supplying Python 3.12, PostgreSQL 16 and Git. Odoo's source installation documentation supports macOS and recommends a package manager for both Python and non-Python dependencies.
Install the tools
brew update
brew install python@3.12 postgresql@16 git
brew services start postgresql@16
python3.12 --version
psql --versionHomebrew's PostgreSQL usually creates a role named after your macOS user. Confirm with psql postgres -c '\du', and create it with createuser -d -R -S $USER if it is missing.
Clone, install and run
mkdir -p ~/odoo20 && cd ~/odoo20
git clone --branch 20.0 --single-branch --depth 1 https://github.com/odoo/odoo.git
cd odoo
python3.12 -m venv ../venv
source ../venv/bin/activate
python -m pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
python3 odoo-bin --addons-path=addons -d odoo20If a package fails to build, install the Command Line Tools with xcode-select --install and the matching Homebrew library (libpq for psycopg2, openldap for python-ldap), then re-run pip. On Apple Silicon keep everything arm64: Homebrew Python with Homebrew PostgreSQL.
How do you run Odoo 20 with Docker?
Run one container for Odoo, one for PostgreSQL 16, a private network between them, and named volumes for the database and the filestore. The official image is maintained in the odoo/docker repository (opens in a new tab) and published on Docker Hub (opens in a new tab).
Official image not published yet (checked 26 Sep 2026)
The odoo/docker repository has version folders up to 19.0 only, and Docker Hub's newest tags are for 19.0. The examples use odoo:20 so they work the day the image ships. Until then, use the source install or stay on Odoo 19 in Docker.
services:
db:
image: postgres:16
environment:
POSTGRES_DB: postgres
POSTGRES_USER: odoo
POSTGRES_PASSWORD: CHANGE_THIS_PASSWORD
volumes:
- odoo-db-data:/var/lib/postgresql/data
odoo:
image: odoo:20
depends_on:
- db
ports:
- "8069:8069"
environment:
HOST: db
USER: odoo
PASSWORD: CHANGE_THIS_PASSWORD
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./addons:/mnt/extra-addons
volumes:
odoo-db-data:
odoo-web-data:docker network create odoo-net
docker volume create odoo-db-data
docker volume create odoo-web-data
docker run -d --name odoo20-db --network odoo-net \
-e POSTGRES_DB=postgres -e POSTGRES_USER=odoo \
-e POSTGRES_PASSWORD=CHANGE_THIS_PASSWORD \
-v odoo-db-data:/var/lib/postgresql/data \
postgres:16
docker run -d --name odoo20 --network odoo-net -p 8069:8069 \
-e HOST=odoo20-db -e USER=odoo -e PASSWORD=CHANGE_THIS_PASSWORD \
-v odoo-web-data:/var/lib/odoo \
odoo:20- The official image reads
HOST,PORT,USERandPASSWORDto find PostgreSQL, so those variable names are not arbitrary. - Start the stack with
docker compose up -dand openhttp://localhost:8069. Custom modules go in./addons, which maps to/mnt/extra-addons, already on the image's addons path. - For Odoo's AI features, swap the database image for
pgvector/pgvector:pg16: PostgreSQL 16 with pgvector pre-installed.
Before you run Docker in production
Removing containers without named volumes deletes the data inside them. For production, move passwords into a secrets file, never publish port 5432, put Odoo behind a TLS reverse proxy, and schedule pg_dump and filestore backups from the host.
Set up a clean development workspace, then harden it for production.
How should you structure an Odoo 20 development environment?
Keep the Odoo core, Enterprise, your custom addons, the virtual environment and the configuration in separate folders under one version-specific root. The layout keeps Git clean, upgrades predictable, and lets Odoo 19 and Odoo 20 live on the same machine.
Folder layout
- odoo20/
- odoo/git clone, branch 20.0
- enterprise/optional, branch 20.0
- custom-addons/your modules, own repository
- venv/Python 3.12 virtual environment
- config/
- odoo.confkeep out of public Git
- logs/
[options]
admin_passwd = CHANGE_THIS_MASTER_PASSWORD
db_host = False
db_port = False
db_user = odoo
db_password = False
addons_path = /home/you/odoo20/enterprise,/home/you/odoo20/odoo/addons,/home/you/odoo20/custom-addons
http_port = 8069
logfile = /home/you/odoo20/logs/odoo.logpython3 odoo-bin -c ../config/odoo.conf -d odoo20 --dev=all--dev=allreloads Python code and XML views as you edit them. Install thewatchdogpackage in the virtual environment so the Python auto-reload works.- The master password (
admin_passwd) is the key to every database on that server. Keepodoo.confout of public repositories. - New to writing modules? Our Odoo module development guide picks up from this folder layout.
What changes for an Odoo 20 production deployment?
Production adds four things a development install does not have: a reverse proxy with HTTPS, a multi-worker configuration, backups of both PostgreSQL and the filestore, and monitoring. Odoo's system configuration guide (opens in a new tab) covers each in depth; below is the shape we deploy for clients.
- Users and integrationsBrowsers, mobile app, API clients
- DNS or CDNCloudflare or your DNS provider
- Nginx reverse proxyTLS termination, HTTP to HTTPS redirect:443
- Odoo 20multi-worker serverHTTP workersWeb client, API, reports:8069Live chat workerEverything under /websocket:8072
- PostgreSQL 16Private network or localhost only:5432
Configuration, service, proxy and backups
Four files turn a working install into a production one. Each tab has the file and what to watch in it.
[options]
admin_passwd = CHANGE_THIS_MASTER_PASSWORD
db_host = 127.0.0.1
db_port = 5432
db_user = odoo
db_password = CHANGE_THIS_DB_PASSWORD
db_name = production
dbfilter = ^production$
list_db = False
addons_path = /opt/odoo20/odoo/addons,/opt/odoo20/custom-addons
data_dir = /var/lib/odoo20
logfile = /var/log/odoo20/odoo.log
log_level = warn
proxy_mode = True
http_port = 8069
gevent_port = 8072
workers = 5
max_cron_threads = 1
limit_memory_soft = 2147483648
limit_memory_hard = 2684354560
limit_time_cpu = 600
limit_time_real = 1200workers = 5follows the (CPUs × 2) + 1 rule for a 2-CPU host. Tune memory and time limits from measured load, not from a forum post.proxy_mode = Truemakes Odoo trust the forwarded headers from Nginx, which it needs for correct URLs and client IPs.list_db = Falsewith a strictdbfilterkeeps the database manager off the public internet.
[Unit]
Description=Odoo 20
After=network.target postgresql.service
[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/opt/odoo20/venv/bin/python /opt/odoo20/odoo/odoo-bin -c /etc/odoo20.conf
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target- For a source install. The official package ships its own
odooservice. - Enable it with
sudo systemctl daemon-reload && sudo systemctl enable --now odoo20. - The
odoouser should own/opt/odoo20,/var/lib/odoo20and/var/log/odoo20, and nothing else.
upstream odoo { server 127.0.0.1:8069; }
upstream odoochat { server 127.0.0.1:8072; }
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name erp.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name erp.example.com;
ssl_certificate /etc/letsencrypt/live/erp.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/erp.example.com/privkey.pem;
client_max_body_size 200m;
proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
location /websocket {
proxy_pass http://odoochat;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_pass http://odoo;
}
}- The
/websocketblock is what keeps live chat and notifications working. A proxy that only forwards to 8069 looks fine until the first missing notification. - Get the certificate with Certbot or your provider, and redirect every HTTP request to HTTPS.
sudo -u postgres pg_dump -Fc production > /backups/production-$(date +%F).dump
tar -czf /backups/filestore-production-$(date +%F).tgz /var/lib/odoo20/filestore/production- Back up the database and the filestore together, encrypt them, and copy them off the server.
- Restore them onto a staging server on a schedule. A backup you have never restored is a hope, not a backup.
Production checklist
Tick items off as you go. Progress stays in this browser.
0 of 10 done
Do you need wkhtmltopdf, rtlcss and pgvector for Odoo 20?
You need wkhtmltopdf for PDF reports, rtlcss only for right-to-left languages, and pgvector only for Odoo's AI features. Odoo documents all three as separate installs that pip does not cover.
wkhtmltopdf
Needed for PDF reportsOdoo's documentation says it must be installed manually in version 0.12.6 for headers and footers to work. If web pages render but PDF reports fail, fix this binary before touching any other setting.
# download the 0.12.6 build for your distribution from
# github.com/wkhtmltopdf/packaging/releases, then:
sudo apt install ./wkhtmltox_*.deb
wkhtmltopdf --versionrtlcss
Right-to-left languages onlyFor Arabic, Hebrew or Persian interfaces. An English-only install can skip it, but add RTL rendering to your acceptance tests if the business trades in the Gulf.
sudo apt install -y nodejs npm
sudo npm install -g rtlcsspgvector
Odoo AI features onlyOdoo's documentation states the pg-vector extension is required for its AI features and works on PostgreSQL 15 and up. Plan it in from day one if AI is on the roadmap, rather than adding it to a live database later.
sudo apt install -y postgresql-server-dev-16 build-essential
cd /tmp
git clone https://github.com/pgvector/pgvector.git
cd pgvector
make
sudo make installProve the install works, and fix the errors people hit most often.
How do you verify an Odoo 20 installation?
Check each layer on its own, then run one end-to-end test that touches the web server, PostgreSQL, the filestore and PDF rendering together. Every layer fails with a different error, and you want to meet them one at a time.
python3 --version
psql --version
git --version
sudo systemctl status postgresqlThen run one end-to-end test
Create a test database and install Contacts and Sales.
Tests: Web server and PostgreSQLCreate a second user and sign in as that user.
Tests: Access rightsUpload an attachment to any record.
Tests: FilestorePrint a quotation as PDF.
Tests: wkhtmltopdf, headers and footersRead the log for warnings after each step.
Tests: Everything above
Common Odoo 20 installation errors and fixes
Most Odoo 20 installation errors come from four causes: the wrong Python, the wrong PostgreSQL, a missing system library, or a path that does not match the config file. Work through them in that order.
"Outdated python version" or a syntax error on startup
- Cause:
- The shell is using Python 3.10 or 3.11.
- Fix:
- Create the environment with
python3.12 -m venv, activate it, and checkwhich python.
psycopg2.OperationalErroror "could not connect"- Cause:
- PostgreSQL is not running, or the role or host is wrong.
- Fix:
- Run
systemctl status postgresql, confirm the role exists, then checkdb_hostanddb_user.
PostgreSQL version error when creating a database
- Cause:
- PostgreSQL 14 or 15 is installed.
- Fix:
- Install PostgreSQL 16 from the PostgreSQL apt repository, or move to Ubuntu 24.04.
Port 8069 already in use
- Cause:
- Another Odoo instance is running.
- Fix:
- Find it with
sudo lsof -i :8069, stop it, or start Odoo with--http-port 8070.
ModuleNotFoundErrorfor a Python package- Cause:
- The wrong virtual environment is active.
- Fix:
- Run
source venv/bin/activate, thenpip install -r requirements.txt.
PDF reports blank, or missing header and footer
- Cause:
- wkhtmltopdf is missing or the wrong version.
- Fix:
- Install 0.12.6 and check it with
wkhtmltopdf --version.
Custom module not found
- Cause:
- Wrong
addons_path, a missing__manifest__.py, or file permissions. - Fix:
- Check the path in the config file and the addons list Odoo prints at startup.
Enterprise apps missing from the Apps menu
- Cause:
- The Enterprise path is listed after the Community addons.
- Fix:
- Put the Enterprise path first in
addons_path.
Data gone after
docker compose down -v- Cause:
- The
-vflag deletes named volumes. - Fix:
- Recreate the stack with named volumes and restore from your last backup.
Live chat or notifications never arrive behind Nginx
- Cause:
/websocketis not proxied to port 8072.- Fix:
- Add the websocket location block and set
proxy_mode = True.
Can you run Odoo 19 and Odoo 20 on the same machine?
Yes, as long as every layer is isolated: separate source folders, separate virtual environments, separate databases and separate ports. Source environments and containers make this practical.
Source folder
- Odoo 19
- ~/odoo19/odoo
- Odoo 20
- ~/odoo20/odoo
Python environment
- Odoo 19
- ~/odoo19/venv
- Odoo 20
- ~/odoo20/venv (3.12)
Database
- Odoo 19
- odoo19
- Odoo 20
- odoo20
Port
- Odoo 19
- 8069
- Odoo 20
- 8070
Start with
- Odoo 19
- --http-port 8069
- Odoo 20
- --http-port 8070 --db-filter=^odoo20$
| Keep separate | Odoo 19 | Odoo 20 |
|---|---|---|
| Source folder | ~/odoo19/odoo | ~/odoo20/odoo |
| Python environment | ~/odoo19/venv | ~/odoo20/venv (3.12) |
| Database | odoo19 | odoo20 |
| Port | 8069 | 8070 |
| Start with | --http-port 8069 | --http-port 8070 --db-filter=^odoo20$ |
One rule you cannot skip
Never point two major versions at the same database, even for a quick test. Schemas change between versions, and only Odoo's upgrade process moves data from one to the other safely.
From our own work
When we compared the 19.0 and 20.0 branches for our Odoo widget reference, the widget registry alone showed 200 additions and 62 removals. A shared database would be exposed to changes on that scale.
Pick an edition and a hosting model, or hand the whole job to us.
Odoo 20 Community vs Enterprise: what changes in the installation?
Only where the code comes from. Enterprise is an extra set of addons on the Community server, so everything else in this guide, from Python 3.12 to the Nginx configuration, is identical for both editions.
Odoo 20 Community
- One repository:
odoo/odoo, branch 20.0 - Nightly packages for Ubuntu, Fedora and Windows
- Free, LGPL-licensed
Odoo 20 Enterprise
- Two repositories:
odoo/odooplusodoo/enterprise - Enterprise path first in
addons_path - Packages from the Odoo download page with a paid login
Odoo Online vs Odoo.sh vs self-hosted Odoo 20
Not every Odoo 20 project needs a manual installation. Odoo's hosting overview (opens in a new tab) sets out three models, and the right one depends on customization, operational responsibility and budget, not on which has the fewest commands.
Odoo Online
- Who runs the server
- Odoo
- Custom server code
- No custom server-side code
- Best for
- Standard apps with minimal IT
Odoo.sh
- Who runs the server
- Odoo, with your Git branches
- Custom server code
- Yes, deployed through Git
- Best for
- Custom modules without server administration
Self-hosted
- Who runs the server
- You or your partner
- Custom server code
- Yes, unrestricted
- Best for
- Full control, data residency, integrations, cost control at scale
Self-hosting gives the most control and makes you responsible for operating system updates, PostgreSQL, backups, security, monitoring, deployment and disaster recovery. Our own website content is served from a self-hosted Odoo instance behind a reverse proxy, so it is the model we run ourselves, not only the one we recommend. For cost and control in detail, see Odoo Online vs Odoo.sh vs on-premise.
How iVentureTeam installs and hosts Odoo 20 for clients
We set up Odoo environments the way this guide describes, then take responsibility for keeping them running, on your own cloud account, on Odoo.sh or on dedicated servers.
- years with Odoo
- 13+
- ERP projects delivered
- 150+
- Odoo specialists
- 40+
- countries served
- 35+
Environment audit
Current version, Python and PostgreSQL levels, custom modules, third-party apps and hosting.
Build the tiers
Development, staging and production, each with the safeguards it needs.
Move custom code
Port your modules to the Odoo 20 framework and test them against real data.
Cut over safely
A rehearsed go-live with a written rollback plan and backups verified first.
On an older version? Read whether to upgrade to Odoo 20 on release day, browse the Odoo 20 release notes, or see our Odoo upgrade services.
The bottom line on installing Odoo 20
- Choose the architecture first and the commands second.
- Odoo 20 raises the baseline to Python 3.12 and PostgreSQL 16, so Ubuntu 24.04 LTS or Debian 13 gives a clean install and older releases do not.
- Developers get the most from a source install with one virtual environment per version.
- Businesses get the most from Linux behind Nginx with real backups and monitoring, or from Odoo.sh when they would rather not run that layer.
- Treat Odoo 18 and 19 tutorials as a starting point whose versions need checking, not as a script to paste.
Odoo 20 installation: frequently asked questions
What Python version does Odoo 20 require?
Odoo 20 requires Python 3.12 or later. Odoo's source installation documentation records the change for version 20, up from the Python 3.10 minimum used by Odoo 17 through 19. The 20.0 requirements file also carries pins for Python 3.13 and 3.14, so newer interpreters are covered too.
What PostgreSQL version does Odoo 20 require?
Odoo 20 requires PostgreSQL 16 or later, up from PostgreSQL 13 in Odoo 19. Ubuntu 24.04 and Debian 13 ship a compatible version by default. Ubuntu 22.04 and Debian 12 do not, so add the PostgreSQL apt repository or move to a newer release before installing.
Is Odoo 20 released yet?
Yes. Odoo 20 was released at Odoo Experience 2026 in Brussels, held 24 to 26 September 2026. The 20.0 source branch, the 20.0 documentation and nightly packages for Ubuntu, Fedora and Windows are available. The official Docker image had not been published when we last checked on 26 September 2026.
Can I install Odoo 20 on Ubuntu 22.04?
Yes, but not from the default repositories. Ubuntu 22.04 ships Python 3.10 and PostgreSQL 14, both below the Odoo 20 minimum, so you need PostgreSQL 16 from the PostgreSQL apt repository and a separately installed Python 3.12. The official Odoo 20 package targets Ubuntu 24.04, which is the simpler choice for production.
Can I install Odoo 20 on Windows for production?
Odoo provides a Windows installer, but its documentation describes Windows packaging as meant for testing or single-user local instances and discourages production on Windows. The multi-worker server is also unavailable on Windows. Evaluate locally on Windows and deploy production on Linux, Odoo.sh or Odoo Online.
Is there an official Odoo 20 Docker image?
Not yet. When we checked on 26 September 2026, the odoo/docker repository had version folders up to 19.0 and Docker Hub's newest tags were for 19.0. Expect an odoo:20 tag after the release settles. Until then, use the source install or run Odoo 19 in Docker.
Can I run Odoo 19 and Odoo 20 on the same server?
Yes, with full isolation: separate source folders, virtual environments, databases and ports, for example 8069 for Odoo 19 and 8070 for Odoo 20. Never connect both versions to the same database. Only Odoo's upgrade process moves a database safely from 19 to 20.
How do I install Odoo 20 Enterprise?
Clone both the Community and Enterprise 20.0 repositories and list the Enterprise path first in addons_path, or install the Enterprise package from the Odoo download page while logged in as a paying customer or partner. Enterprise is a set of extra addons on top of the Community server, not a different server.
Do I need pgvector to install Odoo 20?
Only if you use Odoo's AI features. Odoo's documentation states the pg-vector PostgreSQL extension is required for those features and works on PostgreSQL 15 and up. A standard install for sales, inventory or accounting runs without it, though planning for it early avoids a production database change later.
What port does Odoo 20 use?
Odoo 20 serves the web client on port 8069 by default, as earlier versions did. When workers are enabled in production, live chat and notifications run on port 8072, and your reverse proxy must forward /websocket traffic to it.
Sources, and how this guide was checked
Every version number, file path and command on this page was checked on 26 Sep 2026 against these primary sources. Package paths come from the 20.0 source itself (debian/postinst and debian/odoo.service).
- Odoo 20.0 documentation: source install (opens in a new tab)
- Odoo 20.0 documentation: packaged installers (opens in a new tab)
- Odoo 20.0 documentation: system configuration (opens in a new tab)
- Odoo 20.0 source branch on GitHub (opens in a new tab)
- Odoo nightly builds, 20.0 (opens in a new tab)
- Official Odoo image on Docker Hub (opens in a new tab)
- Official Odoo 20 release notes (opens in a new tab)
- pgvector (opens in a new tab)
- wkhtmltopdf packaging releases (opens in a new tab)
Keep going with Odoo 20
Odoo 20, installed properly
Want Odoo 20 installed the right way the first time?
Book a free 30-minute call with an Odoo consultant. We will review your hosting, your custom modules and your timeline, and tell you plainly whether Odoo 20 is the right move now.
Or call +91-90235-15208business@iventureteam.comOr get a free Odoo demo and trial
