- November 25, 2021
- La Cantera de Binaural, Odoo
- 0 Comments
En este post te vamos a explicar nuestra forma de iniciar un desarrollo de algún módulo personalizado para Odoo.
Desde que iniciamos nuestro trabajo de desarrollo Odoo, hemos experimentado varias formas de desarrollar: desde generar ambientes virtuales (virtualenv) con Python, hasta instalar en nuestros equipos directamente Odoo para desarrollar.
Lo anterior efectivamente nos permite trabajar, sin embargo sufrimos de los clásicos problemas de programador:
“En mi máquina funciona”.
Haciendo que el proceso de probar y llevar una solución a feliz termino fuese una tarea casi imposible.
Ahí es donde Docker entra en acción, específicamente Docker-compose como herramienta para estandarizar los ambientes de desarrollo del equipo.
Archivos para levantar un ambiente de desarrollo Odoo con Docker
Existen otros archivos que usamos en la instalación base (test_deploy_local.sh, wait-for-psql.py), que sirven para evitar errores de uso de base de datos pero no son estrictamente necesarios.
La estructura del proyecto quedaría parecida a lo siguiente:
Vamos a visualizar el contenido del archivo docker-compose.yml, Dockerfile y el archivo odoo.conf ubicado en el directorio config:
version: '3.5'
services:
web-integra14:
build:
context: .
container_name: integra14_container
depends_on:
- db-integra14
ports:
- "15000:8069"
volumes:
- odoo-web-integra14:/var/lib/odoo
- ./config:/etc/odoo
- ./enterprise:/mnt/extra-addons
- ./modules:/mnt/custom-addons
environment:
- PYTHONUNBUFFERED=0
db-integra14:
image: postgres:13
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odoo
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- odoo-db-integra14:/var/lib/postgresql/data/pgdata
volumes:
odoo-web-integra14:
odoo-db-integra14:
Cada bloque indica un servicio. En nuestro caso usamos 2, el que incluye toda la instalación de Odoo y otro para el servicio de base de datos: PostgreSQL (versión 13).
Usamos nuestro nombre clave para designar el nombre al servicio (Integra), tú puedes usar el nombre que desees.
Un punto importante está en la definición de los volúmenes para el servicio Odoo:
volumes:
- odoo-web-integra14:/var/lib/odoo
- ./config:/etc/odoo
- ./enterprise:/mnt/extra-addons
- ./modules:/mnt/custom-addons
El primer volumen es el volumen compartido entre los 2 servicios, el volumen config incluye el archivo odoo.conf, el cual tiene todas las configuraciones base de Odoo.
Por ultimo, el directorio “modules” que sera el que incluya todos nuestros modulos personalizados.
Ahora veremos el archivo Dockerfile:
FROM debian:buster-slim
MAINTAINER Odoo S.A. <info@odoo.com>
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG C.UTF-8
# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
python3-num2words \
python3-pdfminer \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
xz-utils \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.buster_amd64.deb \
&& echo 'ea8277df4297afc507c61122f3c349af142f31e5 wkhtmltox.deb' | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb
# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*
# Install rtlcss (on Debian buster)
RUN npm install -g rtlcss
#add pandas and another
RUN pip3 install num2words xlwt xlrd openpyxl xlwt pytest-odoo wheel
# Install Odoo
ENV ODOO_VERSION 14.0
ARG ODOO_RELEASE=latest
ARG ODOO_SHA=192b764692a2bb9d8ea74ca40c1457e031e98513
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
#&& echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
&& apt-get update \
&& apt-get -y install --no-install-recommends ./odoo.deb \
&& rm -rf /var/lib/apt/lists/* odoo.deb
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
COPY ./odoo.conf /etc/odoo/
# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
&& mkdir -p /mnt/extra-addons \
&& chown -R odoo /mnt/extra-addons
VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]
# Expose Odoo services
EXPOSE 8069 8071 8072
# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf
COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py
RUN ["chmod", "+x", "/entrypoint.sh"]
RUN ["chmod", "+x", "/usr/local/bin/wait-for-psql.py"]
# Set default user when running the container
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]
Básicamente iniciamos una imagen basada en Debian, descargamos las librerías necesarias. Para levantar la imagen se exponen puertos necesarios y se ejecuta el binario Odoo.
Para iniciar servicio basta con ejecutar el comando:
docker-compose up -d
Docker empezara a descargar todo lo necesario. Finalmente, podrás tener el ambiente para empezar a desarrollar; deberías poder visualizar la pantalla de inicio de Odoo usando la dirección: localhost:puerto-docker-compose (en este ejemplo el puerto es el 15000):
En este punto puedes restaurar una base de datos de otra instalación o iniciar con una base de datos limpia para empezar a programar tu módulo.
En otros post estaremos mostrando como crear un módulo usando la función de Scaffold que proporciona Odoo.