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
- Un servidor Rocky Linux 9 con un mínimo de 2GB de RAM para alojar Odoo Stack.
- 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.
- 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.
- Mantén tus sistemas actualizados.
$ sudo dnf update - Un usuario no root con privilegios sudo en ambos servidores.
- Fail2Ban debe estar instalado. Este paso es opcional. Puedes seguir nuestra guía sobre cómo instalar Fail2Ban en Rocky Linux para lo mismo.
- SELinux debe estar deshabilitado.
- Algunos paquetes que tus sistemas necesitan. Algunos de estos paquetes pueden ya estar instalados en tu sistema.
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
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
runningEl 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-allDeberí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=httpsVerifica 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}/tcpHaz que todos los cambios sean permanentes y recarga el firewall para habilitar los cambios.
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reloadPaso 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.comEstablece el nombre de host en el servidor PostgreSQL utilizando el siguiente comando.
$ sudo hostnamectl set-hostname postgresql.yourdomain.comEn el servidor Odoo, abre el archivo /etc/hosts.
$ sudo nano /etc/hostsAsegú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 postgresqlEn 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 odooPresiona 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.rpmDesactiva el módulo de PostgreSQL incorporado.
$ sudo dnf -qy module disable postgresqlInstala PostgreSQL 16.
$ sudo dnf install -y postgresql16-server postgresql16-contribInicializa la base de datos.
$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdbHabilita e inicia el servicio de PostgreSQL.
$ sudo systemctl enable postgresql-16
$ sudo systemctl start postgresql-16Verifica el estado del servicio.
$ sudo systemctl status postgresql-16Deberí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 -dPLa 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-16Para 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 psqlEjecuta 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.confPega la siguiente línea al final.
host all odoo odoo.yourdomain.com scram-sha-256Esta 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.confCambia 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.18Instala 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-develDescarga 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.tgzExtrae el archivo.
$ tar xzf Python-3.10.14.tgzCámbiate al directorio extraído.
$ cd Python-3.10.14Configura el código fuente.
$ ./configure --enable-optimizationsInstala Python 3.10.14. El comando altinstall se utiliza para que no sobrescriba la versión de Python del sistema.
$ sudo make altinstallConfirma la instalación.
$ python3.10 -V
O
$ python3.10 --versionDeberías obtener la siguiente salida.
Python 3.10.14A 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 2Para ver las versiones de Python disponibles, utiliza el siguiente comando.
$ sudo update-alternatives --config python3Deberí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 odooInstala 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-develInstala 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 nodejsConfirma la versión de Node.
$ node --version
v20.12.1Instala 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 rtlcssInstala 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.rpmInstala las fuentes requeridas por Wkhtmltopdf.
$ sudo dnf install xorg-x11-fonts-75dpi.noarch xorg-x11-fonts-Type1.noarchInstala Wkhtmltopdf.
$ sudo rpm -i wkhtmltox-0.12.6.1-3.almalinux9.x86_64.rpmVerifica 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 - odooClona el repositorio de Github de Odoo en tu sistema.
$ git clone https://github.com/odoo/odoo.git --depth 1 --branch 17.0 --single-branchPara 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.
- Crea un nuevo entorno
virtualenvpara Odoo.$ python3 -m venv odoo-env - 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 - Actualiza PIP por si acaso.
(odoo-env) $ pip3 install --upgrade pip - 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.txtLos 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.2Sal de la virtual environment de Python.
$ deactivateCrear un directorio para complementos de terceros
$ mkdir /opt/odoo/odoo/custom-addonsEste directorio debe ser agregado al parámetro addons_path que define los directorios donde Odoo busca módulos. Sal del usuario del sistema Odoo.
$ exitPaso 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.confAbre el archivo para editar.
$ sudo nano /etc/odoo.confEdita 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 = TruePresiona 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.servicePega 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.targetReemplaza /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/odooEstablecer 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.serviceEstablece 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/odooRestringe el archivo de configuración de Odoo.
$ sudo chown odoo: /etc/odoo.conf
$ sudo chmod 640 /etc/odoo.confIniciar el servidor Odoo
Inicia y habilita el servidor Odoo.
$ sudo systemctl start odoo-server
$ sudo systemctl enable odoo-serverVerifica 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.repoPega 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=trueUna 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 nginxVerifica la instalación.
$ nginx -v
nginx version: nginx/1.25.4Habilita e inicia el servicio del servidor Nginx.
$ sudo systemctl enable nginx --nowVerifica 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-releaseRocky Linux 9 no viene con Snapd instalado. Instala el paquete Snapd.
$ sudo dnf install -y snapdHabilita e inicia el servicio Snap.
$ sudo systemctl enable snapd --nowInstala el paquete Snap core y asegúrate de que tu versión de Snapd esté actualizada.
$ sudo snap install core
$ sudo snap refresh coreCrea 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.shInstala Certbot.
$ sudo snap install --classic certbotUsa 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/certbotVerifica si Certbot está funcionando correctamente.
$ certbot --version
certbot 2.10.0Genera 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.comGenera un certificado de intercambio de claves Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Verifica el servicio programador de renovación de Certbot.
$ sudo systemctl list-timersEncontrará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.serviceHaz una prueba en seco del proceso para verificar si la renovación de SSL está funcionando bien.
$ sudo certbot renew --dry-runSi 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-serverAbre el archivo de configuración del servidor Odoo.
$ sudo nano /etc/odoo.confAgrega las siguientes líneas a él.
xmlrpc_interface = 127.0.0.1
proxy_mode = TrueCrea un archivo de configuración de Nginx para Odoo.
$ sudo nano /etc/nginx/conf.d/odoo.confPega 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.confAgrega 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 -tSi no ves errores, significa que estás listo para continuar. Reinicia el servidor Nginx.
$ sudo systemctl restart nginxPaso 9 - Iniciar Odoo
Podemos iniciar el servidor Odoo nuevamente después de que todo esté configurado.
$ sudo systemctl start odoo-serverLanza Odoo en tu navegador a través de https://odoo.yourdomain.com. En tu navegador, abre la URL http:// 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-serverCámbiate al usuario del sistema Odoo.
$ sudo su - odooObtén el último código fuente de GitHub.
$ git fetch
$ git rebase --autostashEl 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 --hardActiva el entorno virtual de Python.
$ source odoo-env/bin/activateInstala las dependencias de Python.
$ pip3 install -r /opt/odoo/odoo/requirements.txtSal del entorno virtual de Python.
$ deactivateInicia el servidor Odoo.
$ sudo systemctl start odoo-serverPaso 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.confPega 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 herePresiona 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.confPega 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 fail2banConclusió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.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.