En primer lugar, eche un vistazo a la documentación oficialdel despliegue, que tiene un buen párrafo de introducción sobre el filtrado de base de datos.
Odoo es un sistema multiinquilino: un solo sistema Odoo puede ejecutar y servir a una serie de instancias de base de datos.
Ejemplos
Tomemos algunos ejemplos para ilustrar cómo funciona el código:
dbfilter
es una expresión regex que se crea dinámicamente: puede utilizar variables y adaptar su contenido en función del encabezado HOST de la solicitud http.%d
%h
Concreto:
%d
es reemplazado por el primer subdominio después de www:- https://demo.example.com:
%d = demo
- https://www.demo.example.com:
%d = demo
- https://demo.example.com:
%h
se sustituye por el dominio completo, puerto excluido si existe:- https://demo.example.com:
%h = demo.domain.com
- https://demo.example.com:8080:
%h = demo.domain.com
- https://demo.example.com:
Por lo tanto, si define , un usuario que acceda tendrá acceso a bases de datos que coincidan, por ejemplo:dbfilter = ^%d.*\Z
https://demo.example.com
^demo.*\Z
demo
demo_backup_20180404
Cuidado
re.match
se utiliza: dbs = [i for i in dbs if re.match(r, i)]
Así que es fácil escribir un regex más permisivo de lo esperado. Si define, por ejemplo, también coincidirá con .dbfilter = demo_*
demoinefromage_prod
dbfilter_from_header
Módulo
No siempre puede hacer coincidir los nombres de las bases de datos con los nombres de dominio.
Por ejemplo, puede tener una única instancia de Odoo para servir 2 bases de datos:
customer1_prod
customer2_prod
Pero cada uno de estos clientes quiere su propio dominio personalizado, respectivamente:
https://back.customer1.com
https://app.customer2.com
Para admitir este caso, puede utilizar el módulo dbfilter_from_header
de OCA.
Instalación
$ git clone https://github.com/OCA/server-tools -b 9.0 --no-checkout --single-branch --depth 1
$ cd server-tools
$ git config core.sparsecheckout true
$ echo "dbfilter_from_header" > .git/info/sparse-checkout
$ git read-tree -mu HEAD
Configuración
En el lado de Nginx, debe definir un dedicado para cada host virtual.dbfilter
En nuestro caso, para:https://back.customer1.com
server_name back.customer1.com;
(...)
location / {
(...)
proxy_set_header X-Odoo-dbfilter ^customer1_.*\Z;
2 cosas a tener en cuenta:
- antes de pasar la solicitud a Odoo, Nginx toma todos los encabezados HTTP, los pone en minúsculas y convierte guiones en guiones bajos;
- usamos en lugar de hacer coincidir el final de la cadena, porque nginx no puede escapar
$
\Z
$
2 niveles de filtrado
dbfilter_from_header
respeta lo definido a nivel de Odoo, por lo que podemos configurar 2 niveles de filtrado:dbfilter
dbfilter = ^.+prod.*$
proxy_set_header X-Odoo-dbfilter ^.*customer1.*\Z;
.