Cómo instalar el software ERP Odoo 17 en Rocky Linux 9

Odoo (antes conocido como OpenERP) es un conjunto autoalojado de más de 10.000 aplicaciones de código abierto para diversas necesidades empresariales, como CRM, comercio electrónico, contabilidad, inventario, gestión de proyectos y punto de venta. Estas aplicaciones están totalmente integradas y se accede a ellas a través de una interfaz web familiar.

Este tutorial nos enseñará a instalar Odoo 16 Stack en un servidor Rocky Linux 9.

Requisitos previos

  1. Un servidor Rocky Linux 9 con un mínimo de 2GB RAM para alojar Odoo Stack.
  2. Un segundo servidor Rocky Linux 9 con un mínimo de 2GB RAM para alojar la base de datos PostgreSQL. Sin embargo, puedes instalar la base de datos en el mismo servidor que Odoo, pero para entornos de producción, es muy recomendable que la instales en un servidor independiente. También puedes elegir cualquiera de las opciones de bases de datos gestionadas disponibles en cualquier proveedor de tu elección.
  3. Los requisitos de RAM dependerán del número de usuarios simultáneos que vayan a utilizar la pila. Puedes encontrar una guía detallada sobre cómo calcular los requisitos del sistema en la documentación de Odoo.
  4. Mantén tus sistemas actualizados.
    $ sudo dnf update
    
  5. Un usuario no root con privilegios sudo en ambos servidores.
  6. Fail2Ban debe estar instalado. Este paso es opcional. Para ello puedes seguir nuestra guía sobre la instalación de Fail2Ban en Rocky Linux.
  7. SELinux debe estar desactivado.
  8. Pocos paquetes que necesiten tus sistemas.
    $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
    

    Puede que algunos de estos paquetes ya estén instalados en tu sistema.

Paso 1 – Configurar las reglas del cortafuegos

El primer paso es configurar el cortafuegos. Rocky Linux utiliza el cortafuegos Firewalld. Para este tutorial, supondremos que tienes instalado el cortafuegos Firewalld en ambos servidores.

Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

El cortafuegos funciona con diferentes zonas, y la zona pública es la que utilizaremos por defecto. Enumera todos los servicios y puertos activos en el cortafuegos.

$ sudo firewall-cmd --zone=public --list-all

Debería mostrar el siguiente resultado.

public
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

En el servidor de Odoo, necesitaremos que los puertos 22, 80, 443, 6010, 5432 y 8069 estén abiertos. El 22 se utiliza para SSH, el 80 para HTTP, el 443 para HTTPS, el 6010 para la comunicación con Odoo, el 5432 para PostgreSQL y el 8069 para la aplicación del servidor Odoo.

Ejecuta los siguientes comandos para abrir los puertos necesarios en el servidor Odoo.

$ sudo firewall-cmd --zone=public --add-port={6010,5432,8069,8072}/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: cockpit dhcpv6-client http https ssh
  ports: 6010/tcp 5432/tcp 8069/tcp 8072/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

En el servidor PostgreSQL, necesitamos abrir los puertos 22, 6010 y 5432. Ábrelos utilizando los siguientes comandos.

$ sudo firewall-cmd --zone=public --add-port={6010,5432}/tcp

Haz que todos los cambios sean permanentes y recarga el cortafuegos para activar los cambios.

$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

Paso 2 – Asignar nombres de host

Puedes utilizar las direcciones IP de los servidores o sus Nombres de Dominio Completamente Cualificados (FQDN), si están disponibles. Para nuestro tutorial, utilizaremos FQDNs y para ello, necesitamos establecer nombres de host en ambos servidores.

Establece el nombre de host en el servidor de Odoo utilizando el siguiente comando.

$ sudo hostnamectl set-hostname odoo.yourdomain.com

Establece el nombre de host en el servidor PostgreSQL utilizando el siguiente comando.

$ sudo hostnamectl set-hostname postgresql.yourdomain.com

En el servidor Odoo, abre el archivo /etc/hosts.

$ sudo nano /etc/hosts

Asegúrate de que tiene el siguiente aspecto.

127.0.0.1 	localhost
127.0.0.1	odoo.yourdomain.com		odoo
10.1.1.10	postgresql.yourdomain.com	postgresql

En el servidor PostgreSQL, abre el archivo y asegúrate de que tiene el siguiente aspecto.

127.0.0.1 	localhost
127.0.0.1	postgresql.yourdomain.com	postgresql
10.1.2.10	odoo.yourdomain.com		odoo

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Paso 3 – Instalar y configurar PostgreSQL

Rocky Linux 9 viene con PostgreSQL 13 por defecto y PostgreSQL 15 como módulo de flujo postgresql:15. Sin embargo, instalaremos la última versión disponible en el momento de escribir este tutorial, PostgreSQL 16 desde su repositorio oficial.

Instala el RPM del repositorio PostgreSQL.

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Desactiva el módulo incorporado de PostgreSQL.

$ sudo dnf -qy module disable postgresql

Instala PostgreSQL 16.

$ sudo dnf install -y postgresql16-server postgresql16-contrib

Inicializa la base de datos.

$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

Habilita e inicia el servicio PostgreSQL.

$ sudo systemctl enable postgresql-16
$ sudo systemctl start postgresql-16

Comprueba el estado del servicio.

$ sudo systemctl status postgresql-16

Deberías obtener un resultado similar.

? postgresql-16.service - PostgreSQL 16 database server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Sun 2024-04-07 02:22:42 UTC; 3s ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 8673 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 8678 (postgres)
      Tasks: 7 (limit: 10819)
     Memory: 17.4M
        CPU: 60ms
     CGroup: /system.slice/postgresql-16.service
             ??8678 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             ??8679 "postgres: logger "
             ??8680 "postgres: checkpointer "
             ??8681 "postgres: background writer "
             ??8683 "postgres: walwriter "
             ??8684 "postgres: autovacuum launcher "
             ??8685 "postgres: logical replication launcher "

Apr 07 02:22:42 postgresql systemd[1]: Starting PostgreSQL 16 database server...
Apr 07 02:22:42 postgresql postgres[8678]: 2024-04-07 02:22:42.370 UTC [8678] LOG:  redirecting log output to logging collector process
Apr 07 02:22:42 postgresql postgres[8678]: 2024-04-07 02:22:42.370 UTC [8678] HINT:  Future log output will appear in directory "log".
Apr 07 02:22:42 postgresql systemd[1]: Started PostgreSQL 16 database server.

A continuación, tenemos que crear un usuario de base de datos odoo. Se te pedirá una contraseña para el rol. Introduce una contraseña segura de tu elección.

$ sudo -u postgres createuser odoo -U postgres -dP

La opción -u ejecuta el comando como usuario postgres.

La opción -U indica el nombre de usuario con el que conectarse.

La opción -d concede al usuario permiso para crear bases de datos.

La opción -p solicita la contraseña del nuevo usuario.

Configurar la autenticación basada en host

Necesitamos dar permiso al servicio PostgreSQL para que pueda conectarse al servidor de Odoo.

Primero, detén el servicio PostgreSQL.

$ sudo systemctl stop postgresql-16

Para encontrar dónde almacena PostgreSQL el archivo de Autenticación de Cliente, ejecuta el siguiente comando para iniciar el intérprete de comandos de PostgreSQL.

$ sudo -u postgres psql

Ejecuta la siguiente consulta para encontrar la ubicación del archivo.

postgres=# SHOW hba_file;

Obtendrás el siguiente resultado.

              hba_file              
------------------------------------
 /var/lib/pgsql/16/data/pg_hba.conf
(1 row)

Escribe exit para salir del intérprete de comandos.

Abre el archivo /var/lib/pgsql/16/data/pg_hba.conf para editarlo.

$ sudo nano /var/lib/pgsql/16/data/pg_hba.conf

Pega la siguiente línea al final.

host		all		odoo		odoo.yourdomain.com		scram-sha-256

Esta línea concede permiso al usuario odoo para conectarse a todas las bases de datos de este servidor. También puedes especificar el nombre de las bases de datos en lugar de utilizar la palabra clave all.

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Configurar la dirección de escucha de PostgreSQL

A continuación, tenemos que permitir que el servidor de bases de datos escuche conexiones remotas.

Inicia el intérprete de comandos PostgreSQL y ejecuta el siguiente comando para localizar el archivo de configuración PostgreSQL.

$ sudo -u postgres psql
postgres=# SHOW config_file;

Recibirás la siguiente salida.

              config_file               
----------------------------------------
 /var/lib/pgsql/16/data/postgresql.conf
(1 row)

Escribe exit para salir del intérprete de comandos.

Abre el archivo /var/lib/pgsql/16/data/postgresql.conf para editarlo.

$ sudo nano /var/lib/pgsql/16/data/postgresql.conf

Cambia la línea listen_addresses de

#listen_addresses = 'localhost' # what IP address(es) to listen on;

a.

listen_addresses = '*'

El * significa que escuchará todas las direcciones IP. Puedes cambiarla por la dirección IP de tu instancia de odoo.

listen_addresses = 'localhost, <odoo_server_ip>'

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Habilitar e Iniciar el servicio PostgreSQL

Ya que nuestra configuración está terminada, es hora de iniciar el servicio PostgreSQL.

$ sudo systemctl start postgresql-16	

Paso 4 – Instalar Odoo

Instala Python 3.10

Rocky Linux 9 viene con Python 3.9 mientras que Odoo 17 requiere Python 3.10 y superior. Por lo tanto, necesitamos instalarlo primero.

Puedes comprobar primero la versión disponible actualmente.

$ python --version
Python 3.9.18

Instala las dependencias necesarias para Python.

$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install readline-devel ncurses-devel openssl-devel sqlite-devel tk-devel gdbm-devel libc6-dev libbz2-dev libffi-dev zlib1g-dev
$ sudo dnf install -y openssl-devel bzip2-devel libffi-devel readline-devel ncurses-devel sqlite-devel tk-devel

Descarga el código fuente del sitio web de Python. En el momento de escribir este tutorial, la última versión 3.10.x disponible es la 3.10.14, que es la que hemos utilizado.

$ wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz

Extrae el archivo.

$ tar xzf Python-3.10.14.tgz

Cambia al directorio extraído.

$ cd Python-3.10.14

Configura el código fuente.

$ ./configure --enable-optimizations

Instala Python 3.10.14. Utiliza el comando altininstall para no sobrescribir la versión de Python del sistema.

$ sudo make altinstall

Confirma la instalación.

$ python3.10 -V
OR
$ python3.10 --version

Deberías obtener la siguiente salida.

Python 3.10.14

A continuación, tenemos que establecer Python 3.10 como versión de Python por defecto. Crea enlaces simbólicos para cada versión de Python instalada en tu servidor. Al crear la versión simbólica, debes incluir la versión exacta de Python en tus comandos. Ejecuta los siguientes comandos para crear los enlaces simbólicos.

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.10 1
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2

Para ver las versiones de Python disponibles, utiliza el siguiente comando.

$ sudo update-alternatives --config python3

Deberías ver la siguiente salida.

There are 2 programs which provide 'python3'.

  Selection    Command
-----------------------------------------------
   1           /usr/local/bin/python3.10
*+ 2           /usr/bin/python3.9

Enter to keep the current selection[+], or type selection number:

Selecciona el número 1 para cambiar a Python 3.10.

Cierra la sesión y vuelve a entrar en el terminal para cambiar a la versión de Python. Ahora puedes utilizar Python 3.10.14 utilizando directamente python.

Instala las dependencias y prepárate para la instalación

Crea un nuevo usuario de sistema para gestionar los procesos de Odoo en el servidor de Odoo con el directorio home como /opt/odoo. Esto es para prevenir cualquier riesgo de seguridad ejecutándolo bajo el usuario root.

$ sudo useradd -m -d /opt/odoo -U -r -s /bin/bash odoo

Instala las dependencias del sistema necesarias para la configuración de Odoo 17.

$ sudo dnf install -y git libxslt-devel bzip2-devel openldap-devel libjpeg-devel freetype-devel libpq-devel

Instala Nodejs. Rocky Linux 9 viene con Node 18.x que es la versión LTS actual de Nodejs. Sin embargo, utilizaremos el repositorio oficial Nodesource para ello.

Añade el repositorio Node 20.

$ curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -

Instala Nodejs.

$ sudo dnf -y install nodejs

Confirma la versión de Node.

$ node --version
v20.12.1

Instala el paquete Less CSS con Node. Si utilizas un lenguaje con interfaz de derecha a izquierda, instala también el paquete rtlcss.

$ sudo npm install -g less rtlcss

Instala wkhtmltopdf. Utilizaremos el paquete RPM del repositorio de paquetes Wkhtmltopdf de GitHub. La última versión disponible en el momento de escribir este tutorial es 0.12.6.1 r3.

Descarga el RPM Wkhtmltopdf.

$ cd ~
$ wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox-0.12.6.1-3.almalinux9.x86_64.rpm

Instala las fuentes requeridas por Wkhtmltopdf.

$ sudo dnf install xorg-x11-fonts-75dpi.noarch xorg-x11-fonts-Type1.noarch

Instala Wkhtmltopdf.

$ sudo rpm -i wkhtmltox-0.12.6.1-3.almalinux9.x86_64.rpm

Comprueba la versión de wkhtmltopdf instalada.

$ wkhtmltopdf --version
wkhtmltopdf 0.12.6.1 (with patched qt)

Descargar archivos de Odoo

Cambiar al usuario del sistema de Odoo.

$ sudo su - odoo

Clona el repositorio Github de Odoo en tu sistema.

$ git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0 --single-branch

Para nuestro propósito, estamos copiando Odoo al directorio /opt/odoo desde donde se instalará. Esto creará el directorio /opt/odoo/odoo que utilizaremos para la instalación.

Configurar el entorno Virtualenv Python

Este paso es opcional pero se recomienda ya que un entorno virtual Python para Odoo ayudará a evitar conflictos con los módulos Python del Sistema Operativo, especialmente al realizar actualizaciones del SO.

Para ello, utilizaremos virtualenv.

  1. Crea un nuevo entorno virtualenv para Odoo.
    $ python3 -m venv odoo-env
    
  2. Activa el entorno virtual. Vamos a crear un entorno bajo el directorio personal del usuario del sistema. Eres libre de elegir la ubicación que quieras.
    $ source odoo-env/bin/activate
    
  3. Actualiza PIP por si acaso.
    (odoo-env) $ pip3 install --upgrade pip
    
  4. Instala la rueda de Python en el entorno virtual.
    $ pip3 install wheel
    

Instala las dependencias de Python

Instala las dependencias de Python requeridas por Odoo 17.

$ pip3 install -r /opt/odoo/odoo/requirements.txt

Los requisitos tardarán algún tiempo en instalarse, así que ten paciencia.

Comprueba si los requisitos se han instalado correctamente comprobando la lista de módulos Python instalados.

$ pip3 list
Package           Version
----------------- --------
attrs             23.2.0
Babel             2.9.1
beautifulsoup4    4.12.3
cached-property   1.5.2
certifi           2024.2.2
cffi              1.16.0
chardet           4.0.0
cryptography      3.4.8
decorator         4.4.2
docopt            0.6.2
docutils          0.17
ebaysdk           2.1.5
freezegun         1.1.0
geoip2            2.9.0
gevent            21.8.0
greenlet          1.1.2
idna              2.10
isodate           0.6.1
Jinja2            3.0.3
libsass           0.20.1
lxml              4.8.0
MarkupSafe        2.0.1
maxminddb         2.6.0
num2words         0.5.10
ofxparse          0.21
passlib           1.7.4
Pillow            9.0.1
pip               24.0
platformdirs      4.2.0
polib             1.1.1
psutil            5.9.0
psycopg2          2.9.2
pyasn1            0.6.0
pyasn1_modules    0.4.0
pycparser         2.22
pydot             1.4.2
pyOpenSSL         21.0.0
pyparsing         3.1.2
PyPDF2            1.26.0
pyserial          3.5
python-dateutil   2.8.1
python-ldap       3.4.0
python-stdnum     1.17
pytz              2024.1
pyusb             1.2.1
qrcode            7.3.1
reportlab         3.6.8
requests          2.25.1
requests-file     2.0.0
requests-toolbelt 1.0.0
rjsmin            1.1.0
setuptools        65.5.0
six               1.16.0
soupsieve         2.5
urllib3           1.26.5
vobject           0.9.6.1
Werkzeug          2.0.2
wheel             0.43.0
xlrd              1.2.0
XlsxWriter        3.0.2
xlwt              1.3.0
zeep              4.1.0
zope.event        5.0
zope.interface    6.2

Sal del entorno virtual de Python.

$ deactivate

Crea un directorio para addons de terceros

$ mkdir /opt/odoo/odoo/custom-addons

Este directorio debe añadirse al parámetro addons_path que define los directorios donde Odoo busca los módulos. Sal del usuario del sistema Odoo.

$ exit

Paso 5 – Configurar Odoo

Copia el archivo de configuración por defecto de Odoo para crear uno nuevo.

$ sudo cp /opt/odoo/odoo/debian/odoo.conf /etc/odoo.conf

Abre el archivo para editarlo.

$ sudo nano /etc/odoo.conf

Edita el archivo para que tenga el siguiente aspecto.

[options]
; This is the password that allows database operations:
admin_passwd = admin
db_host = postgresql.yourdomain.com
db_port = False
db_user = odoo
db_password = odoo_password
addons_path = /opt/odoo/odoo/addons, /opt/odoo/odoo/custom-addons
xmlrpc_port = 8069
default_productivity_apps = True

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

La opción admin_passwd es la contraseña que permite las operaciones administrativas dentro de la GUI de Odoo. Asegúrate de elegir una contraseña segura.

La opción db_host es el FQDN o la dirección IP del servidor PostgreSQL.

La opción db_port está establecida en false ya que se está utilizando el puerto PostgreSQL 5432 por defecto. Si quieres utilizar un puerto diferente, tendrás que actualizar este valor.

La opción db_user es el nombre del usuario PostgreSQL.

La opción db_password es la contraseña del usuario PostgreSQL ‘odoo’ que creamos anteriormente en el servidor PostgreSQL.

La opción addons_path es la ruta por defecto de Addons. También puedes añadir una ruta personalizada para Addons separándolas con comas.

La opción xmlrpc_port es el puerto en el que escucha Odoo.

La opción default_productivity_apps asegura que las aplicaciones de productividad por defecto (Empleados, Email Marketing, Proyectos y Encuestas) permanezcan activadas. Estas cuatro aplicaciones son las predeterminadas en la Edición Comunidad de Odoo. En la edición Enterprise, hay apps de productividad adicionales que se pueden habilitar por defecto y que son Citas, Conocimiento, Planificación y Firmar.

Crear servicio Odoo

Para asegurarnos de que Odoo sigue funcionando incluso después de reiniciar el sistema, necesitamos crear un servicio para él.

Crea un archivo /lib/systemd/system/odoo-server.service y ábrelo para editarlo.

$ sudo nano /lib/systemd/system/odoo-server.service

Pega el siguiente código en él.

[Unit]
Description=Odoo Open Source ERP and CRM
Requires=postgresql-16.service
After=network.target postgresql-16.service

[Service]
Type=simple
SyslogIdentifier=odoo-server
User=odoo
Group=odoo
ExecStart=/opt/odoo/odoo-env/bin/python3 /opt/odoo/odoo/odoo-bin --config=/etc/odoo.conf --addons-path=/opt/odoo/odoo/addons/ --logfile /var/log/odoo/odoo-server.log
WorkingDirectory=/opt/odoo/odoo/
StandardOutput=journal+console
KillMode=mixed

[Install]
WantedBy=multi-user.target

Sustituye /home/<username> por la ubicación que elegiste para instalar el Entorno Virtual Python.

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Crear un directorio Log para Odoo

$ sudo mkdir /var/log/odoo

Establece los permisos del archivo

Establece los permisos en el archivo odoo-server.service para que sólo los usuarios de Odoo puedan leerlo o ejecutarlo.

$ sudo chmod 755 /lib/systemd/system/odoo-server.service
$ sudo chown odoo: /lib/systemd/system/odoo-server.service

Establece la propiedad en el entorno Python, la instalación de Odoo y el directorio log.

$ sudo chown -R odoo: /opt/odoo/
$ sudo chown -R odoo: /opt/odoo/odoo-env
$ sudo chown -R odoo: /var/log/odoo

Restringe el archivo de configuración de Odoo.

$ sudo chown odoo: /etc/odoo.conf
$ sudo chmod 640 /etc/odoo.conf

Iniciar el servidor Odoo

Inicia y habilita el servidor de Odoo.

$ sudo systemctl start odoo-server
$ sudo systemctl enable odoo-server

Comprueba el estado del servidor.

$ sudo systemctl status odoo-server
? odoo-server.service - Odoo Open Source ERP and CRM
     Loaded: loaded (/usr/lib/systemd/system/odoo-server.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-04-09 23:59:38 UTC; 1s ago
   Main PID: 102598 (python3)
      Tasks: 4 (limit: 10736)
     Memory: 69.6M
        CPU: 895ms
     CGroup: /system.slice/odoo-server.service
             ??102598 /opt/odoo/odoo-env/bin/python3 /opt/odoo/odoo/odoo-bin --config=/etc/odoo.conf --addons-path=/opt/odoo/odoo/addons/ --logfile /var/log/odoo/odoo-server.log

Apr 09 23:59:38 odoo.yourdomain.com systemd[1]: Started Odoo Open Source ERP and CRM.

Paso 6 – Instalar y configurar Nginx

Rocky Linux 9 viene con una versión antigua de Nginx. Necesitas utilizar el repositorio oficial de Nginx para instalar la última versión.

Crea y abre el archivo /etc/yum.repos.d/nginx.repo para editarlo.

$ sudo nano /etc/yum.repos.d/nginx.repo

Pega en él el siguiente código.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Utilizaremos la versión mainline de Nginx y, por tanto, hemos habilitado el repositorio mainline en el archivo anterior utilizando enabled=1 en la sección mainline en lugar de la estable. Puedes elegir cualquiera de las dos.

Instala Nginx.

$ sudo dnf install -y nginx

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.25.4

Habilita e inicia el servicio del servidor Nginx.

$ sudo systemctl enable nginx --now

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Wed 2024-04-10 06:52:14 UTC; 3s ago
       Docs: http://nginx.org/en/docs/
    Process: 103452 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 103453 (nginx)
      Tasks: 3 (limit: 10736)
     Memory: 3.1M
        CPU: 17ms
     CGroup: /system.slice/nginx.service
             ??103453 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??103454 "nginx: worker process"
             ??103455 "nginx: worker process"

Paso 7 – Instalar SSL

Necesitamos instalar Certbot para generar certificados SSL gratuitos ofrecidos por Let’s Encrypt. Para ello utilizaremos el instalador de paquetes Snapd. Requiere el repositorio EPEL (Extra Packages for Enterprise Linux) para funcionar.

Instala el repositorio EPEL.

$ sudo dnf install -y epel-release

Rocky Linux 9 no viene con Snapd instalado. Instala el paquete Snapd.

$ sudo dnf install -y snapd

Habilita e Inicia el servicio Snap.

$ sudo systemctl enable snapd --now

Instala el paquete Snap core, y asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core
$ sudo snap refresh core

Crea los enlaces necesarios para que Snapd funcione.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Comprueba si Certbot funciona correctamente.

$ certbot --version
certbot 2.10.0

Genera el certificado. También necesitamos crear un certificado DHParams.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d odoo.yourdomain.com

Genera un certificado de intercambio de claves Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Comprueba el servicio programador de renovación de Certbot.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT          LAST                        PASSED   UNIT                         ACTIVATES
....                        ....          ....                        ......   ....                         .........
Wed 2024-04-10 13:32:11 UTC 1h 42min left Wed 2024-04-10 11:43:41 UTC 5min ago dnf-makecache.timer          dnf-makecache.service
Wed 2024-04-10 19:08:00 UTC 7h left       -                           -        snap.certbot.renew.timer     snap.certbot.renew.service
Thu 2024-04-11 00:00:00 UTC 12h left      Wed 2024-04-10 00:00:36 UTC 11h ago  logrotate.timer              logrotate.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 8 – Configurar Nginx

Para ejecutarlo a través de Nginx, necesitamos ejecutar Odoo en localhost. Para cambiar eso, detén el servicio Odoo.

$ sudo systemctl stop odoo-server

Abre el archivo de configuración del servidor de Odoo.

$ sudo nano /etc/odoo.conf

Añade las siguientes líneas.

xmlrpc_interface = 127.0.0.1
proxy_mode = True

Crea un archivo de configuración Nginx para Odoo.

$ sudo nano /etc/nginx/conf.d/odoo.conf

Pega el código siguiente.

#odoo server
upstream odoo {
 server 127.0.0.1:8069;
}
upstream odoochat {
 server 127.0.0.1:8072;
}
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}
map $sent_http_content_type $content_type_csp {
    default "";
    ~image/ "default-src 'none'";
}

# http -> https
server {
   listen 80;
   listen [::]:80;
   server_name odoo.yourdomain.com;
   return 301 https://$host$request_uri;
}

server {
 listen 443 ssl;
 listen [::]:443 ssl;
 http2 on;
 http3 on;
 quic_retry on;

 server_name odoo.yourdomain.com;

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

 # Add Headers for odoo proxy mode
 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;

 # SSL parameters
 ssl_certificate /etc/letsencrypt/live/odoo.yourdomain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/odoo.yourdomain.com/privkey.pem;
 ssl_trusted_certificate /etc/letsencrypt/live/odoo.yourdomain.com/chain.pem;

 ssl_session_timeout 30m;
 ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
 ssl_session_tickets off;

 ssl_protocols TLSv1.2 TLSv1.3;
 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
 ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
 ssl_prefer_server_ciphers off;
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_dhparam /etc/ssl/certs/dhparam.pem;

 # log
 access_log /var/log/nginx/odoo.access.log;
 error_log /var/log/nginx/odoo.error.log;

 # Redirect longpoll requests to odoo longpolling port
 location /longpolling {
   proxy_pass http://odoochat;
 }

 location /websocket {
   proxy_pass http://odoochat;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection $connection_upgrade;
   proxy_set_header X-Forwarded-Host $http_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;
   proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8
 }

 # Redirect requests to odoo backend server
 location / {
  # Add Headers for odoo proxy mode
   proxy_set_header X-Forwarded-Host $http_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;
   proxy_redirect off;
   proxy_pass http://odoo;
   proxy_cookie_flags session_id samesite=lax secure;  # requires nginx 1.19.8
 }

 # common gzip
 gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
 gzip on;

 # Serve static files right away
 location ~ ^/[^/]+/static/.+$ {
   # root and try_files both depend on your addons paths
   root /opt/odoo/odoo;
   try_files /opt/odoo/odoo/addons$uri @odoo;
   expires 24h;
   add_header Content-Security-Policy $content_type_csp;
 }
}

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Prueba la configuración de Nginx.

$ sudo nginx -t

Si no ves ningún error, significa que puedes continuar. Reinicia el servidor Nginx.

$ sudo systemctl restart nginx

Paso 9 – Iniciar Odoo

Podemos iniciar el servidor de Odoo de nuevo después de que todo esté configurado.

$ sudo systemctl start odoo-server

Inicia Odoo en tu navegador a través de https://odoo.yourdomain.com. En tu navegador, abre la URL http://<yourIPaddress>:8069 o http://odoo.yourdomain.com:8069. Deberías ver la pantalla de creación de la base de datos de Odoo si todo funciona correctamente.

Elige tu correo electrónico y contraseña para crear tus credenciales de acceso. La contraseña maestra es la admin_passwd que añadiste en el archivo /etc/odoo.conf. Rellena todos los campos restantes.

Marca el campo Demo Data para rellenar la base de datos con datos de muestra. No instales datos de demostración en servidores orientados a Internet. Las bases de datos con datos de demostración contienen nombres de usuario y contraseñas por defecto que pueden utilizarse para entrar en tus sistemas y causar problemas importantes, incluso en sistemas de montaje/dev. Nosotros la utilizamos sólo con fines de tutorial.

Haz clic en el botón Crear base de datos para completar la instalación. La primera vez que crees una base de datos, la página de complementos tardará en cargarse, así que no actualices la página. Se te redirigirá automáticamente a la siguiente página de acceso una vez creada la base de datos.

Introduce las credenciales utilizadas en el paso anterior para iniciar sesión en el ERP Odoo y serás redirigido a la página del panel de control como se muestra a continuación. Se rellenará previamente con datos de demostración. Si no has marcado la opción de datos de demostración en la página de creación de la base de datos, obtendrás un panel de control diferente y mucho más limpio.

A partir de aquí puedes empezar a utilizar Odoo para gestionar tu negocio.

Paso 10 – Actualizar Odoo

Detén el servidor de Odoo.

$ sudo systemctl stop odoo-server

Cambia al usuario del sistema Odoo.

$ sudo su - odoo

Extrae el último código fuente de GitHub.

$ git fetch
$ git rebase --autostash

El segundo comando puede encontrar conflictos con el código fuente si lo cambias manualmente. Se te dará la lista de archivos en conflicto. Tendrás que cambiar manualmente todos los archivos y volver a ejecutar el comando para solucionar los problemas.

Si quieres descartar los cambios conflictivos, puedes ejecutar el siguiente comando para restablecer la fuente.

$ git reset --hard

Activa el entorno virtual Python.

$ source odoo-env/bin/activate

Instala las dependencias de Python.

$ pip3 install -r /opt/odoo/odoo/requirements.txt

Sal del entorno virtual Python.

$ deactivate

Inicia el servidor de Odoo.

$ sudo systemctl start odoo-server

Paso 11 – Asegurar Odoo usando Fail2Ban

Este paso es opcional, pero si tienes Fail2Ban instalado, puedes añadir una configuración para proteger Odoo.

Crea y abre el archivo odoo-login.conf para editarlo.

$ sudo nano /etc/fail2ban/jail.d/odoo-login.conf

Pega el siguiente código en él.

[odoo-login]
enabled = true
port = http,https
bantime = 900  ; 15 min ban
maxretry = 10  ; if 10 attempts
findtime = 60  ; within 1 min  /!\ Should be adjusted with the TZ offset
logpath = /var/log/odoo.log  ;  set the actual odoo log path here

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo.

Crea y abre el archivo de filtro odoo-login.conf para editarlo.

$ sudo nano /etc/fail2ban/filter.d/odoo-login.conf

Pega en él el siguiente código.

[Definition]
failregex = ^ \d+ INFO \S+ \S+ Login failed for db:\S+ login:\S+ from <HOST>
ignoreregex =

Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida que guardes el archivo.

Reinicia Fail2Ban.

$ sudo systemctl restart fail2ban

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y configuración de Odoo en el servidor Rocky Linux 9. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...