← Back to odoo/odoo

How to Deploy & Use odoo/odoo

Odoo Deployment and Usage Guide

1. Prerequisites

System Requirements

  • Python: 3.10 or higher (3.10-3.12 recommended for Odoo 17.0/18.0)
  • PostgreSQL: 12.0 or higher
  • Node.js: 16.x or higher (for asset compilation)
  • Operating System: Linux (Ubuntu 22.04/24.04 recommended), Windows 10/11, or macOS
  • RAM: Minimum 2GB RAM (4GB+ recommended for production)

Required System Packages

Ubuntu/Debian:

sudo apt update
sudo apt install git python3-pip python3-dev python3-venv libxml2-dev libxslt1-dev \
libevent-dev libsasl2-dev libldap2-dev libpq-dev libpng-dev libjpeg-dev node-less \
xfonts-75dpi xfonts-base wget gcc g++ make

macOS (with Homebrew):

brew install postgresql node git python3 freetype jpeg libpng libxml2 libxslt

Additional Dependencies

  • wkhtmltopdf (required for PDF reports):
# Ubuntu 22.04/24.04
wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltopdf_0.12.6.1-3.jammy_amd64.deb
sudo dpkg -i wkhtmltopdf_0.12.6.1-3.jammy_amd64.deb

# macOS
brew install --cask wkhtmltopdf

2. Installation

Step 1: Clone the Repository

git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0
cd odoo

Step 2: Create Python Virtual Environment

python3 -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

Step 3: Install Python Dependencies

pip install --upgrade pip
pip install -r requirements.txt

Note: If you encounter psycopg2 build errors, install the binary version:

pip install psycopg2-binary

Step 4: Install Node.js Dependencies (for frontend assets)

npm install -g rtlcss

Step 5: Database Setup

Create a PostgreSQL user for Odoo:

sudo -u postgres createuser -s $USER
# Or create specific odoo user:
sudo -u postgres createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo

3. Configuration

Configuration File (odoo.conf)

Create a configuration file in the project root:

[options]
; Database settings
db_host = localhost
db_port = 5432
db_user = odoo
db_password = your_secure_password
db_name = False

; Paths
addons_path = /path/to/odoo/addons
data_dir = /var/lib/odoo

; Server settings
http_port = 8069
longpolling_port = 8072
proxy_mode = False

; Security
admin_passwd = admin_master_password_change_this
csv_internal_sep = ,
db_maxconn = 64
db_template = template0
dbfilter = .*

; Logging
logfile = /var/log/odoo/odoo.log
log_level = info
logrotate = True

; Performance
workers = 0  ; Set to 0 for development, (2 * CPU cores + 1) for production
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 60
limit_time_real = 120

Environment Variables

Alternatively, use environment variables:

export ODOO_RC=/path/to/odoo.conf
export PGHOST=localhost
export PGUSER=odoo
export PGPASSWORD=your_secure_password

4. Build & Run

Development Mode

Initialize a new database and start the server:

./odoo-bin -c odoo.conf -d odoo_dev_db --init base --dev=all --stop-after-init

Start the development server:

./odoo-bin -c odoo.conf -d odoo_dev_db --dev=all

Key development flags:

  • --dev=all: Enables auto-reload, XML RPC debugging, and asset debugging
  • --save: Saves configuration to the config file
  • --update=all: Updates all modules (use after pulling code changes)

Production Mode

./odoo-bin -c odoo.conf --workers=4 --no-database-list --log-level=warn

Production checklist:

  • Set workers > 0 (typically 2-8 depending on CPU cores)
  • Set proxy_mode = True when behind Nginx/Apache
  • Change admin_passwd from default 'admin'
  • Disable database listing: --no-database-list or list_db = False in config

Database Management

Create database via CLI:

./odoo-bin -d production_db --init base --stop-after-init

Update modules:

./odoo-bin -d production_db --update all --stop-after-init

5. Deployment

Docker Deployment (Recommended)

# docker-compose.yml
version: '3.1'
services:
  web:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
    environment:
      - HOST=db
      - USER=odoo
      - PASSWORD=myodoo
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=myodoo
      - POSTGRES_USER=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata

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

Systemd Service (Linux)

Create /etc/systemd/system/odoo.service:

[Unit]
Description=Odoo
Documentation=http://www.odoo.com
After=network.target postgresql.service

[Service]
Type=simple
User=odoo
Group=odoo
ExecStart=/opt/odoo/odoo/odoo-bin -c /etc/odoo/odoo.conf
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Enable and start:

sudo systemctl daemon-reload
sudo systemctl enable odoo
sudo systemctl start odoo

Reverse Proxy (Nginx)

upstream odoo {
    server 127.0.0.1:8069;
}
upstream odoochat {
    server 127.0.0.1:8072;
}

server {
    listen 80;
    server_name odoo.example.com;

    location / {
        proxy_pass http://odoo;
        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;
        proxy_redirect off;
    }

    location /longpolling {
        proxy_pass http://odoochat;
    }

    location ~* /web/static/ {
        proxy_cache_valid 200 90m;
        proxy_buffering on;
        expires 864000;
        proxy_pass http://odoo;
    }

    # Enable Gzip
    gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
    gzip on;
}

Cloud Platforms

  • Odoo.sh: Official Odoo PaaS with GitHub integration
  • AWS/Azure/GCP: Use with RDS PostgreSQL and EC2/VM instances (t3.medium minimum recommended)
  • Kubernetes: Use official Helm charts available at helm/odoo

6. Troubleshooting

Database Connection Errors

Issue: FATAL: role "odoo" does not exist

# Solution: Create PostgreSQL user
sudo -u postgres createuser -s odoo
# Or set correct permissions:
sudo -u postgres psql -c "ALTER USER odoo WITH PASSWORD 'newpassword';"

Port Already in Use

Issue: OSError: [Errno 98] Address already in use

# Find and kill process using port 8069
sudo lsof -i :8069
sudo kill -9 <PID>
# Or start Odoo on different port
./odoo-bin --http-port=8070

Permission Denied on Filestore

Issue: PermissionError: [Errno 13] Permission denied: '/var/lib/odoo'

sudo mkdir -p /var/lib/odoo
sudo chown -R $(whoami):$(whoami) /var/lib/odoo

Assets Not Loading (CSS/JS)

Solution: Restart with asset regeneration:

./odoo-bin -d your_database --dev=all --stop-after-init
# Or update base module
./odoo-bin -d your_database -u base --stop-after-init

Memory Issues (Worker Timeout)

Issue: Worker (pid:XXXX) exceeded memory limit

  • Increase limit_memory_hard and limit_memory_soft in config
  • Reduce workers count if RAM is insufficient
  • Add swap space:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

PDF Generation Issues

Issue: Unable to find Wkhtmltopdf on this system

  • Ensure wkhtmltopdf is installed (not just the wrapper)
  • Check version matches system architecture (amd64 vs arm64)
  • Verify web.base.url system parameter is set correctly in Odoo

Module Installation Errors

Issue: ImportError: No module named 'xyz'

# Install missing Python package
pip install <module_name>
# If package is in requirements.txt but failed, install manually:
pip install --ignore-installed -r requirements.txt