Docker para Odoo: Despliegue con Docker Compose
Docker revoluciona la forma de desplegar Odoo al empaquetar la aplicación y sus dependencias en contenedores portables. Docker Compose orquesta múltiples servicios (Odoo, PostgreSQL, Redis) con un solo archivo de configuración. Este artículo cubre cómo crear un despliegue completo de Odoo 18 con Docker Compose, incluyendo volumes persistentes, redes, variables de entorno y configuración de producción.
1. Instalación de Docker y Docker Compose
Instala Docker Engine y Docker Compose en tu servidor. En Ubuntu, usa el repositorio oficial de Docker para obtener la última versión estable. Docker Compose viene incluido en Docker Desktop para macOS y Windows, pero en Linux necesitas instalarlo por separado.
# Instalar Docker en Ubuntu
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
# Verificar instalación
docker --version
docker compose version
2. Estructura del Proyecto Docker
Organiza tu proyecto con una estructura clara que separe configuraciones, datos persistentes y código personalizado. La estructura típica incluye docker-compose.yml en la raíz, carpetas para addons personalizados, configuración de Odoo, y un directorio para datos persistentes de PostgreSQL.
odoo-docker/
├── docker-compose.yml
├── .env
├── odoo/
│ └── config/
│ └── odoo.conf
├── addons/
│ └── mi_modulo/
├── db/
└── filestore/
3. Archivo docker-compose.yml Básico
El archivo docker-compose.yml define los servicios, redes y volumes para el despliegue. El servicio principal es Odoo que depende de PostgreSQL. Cada servicio tiene su propia imagen, variables de entorno, volumes para persistencia y puertos expuestos.
version: '3.8'
services:
db:
image: postgres:16
environment:
POSTGRES_DB: postgres
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo_password
volumes:
- odoo-db-data:/var/lib/postgresql/data
ports:
- "5432:5432"
odoo:
image: odoo:18
depends_on:
- db
ports:
- "8069:8069"
- "8072:8072"
volumes:
- odoo-web-data:/var/lib/odoo
- ./odoo/config:/etc/odoo
- ./addons:/mnt/extra-addons
environment:
HOST: db
USER: odoo
PASSWORD: odoo_password
volumes:
odoo-db-data:
odoo-web-data:
4. Configuración de odoo.conf para Docker
Dentro del contenedor, Odoo necesita una configuración que apunte a los servicios correctos usando los nombres de servicios de Docker Compose como hostnames. El archivo de configuración se monta como volume para permitir modificaciones sin reconstruir la imagen.
[options]
addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons
data_dir = /var/lib/odoo
logfile = /var/lib/odoo/odoo.log
db_host = db
db_port = 5432
db_user = odoo
db_password = odoo_password
admin_passwd = admin_master_password
proxy_mode = True
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
5. Volumes y Persistencia de Datos
Los volumes de Docker garantizan que los datos sobrevivan a la destrucción y recreación de contenedores. Usa volumes nombrados para PostgreSQL y el filestore de Odoo. Para desarrollo, monta directorios del host con -v para ver los cambios en tiempo real sin reconstruir la imagen.
6. Redes Docker para Comunicación entre Servicios
Docker Compose crea automáticamente una red para cada proyecto donde los servicios se comunican usando sus nombres como hostnames. Odoo se conecta a PostgreSQL usando el hostname 'db' definido en docker-compose.yml. Configura redes personalizadas si necesitas aislar servicios o conectar múltiples proyectos.
7. Variables de Entorno y Seguridad
Usa un archivo .env para almacenar variables sensibles como contraseñas y claves API. Nunca hardcodes credenciales en docker-compose.yml. Docker Compose sustituye las variables del archivo .env automáticamente. Para producción, considera usar Docker Secrets o un gestor de secretos como HashiCorp Vault.
8. Módulos Personalizados en Docker
Los módulos personalizados se montan como volumes en /mnt/extra-addons. Si necesitas instalar dependencias Python adicionales, crea una imagen personalizada heredando de la imagen oficial de Odoo con un Dockerfile que instale los paquetes necesarios.
FROM odoo:18
USER root
RUN pip3 install --no-cache-dir \
firebase-admin \
stripe \
python-barcode
USER odoo
9. Despliegue con Docker Compose
Ejecuta el despliegue con docker compose up -d para iniciar todos los servicios en modo daemon. Verifica el estado con docker compose ps, los logs con docker compose logs -f, y accede a Odoo en http://localhost:8069.
10. Actualización de Odoo en Docker
Para actualizar Odoo, descarga la nueva imagen, detén el contenedor, ejecuta la migración de la base de datos con odoo-bin -d y la opción --stop-after-init, y reinicia los contenedores. Siempre crea un backup antes de actualizar.
11. Backups en Docker
Los backups en Docker requieren respaldar tanto los volumes nombrados como los datos de configuración. Ejecuta pg_dump desde dentro del contenedor de PostgreSQL, respalda el filestore del contenedor de Odoo, y guarda los archivos de configuración montados como volumes.
# Backup de PostgreSQL desde Docker
docker exec -t odoo-docker-db-1 pg_dump \
-U odoo -Fc odoo > backup_$(date +%Y%m%d).dump
# Backup del filestore
docker cp odoo-docker-odoo-1:/var/lib/odoo/filestore ./backup_filestore
12. Monitoreo de Contenedores
Monitorea el estado de los contenedores con docker stats, los logs con docker logs, y usa herramientas como cAdvisor, Portainer o Prometheus con Grafana para dashboards de monitoreo. Configura reinicio automático con restart: unless-stopped para que los contenedores se recuperen de caídas.
13. SSL y Nginx con Docker
Agrega un contenedor de Nginx como proxy inverso con Certbot para SSL. Mount los certificados como volumes y configura Nginx para redirigir HTTP a HTTPS y proyectar las peticiones al contenedor de Odoo.
14. Multi-Entorno con Docker Compose
Usa perfiles de Docker Compose o archivos docker-compose.override.yml para manejar múltiples entornos (desarrollo, staging, producción). Cada entorno puede tener diferentes parámetros de workers, niveles de log, y configuraciones de base de datos.
Conclusión
Docker Compose simplifica enormemente el despliegue y mantenimiento de Odoo. La portabilidad de los contenedores garantiza que el entorno de desarrollo sea idéntico al de producción. Los volumes persisten los datos, las redes aíslan los servicios, y las imágenes personalizadas encapsulan las dependencias. Invertir en un despliegue Docker bien estructurado ahorra horas de problemas en cada actualización.
15. Optimizacion de Imagenes Docker
Las imagenes Docker de Odoo pueden ser grandes (mas de 1 GB) lo que ralentiza los despliegues y actualizaciones. Para reducir el tamano, usa Multi-stage builds que compilen las dependencias en una imagen intermedia y copien solo los archivos necesarios a la imagen final.
Ordena las capas de Docker de menos a mas frecuente para aprovechar la cache. Las capas que rara vez cambian como la instalacion de dependencias del sistema deben ir primero, y las capas que cambian frecuentemente como el codigo de Odoo al final.
Usa .dockerignore para excluir archivos innecesarios del contexto de construccion como .git, __pycache__, archivos de prueba, y logs. Esto reduce el tamano del contexto y acelera la construccion de la imagen.
Para produccion, usa imagenes minimalistas como Alpine Linux en lugar de Ubuntu o Debian. Las imagenes Alpine son significativamente mas pequenas (5 MB vs 200 MB) y reducen la superficie de ataque.
16. Networking y Seguridad en Docker
Docker crea automaticamente una red para cada proyecto donde los servicios se comunican entre si. Para mayor seguridad, crea redes personalizadas y aísla los servicios que no necesitan comunicarse. Por ejemplo, PostgreSQL no necesita acceso a internet, solo al contenedor de Odoo.
Los puertos solo se exponen cuando es estrictamente necesario. PostgreSQL no debe exponer el puerto 5432 al host. Solo Odoo necesita acceso a PostgreSQL a traves de la red Docker interna.
Para produccion, configura Docker para que no ejecute contenedores como root. Usa --user en los comandos Docker o configura el usuario en el Dockerfile para ejecutar la aplicacion con un usuario no privilegiado.
Implementa politicas de red con Docker Network Policies para restringir el trafico entre contenedores. Esto previene que un contenedor comprometido acceda a otros servicios no relacionados.
17. Estrategia de Actualizacion de Contenedores
Las actualizaciones de contenedores Docker deben ser atomicas: el contenedor antiguo se detiene y el nuevo se inicia en una operacion coordinada. Usa docker compose pull para descargar la nueva imagen, docker compose up -d para recrear los contenedores, y docker compose logs -f para verificar que el nuevo contenedor funciona correctamente.
Para actualizaciones sin tiempo de inactividad (zero-downtime), implementa un despliegue blue-green donde ejecutas el contenedor nuevo en paralelo con el antiguo, verificas que funciona correctamente, y rediriges el trafico al nuevo contenedor. El contenedor antiguo se mantiene como backup durante un periodo de gracia.
Las actualizaciones de base de datos dentro de Docker requieren un plan cuidadoso. Primero ejecuta la migracion en un contenedor temporal, verifica que la base de datos migrada es funcional, y luego actualiza el contenedor de Odoo para usar la nueva base de datos.
Para actualizaciones de Redis dentro de Docker, verifica la compatibilidad de la version antes de actualizar. Redis generalmente es compatible con actualizaciones menores (4.x a 4.y) pero las actualizaciones mayores (4.x a 5.x) pueden requerir un dump y restore de los datos.
18. Disaster Recovery con Docker
El disaster recovery con Docker es mas sencillo que con instalaciones tradicionales ya que todo el sistema esta empaquetado en contenedores. Mantene una copia de docker-compose.yml, los volumes, y los archivos de configuracion en un almacenamiento externo para poder recrear el sistema completo.
Para disaster recovery rapido, crea una imagen Docker personalizada que incluya toda la configuracion de Odoo. Esta imagen se puede desplegar en cualquier servidor con Docker en minutos, reduciendo significativamente el tiempo de recuperacion.
Implementa replicacion automatica de volumes Docker a un almacenamiento externo. Usa rsync o rclone para sincronizar los volumes periodicamente. En caso de desastre, restaura los volumes y ejecuta docker compose up -d para levantar el sistema.
Prueba el disaster recovery al menos una vez al trimestre ejecutando un simulacro completo de restauracion en un servidor de pruebas. Mide el tiempo de recuperacion y verifica que el resultado es funcional. Ajusta el plan segun los resultados del simulacro.
19. Backup y Recuperacion en Docker
Los backups en Docker requieren respaldar tanto los volumes nombrados como los archivos de configuracion montados como bind mounts. Los volumes nombrados se respaldan ejecutando comandos dentro del contenedor o montando el volume en un contenedor temporal de backup.
Para respaldar PostgreSQL en Docker, ejecuta pg_dump dentro del contenedor de la base de datos. El comando es: docker exec -t odoo-db-1 pg_dump -U odoo -Fc odoo_db > backup.dump. Este comando genera un backup en formato custom que se puede restaurar con pg_restore.
El filestore de Odoo se respalda copiando el contenido del volume nombrado. Usa docker cp para copiar el directorio filestore del contenedor de Odoo a una ubicacion temporal, comprimelo con tar, y transfierelo al almacenamiento externo.
Para automatizar los backups, crea un contenedor de backup que se ejecute periodicamente con docker compose. El contenedor ejecuta los comandos de backup y notifica al equipo por email o Slack cuando el backup se completa o falla.
20. Monitoreo de Contenedores con Prometheus
Prometheus es una herramienta de monitoreo open source que recopila metricas de contenedores Docker. Instala Prometheus con docker compose y configuralo para que recopile metricas de los contenedores de Odoo, PostgreSQL, Redis y Nginx.
Grafana es la herramienta de visualizacion recomendada para Prometheus. Crea dashboards que muestren: uso de CPU y memoria por contenedor, numero de conexiones activas, tiempo de respuesta de la aplicacion, y estado de los servicios.
Configura alertas en Prometheus que se activen cuando las metricas superen umbrales criticos. Por ejemplo, una alerta cuando el uso de memoria de un contenedor supere el 80%, o cuando el tiempo de respuesta promedio supere los 3 segundos.
El monitoreo de contenedores con Prometheus y Grafana proporciona una visibilidad completa del estado de tu despliegue Docker. Los dashboards facilitan la identificacion de problemas y las metricas historicas permiten analizar tendencias de rendimiento.
21. Estrategia de Redes en Docker Compose
Docker Compose crea automaticamente una red por defecto para cada proyecto donde todos los servicios se comunican entre si. Para mayor seguridad y organizacion, crea redes personalizadas que aislen los servicios segun su nivel de confianza.
Por ejemplo, crea una red 'frontend' para Nginx y Odoo, una red 'backend' para Odoo y PostgreSQL, y una red 'monitoring' para las herramientas de monitoreo. Cada red solo conecta los servicios que necesitan comunicarse entre si.
Los puertos solo se exponen cuando es estrictamente necesario para el desarrollo local. En produccion, Nginx es el unico servicio que debe exponer puertos al host. PostgreSQL, Redis y Odoo internamente no deben ser accesibles desde fuera de Docker.
Configura DNS personalizado en las redes Docker para que los servicios se resuelvan por nombres descriptivos en lugar de por IDs de contenedor. Esto facilita la configuracion y el mantenimiento de la infraestructura.
22. Integracion con Servicios Cloud
Docker facilita la integracion con servicios cloud como AWS, Google Cloud, o Azure. Usa las imagenes oficiales de cada proveedor para acceder a servicios gestionados como Amazon RDS para PostgreSQL, Amazon ElastiCache para Redis, y Amazon S3 para almacenamiento de archivos.
Los servicios cloud gestionados reducen la carga operativa ya que el proveedor se encarga de las actualizaciones, respaldos, y alta disponibilidad. Sin embargo,增加了 la complejidad de la red ya que los servicios estan en la nube y necesitan configuracion de VPC, subnets, y reglas de seguridad.
Para despliegues en la nube, usa Docker Swarm o Kubernetes para orquestar los contenedores. Docker Swarm es mas simple y adecuado para despliegues pequenos, mientras que Kubernetes ofrece mayor flexibilidad y escalabilidad para entornos de produccion grandes.
Implementa auto-scaling para los workers de Odoo segun la carga de trabajo. Cuando el numero de usuarios concurrentes supere un umbral, se agregan automaticamente nuevos workers. Cuando la carga disminuya, los workers se eliminan para reducir costos.
23. Estrategia de Despliegue Continuo
El despliegue continuo (CD) automatiza el proceso de publicar cambios de codigo en produccion. Implementa un pipeline de CD que ejecute las pruebas automaticamente, construya las imagenes Docker, y despliege los cambios en el servidor de produccion sin intervencion manual.
El pipeline de CD debe incluir multiples etapas: compilacion, pruebas unitarias, pruebas de integracion, construccion de imagen Docker, despliegue en staging, verificacion automatica, y despliegue en produccion. Cada etapa debe ser verificada antes de avanzar a la siguiente.
Para despliegues sin tiempo de inactividad, implementa estrategias como blue-green deployment o canary releases. Blue-green mantiene dos copias del sistema y alterna el trafico entre ellas. Canary despliega los cambios a un porcentaje pequeno de usuarios primero y los expande gradualmente si no hay problemas.
Despues de cada despliegue, monitorea las metricas de la aplicacion durante al menos 30 minutos para detectar regresiones. Si se detecta un problema, ejecuta automaticamente un rollback a la version anterior. La automatizacion del rollback reduce el tiempo de recuperacion de horas a minutos.
24. Estrategia de Respaldo en Docker
Los respaldos en Docker requieren una estrategia diferente a las instalaciones tradicionales ya que los datos se almacenan en volumes nombrados en lugar de directorios del host. Para respaldar PostgreSQL, ejecuta pg_dump desde dentro del contenedor de la base de datos usando docker exec. Para respaldar el filestore de Odoo, monta el volume en un contenedor temporal de backup.
Implementa un contenedor de backup dedicado que se ejecute periodicamente con un cron job del sistema operativo o con un timer de systemd. El contenedor debe incluir las herramientas necesarias como pg_dump, tar, gzip, y un cliente de almacenamiento como rclone o aws cli para transferir los backups a almacenamiento externo.
Los backups en Docker deben incluir: el archivo docker-compose.yml con la configuracion de servicios, los archivos de configuracion montados como bind mounts, los volumes nombrados con los datos de PostgreSQL y el filestore, y los certificados SSL. Documenta el proceso de restauracion paso a paso para que cualquier persona del equipo pueda ejecutarlo.
Prueba la restauracion de backups en un entorno de pruebas al menos una vez al mes. Ejecuta el backup, restaura en un servidor limpio, verifica que Odoo funciona correctamente, y mide el tiempo de restauracion. Si el tiempo de restauracion excede el RPO (Recovery Point Objective), optimiza el proceso o ajusta la frecuencia de backups.