Implementación de Docker Odoo: configuración de contenedores listos para producción

Implemente Odoo en contenedores Docker para producción. Guía completa que cubre la configuración de Docker Compose, la configuración de PostgreSQL, el proxy inverso de Nginx, SSL, las copias de seguridad y el escalado.

E

ECOSIRE Research and Development Team

Equipo ECOSIRE

5 de marzo de 20265 min de lectura1.0k Palabras

Implementación de Docker Odoo: configuración de contenedores listos para producción

Docker se ha convertido en el método de implementación estándar para Odoo en entornos de producción, con más de 10 millones de imágenes de Odoo Docker en Docker Hub. La implementación en contenedores proporciona entornos reproducibles, fácil escalamiento, copias de seguridad simplificadas y separación limpia entre instancias de Odoo. Esta guía cubre una configuración completa de Docker Odoo lista para producción.

Conclusiones clave

  • Docker Compose organiza Odoo, PostgreSQL y Nginx como servicios conectados
  • Los volúmenes persistentes garantizan que los datos sobrevivan a los reinicios y actualizaciones de los contenedores.
  • El proxy inverso de Nginx maneja la terminación SSL, el almacenamiento en caché de archivos estáticos y el equilibrio de carga
  • Las copias de seguridad automatizadas protegen contra la pérdida de datos con una mínima intervención manual

Descripción general de la arquitectura

Una implementación de producción de Odoo Docker consta de tres servicios principales:

  1. Servidor de aplicaciones Odoo: el contenedor Odoo que ejecuta el servidor web y la lógica de la aplicación.
  2. Base de datos PostgreSQL: un contenedor de base de datos dedicado que almacena todos los datos de Odoo
  3. Proxy inverso de Nginx: maneja SSL, sirve archivos estáticos y envía solicitudes a Odoo.

Los servicios opcionales incluyen Redis (para almacenamiento en caché y sesiones), un contenedor de respaldo (volcados de bases de datos automatizados) y monitoreo (Prometheus + Grafana).


Configuración de composición de Docker

La base de la implementación es un archivo docker-compose.yml que define todos los servicios:

version: "3.8"

services:
  odoo:
    image: odoo:17.0
    depends_on:
      - db
    ports:
      - "8069:8069"
      - "8072:8072"
    volumes:
      - odoo-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
    environment:
      - HOST=db
      - PORT=5432
      - USER=odoo
      - PASSWORD=odoo_db_password
    restart: unless-stopped

  db:
    image: postgres:16
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=odoo_db_password
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - postgres-data:/var/lib/postgresql/data/pgdata
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - odoo
    restart: unless-stopped

volumes:
  odoo-data:
  postgres-data:

Archivo de configuración de Odoo

Cree config/odoo.conf con configuraciones optimizadas para producción:

[options]
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
admin_passwd = your_strong_admin_password
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_db_password
db_name = production_db
dbfilter = ^production_db$
list_db = False
proxy_mode = True
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_time_cpu = 600
limit_time_real = 1200
log_level = warn

Configuraciones clave explicadas:

  • proxy_mode = True: Required when running behind Nginx to correctly handle forwarded headers
  • workers = 4: Número de procesos de trabajo (regla general: 2 trabajadores por núcleo de CPU)
  • max_cron_threads = 2: Hilos dedicados para acciones programadas
  • list_db = False: Impide que la base de datos aparezca en la página de inicio de sesión (seguridad)
  • dbfilter: Restringe el acceso a una única base de datos

Configuración del proxy inverso de Nginx

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

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$host$request_uri;
}

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

    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.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 "upgrade";
    }

    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;
    }

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

Estrategia de respaldo

Copias de seguridad de bases de datos automatizadas

Cree un script de respaldo que se ejecute diariamente mediante cron:

#!/bin/bash
BACKUP_DIR=/backups/odoo
DATE=$(date +%Y%m%d_%H%M%S)
docker exec odoo-db pg_dump -U odoo production_db | gzip > $BACKUP_DIR/odoo_$DATE.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete

Copia de seguridad del almacén de archivos

El almacén de archivos de Odoo (documentos cargados, archivos adjuntos) se encuentra en el volumen odoo-data. Haga una copia de seguridad junto con la base de datos:

docker run --rm -v odoo-data:/data -v /backups:/backup alpine \
  tar czf /backup/odoo-filestore_$DATE.tar.gz /data

Refuerzo de la seguridad

  • Cambie el admin_passwd predeterminado en odoo.conf a una contraseña aleatoria segura
  • Configure list_db = False para evitar la enumeración de la base de datos.
  • Utilice dbfilter para restringir el acceso a la base de datos a una sola base de datos.
  • Ejecutar contenedores como usuarios no root siempre que sea posible.
  • Mantenga las imágenes de Docker actualizadas con parches de seguridad
  • Utilice secretos de Docker o archivos de variables de entorno (no contraseñas en línea)
  • Restringir el acceso a la red de contenedores mediante redes Docker

Preguntas frecuentes

P: ¿Cuántos usuarios simultáneos puede manejar un solo contenedor de Odoo?

Con 4 trabajadores, un contenedor Odoo maneja cómodamente entre 20 y 30 usuarios simultáneos. Para una mayor concurrencia, aumente los trabajadores (limitados por CPU/RAM) o implemente múltiples contenedores Odoo detrás de un balanceador de carga.

P: ¿Cómo actualizo Odoo en Docker?

Extraiga la nueva imagen, detenga el contenedor actual, ejecute la nueva imagen con los volúmenes existentes. Los volúmenes persistentes retienen sus datos y su almacén de archivos a través de actualizaciones de imágenes.

P: ¿Debo usar la imagen oficial de Odoo Docker o crear la mía propia?

La imagen oficial funciona para implementaciones estándar. Cree una imagen personalizada cuando necesite paquetes de Python específicos, dependencias del sistema para módulos personalizados o módulos comunitarios preinstalados.

P: ¿Cómo manejo Odoo Enterprise en Docker?

Odoo Enterprise no está disponible como imagen pública de Docker. Monte el directorio de complementos empresariales como un volumen y haga referencia a él en la configuración addons_path. Necesita una suscripción válida de Odoo Enterprise.


¿Qué sigue?

La implementación de Docker le brinda un entorno de producción de Odoo reproducible, escalable y mantenible. Comience con esta configuración y ajuste el número de trabajadores, los límites de memoria y el almacenamiento en caché según sus patrones de uso.

Comuníquese con ECOSIRE para obtener ayuda con la implementación de Odoo, o explore nuestros servicios de soporte de Odoo para alojamiento administrado.


Publicado por ECOSIRE: ayuda a las empresas a escalar con soluciones de software empresarial.

E

Escrito por

ECOSIRE Research and Development Team

Construyendo productos digitales de nivel empresarial en ECOSIRE. Compartiendo perspectivas sobre integraciones Odoo, automatización de eCommerce y soluciones empresariales impulsadas por IA.

Chatea en whatsapp