Que cada subdomino de Odoo 12 apunte a una base de datos

Esta es para mi la guía definitiva de cómo tener varios Odoo’s o bases de datos de Odoo bajo nombre de dominio diferente.

Partimos del escenario en el que las bases de datos que tenemos son:

ejemplo_erp
erp_demo

Vamos a trabajar con el dominio erp_demo, haríamos lo mismo para erp_ejemplo

En el en el archivo de odoo.conf tenemos que modificar los siguiente parámetros: db_name, dbfilter y proxy_mode:

Si no sabemos donde se encuentra el archivo podemos buscarlo con

sudo find / -name odoo.conf

Y editamos el archivo:

sudo nano /etc/odoo/odoo.conf

Los parámetros de mi instalación de Odoo (y funcionando) eran:

db_name = False
dbfilter =
proxy_mode = false

Los modificamos a:

db_name = False
dbfilter = %d
proxy_mode = True

En algunos casos recomiendan utilizar para dbfilter la expresión regular:

dbfilter = ^%d$

A mi, solo con %d me funciona.

dbfilter = %d

En el archivo rc.local no tengo ninguna redirección, sería conveniente que le peguéis un ojo por si alguna redirección está actuando por ahí.

Para leer el archivo:

cat /etc/rc.local

Creamos el certificado SSL para nuestro nuevo subdominio:

sudo certbot --nginx -d erp_demo.ekiketa.com

Mas info en al web de certbot: https://certbot.eff.org/lets-encrypt/ubuntubionic-nginx

Bien, vayamos para NGINX!

Creamos o editamos el sitio web:

sudo nano /etc/nginx/sites-available/erp_demo

Y escribimos nuestra configuración (IMPORTANTE: esta es solo una guía):

upstream odoo_ejemplo {
	server 127.0.0.1:8069;
}
upstream odoochat_ejemplo {
	server 127.0.0.1:8072;
}


server {
	listen 80;
	server_name erp_demo.ekiketa.com;

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

server {
	listen 443 ssl http2;
	server_name erp_demo.ekiketa.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;


	# Redirect requests to odoo backend server
	location / {
		proxy_redirect off;
		proxy_pass http://odoo_ejemplo;
	}

	location /longpolling {
		proxy_pass http://odoochat_ejemplo;
	}

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

	ssl_certificate /etc/letsencrypt/live/erp_demo.ekiketa.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/erp_demo.ekiketa.com/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/erp_demo.ekiketa.com/chain.pem;
	include snippets/ssl.conf;
	include snippets/letsencrypt.conf;

}

No olvidemos editar el server_name de los dos «server» Y la ubicación de los certificados de letsencrypt en los parámetros ssl_certificate, ssl_certificate_key y ssl_trusted_certificate

Si creásemos otro sitio, no olvidéis cambiar los «upstream«. De todos modos si al arrancar NGINX o al reiniciarlo no los hemos cambiado, no arrancará correctamente y nos lazará un error, para verlo nos sugiere que escribamos el comando: «sudo systemctl status nginx.service»

Habilitamos sitio:

sudo ln -s /etc/nginx/sites-available/erp_demo /etc/nginx/sites-enabled/

Antes de reiniciar NGINX testamos su configuración con:

sudo nginx -t

Si no nos da ningún error de sintaxis seguimos, en caso de que nos dé algún error, este, suele ser descriptivo. (Os copio en el apéndice 1 un error que surgió en otra instalacion)

Reiniciamos NGINX:

sudo systemctl restart nginx.service

Reiniciamos Odoo:

sudo systemctl restart odoo.service

Y a funcionar, accedemos a «erp_demo.ekiketa.com» y debería de funcionar 👀


👀
Ojo, con el cambio del dbfilter hay algo que es importante. Puede que al intentar imprimir un «Report» (Facturas, pedidos de compra, etc) Odoo 12 pierda la sesión y la factura se imprima sin estilos. Recordemos qué hacer si Odoo imprime mal las facturas, tocábamos un parámetro del sistema de Odoo llamado «report.url«. (Click en el enlace anterior para ver el tutorial).
Pues con el dbfilter activado, tenemos que hacer una pequeña modificación en este parámetro y en el archivo «/etc/hosts» de la máquina donde está Odoo 12 instalado.

Para ello, vamos a editar el archivo hosts de el servidor donde tenemos nuestro Odoo.

sudo nano /etc/hosts

(Puede que se redundante que mencione tanto nuestro máquina donde está Odoo, nuestro servidor de Odoo, etc… Pero es importante no perder el contexto en estos puntos)

Y añadimos un nombre «local» para nuestros dominios, por ejemplo:

127.0.0.1 erp_demo.ekiketa.local
127.0.0.1  ejemplo_erp.ekiketa.local

Ahora, desde nuestro navegador «local» (Donde se encuentra nuestro Odoo) deberemos acceder a éste mediante: http://erp_demo.ekiketa.local:8069 y… deberemos cambiar en Odoo el parámetro «report.url» de los Parámetros del sistema.

Y ya, ahora sí que estará todo al sitio.

¡Saludos!


Apéndice 1

Al comprobar la configuración de nginx con sudo nginx -t el error que me muestra es el siguiente:

● nginx.service – A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2020-04-16 07:06:02 CEST; 44s ago
Docs: man:nginx(8)
Process: 62727 ExecStop=/sbin/start-stop-daemon –quiet –stop –retry QUIT/5 –pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 6007 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 62813 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
Main PID: 6008 (code=exited, status=0/SUCCESS)

abr 16 07:06:02 example-virtual-machine systemd[1]: Starting A high performance web server and a reverse proxy server…
abr 16 07:06:02 example-virtual-machine nginx[62813]: nginx: [emerg] open() «/etc/nginx/sites-enabled/example» failed (2: No such file or directory) in /etc/nginx/nginx.conf:62
abr 16 07:06:02 example-virtual-machine nginx[62813]: nginx: configuration file /etc/nginx/nginx.conf test failed
abr 16 07:06:02 example-virtual-machine systemd[1]: nginx.service: Control process exited, code=exited status=1
abr 16 07:06:02 example-virtual-machine systemd[1]: nginx.service: Failed with result ‘exit-code’.
abr 16 07:06:02 example-virtual-machine systemd[1]: Failed to start A high performance web server and a reverse proxy server.

Y ¿por qué sucede esto? Porque copié este archivo de configuración de nginx sin tener en cuenta algunos parámetros.
¿Qué está fallando aquí?
En la linea 2 de los errores vemos:

abr 16 07:06:02 example-virtual-machine nginx[62813]: nginx: [emerg] open() «/etc/nginx/sites-enabled/example» failed (2: No such file or directory) in /etc/nginx/nginx.conf:62

Nginx intenta abrir un fichero que no existe. ¿Cuál es? En este caso tenemos el error en:

server {
	listen 80;
	server_name erp_demo.ekiketa.com;

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

Intenta cargar el archivo: «include snippets/letsencrypt.conf», letsencrypt ha cambiado sus ficheros de configuración, a la hora de crear el SSL en la versión actual del certbot nos añade la linea «# managed by Certbot» con la ubicación de los certificados en el site config (/etc/nginx/sites-enabled/ejemplo). Guiándonos de esto podemos crear nuestro propia configuración del sitio.


Tu opinión es importante para mi, ¿Te ha resultado útil este artículo?

3 Comments

pablo cruz

Buen dia, tengo la siguiente consulta.

/etc/nginx/sites-available/odoo.conf
lo configure como lo tienes aca pero la diferencia que yo no tengo ssl.
apunte los dos al puerto 80 ,
cuando coloco ahora el dominio principal.
dominio.com me muestra la pantalla del Welcome to nginx! y solo colcando 8069 me funciona

al colocar el subdominio test.dominio.com me funciona perfectamente mostrando la base de datos qu enecesito. como hago para que al colocar el dominio principal me muestra la base de datos odoo_ejemplo sin necesidad del colocar 8069 tengo que apuntar a otro puerto que no sea el 80
upstream odoo_ejemplo {
server 127.0.0.1:8069;
}
upstream odoochat_ejemplo {
server 127.0.0.1:8072;
}

server {
listen 80;

Reply
kike

Hola Pablo!

Gracias por escribir (:

¿Con el ejemplo que has puesto no te funciona?
Se trataría de redirigir el trádico de 8069 a 80.

Algo parecido a esto:


upstream odoo_dominioprincipal_ejemplo {
	server 127.0.0.1:8069;
}
upstream odoochat_dominioprincipal_ejemplo {
	server 127.0.0.1:8072;
}
 
 
server {
	listen 80;
	server_name dominioprincipal.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;
 
 
	# Redirect requests to odoo backend server
	location / {
		proxy_redirect off;
		proxy_pass http://odoo_dominioprincipal_ejemplo;
	}
 
	location /longpolling {
		proxy_pass http://odoochat_dominioprincipal_ejemplo;
	}
 
	# common gzip
	gzip_types text/css text/less text/plain text/xml application/xml application/json application/javascript;
	gzip on;
 
}

Cuéntame si te sirve (:

¡Saludos!

Reply
pablo Cruz

Gracias por la respuesta, te comento que intente pero creo que no me di a entender en mi pregunta anteriod.
tengo dos bases de datos : caasbi y E-comerce en ambas bases de datos ya tengo un sitio web.
tengo el dominio caasbi.com y el subdominio ms.caasbi.com
lo que no puedo hacer es que al colocar caasbi.com me muestra el sitio web que esta en la base de datos caasbi y al colocar ms.caasbi.com que me muestre el sitio web de la base de datos E-comerce.
sin colocar el puerto 8069 si no que solo colocando el dominio o subdominio me muestre su respectiva sitio web.

Reply

Responder a kike Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*