Configuración de Servidores para Odoo en Producción

Desplegar Odoo en producción exige más que instalar unos paquetes. Un servidor mal configurado puede convertirse en un cuello de botella que afecta a toda la organización. En este artículo analizamos paso a paso cómo preparar un entorno Linux robusto, optimizar PostgreSQL, configurar Nginx como proxy inverso, habilitar SSL/TLS y aplicar medidas de seguridad básicas.

1. Requisitos del Sistema y Selección del Hardware

Antes de tocar cualquier configuración, define los requisitos mínimos. Odoo 18 necesita al menos 2 GB de RAM para pruebas, pero en producción se recomienda 8 GB o más dependiendo del número de usuarios concurrentes. El disco debe ser SSD con al menos 50 GB libres. El procesador ideal es multi-core (4+ cores) para soportar los workers de Odoo y PostgreSQL simultáneamente.

El sistema operativo recomendado es Ubuntu 22.04 LTS o Debian 12. Ambos ofrecen soporte a largo plazo y paquetes actualizados. Verifica la versión con:

lsb_release -a
cat /etc/os-release

Actualiza el sistema antes de comenzar:

sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common curl wget git

2. Creación de Usuario y Grupo para Odoo

Nunca ejecutes Odoo como root. Crea un usuario dedicado con un grupo específico:

sudo addgroup --system odoo
sudo adduser --system --ingroup odoo --home /opt/odoo --shell /bin/bash odoo

Establece permisos sobre el directorio de datos y logs:

sudo mkdir -p /opt/odoo/{server,addons,config,data,logs}
sudo chown -R odoo:odoo /opt/odoo
sudo chmod 750 /opt/odoo/data

3. Instalación de Dependencias del Sistema

Odoo depende de múltiples librerías del sistema. Instálalas todas en un solo comando:

sudo apt install -y python3-dev python3-pip python3-venv \
  build-essential libpq-dev libldap2-dev libsasl2-dev \
  libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev \
  libwebp-dev libharfbuzz-dev libfribidi-dev \
  wkhtmltopdf node-less nodejs npm

Si wkhtmltopdf no funciona correctamente (problema común), descarga la versión precompilada desde GitHub releases y reinstala el paquete. Verifica la instalación con wkhtmltopdf --version.

4. Instalación y Configuración de PostgreSQL

La versión mínima recomendada para Odoo 18 es PostgreSQL 14. Instala PostgreSQL 16:

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt \
  "$(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install -y postgresql-16 postgresql-client-16

Los parámetros críticos para Odoo en postgresql.conf (servidor con 16 GB RAM):

# Memoria
shared_buffers = 4GB            # 25-40% de RAM
effective_cache_size = 12GB     # 75% de RAM
work_mem = 64MB                 # Memoria por operación sort/hash
maintenance_work_mem = 512MB    # Memoria para VACUUM, CREATE INDEX

# Escritura
wal_buffers = 64MB
checkpoint_completion_target = 0.9
max_wal_size = 2GB
min_wal_size = 1GB

# Consultas (SSD)
random_page_cost = 1.1
effective_io_concurrency = 200

# Conexiones
max_connections = 200

5. Creación de Usuario y Base de Datos en PostgreSQL

Crea un usuario dedicado para Odoo y habilita las extensiones necesarias:

sudo -u postgres createuser --createdb --no-createrole \
  --no-superuser --login odoo_user
sudo -u postgres psql -c \
  "ALTER USER odoo_user WITH PASSWORD 'tu_password_segura';"
sudo -u postgres psql -c "ALTER USER odoo_user CREATEDB;"
sudo -u postgres psql -d template1 -c \
  "CREATE EXTENSION IF NOT EXISTS unaccent;"
sudo -u postgres psql -d template1 -c \
  "ALTER SYSTEM SET shared_preload_libraries = 'pg_trgm';"
sudo systemctl restart postgresql

Configura pg_hba.conf para autenticación por contraseña:

host    all    odoo_user    127.0.0.1/32    md5
host    all    odoo_user    ::1/128         md5

6. Instalación de Odoo 18 desde Código Fuente

Clona el repositorio oficial en una rama específica y prepara el entorno virtual:

sudo -u odoo git clone https://github.com/odoo/odoo.git \
  /opt/odoo/server -b 18.0 --depth 1
cd /opt/odoo/server
sudo -u odoo python3 -m venv /opt/odoo/venv
source /opt/odoo/venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
sudo -u odoo npm install -g less less-plugin-clean-css

7. Configuración del Archivo odoo.conf

Crea el archivo de configuración principal con parámetros optimizados para producción:

[options]
addons_path = /opt/odoo/server/odoo/addons,/opt/odoo/addons
data_dir = /opt/odoo/data
logfile = /opt/odoo/logs/odoo.log
log_level = warn
db_host = 127.0.0.1
db_port = 5432
db_user = odoo_user
db_password = tu_password_segura
db_name = False
list_db = False
admin_passwd = tu_master_password_seguro
proxy_mode = True
workers = 6
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 120
limit_time_real = 300
limit_time_real_cron = 300
email_from = [email protected]

Los parámetros workers y max_cron_threads dependen de tu hardware. La fórmula general es: workers = (RAM disponible - PostgreSQL - sistema) / 256MB.

8. Configuración de Nginx como Proxy Inverso

Nginx actúa como intermediario entre el cliente y Odoo, manejando SSL, compresión y balanceo de carga:

sudo apt install -y nginx
sudo rm /etc/nginx/sites-enabled/default

Crea el archivo de configuración del sitio con upstream, compresión gzip y proxy headers:

upstream odoo {
    server 127.0.0.1:8069;
    keepalive 32;
}

upstream odoo-chat {
    server 127.0.0.1:8072;
    keepalive 32;
}

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

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

    ssl_certificate /etc/letsencrypt/live/odoo.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/odoo.tudominio.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    proxy_read_timeout 720s;
    proxy_connect_timeout 720s;
    proxy_send_timeout 720s;

    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;

    gzip on;
    gzip_types text/css text/plain text/xml application/xml
               application/javascript application/json image/svg+xml;
    gzip_min_length 1000;
    client_max_body_size 200m;

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

    location / {
        proxy_pass http://odoo;
    }
}

9. Configuración de SSL con Let's Encrypt

Certbot obtiene y renueva automáticamente los certificados SSL:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d odoo.tudominio.com
sudo crontab -e
# Agregar línea para renovación automática:
0 3 * * 1 certbot renew --quiet --post-hook "systemctl reload nginx"

10. Servicio Systemd para Odoo

Crea un servicio systemd para controlar Odoo con reinicio automático:

[Unit]
Description=Odoo 18
Requires=postgresql.service
After=network.target postgresql.service

[Service]
Type=simple
SyslogIdentifier=odoo
User=odoo
Group=odoo
ExecStart=/opt/odoo/venv/bin/python3 /opt/odoo/server/odoo-bin \
  -c /opt/odoo/config/odoo.conf
StandardOutput=journal+console
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable odoo
sudo systemctl start odoo

11. Configuración de Firewall (UFW)

Limita el acceso a los puertos necesarios. Nunca expongas el puerto 8069 directamente al exterior:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

12. Configuración de Swap

Un archivo de swap actúa como safety net ante picos de memoria. El valor swappiness=10 indica al kernel que use el swap solo como último recurso:

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo sysctl vm.swappiness=10

13. Monitoreo y Logs con Logrotate

Configura logrotate para evitar que los logs llenen el disco:

/opt/odoo/logs/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 odoo odoo
    sharedscripts
    postrotate
        systemctl reload odoo > /dev/null 2>&1 || true
    endscript
}

Monitorea el rendimiento en tiempo real con htop o glances:

sudo apt install -y htop glances
htop -u odoo

14. Optimizaciones Avanzadas del Kernel

Ajusta parámetros del kernel para mejorar el rendimiento del servidor:

sudo tee /etc/sysctl.d/99-odoo.conf <<'SYSCTL'
# Buffers de red
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# Conexiones
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# Memoria virtual
vm.overcommit_memory = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
SYSCTL
sudo sysctl --system

15. Checklist de Verificación Post-Instalación

Después de configurar todo, verifica que cada componente funcione correctamente. Comienza verificando que PostgreSQL acepta conexiones con el usuario odoo_user y la contraseña configurada. Luego confirma que Odoo inicia sin errores revisando el archivo de logs en /opt/odoo/logs/odoo.log. Nginx debe pasar las peticiones al puerto 8069 de Odoo sin errores 502 o 504. Prueba la conexión SSL con un navegador y verifica que el certificado sea válido. Finalmente, ejecuta una copia de prueba de un pedido para confirmar que la base de datos, el filestore y el sistema de emails funcionan correctamente en conjunto. Guarda este checklist y revísalo cada vez que realices cambios en la configuración del servidor.

Conclusión

Una configuración de servidor adecuada es la base de un Odoo estable y rápido. Desde la selección del hardware hasta las optimizaciones del kernel, cada paso contribuye a un rendimiento óptimo. La configuración no es estática: revisa periódicamente los parámetros de PostgreSQL, los logs de Nginx y las métricas del sistema para identificar posibles cuellos de botella antes de que afecten a los usuarios.

16. Monitoreo de Servicios con Systemd

Systemd ofrece herramientas poderosas para monitorear y gestionar servicios. Usa systemctl status para ver el estado actual de Odoo, incluyendo si esta ejecutandose, el PID del proceso, y los ultimos logs. El comando journalctl -u odoo -f muestra los logs en tiempo real, y journalctl -u odoo --since "1 hour ago" filtra por un rango de tiempo especifico.

Para detectar problemas de rendimiento, configura systemd para que genere metricas de CPU y memoria con systemd-analyze. El comando systemd-analyze blame muestra el tiempo que tardo cada servicio en iniciar, lo que te ayuda a identificar cuellos de botella en el arranque del sistema.

Configura alertas automaticas usando systemd path units que monitoreen cambios en archivos de configuracion o logs. Cuando se detecta un cambio, systemd ejecuta automaticamente el servicio o script asociado para responder al evento.

Los timers de systemd son una alternativa moderna a cron para ejecutar tareas periodicas. Son mas flexibles que cron ya que soportan calendars, monotonic timers, y persistencia entre reinicios. Usa timers para las tareas de mantenimiento y monitoreo de Odoo.

17. Seguridad del Servidor

La seguridad del servidor es fundamental para proteger los datos de tu empresa. Ademas del firewall UFW, implementa estas measures de seguridad: desactiva el login por SSH con password y usa solo claves publicas, cambia el puerto SSH por defecto (22) a uno no estandar para reducir ataques de fuerza bruta, y configura SELinux o AppArmor para confinar los procesos de Odoo.

Instala fail2ban para bloquear automaticamente direcciones IP que intenten fuerza bruta contra SSH o el login de Odoo. Configura los jails para SSH y Nginx, y establece un tiempo de bloqueo de al menos una hora para los atacantes persistentes.

Mantene el sistema actualizado con apt upgrade regularmente. Las actualizaciones de seguridad son criticas y deben aplicarse lo antes posible. Configura actualizaciones automaticas para paquetes de seguridad con unattended-upgrades.

Revisa los permisos de archivos periodicamente con herramientas como Lynis que realizan auditorias de seguridad automaticas y generan reportes con recomendaciones de mejora. Los problemas mas comunes incluyen permisos excesivos en archivos de configuracion y directorios world-writable.

18. Backup del Servidor Completo

Ademas de respaldar la base de datos y el filestore de Odoo, respalda la configuracion completa del servidor. Esto incluye los archivos de Nginx, PostgreSQL, Odoo, los certificados SSL, los scripts de cron, y los archivos de configuracion del sistema operativo.

Usa herramientas como rsync para sincronizar archivos con un servidor remoto de forma incremental. Rsync solo transfiere los archivos que cambiaron, lo que reduce significativamente el tiempo y ancho de banda necesario para los respaldos.

Para entornos de alta disponibilidad, configura replicacion de PostgreSQL con streaming replication que mantiene una copia en tiempo real de la base de datos en un servidor secundario. Si el servidor principal falla, el servidor secundario puede tomar el control con minimal perdida de datos.

Documenta el proceso de backup y restauracion paso a paso, y realizal regularmente para verificar que funciona correctamente. Un backup que no se puede restaurar no tiene valor. Prueba la restauracion en un entorno de al menos una vez al mes.

19. Estrategias de Alto Disponibilidad

Para empresas que requieren disponibilidad 24/7, implementa una arquitectura de alta disponibilidad con multiples nodos. Usa un balanceador de carga como HAProxy o Keepalived para distribuir el trafico entre dos o mas servidores Odoo. Cada servidor ejecuta sus propios workers y comparte la misma base de datos PostgreSQL con replicacion streaming.

La replicacion streaming de PostgreSQL mantiene un servidor primario que procesa las escrituras y uno o mas servidores secundarios que replican los datos en tiempo real. Si el servidor primario falla, un servidor secundario puede tomar el control automaticamente con minimal perdida de datos usando herramientas como Patroni o repmgr.

El filestore de archivos adjuntos debe estar en un almacenamiento compartido accesible desde todos los servidores. NFS es la solucion mas simple pero puede tener problemas de rendimiento. Ceph o S3-compatible storage (MinIO) ofrecen mejor rendimiento y escalabilidad para entornos de alta disponibilidad.

Implementa health checks automatizados que verifiquen la disponibilidad de cada componente del sistema. Si un health check falla, el balanceador de carga deja de enviar trafico al servidor afectado y notifica al equipo de operaciones para que investigue y resuelva el problema.

20. Mantenimiento Preventivo del Servidor

El mantenimiento preventivo evita problemas antes de que ocurran. Establece un calendario de mantenimiento que incluya revision semanal de logs, actualizaciones de seguridad mensuales, optimizacion de base de datos trimestral, y revision completa del sistema semestral.

Cada revision semanal debe incluir: verificacion del estado de los servicios (Odoo, PostgreSQL, Nginx), revision de logs en busca de errores o warnings, verificacion del espacio en disco y memoria, y revision de las metricas de rendimiento para detectar tendencias de degradacion.

Las actualizaciones de seguridad mensuales incluyen: actualizacion de paquetes del sistema operativo, actualizacion de Odoo si hay parches de seguridad, renovacion de certificados SSL si es necesario, y revision de las configuraciones de firewall y permisos.

La optimizacion trimestral de la base de datos incluye: ANALYZE de todas las tablas para actualizar estadisticas, VACUUM FULL de tablas con muchos dead tuples, revision y recreacion de indices fragmentados, y optimizacion de los parametros de PostgreSQL segun las metricas de rendimiento actuales.

21. Configuracion de Correo Electronico

Odoo necesita un servidor SMTP configurado para enviar emails de notificacion, confirmaciones de pedido, y alertas de stock. Configura el servidor de correo en Ajustes, Configuracion, Correo, Servidores de correo salientes. Usa un servidor SMTP dedicado como Postfix, Exim o un servicio cloud como Amazon SES o SendGrid.

Para evitar que los emails de Odoo terminen en la carpeta de spam, configura los registros DNS de tu dominio: SPF para autorizar el servidor de correo, DKIM para firmar digitalmente los emails, y DMARC para definir la politica de manejo de emails no autenticados. Estos registros son criticos para la reputacion de envio de tu dominio.

Configura la cola de envio de emails en Odoo para procesar los mensajes de forma asincrona. La cola permite reintentar automaticamente los emails que fallan por timeout o errores temporales de red. Monitorea la cola de emails en Configuracion, Tecnico, Cola de Emails para detectar mensajes atascados.

Para empresas que reciben muchos emails, configura el servidor de correo entrante (IMAP o POP3) de Odoo para sincronizar automaticamente los emails recibidos con los registros de CRM o soporte. Esto permite que los vendedores y agentes de soporte vean la comunicacion completa con cada cliente directamente desde Odoo.

22. Configuracion de Impresoras y Reportes

Odoo genera reportes PDF usando wkhtmltopdf. La calidad de los reportes depende de la correcta configuracion de wkhtmltopdf y de las plantillas QWeb. Verifica que wkhtmltopdf puede generar PDFs con cabeceras y pies de pagina personalizados, que las imagenes se renderizan correctamente, y que las tablas se ajustan al ancho de la pagina.

Para reportes personalizados, crea plantillas QWeb en XML con estilos CSS inline. Usa las clases de impresion de Odoo para controlar el formato de impresion: @page para configurar margenes y orientacion, @media print para estilos especificos de impresion, y page-break-before para forzar saltos de pagina.

Las impresoras de红etiquetas y tickets requieren configuracion adicional. Odoo soporta impresoras de红etiquetas Zebra, SAT, y otras marcas populares. Configura la impresora en Ajustes, Dispositivos, y asociala a las vistas de lista o formulario que necesiten imprimir etiquetas.

Para impresoras de红etiquetas térmicas, usa la extension pos_printer o modulos de la comunidad que permiten enviar comandos de impresion directamente desde el navegador al equipo de impresion local. Esto evita la necesidad de un servidor de impresion dedicado.