[Tutoriales] Instalando odoo 12 en CentOS 7 Paso a Paso

El siguiente tutorial busca mostrarle paso a paso como instalar odoo 12 en un servidor linux CentOS 7.x con un nombre de dominio o sub-dominio personalizado utilizando nginx como Reverse Proxy con un certificado SSL provisto por Let's Encrypt para proveer una conexión segura a su servicio.

Prerequisitos

  • Máquina Virtual o Servidor Dedicado con Linux (CentOS 7)
  • Permiso root
  • Un dominio o sub-dominio que apunte a la dirección IP de su servidor.
  • Disponer de los puertos 80 y 443 habilitados.

Hemos preparado este tutorial utilizando una máquina virtual con CentOS Linux release 7.6 (Core).

Instalación

Para iniciar la instalación de odoo 12 en CentOS 7 de forma correcta procederemos con los siguientes pasos:

1. Instalar Python 3.6 y las dependencias de odoo

Para instalar Python 3.6 en CentOS 7, se requiere del repositorio de Extra Packages for Enterprise (EPEL) 1 y Software Collections (SCL) 2. Al habilitar estas librerías tendremos acceso a nuevas versiones de servicios y lenguajes de programación no disponibles a través del repositorio base del Sistema Operativo.

Instalación de los Repositorios

Para habilitar los repositorios de EPEL 1 y SCL 2 ejecutamos el siguiente comando:

sudo yum install -y epel-release centos-release-scl

Instalación de los Paquetes Fuentes

Luego de completada la instalación de los repositorios, podremos instalar Python 3.6 junto a todas las herramientas necesarias para construir las dependencias de odoo:

sudo yum install -y rh-python36 git gcc wget nodejs-less libxslt-devel bzip2-devel openldap-devel libjpeg-devel freetype-devel

Durante el proceso de instalación, al utilizar paquetes de los repositorios instalados de forma reciente y descargar archivos de estos repositorios por primera vez, el sistema le solicitará autorización para aceptar las llaves GPG 3 de los servidores remotos, lo cual le permitirá acceder a la información publicada en estos repositorios:

...
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
Importing GPG key 0xF2EE9D55:
 Userid     : "CentOS SoftwareCollections SIG (https://wiki.centos.org/SpecialInterestGroup/SCLo) <security@centos.org>"
 Fingerprint: c4db d535 b1fb ba14 f8ba 64a8 4eb8 4e71 f2ee 9d55
 Package    : centos-release-scl-rh-2-3.el7.centos.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
Is this ok [y/N]: y
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-11.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Is this ok [y/N]: y

Escriba y y presione enter para aceptar las llaves y continuar.

2. Crear el Usuario de Sistema de odoo

Según el formato de conexión establecido con el servicio de PostgreSQL, necesitaremos un Usuario de Sistema que posea los permisos necesarios para ejecutar odoo y conectarse con la base de datos. Para evitar conflictos de permisos durante el proceso de instalación, crearemos un Usuario de Sistema que será utilizado en todo el proceso de instalación de odoo y el cuál será el usuario por defecto a utilizar para conectar la base de datos. Para crear este usuario utilizaremos el siguiente comando:

sudo useradd -m -U -r -d /opt/odoo12 -s /bin/bash odoo_user
Puede colocar el nombre que desee como Nombre de Usuario (En este ejemplo odoo_user), pero recuerde que deberá utilizar el mismo como nombre del usuario del servicio de PostgreSQL y archivos de configuración relacionados.

Opcional - Tips de Seguridad

Puede establecer una contraseña para este usuario utilizando el siguiente comando:

sudo passwd odoo_user

La consola le solicitará que coloque una contraseña segura para el usuario. Esta contraseña debe ser colocada dos veces para confirmar que es correcta.

3. Instalar y Configurar PostgreSQL

Hasta el momento de publicación de este tutorial no ha sido publicada de forma oficial en el repositorio de CentOS 7.6 una versión de PostgreSQL compatible con odoo 12. Por esta razón instalaremos PostgreSQL a través del repositorio oficial de la organización.

Instalación del Repositorio Oficial de PostgreSQL

Para instalar este repositorio procedemos ejecutar el siguiente comando:

sudo yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm

Instalación del Servicio

Completada la instalación del repositorio, procedemos a instalar PostgreSQL Server:

sudo yum install -y postgresql10-server postgresql10-devel

Al igual que el Paso 2, al instalar un nuevo repositorio, el sistema le solicitará aceptar las llaves GPG 3 de los servidores remotos:

...
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
Importing GPG key 0x442DF0F8:
 Userid     : "PostgreSQL RPM Building Project <pgsqlrpms-hackers@pgfoundry.org>"
 Fingerprint: 68c9 e2b9 1a37 d136 fe74 d176 1f16 d2e1 442d f0f8
 Package    : pgdg-redhat-repo-42.0-4.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
Is this ok [y/N]: y

Escriba y y presione enter para aceptar las llaves y continuar.

Iniciación y Configuración del Servicio

Iniciamos la base de datos a través del siguiente comando:

sudo /usr/pgsql-10/bin/postgresql-10-setup initdb

Si la inicialización se completa correctamente deberá recibir el siguiente mensaje:

Initializing database ... OK

Una vez finalizada la inicialización procedemos a habilitar el servicio de PostgreSQL. Si no está familiarizado con el termino, "habilitar un servicio" en Linux corresponde a añadir dicho servicio en la Lista de Servicios del Sistema, la cuál asegura que el servicio sea restablecido cada vez que iniciemos o re-iniciemos el sistema:

‌sudo systemctl enable postgresql-10
sudo systemctl start postgresql-10

Creación del usuario PostgreSQL de odoo

Procedemos a crear el usuario de Base de Datos con el mismo nombre del Usuario de Sistema creado anteriormente en el Paso 2:

sudo su - postgres -c "createuser -s odoo_user"
Recuerde utilizar el mismo nombre de Usuario de Sistema creado en el Paso 2.

4. Instalar WKHTMLtoPDF

wkhtmltopdf es una paquete Open Source que permite convertir documentos HTML a PDF a través de la línea de comandos. odoo necesita de esta aplicación para poder imprimir Reportes PDF. La versión recomendada por odoo es la 0.12.1. Esta versión se encuentra disponible en el repositorio base.

Opcional - Validar versión existente

Si desea conocer la versión de wkhtmltopdf disponible en los repositorios del sistema, puede ejecutar el siguiente comando:

sudo yum info wkhtmltopdf.x86_64

Para instalar la aplicación procedemos a ejecutar el siguiente comando:

sudo yum install -y wkhtmltopdf.x86_64

Update: 24 de Octubre de 2019

IMPORTANTE: Hemos identificado un problema relacionado a la librería nativa de wkhtmltopdf del repositorio de CentOS y algunas instalaciones de Odoo. Si presentas problemas a la hora de generar archivos PDF (Si los mismos se generan vacios o corruptos) te recomendamos seguir los siguientes pasos para reinstalar la librería y corregir el problema.

Descargamos la aplicación en el directorio home del usuario:

wget -P ~/. https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.1/wkhtmltox-0.12.1_linux-centos7-amd64.rpm

Procedemos a reinstalar la librería a través del siguiente comando:

sudo yum localinstall ~/wkhtmltox-0.12.1_linux-centos7-amd64.rpm

Con estos pasos hemos reinstalado correctamente la librería. Si su problema estaba relacionado a este inconveniente, su instalación de Odoo debería exportar correctamente los archivos PDF.

5. Instalar y Configurar odoo

Para iniciar con el proceso de instalación de odoo de forma correcta debemos iniciar sesión con el Usuario de Sistema creado en el Paso 2 de este tutorial. Para realizar esta acción procedemos a ejecutar el siguiente comando:

sudo su - odoo_user

Copia del Repositorio

Procedemos a clonar el código fuente de odoo 12 desde el repositorio de odoo en GitHub a traves del siguiente comando:

git clone https://www.github.com/odoo/odoo --depth 1 --branch 12.0 /opt/odoo12/odoo

Esta acción iniciará el proceso de copia que demorará de 1 a varios minutos dependiendo de su velocidad de internet.

Habilitando y Configurando Python

Procedemos a habilitar la colección de software requerida para acceder a la versión de los binarios de Python 3.6:

scl enable rh-python36 bash

Procedemos a movernos a la ruta donde hemos copiado los archivos fuentes de odoo y donde realizaremos la instalación:

cd /opt/odoo12

Creamos un nuevo ambiente de Python 3 para disponer de las librerías requeridas en los próximos pasos:

python3 -m venv venv

Procedemos a activar el ambiente:

source venv/bin/activate

Tips de Seguridad

Puede confirmar que el ambiente fue activado correctamente si ve que su línea de comandos a cambiado al siguiente formato:

(venv) [odoo12@erp ~]$

Iniciando la instalación de pre-requisitos de Python

Procedemos a instalar todos los módulos de Python requeridos a través del siguiente comando:

(venv) [odoo12@erp ~]$ pip3 install -r odoo/requirements.txt

Este proceso iniciará la descarga e instalación de los módulos de Python requeridos para la instalación de odoo. Este proceso es riguroso y podrá demorar de 3 a 15 minutos dependiendo de los recursos de su equipo.

Si encuentra algún error de compilación durante el proceso de instalación de los pre-requisitos, asegure el haber instalado todas dependencias requeridas listadas en el Paso 1.

Si su instalación fue completada correctamente deberá ver el siguiente mensaje:

...
Successfully installed Babel-2.3.4 Jinja2-2.10.1 ...
...

Una vez completado todo este proceso, procedemos a desactivar el ambiente de Python 3 a través del siguiente comando:

(venv) [odoo12@erp ~]$ deactivate

Creación de Directorio para Custom Addons

Antes de cerrar la sesión del usuario odoo_user, procedemos a crear una carpeta para componentes personalizados:

mkdir /opt/odoo12/odoo-custom-addons

A partir de este punto necesitaremos volver al usuario con privilegios root para completar la instalación, por lo que ejecutaremos el siguiente comando para volver al usuario anterior:

exit

Creación del Archivo de Configuración de odoo

A continuación, abrimos el editor de su preferencia (En nuestro caso VIM) y creamos el siguiente archivo de configuración:

sudo vim /etc/odoo12.conf

Editamos y colocamos la siguiente información:

[options]
admin_passwd = password_superadmin (Debe cambiar este valor por una contraseña segura.)
db_host = False
db_port = False
db_user = odoo_user (Nombre del Usuario de Sistema del Paso 2)
db_password = False
addons_path = /opt/odoo12/odoo/addons, /opt/odoo12/odoo-custom-addons

; Configuraciones de Seguridad
; xmlrpc_interface = 127.0.0.1
; netrpc_interface = 127.0.0.1

; Tweaks de Performance (Estas configuraciones serán explicadas en lo adelante. Este ejemplo corresponde a un servidor con 2 Cores y 2 GB de memoria.)
limit_memory_hard = 1610612736
limit_memory_soft = 1288490189
limit_request = 8192
limit_time_cpu = 600
limit_time_real = 1200
max_cron_threads = 1
workers = 5
La información colocada entre paréntesis () no es parte del archivo de configuración.

Guarde los cambios realizados y cierre el archivo.

6. Crear el Archivo de Servicio (systemd unit file)

Para poder ejecutar odoo como servicio, es necesario crear un archivo de servicio.

Para esto abrimos el editor de su preferencia (En nuestro caso VIM) y creamos el siguiente archivo de configuración en la ruta /etc/systemd/system/:

sudo vim /etc/systemd/system/odoo12.service 

Colocamos la siguiente información:

[Unit]
Description=Odoo12
Requires=postgresql-10.service
After=network.target postgresql-10.service

[Service]
Type=simple
SyslogIdentifier=odoo12 (Nombre del Usuario de Sistema creado en el Paso 2.)
PermissionsStartOnly=true
User=odoo_user (Nombre del Usuario de Sistema creado en el Paso 2.)
Group=odoo_user (Nombre del Usuario de Sistema creado en el Paso 2.)
ExecStart=/usr/bin/scl enable rh-python36 -- /opt/odoo12/venv/bin/python3 /opt/odoo12/odoo/odoo-bin -c /etc/odoo12.conf
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target
La información colocada entre paréntesis () no es parte del archivo de configuración.

Guarde los cambios realizados y cierre el archivo.

Notificando al Sistema

Al crear un nuevo archivo de configuración debemos actualizar el sistema para que identifique los cambios. Podemos realizar esta acción ejecutando el siguiente comando:

sudo systemctl daemon-reload 

Habilitando e Iniciando odoo

Procedemos a habilitar e iniciar el servicio de odoo:

sudo systemctl enable odoo12 
Sudo systemctl start odoo12

Tips para Validación del Servicio

Si desea conocer el estatus del servicio puede proceder con el siguiente comando:

sudo systemctl status odoo12 

Si desea conocer la información guardada en el sistema al momento de iniciar el servicio de odoo, puede ejecutar el siguiente comando:

sudo journalctl -u odoo12 

7. Probar la instalación

Para probar su instalación de forma remota debe asegurar que el puerto 8069 se encuentre desbloqueado en su firewall.

Abra su explorador y presione:

http://<IP_del_Servidor>:8069

Si puede ver la siguiente pantalla, su instalación ha sido realizada correctamente.

Si ha validado que el servicio de odoo se encuentra funcionando y tiene acceso a los puertos 80 y 443 pero no puede habilitar el puerto 8069, entonces proceda con los próximos pasos.

8. Instalar y Configurar Nginx

Para configurar un nombre de dominio personalizado a nuestra instalación de odoo, requeriremos de un servidor web que pueda funcione como Reverse Proxy entre el cliente y el servicio de odoo.

Para esto utilizaremos Nginx, un servidor HTTP de alto desempeño y Reverse Proxy responsable de administrar la carga de algunos de los sítios web más grandes del internet.

Para instalar Nginx en nuestro servidor procedemos a ejecutar el siguiente comando:

sudo yum install -y nginx 

Habilitando e Iniciando el Servidor Web

Procedemos a habilitar e iniciar el servicio de Nginx:

sudo systemctl enable nginx 
Sudo systemctl start nginx

Tips - Validando el Servicio

Si desea conocer el estatus del servicio puede proceder con el siguiente comando:

sudo systemctl status nginx

Confirmando la Instalación

Puede validar la instalación accediendo a la dirección web http://<IP_del_Servidor> en un explorador de su preferencia. Si la instalación fue realizada correctamente, deberá ver una página similar a la siguiente:

9. Habilitar Let's Encrypt

Let's Encrypt es una autoridad de certificación libre y abierta desarrollada por Internet Security Research Group (ISRG). Los certificados emitidos por Let's Encrypt son avalados por casi todos los exploradores existentes hoy en día.

Con Let's Encrypt podremos generar un certificado SSL con el cual podremos acceder de forma segura a nuestro servicio de odoo a través del protocolo SSL.

Para obtener un certificado de Let's Encrypt, necesitaremos instalar la herramienta de gestión certbot en nuestro servidor. Para esto procedemos a ejecutar el siguiente comando:

sudo yum install -y certbot 

Generando una Llave de Intercambio Segura

Para este proceso vamos a generar una llave de intercambio bajo el proceso de encriptación de Diffie-Hellman (DH). Este es un método de intercambio criptográfico seguro sobre un canal de comunicación inseguro.

Para generar una llave de encriptación de 2048 bits DH, debemos ejecutar el siguiente comando:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Puede generar una llave aun más segura cambiando el tamaño a 4096 bits, pero debe saber que este proceso puede durar más de 30 minutos dependiendo de la entropía de su servidor.

Configurando el Directorio de Certificados

Para obtener un certificado SSL para nuestro dominio, tendremos que habilitar un plugin de Nginx en nuestra dirección raíz que genere un archivo temporal que nos permita validar el dominio en el directorio ${webroot-path}/.well-known/acme-challenge.

Para simplificar el proceso validación, vamos a redireccionar todas las llamadas HTTP de .well-known/acme-challenge a un solo directorio llamado /var/lib/letsencrypt/.

Para crear el directorio y asignar los permisos de lugar en nuestro Servidor Nginx, procedemos con los siguientes comandos:

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt 

Creando Fragmentos reutilizables (Snippets)

Para evitar duplicar información, crearemos los siguientes fragmentos que podremos incluir en todos nuestros bloques de dominio del servidor Nginx.

Primero crearemos la carpeta donde publicaremos nuestros fragmentos:

sudo mkdir /etc/nginx/snippets 

Ahora procedemos a crear nuestro primer fragmento. Para esto abrimos el editor de su preferencia (En nuestro caso VIM) y creamos el siguiente archivo de configuración en la ruta /etc/nginx/snippets/:

sudo vim /etc/nginx/snippets/letsencrypt.conf

Colocamos la siguiente información:

location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

Guardamos los cambios realizados y cerramos el archivo.

De inmediato procedemos a crear nuestro segundo fragmento. Para esto abrimos el editor de su preferencia (En nuestro caso VIM) y creamos el siguiente archivo de configuración en la misma ruta:

sudo vim /etc/nginx/snippets/ssl.conf

Colocamos la siguiente información:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;

add_header Strict-Transport-Security max-age=15768000;

proxy_read_timeout 720s;
proxy_connect_timeout 720s;
proxy_send_timeout 720s;
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;

Guardamos los cambios realizados y cerramos el archivo.

Configurando los Bloques de Dominio

Luego de crear los fragmentos, editamos el archivo de configuración del bloque de dominio que deseamos modificar e incluimos el fragmento correspondiente a la configuración de Let's Encrypt (snippets/letsencrypt.conf), en este caso utilizaremos el dominio ejemplo.com.

Para crear un archivo de configuración de este dominio procedemos a utilizar el editor de su preferencia (En nuestro caso VIM) y creamos el archivo en la ruta /etc/nginx/conf.d/:

sudo vim /etc/nginx/conf.d/ejemplo.com.conf

Colocamos la siguiente información:

server{
    listen 80;
    server_name: ejemplo.com www.ejemplo.com;
    
    include snippets/letsencrypt.conf;
}

Tips - Chequeo de Configuración de Nginx

Puede validar la integridad de los archivos de configuración de Nginx a través del siguiente comando:

nginx -t

Si el archivo no posee errores recibirá el siguiente mensaje:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Cerramos y guardamos el archivo y procedemos de inmediato a actualizar el servidor web (Nginx) para que se apliquen los cambios:

sudo systemctl reload nginx

Generando el Certificado SSL

Antes de ejecutar el comando de certbot que genera el certificado del dominio configurado, vamos a ejecutar el comando en modo de prueba para asegurar que nuestra configuración se encuentre correcta y no agotar la cuota de ejecución.

Ejecutar el siguiente comando de prueba:

certbot certonly --agree-tos --email info@ejemplo.com --webroot -w /var/lib/letsencrypt/ -d ejemplo.com --dry-run

Si el proceso se completó correctamente deberá recibir el siguiente mensaje:

...
IMPORTANT NOTES:
 - The dry run was successful.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

El parámetro --dry-run es el responsable de ejecutar el comando en modo de prueba. Si el proceso anterior finalizó correctamente, solo debe ejecutar el comando anterior sin el parámetro --dry-run:

certbot certonly --agree-tos --email info@ejemplo.com --webroot -w /var/lib/letsencrypt/ -d ejemplo.com

Durante el proceso de validación se ejecutará la pregunta de si desea compartir su correo electrónico:

...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
...

Presione y si desea compartirlo, o n en caso contrario.

Si su proceso fue completado correctamente deberá recibir el siguiente mensaje:

...
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ejemplo.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ejemplo.com/privkey.pem
   Your cert will expire on 2019-12-08. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Configurando el Bloque de Dominio con el nuevo Certificado

Ahora que existen los archivos de certificado (puede validarlos en la ruta /etc/letsencrypt/live/nombre_de_dominio), podemos editar el archivo de bloque de dominio creado anteriormente con el editor de su preferencia (En nuestro caso VIM) en la ruta /etc/nginx/conf.d/:

sudo vim /etc/nginx/conf.d/ejemplo.com.conf

Modificamos el archivo para que posea el siguiente formato:

server {
        listen 80;
        server_name ejemplo.com www.ejemplo.com;

        include snippets/letsencrypt.conf;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl http2;
        server_name www.ejemplo.com;

        ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/ejemplo.com/chain.pem;

        include snippets/ssl.conf;
        include snippets/letsencrypt.conf;
        
        return 301 https://ejemplo.com$request_uri;
}

server {
        listen 443 ssl http2;
        server_name ejemplo.com;

        ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/ejemplo.com/chain.pem;

        include snippets/ssl.conf;
        include snippets/letsencrypt.conf;
}
La configuración anterior redirecciona todo el tráfico no seguro (http) y el dominio www.ejemplo.com al dominio ejemplo.com bajo un tráfico seguro (https).

Guardamos y cerramos el archivo de configuración y procedemos a validar que el mismo no esté corrompido a través del siguiente comando de Nginx:

nginx -t

Si el archivo no posee errores recibirá el siguiente mensaje:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si el paso anterior se ejecutó correctamente, procedemos a reiniciar el servidor web con el siguiente comando:

sudo systemctl reload nginx

Probando la Instalación

Puede validar la instalación accediendo a la dirección web https://IP_Servidor en un explorador de su preferencia. Si la instalación fue realizada correctamente, deberá ver un candado en la barra de dominio del explorador.

Auto renovando el certificado Let's Encrypt (Cron job)

Los certificados Let's Encrypt son válidos por un período de 90 días. Para renovar un certificado existente de forma automática antes de que los mismos expiren, necesitaremos crear un cronjob que se ejecute 2 veces al día, el cual renovará cualquier certificado próximo a expirar 30 días antes de que se cumpla el plazo.

Para crear el cronjob que ejecuta esta tarea, procedemos a ejecutar el siguiente comando:

sudo crontab -e

Este comando abrirá el editor por defecto con el archivo cron del usuario. En este documento colocaremos la siguiente línea:

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"

Guardamos y cerramos el archivo para actualizar el archivo cron.

Validaremos que hemos guardado correctamente la configuración ejecutando el siguiente comando:

sudo crontab -l 

Si la consola retorna el comando colocado en la línea publicada, la configuración fue guardada correctamente.

Probando la renovación del certificado

Si desea validar que el proceso de validación no retornará errores, puede ejecutar el siguiente comando:

sudo certbot renew --dry-run

El siguiente mensaje confirma que el proceso funcionará correctamente:

...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

10. Habilitando Nginx como Reverse Proxy para odoo

Ya completados todos los pasos anteriores, tendremos todos los prerequesitos necesarios para habilitar Nginx como Reverse Proxy para odoo.

Utilizar un Reverse Proxy nos proporciona un sin número de beneficios tales como posibilidad de colocar Balanceadores de Carga, Caching, Compresión, Servir contenido Estático y mucho más.

En este proceso habilitaremos SSL, Redirección del Contenido HTTP a HTTPS, almacenamiento en caché de archivos estáticos y compresión GZip.

El procedimiento de configuración solo consiste en modificar el Bloque de Dominio creado en el Paso 9 y agregar los valores necesarios para cambiar el comportamiento de Nginx.

Configurando el Bloque de Dominio

Procedemos a editar el archivo de bloque de dominio creado anteriormente con el editor de su preferencia (En nuestro caso VIM) en la ruta /etc/nginx/conf.d/:

sudo vim /etc/nginx/conf.d/ejemplo.com.conf

Modificamos el archivo para que posea el siguiente formato:

; Al tope del archivo
upstream odoo {
 server 127.0.0.1:8069;
}

upstream odoo-chat {
 server 127.0.0.1:8072;
}

; Modificamos los bloques ya existentes
server {
        listen 80;
        server_name erp.suplidom.com;

        include snippets/letsencrypt.conf;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl http2;
        server_name erp.suplidom.com;

        ssl_certificate /etc/letsencrypt/live/erp.suplidom.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/erp.suplidom.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/erp.suplidom.com/chain.pem;

        include snippets/ssl.conf;
        include snippets/letsencrypt.conf;
        
        ; Nuevo contenido
        access_log /var/log/nginx/ejemplo.com-access.log;
        error_log /var/log/nginx/ejemplo.com-error.log;
        
        location / {
            proxy_redirect off;
            proxy_pass http://odoo;
        }
        
        location /longpolling {
            proxy_pass http://odoo-chat;
        }
        
        location ~* /web/static/ {
            proxy_cache_valid 200 90m;
            proxy_buffering on;
            expires 864000;
            proxy_pass http://odoo;
        }
        
        gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
        gzip on;
}
Tips: Si utiliza VIM para modificar el archivo de bloque de dominio, puede reemplazar el dominio ejemplo.com con su dominio real utilizando el siguiente comando: :%s/ejemplo.com/nuevo_dominio.com/gi.

Guardamos los cambios y cerramos el archivo de configuración.

Tips - Chequeo de Configuración de Nginx

Puede validar la integridad de los archivos de configuración de Nginx a través del siguiente comando:

nginx -t

Si el archivo no posee errores recibirá el siguiente mensaje:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si el paso anterior se ejecutó correctamente, procedemos a reiniciar el servidor web con el siguiente comando:

sudo systemctl reload nginx

Al actualizar el servicio, procedemos a visitar el dominio o subdominio a través de su explorador de preferencia.

Si puede visualizar la pantalla de configuración de base de datos, ¡FELICIDADES!, has instalado correctamente odoo 12 en CentOS 7.x.

Troubleshooting (Solución de Problemas)

  1. Al visitar el dominio recibo un error 502 Bad Gateway

    Si recibe este error al visitar el dominio o subdominio configurado, procedemos a revisar el log del servicio a través del comando tail -5 /var/log/nginx/erp.suplidom.com/ejemplo.com-error.conf. Si los resultados mostrados muestran el siguiente tipo de error: [crit] [####]#0: *1 connect() to 127.0.0.1:8069 failed (13: Permission denied) while connecting to upstream,..., debe habilitar los permisos de lugar en el Sistema Operativo a través del siguiente comando: sudo setsebool -P httpd_can_network_connect 1. Luego de esto su servicio deberá restablecerse.

¡Bonus! - A Publicar en los Próximos días

- Completando la configuración Inicial

- Habilitando Multiprocessing

- Otros Errores conocidos.


  1. EPEL: Acrónimo del término inglés Extra Packages for for Enterprise, corresponden a un grupo de interés especial de paquetes de alta calidad para Linux Empresarial creado y mantenido por el proyecto Fedora. Para más información visite https://fedoraproject.org/wiki/EPEL/es ↩︎

  2. SCL: Acrónimo del término inglés Software Collections, corresponde a una colección de paquetes de software 'add-on' creado y mantenido por Red Hat. Visite el website de Software Collection en el siguiente enlace: https://www.softwarecollections.org/en/scls/ ↩︎

  3. GPG: Acrónimo de GNU Privacy Guard, corresponde a una implementación completa y gratuita del estándar de comunicación OpenPGP definido en el estándar RFC4880. GnuPG permite encriptar y firmar información y comunicaciones. Visite el website de GnuPG a través del siguiente enlace: https://gnupg.org/ ↩︎