Existen varias formas de instalar odoo según sea el caso y la necesidad, pero instalar varias versiones de odoo aislado es un poco más complejo de lo normal y la realidad es que no mucha gente lo necesita. Pero si este es tu caso voy a detallarte como tener más de una versión o branch corriendo en la misma máquina.
Por ejemplo, podríamos tener odoo 13 con 3 ramas: Producción, Puesta en escena y Desarrollo. Y al mismo tiempo odoo 12 para otro proyecto, pero 100% aislado.
Tengan presente que utilizar la guía oficial será, sin duda, la forma más fácil de tener odoo funcionando pero que esta no permite múltiples instalaciones en una misma máquina. Así que, vamos a hacerlo creando un entorno virtual en Python y obteniendo el código de odoo de su repositorio Github.
Consideraciones a tener en cuenta antes de instalar varias versiones de odoo en un entorno aislado
Como en cualquier proyecto es muy importante que nos planteemos una forma estructurada de administrar. Acorde vaya pasando el tiempo se puede volver muy caótico administrarlo si todo lo hacemos al vuelo.
Yo voy a seguir esta tabla como guía
Entorno Python | Entorno | Entorno | Entorno1 | Entorno1 | Entorno2 | Entorno2 |
Version de ODOO | Odoo 12 | Odoo 12 | Odoo 13 | Odoo 13 | Odoo 14 | Odoo 14 |
Instancia | Producción | Desarrollo | Producción | Desarrollo | Producción | Desarrollo |
Instancia PSQL | 1p12 | 1d12 | 2p13 | 2d13 | 3p14 | 3d14 |
Puerto PSQL | 5435 | 5436 | 5445 | 5446 | 5455 | 5456 |
Nombre DB | Odoo | Odoo | Odoo | Odoo | Odoo | Odoo |
Usuario DB | Odoo | Odoo | Odoo | Odoo | Odoo | Odoo |
Password DB | Odoo | Odoo | Odoo | Odoo | Odoo | Odoo |
config | 1p12.conf | 1d12.conf | 2p13.conf | 2d13.conf | 3p14.conf | 3d14.conf |
logfile | 1p12.log | 1d12.log | 2p13.log | d13.log | 3p14.log | 3p14.log |
Proxy inverso Odoo | 5500 | 5501 | 5510 | 5511 | 5520 | 5521 |
NO RECOMIENDO PARA NADA USAR EL MISMO USUARIO Y PASSWORD PARA TODOS LOS CASOS. PERO EN ESTA GUIA PREFERI SIMPLIFICARLO UN POCO. |
Supongamos que queremos instalar 2 ramas de odoo, una principal o de producción y una de desarrollo y esto mismo para 3 proyectos distintos. O sea que vamos a tener 3 instalaciones aisladas con 2 ramas cada una.
Para conseguirlo tenemos que hacer que cada una de estas (Instalaciones/ramas) funcione en un puerto distinto, y que cada una tenga su propio archivo de configuración, addons path y archivo log.
En cuanto al Hardware, estoy usando un procesador Intel Xeon X5690 con 8 GB RAM, disco SSD y Ubuntu 20.04 con: PostgresSQL, Python y Nginx.
Nota sobre el entorno virtual Python
Para aislar las instalaciones vamos a hacer uso de Python Virtual Environment. una herramienta para la gestión de dependencias y el aislamiento de proyectos, que nos permiten hacer que los paquetes se instalen en un directorio aislado, en lugar de instalarse globalmente (es decir, como parte de Python en todo el sistema).
Un entorno virtual, es un entorno Python en el que el intérprete de Python, las bibliotecas y los scripts instalados en él están aislados de los instalados en otros entornos virtuales y (de forma predeterminada) cualquier biblioteca instalada en un “sistema” Python, es decir, uno que es instalado como parte de su sistema operativo.
Un entorno virtual es un árbol de directorios que contiene archivos ejecutables de Python y otros archivos que indican que es un entorno virtual.
Sobre las herramientas de instalación Python
Las herramientas de instalación comunes, como setuptools y pip, funcionan como se espera con entornos virtuales. En otras palabras, cuando un entorno virtual está activo, instalan paquetes de Python en el entorno virtual sin necesidad de que se les diga que lo hagan explícitamente.
Cuando un entorno virtual está activo (es decir, el intérprete de Python del entorno virtual se está ejecutando), los atributos sys.prefix y sys.exec_prefix apuntan al directorio base del entorno virtual, mientras que sys.base_prefix y sys.base_exec_prefix apuntan al no- entorno virtual Instalación de Python que se utilizó para crear el entorno virtual. Si un entorno virtual no está activo, sys.prefix es el mismo que sys.base_prefix y sys.exec_prefix es el mismo que sys.base_exec_prefix (todos apuntan a una instalación de Python en un entorno no virtual).
Cuando un entorno virtual está activo, cualquier opción que cambie la ruta de instalación se ignorará de todos los archivos de configuración de distutils para evitar que los proyectos se instalen inadvertidamente fuera del entorno virtual.
Cuando se trabaja en un shell de comandos, los usuarios pueden activar un entorno virtual ejecutando un script de activación en el directorio de ejecutables del entorno virtual (el nombre de archivo exacto y el comando para usar el archivo depende del shell), que antepone el directorio del entorno virtual para los ejecutables. la variable de entorno PATH para el shell en ejecución. En otras circunstancias, no debería ser necesario activar un entorno virtual; Los scripts instalados en entornos virtuales tienen una línea “shebang” que apunta al intérprete de Python del entorno virtual. Esto significa que el script se ejecutará con ese intérprete independientemente del valor de PATH.
Comenzamos con la configuración para instalar odoo aislado en varias versiones:
Arranco por crear el primer entorno virtual en donde se instalará odoo y después activarlo.
Creo la carpeta en donde lo vamos a almacenar
$ mkdir /odoo
$ cd /odoo
$ mkdir entorno1
$ cd entorno1
$ mkdir config
$ mkdir log
Le otorgo un nuevo propietario
$ chown -R postgres:postgres entorno1/
Creo el entorno
$ virtualenv -p python3 /odoo/entorno1
Y lo activo
$ source /odoo/entorno1/bin/activate
Crear un entorno es tan sencillo como eso. A partir de ahora el promp comenzara con algo como esto “(entorno1) “. El resto es una instalación de odoo como cualquier otra
Instalacion de odoo
Instalo dependencias para que funcionen en el nuevo entorno
$ sudo apt install git
$ sudo apt install build-essential libxslt-dev libzip-dev libldap2-dev libsasl2-dev libssl-dev
$ sudo apt install python3-dev python3-pip
El próximo paso es entrar al directorio con el que quiero trabajar, y descargar la version 13 desde Github para después instalarlo:
$ cd /odoo/entorno1
Nótese que acá estoy utilizando la versión 13 de odoo
$ git clone https://github.com/odoo/odoo.git -b 13.0 --depth=1
Y corremos el instalador
$ pip3 install -e /odoo/entorno1/odoo
Instalo dependencias de odoo 13
$ pip3 install -r /odoo/entorno1/odoo/requirements.txt
Instalo paquetes adicionales de Python:
$ pip3 install num2words phonenumbers psycopg2-binary watchdog xlwt
Hasta aca, ya tendriamos odoo instalado.
Ahora encarguémonos de preparar Postgres y poder instalar odoo en entornos aislados y con varias versiones
Ahora vamos a hacer algo similar a lo que hicimos con Python Virtual Environment pero con PostgresSQL
PostgreSQL tiene la posibilidad de generar múltiples instancias llamadas cluster, cada una trabajando de manera independiente en la versión de PostgreSQL que se requiere.
Una instancia puede manejar múltiples bases de datos y se pueden generar tantas instancias se desee según la disposición de recursos de hardware. Con múltiples versiones de PostgreSQL se pueden generar múltiples instancias por versión.
Por ejemplo:
En donde cada versión de PostgreSQL tendrá varias instancias asociadas y cada instancia podrá contener varias bases de datos. Se pueden generar instancias de acuerdo a sus funciones.
Si son sistemas críticos, se recomienda crear una instancia por cada sistema, así el mantenimiento, la restauración o gestión en general de la base de datos se haría solo a esa instancia en particular sin perjudicar la disposición de servicio de las demás instancias.
Dicho esto, hacemos un loging con el usuario postgres:
$ su - postgres
Creamos la instancia nueva usando la lógica que plantee anteriormente:
$ pg_createcluster -p 5435 12 2p13
Configuro el puerto en donde va a funcionar:
$ nano /etc/postgresql/12/2p13/postgresql.conf
Tengo que encontrar que el listen_address está como local host y poner el puerto que planeo usar, en este caso sera el 5445
Ejecuto la nueva instancia:
$ sudo systemctl start postgresql@12-2p13
Y ahora debería ver la nueva instancia creada en postgres
$ pg_lsclusters
Creando un nuevo usuario odoo para el cluster de Postgres:
Para eso, vamos a usar el comando llamado “createuser”.
$ su - postgres
createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt odoo --cluster 12/2p13
y salir de la sesión de postgres con:
exit
/etc/init.d/postgresql restart
Ahora vuelvo a activar la instancia Python:
$ source /odoo/entorno1/bin/activate
ya dentro de la instancia ejecuto:
(entorno1) odoo@iotec:~/entorno1/odoo/./odoo-bin -s
esto me va a crear un archivo de configuración en:
/home/odoo/.odoorc
Ahora que ya tenemos el archivo de configuración creado, debemos copiarlo en la ubicación con un nuevo nombre,
$ cp /home/odoo/.odoorc /odoo/entorno1/conf/2p13.conf
Seguido, tenemos que modificar, primero el host en el que se encuentra nuestra base de datos, el puerto el usuario y la contraseña. Y por ultimo las ubicaciones que tendrá nuestra instalación, el archivo de configuración y el puerto odoo. Este puerto es que usaremos para que el proxy inverso redirija el hostname o url externa a la versión deseada de odoo.
[options]
db_host = localhost
db_port = 5445
db_user = odoo
db_password = (completer con el password elegido)
logfile = /odoo/entorno1/log/aislado.log
addons_path = /odoo/entorno1/odoo(completer al path de los addons)
xmlrpc_port = 5510
pg_path = /usr/lib/postgresql/12/bin
En cuanto al puerto que estoy usando no es lo mas habitual pero como dije, la idea es tener varias de estas funcionando y no podemos hacerlo si todas están en el mismo numero. Por el contrario, si no hiciéramos este cambio el servidor tendríamos conflicto en los puertos y no podríamos instalar odoo para que conviva con varias versiones.
Como instalar nuestro servicio de entorno para cada versión de odoo aislada.
Cada una de las versiones, instancias o ramas va a tener su propio servicio, en mi caso elegí llamarlo 2p13.service porque así puedo saber que es el servicio del entorno virual 2, que es la versión de producción y que tiene odoo 13. Pero si esta forma de identificarlo no les agrada pueden llamarlo como a ustedes les parezca, como dije al principio esta no es la forma mas utilizada de instalar y si solo van a tener una versión les aconsejaría no no sigan esta guia.
nano /lib/systemd/system/2p13.service
[Unit]
Description=Corresponde con la instancia 2p13 de Odoo
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/odoo/entorno1/odoo/./odoo-bin --config /odoo/entorno1/config/2p13.conf --logfile /odoo/entorno1/log/2p13.log
KillMode=mixed
[Install]
WantedBy=multi-user.target
- Listo, ya podemos lanzar odoo con:
$systemctl start 2p13
Si entramos en http://localhost:5510 deberíamos ver nuestro odoo funcionando.
Como dije al principio, la idea es tener varias versiones así que repetimos el proceso ayudándonos de la tabla que planteamos al principio y cambiando los valores de vez en vez para tener así varias versiones conviviendo.
Si dentro de un mismo proyecto, queremos tener distintas ramas lo que vamos a hacer es exactamente todo igual solo que no crearíamos un Cluster nuevo en PGSQL sino que usaríamos el que ya tenemos con su usuario y contraseña
Lo que no mostré es como configurar el proxy inverso para que, por ejemplo, una dirección
http://odoo_NOMBRE DEL HOST.com
se redirija a nuestra versión de odoo específica, creo que no van a tener problema con eso pero si fuera necesario quedara para un nuevo post.
Requirement already satisfied: pypdf2 in /usr/lib/python3/dist-packages (1.26.0)
Hola Danny, es necesario que prestes atención si el requerimiento lo tenes instalado dentro o fuera del entorno virtual. Si no es así instálalo.
danny@danny-G752VS:~$ source /odoo/entorno1/bin/activate
(entorno1) danny@danny-G752VS:~$ /odoo/entorno1/odoo/odoo-bin -s
Traceback (most recent call last):
File “/odoo/entorno1/odoo/odoo-bin”, line 5, in
import odoo
File “/odoo/entorno1/odoo/odoo/__init__.py”, line 75, in
import PyPDF2
ModuleNotFoundError: No module named ‘PyPDF2’
El modulo PyPDF2 no esta instalado.
Corre ejecuta esta linea.
pip3 install PyPDF2