Optimización y Despliegue en Producción de Odoo
El despliegue de Odoo en entornos empresariales de alta concurrencia requiere optimizar las consultas del ORM, indexar adecuadamente PostgreSQL y configurar un servidor multiproceso con proxy inverso Nginx.
1. Técnicas de Optimización del ORM #
- Indexación de Campos Clave:
- Utiliza
index=Trueen campos utilizados frecuentemente en filtros de búsqueda o relacionesMany2one.
1reference = fields.Char(string='Referencia Única', index=True, required=True) - Utiliza
- Consultas en una Sola Operación con
search_read:- Evita realizar
search()seguido de iteraciones que disparen consultas individuales a la base de datos (problema N+1 queries).
- Evita realizar
- Persistencia de Campos Calculados (
store=True):- Si un campo calculado se consulta con frecuencia en vistas de lista o filtros, añade
store=Truey asegúrate de que@api.dependssolo vigile los campos estrictamente necesarios.
- Si un campo calculado se consulta con frecuencia en vistas de lista o filtros, añade
- Operaciones en Lote (Bulk Operations):
- Escribe sobre el recordset completo en una sola sentencia SQL:
1# Correcto: 1 sola consulta UPDATE 2self.env['library.book'].search([('state', '=', 'draft')]).write({'state': 'available'})
2. Configuración Multiproceso (odoo.conf) #
En entornos de producción, Odoo debe ejecutarse en modo multiprocessing configurando workers:
1[options] 2admin_passwd = $pbkdf2-sha512$super_secret_admin_hash 3db_host = db 4db_port = 5432 5db_user = odoo 6db_password = odoo_password 7addons_path = /mnt/extra-addons,/usr/lib/python3/dist-packages/odoo/addons 8 9; Configuración de Workers: (CPU * 2) + 1 10workers = 5 11max_cron_threads = 2 12 13; Límites de memoria para evitar fugas (Memory Leaks) 14limit_memory_soft = 2147483648 ; 2 GB 15limit_memory_hard = 2684354560 ; 2.5 GB 16limit_time_cpu = 60 17limit_time_real = 120
3. Proxy Inverso Nginx con SSL y Longpolling #
Nginx actúa como frontal para gestionar certificados HTTPS, comprimir tráfico con Gzip y enrutar las peticiones web y WebSocket/Longpolling:
1upstream odoo { 2 server 127.0.0.1:8069; 3} 4upstream odoochat { 5 server 127.0.0.1:8072; 6} 7 8server { 9 listen 80; 10 server_name erp.miempresa.com; 11 return 301 https://$host$request_uri; 12} 13 14server { 15 listen 443 ssl http2; 16 server_name erp.miempresa.com; 17 18 ssl_certificate /etc/letsencrypt/live/erp.miempresa.com/fullchain.pem; 19 ssl_certificate_key /etc/letsencrypt/live/erp.miempresa.com/privkey.pem; 20 21 client_max_body_size 100M; 22 23 location / { 24 proxy_pass http://odoo; 25 proxy_set_header Host $host; 26 proxy_set_header X-Real-IP $remote_addr; 27 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 28 proxy_set_header X-Forwarded-Proto $scheme; 29 } 30 31 location /websocket { 32 proxy_pass http://odoochat; 33 proxy_set_header Upgrade $http_upgrade; 34 proxy_set_header Connection "upgrade"; 35 proxy_set_header Host $host; 36 } 37}
Resumen del tema
Conceptos clave #
- Técnicas de Optimización del ORM:
- Indexación selectiva con
index=Trueen campos de búsqueda recurrente. - Persistencia de campos computados con
store=Truey precisión estricta en@api.depends. - Operaciones masivas (bulk writes) sobre recordsets y consultas agrupadas.
- Indexación selectiva con
- Estrategias de Migración (OpenUpgrade): scripts de actualización mediante
post_init_hooky validación en bases de datos clonadas de staging. - Arquitectura de Despliegue en Producción:
- Servidor Odoo multiproceso (
workers = (CPU * 2) + 1, límites de memorialimit_memory_hard/soft). - Reverse Proxy con Nginx para terminación SSL (HTTPS) y websocket de mensajería en vivo.
- Tuning de PostgreSQL (
shared_buffers,work_mem) y copias de seguridad automáticas programadas.
- Servidor Odoo multiproceso (
Qué debes recordar #
Optimiza el rendimiento con índices y operaciones en lote, y despliega Odoo en producción con un proxy inverso Nginx y workers configurados adecuadamente.