Skip to content

Installation

Complete installation guide for the Odoo 15 ERP system.

Prerequisites

Before installation, ensure you have:

Requirement Version Check Command
Docker 20.10+ docker --version
Docker Compose 2.0+ docker compose version
Git 2.0+ git --version
Disk Space 10GB+ free df -h

Install Docker (if needed)

# Update packages
sudo apt update

# Install Docker
sudo apt install -y docker.io docker-compose-plugin

# Add user to docker group
sudo usermod -aG docker $USER

# Log out and back in, then verify
docker --version
# Install Docker Desktop from:
# https://www.docker.com/products/docker-desktop

# Or via Homebrew
brew install --cask docker

# Start Docker Desktop, then verify
docker --version
# Install Docker
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker

# Add user to docker group
sudo usermod -aG docker $USER

# Install Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Installation Steps

Step 1: Clone Repository

# Clone the repository
git clone git@github.com:example/odoo15-production.git
cd odoo15-production

Step 2: Configure Environment

# Copy example environment file
cp .env.example .env

# Review and edit if needed
nano .env

Key variables:

Variable Default Description
COMPOSE_FILE docker-compose.yml:docker-compose.test.yml Auto-loads both compose files
DB_NAME odoo_test Database name
DB_PASSWORD odoo_test_2025 Database password
ODOO_PORT 8016 Odoo web port
PWA_PORT 8000 Field PWA port
LANDING_PORT 8001 Landing page port
DOCS_PORT 8002 Documentation port

COMPOSE_FILE Variable

The .env file includes COMPOSE_FILE which tells Docker Compose which files to use. No need to specify -f flags in commands.

Step 3: Build Custom Images

The Odoo image includes additional Python dependencies required by custom modules:

# Build custom Odoo image (first time only)
docker compose build odoo

# Build docs image
docker compose build docs

Python Dependencies Included

The custom Odoo image (odoo/Dockerfile) includes:

  • oauthlib, PyJWT, cryptography - for REST API module
  • boto3 - for S3 signatures and photos
  • xero-python - for Xero integration
  • google-api-python-client - for Google contacts sync

Step 4: Start Services

# Start all services
docker compose up -d

# Wait for services to initialize (~60 seconds)
sleep 60

# Check status
docker compose ps

Expected output:

NAME                    STATUS              PORTS
odoo15-db-1            Up (healthy)        5432/tcp
odoo15-odoo-1          Up (healthy)        0.0.0.0:8016->8069/tcp
odoo15-pwa-1           Up (healthy)        0.0.0.0:8000->8000/tcp
odoo15-landing-1       Up (healthy)        0.0.0.0:8001->8001/tcp
odoo15-docs-1          Up (healthy)        0.0.0.0:8002->8002/tcp
odoo15-nginx-1         Up (healthy)        0.0.0.0:80->80/tcp

Step 5: Initialize Database

For first-time installation:

# Initialize Odoo database with JDX core data
docker compose exec odoo odoo -i base,jdx_core_data --stop-after-init -d odoo_test

This takes 2-3 minutes. Wait for completion.

What jdx_core_data Installs

The jdx_core_data module sets up your base configuration:

  • MTO Route - Unarchived and active (required for SO → PO workflow)
  • Company Settings - Dimension-based pricing enabled
  • Item Locations - 15 room names (Living Room, Bedroom, Kitchen, etc.)
  • Supply Colors - 14 hardware colors (White, Brown, Black, etc.)
  • Product Categories - Window Coverings hierarchy (Blinds, Shades, Shutters)

See JDX Core Data Module for details.

Step 6: Verify Installation

# Run health check
./scripts/health-check.sh

Or manually check each service:

Service URL Expected
Odoo http://localhost:8016 Login page
PWA http://localhost:8000 Login page
Landing Page http://localhost:8001 Public website
Docs http://localhost:8002 Documentation
Nginx http://localhost Landing page (proxied)

Post-Installation

Set Admin Password

  1. Open http://localhost:8016
  2. Click "Manage Databases"
  3. Set master password (use value from ODOO_ADMIN_PASSWORD)

Install Modules

# Install custom modules
docker compose exec odoo odoo -i jdx_justcall_sms,jdx_service_signature --stop-after-init -d odoo_test

Create First User

  1. Login as admin (default: admin/admin)
  2. Go to Settings → Users & Companies → Users
  3. Create user accounts

Troubleshooting

Services Won't Start

# Check logs
docker compose logs

# Check specific service
docker compose logs odoo

Database Connection Error

# Verify database is running
docker compose exec db pg_isready -U odoo

# Check database exists
docker compose exec db psql -U odoo -l

Port Already in Use

# Find process using port
sudo lsof -i :8016

# Change port in .env
ODOO_PORT=8017

Permission Denied

# Fix config permissions
chmod 644 configs/odoo.conf

Python Dependency Version Conflicts

If you modify odoo/requirements.txt and see errors like:

AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'

or:

ModuleNotFoundError: No module named 'cryptography.hazmat.backends.openssl.x509'

Cause: Incompatible versions of cryptography and pyOpenSSL with Odoo 15's bundled urllib3.

Solution: Pin compatible versions in odoo/requirements.txt:

cryptography>=3.4,<40.0.0
pyOpenSSL>=21.0.0,<23.0.0

Then rebuild:

docker compose build --no-cache odoo
docker compose up -d odoo

Version Compatibility

Odoo 15 Docker image has old system packages. Newer versions of cryptography (42+) remove APIs that Odoo depends on. Always test after modifying Python dependencies.

Module Missing Python Dependency

If installing a module fails with:

Unable to install module "restapi" because an external dependency is not met: Python library not installed: oauthlib

Solution: Add the package to odoo/requirements.txt and rebuild:

# Edit requirements
nano odoo/requirements.txt

# Rebuild image
docker compose build odoo
docker compose up -d odoo

Next Steps