Contenedores

Información general

Cada compilación está aislada dentro de su propio contenedor (un contenedor de espacio de nombres de Linux).

La base es un sistema Ubuntu en donde se instalan todas las dependencias necesarias de Odoo y sus paquetes comunes útiles.

Si tu proyecto necesita otras dependencias de Python o lanzamientos más recientes, puedes definir un archivo requirements.txt en tu rama principal que enumere dichas dependencias. La plataforma se encargará de instalarlas en sus contenedores de manera automática. La documentación sobre los especificadores de requisitos de pip puede ayudarte a elaborar tu archivo requirements.txt. Consulta el archivo requirements.txt de Odoo para visualizar un ejemplo concreto.

Los archivos requirements.txt de los submódulos también se toman en cuenta. La plataforma busca los archivos requirements.txt en todas las carpetas que contienen módulos de Odoo, no dentro de la carpeta del módulo, sino en su carpeta principal.

Estructura del directorio

Los contenedores están basados en Ubuntu, así que la estructura de su directorio sigue el estándar de jerarquía del sistema de archivos de Linux. En la información general del árbol del sistema de archivos de Ubuntu encontrarás una explicación sobre los directorios principales.

Estos son los respectivos directorios de Odoo.sh:

.
├── home
│    └── odoo
│         ├── src
│         │    ├── odoo                Odoo Community source code
│         │    │    └── odoo-bin       Odoo server executable
│         │    ├── enterprise          Odoo Enterprise source code
│         │    ├── themes              Odoo Themes source code
│         │    └── user                Your repository branch source code
│         ├── data
│         │    ├── filestore           database attachments, as well as the files of binary fields
│         │    └── sessions            visitors and users sessions
│         └── logs
│              ├── install.log         Database installation logs
│              ├── odoo.log            Running server logs
│              ├── update.log          Database updates logs
│              └── pip.log             Python packages installation logs
└── usr
     ├── lib
     │    ├── python2.7
     │         └── dist-packages       Python 2.7 standard libraries
     │    ├── python3
     │         └── dist-packages       Python 3 standard libraries
     │    └── python3.5
     │         └── dist-packages       Python 3.5 standard libraries
     ├── local
     │    └── lib
     │         ├── python2.7
     │         │    └── dist-packages  Python 2.7 third-party libraries
     │         └── python3.5
     │              └── dist-packages  Python 3.5 third-party libraries
     └── usr
          └── bin
               ├── python2.7           Python 2.7 executable
               └── python3.5           Python 3.5 executable

Python 2.7 y 3.5 se instala en los contenedores, pero toma en cuenta lo siguiente:

  • Si tu proyecto está configurado para usar Odoo 10.0, el servidor de Odoo se ejecuta con Python 2.7.

  • Si tu proyecto está configurado para usar Odoo 11.0 o una versión superior, el servidor de Odoo se ejecuta con Python 3.5.

Shell de la base de datos

Al acceder a un contenedor mediante el shell, puedes acceder a la base de datos con psql.

odoo@odoo-addons-master-1.odoo.sh:~$ psql
psql (9.5.2, server 9.5.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

odoo-addons-master-1=>

Advertencia: Usa transacciones (BEGIN…COMMIT/ROLLBACK) para cada declaración sql que ocasiona cambios (UPDATE, DELETE, ALTER, etc.), en especial en tu base de datos de producción.

El mecanismo de transacción actúa como red de seguridad en caso de que ocurra un error, solo debes revertir los cambios para restaurar la base de datos a su estado anterior.

Por ejemplo, tal vez olvidaste definir la condición WHERE.

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***';
UPDATE 457
odoo-addons-master-1=> ROLLBACK;
ROLLBACK

En ese caso, puedes realizar una reversión para anular los cambios que hiciste por accidente y luego volver a escribir la declaración:

odoo-addons-master-1=> BEGIN;
BEGIN
odoo-addons-master-1=> UPDATE res_users SET password = '***' WHERE id = 1;
UPDATE 1
odoo-addons-master-1=> COMMIT;
COMMIT

No olvides confirmar o revertir tu transacción después de hacerla. Las transacciones abiertas podrían bloquear los registros en tus tablas y es posible que tu base de datos activa deba esperar hasta que se liberen, lo que ocasiona que haya una pausa indefinida en el servidor.

Además, cuando sea posible, usa tus bases de datos de prueba para probar las declaraciones primero, ya que esto te dará una red de seguridad adicional.

Ejecutar un servidor de Odoo

Puedes iniciar una instancia del servidor de Odoo desde el shell de un contenedor. No podrás acceder a ella desde un navegador, pero puedes:

  • Usar el shell de Odoo.

$  odoo-bin shell
>>> partner = env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1)
>>> partner.name
'ASUSTeK'
>>> partner.name = 'Odoo'
>>> env['res.partner'].search([('email', '=', 'asusteK@yourcompany.example.com')], limit=1).name
'Odoo'
  • Instalar un módulo.

$  odoo-bin -i sale --without-demo=all --stop-after-init
  • Actualizar un módulo.

$  odoo-bin -u sale --stop-after-init
  • Ejecutar las pruebas de un módulo.

$  odoo-bin -i sale --test-enable --log-level=test --stop-after-init

En los comandos anteriores, el argumento:

  • --without-demo=all evita que los datos de demostración se carguen en todos los módulos.

  • --stop-after-init cerrará la instancia del servidor de inmediato luego de completar las operaciones que solicitaste.

Consulta la documentación de la interfaz de la línea de comandos para conocer otras opciones y leer sobre ellas.

En los registros (~/logs/odoo.log) puedes encontrar la ruta de los complementos que Odoo.sh utiliza para ejecutar tu servidor. Busca «odoo: addons paths»:

2018-02-19 10:51:39,267 4 INFO ? odoo: Odoo version 18.0
2018-02-19 10:51:39,268 4 INFO ? odoo: Using configuration file at /home/odoo/.config/odoo/odoo.conf
2018-02-19 10:51:39,268 4 INFO ? odoo: addons paths: ['/home/odoo/data/addons/18.0', '/home/odoo/src/user', '/home/odoo/src/enterprise', '/home/odoo/src/themes', '/home/odoo/src/odoo/addons', '/home/odoo/src/odoo/odoo/addons']

Ten cuidado, sobre todo con tu base de datos de producción. Las operaciones que hagas al ejecutar esta instancia del servidor de Odoo no están aisladas y los cambios se aplicarán directamente en la base de datos. Siempre haz tus pruebas en bases de datos que no son de producción.

Depuración de errores y bugs en Odoo.sh

Depurar una compilación de Odoo.sh no es muy diferente a hacerlo en otra aplicación de Python. Este artículo solo explica las particularidades y limitaciones de la plataforma Odoo.sh, además de que asume que ya sabes cómo usar un depurador.

Nota

Si todavía no sabes cómo depurar una aplicación de Python, hay muchos cursos introductorios que puedes encontrar en internet con facilidad.

Puedes usar pdb, pudb o ipdb para depurar tu código en Odoo.sh. El servidor se ejecuta fuera de un shell, así que no puedes activar el depurador desde el backend de tu instancia de Odoo, ya que el depurador necesita un shell para funcionar.

  • pdb está instalado de forma predeterminada en cada contenedor.

  • Si quieres usar pudb o ipdb, primero debes instalarlos.

    Tienes dos opciones para hacerlo:

    • De forma temporal (solo en la compilación actual):

      $  pip install pudb --user
      

      o

      $  pip install ipdb --user
      
    • de forma permanente al agregar pudb o ipdb al archivo requirements.txt de tu proyecto.

Después, edita el código donde quieres activar el depurador y agrega lo siguiente:

import sys
if sys.__stdin__.isatty():
    import pdb; pdb.set_trace()

La condición sys.__stdin__.isatty() detecta si estás ejecutando Odoo desde un shell.

Guarda el archivo y ejecuta el shell de Odoo:

$ odoo-bin shell

Por último, a través del shell de Odoo, puedes activar el fragmento de código, función o método que quieras depurar.

Captura de pantalla de la consola que muestra a ``pdb`` en ejecución en un shell de Odoo.sh.