DevOps

Docker Deployment

Understand how Nurosentrix deploys Odoo using Docker.

Overview

Nurosentrix uses Docker to deploy Odoo instances, providing consistent environments and easy management. Each instance runs in isolated containers.

Each instance appears in the Instances list with its container health and status indicators.

Container Architecture

A typical Odoo deployment includes these containers:

ContainerPurpose
odooOdoo application server
postgresPostgreSQL database
nginxReverse proxy with SSL

Docker Compose Structure

Nurosentrix generates a docker-compose.yml for each instance:

version: '3.8'

services:
  odoo:
    image: odoo:17.0
    container_name: odoo-production
    depends_on:
      - postgres
    ports:
      - "8069:8069"
      - "8072:8072"
    volumes:
      - odoo-data:/var/lib/odoo
      - ./addons:/mnt/extra-addons
      - ./config:/etc/odoo
    environment:
      - HOST=postgres
      - PORT=5432
      - USER=odoo
      - PASSWORD=${DB_PASSWORD}
    restart: unless-stopped

  postgres:
    image: postgres:15-alpine
    container_name: postgres-production
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=odoo
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    container_name: nginx-production
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./ssl:/etc/ssl/certs
    depends_on:
      - odoo
    restart: unless-stopped

volumes:
  odoo-data:
  postgres-data:

Odoo Configuration

The odoo.conf file is generated with these settings:

[options]
; Database
db_host = postgres
db_port = 5432
db_user = odoo
db_password = <generated>
db_name = odoo

; Paths
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
data_dir = /var/lib/odoo

; Performance
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_time_cpu = 600
limit_time_real = 1200

; Security
admin_passwd = <generated>
list_db = False
proxy_mode = True

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

Resource Limits

Configure container resource limits:

services:
  odoo:
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 4G
        reservations:
          cpus: '0.5'
          memory: 1G

Recommended Resources

WorkloadCPUMemory
Development1 core2 GB
Small Production2 cores4 GB
Medium Production4 cores8 GB
Large Production8+ cores16+ GB

Volume Management

Data Volumes

VolumePurposeLocation
odoo-dataFilestore and sessions/var/lib/odoo
postgres-dataDatabase files/var/lib/postgresql/data
addonsCustom modules/mnt/extra-addons

Backup Volumes

# Backup database
docker exec postgres pg_dump -U odoo odoo > backup.sql

# Backup filestore
docker cp odoo:/var/lib/odoo/filestore ./filestore-backup

Networking

Containers communicate through a Docker network:

networks:
  odoo-network:
    driver: bridge

services:
  odoo:
    networks:
      - odoo-network
  postgres:
    networks:
      - odoo-network

SSL Configuration

Nurosentrix automatically configures SSL using Let's Encrypt:

# nginx/conf.d/odoo.conf
upstream odoo {
    server odoo:8069;
}

upstream odoo-chat {
    server odoo:8072;
}

server {
    listen 80;
    server_name odoo.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name odoo.example.com;

    ssl_certificate /etc/ssl/certs/fullchain.pem;
    ssl_certificate_key /etc/ssl/certs/privkey.pem;

    location / {
        proxy_pass http://odoo;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /longpolling {
        proxy_pass http://odoo-chat;
    }
}

Container Management

Common Commands

# View running containers
docker compose ps

# View logs
docker compose logs -f odoo

# Restart a service
docker compose restart odoo

# Stop all services
docker compose down

# Start all services
docker compose up -d

# Update images
docker compose pull
docker compose up -d

Accessing Container Shell

# Access Odoo container
docker exec -it odoo-production bash

# Access PostgreSQL
docker exec -it postgres-production psql -U odoo

Updating Odoo

  1. Create a backup
  2. Update the image version in docker-compose.yml
  3. Pull the new image
  4. Restart containers
  5. Run database upgrades if needed
# Update process
docker compose down
docker compose pull
docker compose up -d

# Update Odoo database
docker exec odoo-production odoo -u all -d odoo --stop-after-init

Troubleshooting

Container Won't Start

# Check container logs
docker compose logs odoo

# Check container status
docker compose ps

# Inspect container
docker inspect odoo-production

Database Connection Issues

  • Verify PostgreSQL container is running
  • Check database credentials in environment
  • Ensure containers are on the same network

Performance Issues

  • Increase container memory limits
  • Add more Odoo workers
  • Check disk I/O on the host
  • Review PostgreSQL slow queries