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 17: Complete Guide for Businesses
Odoo 17 7 min read

Complete Guide to Installing Odoo 17 on Mac, Windows, Linux and Docker

Comprehensive guide with easy copy-paste commands for installing Odoo 17 on Windows, Mac, Linux, and Docker, plus Nginx and SSL configuration.

· ERP practice 06 Jan 2025 · updated 01 May 2025

Odoo 17 installs three ways: from a packaged installer on Windows and Debian or Ubuntu, from source with Python and PostgreSQL on any platform, or as the official odoo:17.0 Docker image beside a PostgreSQL container. Whichever route you take, Odoo needs a PostgreSQL database and, for anything public, a reverse proxy such as Nginx in front of it for HTTPS.

Introduction

Odoo 17 offers significant improvements in performance, usability, and features. This guide provides step-by-step instructions for installing Odoo 17 on various platforms. All commands are formatted for easy copying and pasting.

Installing Odoo 17 on Windows

Option 1: Using the Official Windows Installer (Recommended for Beginners)

  1. Download the official Odoo 17 installer from the Odoo download page
  2. Run the downloaded .exe file
  3. Follow the installation wizard:
  • Choose installation directory
  • Configure PostgreSQL connection settings
  • Set up the master password (important for database management)

Option 2: Manual Installation on Windows

Prerequisites:

1. Python 3.10 or later: https://www.python.org/downloads/windows/
2. PostgreSQL 14 or later: https://www.postgresql.org/download/windows/
3. Git for Windows: https://git-scm.com/download/win
4. Visual Studio Build Tools: https://visualstudio.microsoft.com/visual-cpp-build-tools/

Installation Steps:

# Clone Odoo repository
git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0 --single-branch odoo17
cd odoo17

# Create and activate virtual environment
python -m venv venv
venv\Scripts\activate

# Install dependencies
pip install setuptools wheel
pip install -r requirements.txt

# Run Odoo
python odoo-bin -c odoo.conf

Create a sample odoo.conf file with the following content:

[options]
; This is the password that allows database operations:
admin_passwd = my_secure_password
db_host = localhost
db_port = 5432
db_user = postgres
db_password = your_postgres_password
addons_path = ./addons
logfile = odoo.log

Installing Odoo 17 on Mac OS

Option 1: Using Homebrew

# Install Homebrew if you don't have it
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install dependencies
brew install [email protected] postgresql git node
brew services start postgresql

# Create PostgreSQL user
psql postgres -c "CREATE USER odoo WITH SUPERUSER PASSWORD 'your_password';"

# Clone Odoo repository
git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0 --single-branch odoo17
cd odoo17

# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install setuptools wheel
pip install -r requirements.txt

# Run Odoo
python3 odoo-bin -c odoo.conf

Create a sample odoo.conf file with the following content:

[options]
; This is the password that allows database operations:
admin_passwd = my_secure_password
db_host = localhost
db_port = 5432
db_user = odoo
db_password = your_password
addons_path = ./addons
logfile = odoo.log

Installing Odoo 17 on Linux (Ubuntu/Debian)

Option 1: Using the Debian/Ubuntu Package

# Add Odoo repository
wget -O - https://nightly.odoo.com/odoo.key | apt-key add -
echo "deb http://nightly.odoo.com/17.0/nightly/deb/ ./" | tee /etc/apt/sources.list.d/odoo.list

# Update package index and install Odoo apt-get update apt-get install odoo

# Start Odoo service systemctl start odoo systemctl enable odoo

Option 2: Manual Installation on Ubuntu/Debian

# Update system and install dependencies apt update apt upgrade -y apt install -y git python3-pip python3-dev python3-venv python3-wheel libxslt-dev libzip-dev libldap2-dev libsasl2-dev python3-setuptools node-less libjpeg-dev xvfb libfontconfig wkhtmltopdf

# Install PostgreSQL apt install -y postgresql postgresql-client

# Create PostgreSQL user -u postgres createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo
# Enter a password when prompted

# Clone Odoo repository
git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0 --single-branch odoo17
cd odoo17

# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate

# Install Python dependencies
pip3 install setuptools wheel
pip3 install -r requirements.txt

# Create Odoo configuration file mkdir /etc/odoo cp debian/odoo.conf /etc/odoo/ chown -R odoo: /etc/odoo/

# Create log directory mkdir /var/log/odoo chown -R odoo: /var/log/odoo/

# Create a dedicated system user adduser --system --home=/opt/odoo --group odoo

# Move Odoo to its final location cp -r ./ /opt/odoo/odoo17 chown -R odoo: /opt/odoo

# Create systemd service file
cat <

Installing Odoo 17 with Docker

Option 1: Using the Official Odoo Docker Image

# Pull the official Odoo 17 image
docker pull odoo:17.0

# Pull the PostgreSQL image
docker pull postgres:14

# Create a network for Odoo and PostgreSQL
docker network create odoo-network

# Start a PostgreSQL container
docker run -d --name odoo-db \
  --network odoo-network \
  -e POSTGRES_USER=odoo \
  -e POSTGRES_PASSWORD=odoo \
  -e POSTGRES_DB=postgres \
  -v odoo-db-data:/var/lib/postgresql/data \
  postgres:14

# Start the Odoo container
docker run -d --name odoo17 \
  --network odoo-network \
  -p 8069:8069 \
  -e POSTGRES_USER=odoo \
  -e POSTGRES_PASSWORD=odoo \
  -e POSTGRES_DB=postgres \
  -e POSTGRES_HOST=odoo-db \
  -v odoo-web-data:/var/lib/odoo \
  -v odoo-addons:/mnt/extra-addons \
  odoo:17.0

Option 2: Using Docker Compose

Create a file named docker-compose.yml with the following content:

version: '3'
services:
  db:
    image: postgres:14
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
    volumes:
      - odoo-db-data:/var/lib/postgresql/data
    restart: always

  odoo:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=odoo
      - POSTGRES_USER=odoo
      - POSTGRES_HOST=db
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./addons:/mnt/extra-addons
    restart: always

volumes:
  odoo-web-data:
  odoo-db-data:

Then run:

# Start the containers
docker-compose up -d

# View logs
docker-compose logs -f

Setting Up Nginx as a Reverse Proxy

Nginx can be used as a reverse proxy to provide SSL termination and handle multiple Odoo instances.

Install Nginx

# Ubuntu/Debian apt update apt install nginx

# CentOS/RHEL yum install epel-release yum install nginx

# macOS
brew install nginx

Configure Nginx for Odoo

Create a new Nginx configuration file:

sudo nano /etc/nginx/sites-available/odoo.conf

Add the following configuration:

upstream odoo {
    server 127.0.0.1:8069;
}

upstream odoochat {
    server 127.0.0.1:8072;
}

server {
    listen 80;
    server_name your-domain.com;

    # Redirect to HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name your-domain.com;

    # SSL configuration
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    ssl_session_timeout 30m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers off;

    # log
    access_log /var/log/nginx/odoo.access.log;
    error_log /var/log/nginx/odoo.error.log;

    # Increase proxy buffer size
    proxy_buffers 16 64k;
    proxy_buffer_size 128k;

    # Add Headers for Odoo proxy mode
    proxy_set_header X-Forwarded-Host $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;

    # Increase timeouts
    proxy_read_timeout 600s;
    proxy_connect_timeout 600s;
    proxy_send_timeout 600s;

    # General proxy settings
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

    # Handle longpoll requests
    location /longpolling {
        proxy_pass http://odoochat;
    }

    # Handle / requests
    location / {
        proxy_redirect off;
        proxy_pass http://odoo;
    }

    # Cache static files
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        proxy_cache_valid 200 304 60m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

    # Gzip
    gzip on;
    gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
    gzip_min_length 1000;
}

Enable the configuration:

sudo ln -s /etc/nginx/sites-available/odoo.conf /etc/nginx/sites-enabled/ nginx -t systemctl restart nginx

Configuring SSL with Let's Encrypt

Install Certbot

# Ubuntu/Debian apt update apt install certbot python3-certbot-nginx

# CentOS/RHEL yum install certbot python3-certbot-nginx

Obtain SSL Certificate

sudo certbot --nginx -d your-domain.com

Follow the prompts to complete the certificate issuance.

Auto-renewal Configuration

Certbot automatically creates a cron job or systemd timer for certificate renewal. You can test the renewal process with:

sudo certbot renew --dry-run

Troubleshooting

Common Issues and Solutions

PostgreSQL Connection Issues

If Odoo can't connect to PostgreSQL:

# Check PostgreSQL service status systemctl status postgresql

# Ensure PostgreSQL is listening on the right address nano /etc/postgresql/14/main/postgresql.conf
# Ensure listen_addresses = 'localhost' or '*'

# Check pg_hba.conf for proper client authentication nano /etc/postgresql/14/main/pg_hba.conf
# Add the line: host all all 127.0.0.1/32 md5

# Restart PostgreSQL systemctl restart postgresql

Permission Issues

If you encounter permission errors:

# Check Odoo log file cat /var/log/odoo/odoo.log

# Ensure correct ownership of directories chown -R odoo:odoo /etc/odoo/ chown -R odoo:odoo /var/log/odoo/ chown -R odoo:odoo /opt/odoo/

Port Access Issues

If you can't access Odoo on port 8069:

# Check if the port is in use netstat -tuln | grep 8069

# Check firewall settings ufw status

# Allow the port if needed ufw allow 8069/tcp

Checking Logs

# Odoo service logs journalctl -u odoo

# Odoo log file cat /var/log/odoo/odoo.log

# Docker logs
docker logs odoo17

# Nginx logs cat /var/log/nginx/odoo.error.log

Need More Help?

If you're still experiencing issues, consider:

Remember that proper server maintenance, security updates, and backups are crucial for any production Odoo deployment.

Questions we get asked

Which Python and PostgreSQL versions does Odoo 17 need?

Odoo 17 runs on Python 3.10 or later, so the 3.8 and 3.9 environments that were fine for Odoo 15 will not work. PostgreSQL 12 or above is supported; the examples here use 14. Install wkhtmltopdf 0.12.6 separately if you want PDF reports that match what you see on screen.

Is Odoo 17 Community free to install?

Yes. The Community edition is LGPL-licensed, and the source, the nightly Debian packages and the Docker image are all free to download and run on your own server. Enterprise apps such as Studio, Documents, Sign, Helpdesk, Field Service and full Accounting are not part of that source and need a paid subscription.

Do I need Nginx to run Odoo 17?

Not to start it - Odoo serves HTTP on port 8069 by itself. You need a reverse proxy for anything reachable from the internet: it terminates TLS, forwards the websocket traffic on port 8072, and caches static files. In Odoo 17 that traffic is on /websocket rather than the older /longpolling path, and proxy_mode must be set to True.

How do I move an existing database onto Odoo 17?

Not by installing the new version over it. Odoo's upgrade service takes a database dump and returns it converted to the target version, which you then test with your own modules before going live. Running odoo-bin with -u all only updates modules within one major version; it does not migrate data between versions.

Where does Odoo 17 keep attachments and logs?

Attachments live in the filestore: by default under ~/.local/share/Odoo/filestore/<database> for a source install, and in /var/lib/odoo for a packaged one, which the Docker image maps to the odoo-web-data volume. Logs go wherever logfile points in odoo.conf, or to the system journal when that option is left unset.

← Previous Integrating All Your Business Apps with Odoo 17
Keep reading
Odoo 17 Creating and Managing Blogs in Odoo 17 3 min read Odoo 17 Building and Managing Your Website with Odoo 17 3 min read Odoo 17 Automating Marketing Campaigns in Odoo 17 3 min read