domingo, 24 de diciembre de 2023

ODOO (IV) : Instalando el proxy Nginx con docker

0. Introducción

consultar: Daniel Nery 

Para aumentar la eficiencia de Odoo se va a colocar un servidor web como Nginx para descargar el caché, comprimir y servir ficheros estáticos. Para ello se instalará Nginx y se configurará com "reverse proxy".

NOTA: Esto permite que Nginx pase las peticiones a varios servidores, repartiendo la carga y permitiendo escalar la infraestructura

1. Parar el servicio de apache2 en nuestro ubuntu

Hay que tener en cuenta que el servicio apache2 de nuestra máquina ubuntu suele estar en marcha y ocupa el puerto 80, cosa que puede impedir que funcione nuestro servicio nginx. para pararlo y ver el estado de dicho servicio:

#1. Parar el servicio
sudo systemctl stop apache2

#2. Ver el estado del servicio
sudo systemctl status apache2

Vamos a un navegador y teclemaos http://localhost:80 y no tendria que aparecer nadfa

2. Conseguir los certificados

En este caso disponemos de un certificado en formato pkcs#12 (extension ".p12"). Parece ser que Nginx prefiere tener el certificado en ficheros, uno con extensión ".crt" y otro, la clave , con extensión ".key". 

Para convertir de format pkcs#12 al último formato ejecutamos:

#1. Extract certificate in crt format
openssl pkcs12 -in ./MyCert.p12 -clcerts -nokeys -out wildcard2023Nginx.crt

#2. Extract key in rsa format
openssl pkcs12 -in ./MyCert.p12 -nocerts -nodes  -out wildcard2023Nginx.rsa

En este caso, el nombre se debe a que es un certificado wildcard que valida cualquier ordenador con el dominio "poblacion.es", como por ejemplo "odoo.poblacion.es" . En el proceso anterior nos pide la contraseña, por tanto ya tenemos este par de certificado y clave:

  • wildcard2023Nginx.crt y 
  • wildcard2023Nginx.rsa

3. Crear la estructura de carpetas


nginx
   └>nginx-certs    para certificados
   └>nginx-conf     solo para guardar un fichero de configuración (odoo-nginx.conf)

4. Guardar los certificados en la carpeta nginx/certs

Se guardarán el certificado crt y clave rsda en la carpeta nginx/certs

5. Crear el fichero de configuración nginx/odoo-nginx.conf

Que tendrá este contenido. OJO los nombres del host se obtienen del partado aliases: que hay en el apartado network de cada servicio en el fichero docker-compose.yml.


Ojo: Se repite lo mismo tanto para el pueto 80 como el 443

server { listen 80; server_name nginx_host; # 2.1.3 nombre del servidor (Utilizamos VS Code y analizamos la red location / { proxy_pass http://odoo:8069; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.well-known/acme-challenge { allow all; root /var/www/certbot; default_type "text/plain"; try_files $uri =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

#--------------------------------------------------
# REPETIMOS LOS MISMO PARA EL PUERTO https (443)
#--------------------------------------------------

server { # 2.1.1 puerto listen 443 ssl; # 2.1.2 certificados obtenidos en el punto 2 ssl_certificate /etc/nginx/certs/wildcard2023Nginx.crt; ssl_certificate_key /etc/nginx/certs/wildcard2023Nginx.rsa; # 2.1.3 nombre del servidor (Utilizamos VS Code y analizamos la red server_name nginx_host; # Obtenido del fichero docker-compose.yml apartado nginx.networks.odoo_network.aliases location / { proxy_pass http://odoo:8069; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.well-known/acme-challenge { allow all; root /var/www/certbot; default_type "text/plain"; try_files $uri =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }


6. Crear el fichero docker-compose.yml en la carpeta del post anterior

Que tendrá este contenido y  sustituirá al anterior docker-compose.yml y tendrá contenido único

version: '3'
services:
odoo:
container_name: odoo16_bo
image: odoo:16.0
env_file: odoo16_pg13.env # environment file
depends_on:
- postgresql
ports:
- "7069:8069" #port mapping(custom-port:8069)
volumes:
- ./odoo-data:/var/lib/odoo/:rw
- ./odoo-conf:/etc/odoo/:rw
- ./odoo-adds:/odoo/extra-addons/:rw #SAME AS odoo.conf addons_path
networks:
- odoo_network
postgresql:
container_name: postgres_odoo_bo
restart: always
image: postgres:13
env_file: odoo16_pg13.env # environment file
ports: - "127.0.0.1:9432:5432"
volumes:
- ./postgresql-data:/var/lib/postgresql/data/pgdata ##SAME AS odoo16_pg13.env PGDAT [4]
networks:
- odoo_network
nginx:
container_name: nginx_bo
image: nginx:latest
restart: unless-stopped
depends_on:
- odoo
ports:
- "7080:80"
- "7443:443"
#1. Copiar la CARPETA de certificados a la carpeta ./nginx-certs
#2. Copiar el FICHERO de configuración del proxy nginx.conf a la carpeta ./nginx-etc/nginx/conf.d
volumes:
- ./nginx-certs:/etc/nginx/certs
# - ./nginx-log:/var/log
# - ./nginx-conf/odoo-nginx.conf:/etc/nginx/conf.d/odoo-nginx.conf
- ./nginx-conf/odoo-nginx.conf:/etc/nginx/conf.d/default.conf
networks:
- odoo_network
# En este caso, tambien damos nombres a los volúmnes compartidos
volumes:
odoo-data: {}
    odoo-conf: {}
    odoo-adds: {}
postgresql-data: {}
    nginx-certs: {}

networks: odoo_network: driver: bridge

Se definen los puertos a utilizar y los mapeos (volumenes docker) del servidor físico y el enlace al servidor virtual dockerizado.

7. ¿Como se pueden ver las direcciones IP?

En VS vamos al símbolo de docker - NETWORKS y en nuestra red apretamos el botón derecho del mouse y seleccionamos inspect


Y nos muestra un fichero de configuración json donde se puede ver las direcciones IP4

{
    "Name": "prova04_odoo_network",
    "Id": "79a4585b674d1e8d80a17073e91663206b8702a48c914800e022b152d2b9c013",
    "Created": "2024-01-03T14:39:30.696893035+01:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": null,
        "Config": [
            {
                "Subnet": "172.21.0.0/16",
                "Gateway": "172.21.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": true,
    "Ingress": false,
    "ConfigFrom": {
        "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
        "242451e0c89495d64305e186429508b79781aa939b714ebaceb9dbfdee2f38fd": {
            "Name": "odoo16_02",
            "EndpointID": "c47c3ff3e7d5e4269976963b47ecbb19ccd675ada631fd253344f37d6040c8ac",
            "MacAddress": "02:42:ac:15:00:03",
            "IPv4Address": "172.21.0.3/16",
            "IPv6Address": ""
        },
        "5b727c3e15b40f7f5e6ae0f2a0b33f8e192a27757fd6e38dbd4cd74dcb3fd2ad": {
            "Name": "postgres_odoo_02",
            "EndpointID": "dda9bd062a5c735592d3d9f04786497bedf714528a0776d7dd38cc7192277c6a",
            "MacAddress": "02:42:ac:15:00:02",
            "IPv4Address": "172.21.0.2/16",
            "IPv6Address": ""
        },
        "627344b0d41cc470d1c98a224ff02992d7bdd7ff38525acee4f2083c21ea9e73": {
            "Name": "nginx_odoo_02",
            "EndpointID": "ce2fad2cc3a0d12a89de56186cf82f742c099f02c3c4f7c2bed7dbadfc589c5f",
            "MacAddress": "02:42:ac:15:00:04",
            "IPv4Address": "172.21.0.4/16",
            "IPv6Address": ""
        }
    },
    "Options": {},
    "Labels": {
        "com.docker.compose.network": "odoo_network",
        "com.docker.compose.project": "prova04",
        "com.docker.compose.version": "1.29.2"
    }
}


8. Ejecución

Ejecutamos "docker-compose" en la carpeta donde esta el "docker-compose.yml" (carpeta nginx)

docker-compose up

Y podemos utilizar en el navegador de la máquina local:

  • https:/localhost:7443/           falla pues redirecciona a http://localhost/web
  • https://localhost:7443/web    redirecciona a https://localhost:7443/web/... y muestra la pantalla de aplicaciones
  • http://localhost:7069/            redirecciona a http://localhost:7069/web/... y muestra la pantalla de aplicaciones
  • http://localhost:7069/web      redirecciona a http://localhost:7069/web/... y muestra la pantalla de aplicaciones
Ojo si hacemos en el navegador http://odoo_host:8089, aparece error. O sea no se accede al DNS


9. Parámetros nginx

1. X-Forwarded-Proto: valor   siendo valor (http o https), se usa para definir el protocolo. Ejemplo de uso:

proxy_set_header X-Forwarded-Proto https;

2. X-Forwarded-For: <client>, <proxy1>, <proxy2>  se utiliza para pasar la IP del cliente y si se quiere las Ips de los proxys por donde pasa, separadas por comas. Si se utiliza un proxy, en el ejemplo de abajo se pasa la dirección del proxy ($host)

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3. X-Real-IP <ip>  Para indicar el nombre de dominio del servidor (para hosts virtuales) y el puerto. Ejemplo

proxy_set_header X-Real-IP $remote_addr;

4. Host: <host>:<port>  Para indicar el nombre de dominio del servidor (para hosts virtuales) y el puerto. Ejemplo

proxy_set_header Host $host;

4. Upgrade: <host>:<port>  Para indicar el nombre de dominio del servidor (para hosts virtuales) y el puerto. Ejemplo


10. Variables nginx

1. $host : Contiene en este orden de precedencia: 

  • nombre del host de la line de la request.
  • nombre del host  del campo "Host" de la cabecera de la request.
  • nombre del servidor que coincide con una request.
Esta variable no contiene el puerto mienttras que $http_host suele incluirlo.

2. $http_host: Contiene el valor del campo "Host" de una cabecera http de una request

3. $server_name: Nombre del servidor virtual que procesó la request. Si "server" contiene múltiples nombres, solo se considerará el primero.

4. $http_upgrade: Tiene el valor del Header "Upgrade" que se utiliza para poder utilizar web sockets que mantienen la conexión abierta mucho tiempo




No hay comentarios :

Publicar un comentario