Arquitectura Multi-Tenant

El ecosistema qwc-services permite usar la arquitectura Multi-Tenant, es decir, que una sola instancia (instalación) de QWC2 pueda alojar diferentes visores, cada uno con su propia configuración de Temas, apariencia, Plugins, usuarios, etc.

Cada tenant debe tener los ficheros de configuración config.json y tenantConfig.json. El directorio donde se almacenan es configurable, pero por defecto están en qwc-docker/volumes/config-in/<tenant>/.

┌─────────────────────────────────────────────────────────────┐
│                    QWC2 MULTI-TENANT                        │
│                  (Una sola instalación)                     │
└─────────────────────────────────────────────────────────────┘
                              │
                              │
        ┌─────────────────────┼─────────────────────┐
        │                     │                     │
        ▼                     ▼                     ▼
┌───────────────┐     ┌───────────────┐     ┌───────────────┐
│   TENANT 1    │     │   TENANT 2    │     │   TENANT 3    │
│  (tenant a)   │     │  (tenant b)   │     │  (tenant c)   │
└───────────────┘     └───────────────┘     └───────────────┘
        │                     │                     │
        ├─ config.json        ├─ config.json        ├─ config.json
        ├─ tenantConfig.json  ├─ tenantConfig.json  ├─ tenantConfig.json
        │                     │                     │
        ├─ Temas propios      ├─ Temas propios      ├─ Temas propios
        ├─ Usuarios propios   ├─ Usuarios propios   ├─ Usuarios propios
        ├─ Roles propios      ├─ Roles propios      ├─ Roles propios
        └─ Autenticación      └─ Autenticación      └─ Autenticación

La configuración de API-Gateway nginx.conf extrae el nombre del tenant, que debe estar definido, para redirigir a los servicios.

server {
    listen       80;
    server_name  localhost;

    proxy_redirect off;
    server_tokens off;

    location ~ ^/(?<t>tenant1|tenant2)/ {
        # Extract tenant
        proxy_set_header Tenant $t;
        # Set headers for original request host
        proxy_set_header   Host              $http_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 ~ ^/[^/]+/auth {
            rewrite ^/[^/]+(.+) $1 break;
            proxy_pass http://qwc-auth-service:9090;
        }

        location ~ ^/[^/]+/ows {
            rewrite ^/[^/]+(.+) $1 break;
            proxy_pass http://qwc-ogc-service:9090;
        }

        location ~ ^/[^/]+/api/v1/featureinfo {
            rewrite ^/[^/]+(.+) $1 break;
            proxy_pass http://qwc-feature-info-service:9090;
        }

        # etc...

        location ~ ^/[^/]+/qwc_admin {
            rewrite ^/[^/]+(.+) $1 break;
            proxy_pass http://qwc-admin-gui:9090;
        }

        # Place these last to give precedence to the other rules:

        # Redirect request without trailing slash
        location ~ ^(/[^/]+)$ {
            return 301 $scheme://$http_host$1/;
        }
        location ~ ^/[^/]+/ {
            rewrite ^/[^/]+(.+) $1 break;
            proxy_pass http://qwc-map-viewer:9090;
        }
    }
}

Por lo que, con una sola instalación de QWC2 podemos tener diferentes visores con diferentes comportamientos. Por ejemplo:

Y en cada uno de ellos una autenticación diferente, temas diferentes, etc.