Odoo Installation · 23 min read · Nov 17, 2025

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

Odoo (anteriormente conocido como OpenERP) es un conjunto autoalojado de más de 10,000 aplicaciones de código abierto para diversas necesidades empresariales, incluyendo CRM, comercio electrónico, contabilidad, inventario, gestión de proyectos y punto de venta. Estas aplicaciones están completamente 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.

Prerrequisitos

  1. Un servidor Rocky Linux 9 con un mínimo de 2GB de RAM para alojar Odoo Stack.
  2. Un segundo servidor Rocky Linux 9 con un mínimo de 2GB de 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, se recomienda encarecidamente que la instales en un servidor separado. También puedes elegir cualquiera de las opciones de base de datos gestionadas disponibles de cualquier proveedor de tu elección.
  3. El requisito de RAM dependerá del número de usuarios concurrentes que utilizarán el stack. Una guía detallada sobre cómo calcular los requisitos del sistema se puede encontrar 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. Puedes seguir nuestra guía sobre cómo instalar Fail2Ban en Rocky Linux para lo mismo.
  7. SELinux debe estar deshabilitado.
  8. Algunos paquetes que tus sistemas necesitan.
    $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
    Algunos de estos paquetes pueden ya estar instalados en tu sistema.

Paso 1 - Configurar reglas del Firewall

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

Verifica el estado del firewall.

$ sudo firewall-cmd --state
running

El firewall trabaja con diferentes zonas, y la zona pública es la predeterminada que utilizaremos. Lista todos los servicios y puertos activos en el firewall.

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

Debería mostrar la siguiente salida.

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 Odoo, necesitaremos que los puertos 22, 80, 443, 6010, 5432 y 8069 estén abiertos. El 22 se utiliza para SSH, el 80 es para HTTP, el 443 es para HTTPS, el 6010 se utiliza para la comunicación de Odoo, el 5432 es utilizado por PostgreSQL y el 8069 es utilizado para la aplicación del servidor Odoo.

Ejecuta los siguientes comandos para abrir los puertos requeridos 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

Verifica el estado del firewall.

$ 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 firewall para habilitar los cambios.

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

Paso 2 - Asignar Nombres de Host

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

Establece el nombre de host en el servidor 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 se vea como lo siguiente.

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 se vea como lo siguiente.

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

Presiona Ctrl + X para cerrar el editor y presiona 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 el flujo de módulo 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 de 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 de PostgreSQL incorporado.

$ 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 de PostgreSQL.

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

Verifica el estado del servicio.

$ sudo systemctl status postgresql-16

Deberías obtener una salida 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, necesitamos crear un usuario de base de datos odoo. Se te pedirá una contraseña para el rol. Ingresa una contraseña fuerte 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 otorga 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 de PostgreSQL para poder conectarse al servidor Odoo.

Primero, detén el servicio de PostgreSQL.

$ sudo systemctl stop postgresql-16

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

$ sudo -u postgres psql

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

postgres=# SHOW hba_file;

Recibirás la siguiente salida.

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

Escribe exit para salir del shell.

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

$ 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 otorga permiso al usuario odoo para conectarse a todas las bases de datos dentro de este servidor. También puedes especificar el nombre de las bases de datos en lugar de usar la palabra clave all.

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

Configurar la dirección de escucha de PostgreSQL

A continuación, necesitamos permitir que el servidor de base de datos escuche conexiones remotas.

Inicia el shell de PostgreSQL y ejecuta el siguiente comando para localizar el archivo de configuración de 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 shell.

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

$ 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 cambiarlo a la dirección IP de tu instancia de Odoo.

listen_addresses = 'localhost, '

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

Habilitar e Iniciar el servicio de PostgreSQL

Dado que nuestra configuración ha terminado, es hora de iniciar el servicio de PostgreSQL.

$ sudo systemctl start postgresql-16    

Paso 4 - Instalar Odoo

Instalar 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 instalar eso primero.

Puedes verificar la versión actualmente disponible primero.

$ python --version
Python 3.9.18

Instala las dependencias requeridas 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 desde el sitio web de Python. En el momento de escribir este tutorial, la última versión 3.10.x disponible es 3.10.14 que es la que utilizamos.

$ 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

Cámbiate al directorio extraído.

$ cd Python-3.10.14

Configura el código fuente.

$ ./configure --enable-optimizations

Instala Python 3.10.14. El comando altinstall se utiliza para que no sobrescriba la versión de Python del sistema.

$ sudo make altinstall

Confirma la instalación.

$ python3.10 -V
O
$ python3.10 --version

Deberías obtener la siguiente salida.

Python 3.10.14

A continuación, necesitamos establecer Python 3.10 como la versión predeterminada de Python. 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 sesión y vuelve a iniciar sesión en la terminal para cambiar a la versión de Python. Ahora puedes usar Python 3.10.14 utilizando python directamente.

Instalar dependencias y Preparar para la instalación

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

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

Instala las dependencias del sistema requeridas 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 de Nodesource para ello.

Agrega el repositorio de 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 usando Node. Si estás utilizando un idioma 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 empaquetado de Wkhtmltopdf en GitHub. La última versión disponible en el momento de escribir este tutorial es 0.12.6.1 r3.

Descarga el RPM de 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

Verifica la versión de wkhtmltopdf instalada.

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

Descargar Archivos de Odoo

Cámbiate al usuario del sistema Odoo.

$ sudo su - odoo

Clona el repositorio de 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 Virtual de Python

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

Para esto, utilizaremos virtualenv.

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

Instalar Dependencias de Python

Instala las dependencias de Python requeridas por Odoo 17.

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

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

Verifica si los requisitos están instalados correctamente comprobando la lista de módulos de 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 de la virtual environment de Python.

$ deactivate

Crear un directorio para complementos de terceros

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

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

$ exit

Paso 5 - Configurar Odoo

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

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

Abre el archivo para editar.

$ sudo nano /etc/odoo.conf

Edita el archivo para que se vea como lo siguiente.

[options]
; Esta es la contraseña que permite operaciones de base de datos:
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

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

La opción admin_passwd es la contraseña que permite 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 se establece en falso ya que se está utilizando el puerto predeterminado de PostgreSQL 5432. Si deseas usar un puerto diferente, necesitarás actualizar este valor.

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

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

La opción addons_path es la ruta predeterminada de los complementos. También puedes agregar una ruta personalizada para los complementos separándolos con comas.

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

La opción default_productivity_apps asegura que las aplicaciones de productividad predeterminadas (a saber, Empleados, Marketing por Correo Electrónico, Proyecto y Encuestas) permanezcan habilitadas. Estas cuatro aplicaciones son las predeterminadas en la Edición Comunitaria de Odoo. En la edición Enterprise, hay aplicaciones de productividad adicionales que pueden habilitarse por defecto que son Citas, Conocimiento, Planificación y Firma.

Crear el servicio de Odoo

Para asegurarnos de que Odoo siga funcionando incluso después de que se reinicie el sistema, necesitamos crear un servicio para ello.

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

$ 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

Reemplaza /home/ con la ubicación que elegiste para instalar el Entorno Virtual de Python.

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

Crear un directorio de registro para Odoo

$ sudo mkdir /var/log/odoo

Establecer permisos de archivo

Establece permisos en el archivo odoo-server.service para que solo los usuarios de Odoo puedan leer 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 de Python, la instalación de Odoo y el directorio de registro.

$ 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 Odoo.

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

Verifica 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 más antigua de Nginx. Necesitas usar el repositorio oficial de Nginx para instalar la última versión.

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

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

Pega el siguiente código en él.

[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

Una vez que hayas terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida. Usaremos la versión principal de Nginx y, por lo tanto, hemos habilitado el repositorio principal en el archivo anterior usando enabled=1 bajo la sección principal en lugar de la estable. Puedes elegir cualquiera de los 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

Verifica 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. Usaremos el instalador de paquetes Snapd para eso. Requiere el repositorio EPEL (Paquetes Adicionales para Linux Empresarial) 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

Usa el siguiente comando para asegurarte de que el comando Certbot pueda ejecutarse creando un enlace simbólico al directorio /usr/bin.

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

Verifica si Certbot está funcionando 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

Verifica 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

Haz una prueba en seco del proceso para verificar si la renovación de SSL está funcionando bien.

$ sudo certbot renew --dry-run

Si no ves errores, estás 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 Odoo.

$ sudo nano /etc/odoo.conf

Agrega las siguientes líneas a él.

xmlrpc_interface = 127.0.0.1
proxy_mode = True

Crea un archivo de configuración de Nginx para Odoo.

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

Pega el código a continuación.

#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;
 }
}

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

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

$ sudo nano /etc/nginx/nginx.conf

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

server_names_hash_bucket_size 64;

Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Prueba la configuración de Nginx.

$ sudo nginx -t

Si no ves errores, significa que estás listo para continuar. Reinicia el servidor Nginx.

$ sudo systemctl restart nginx

Paso 9 - Iniciar Odoo

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

$ sudo systemctl start odoo-server

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

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

Marca el campo Demo Data para poblar la base de datos con datos de muestra. No instales datos de demostración en servidores expuestos a Internet. Las bases de datos con datos de demostración contienen inicios de sesión y contraseñas predeterminadas que pueden ser utilizadas para acceder a tus sistemas y causar problemas significativos, incluso en sistemas de staging/dev. Lo estamos utilizando solo con fines de tutorial.

Haz clic en el botón Crear base de datos para proceder a completar la instalación. La primera vez que creas una base de datos, la página de complementos tardará en cargarse, así que no actualices la página. Serás redirigido automáticamente a la siguiente página de inicio de sesión una vez que se haya creado la base de datos.

Ingresa las credenciales utilizadas en el paso anterior para iniciar sesión en el ERP Odoo y serás llevado a la página del tablero como se muestra a continuación. Estará prellenada con datos de demostración. Si no marcaste la opción de datos de demostración en la página de creación de base de datos, obtendrás un tablero diferente y mucho más limpio.

Puedes comenzar a usar Odoo para gestionar tu negocio desde aquí.

Paso 10 - Actualizar Odoo

Detén el servidor Odoo.

$ sudo systemctl stop odoo-server

Cámbiate al usuario del sistema Odoo.

$ sudo su - odoo

Obtén el último código fuente de GitHub.

$ git fetch
$ git rebase --autostash

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

Si deseas descartar los cambios en conflicto, puedes ejecutar el siguiente comando para restablecer el código fuente.

$ git reset --hard

Activa el entorno virtual de Python.

$ source odoo-env/bin/activate

Instala las dependencias de Python.

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

Sal del entorno virtual de Python.

$ deactivate

Inicia el servidor Odoo.

$ sudo systemctl start odoo-server

Paso 11 - Asegurar Odoo usando Fail2Ban

Este paso es opcional, pero si tienes Fail2Ban instalado, puedes agregar configuración para Odoo para protegerlo.

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

$ 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

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

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

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

Pega el siguiente código en él.

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

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

Reinicia Fail2Ban.

$ sudo systemctl restart fail2ban

Conclusión

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

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.