¿Cómo desplegar onesait Platform Community con Docker y docker-compose?

¿Cómo desplegar onesait Platform Community con Docker y docker-compose?

Pre-requisitos

Para levantar la versión Community en un entorno, deberemos tener en cuenta los siguientes pre-requisitos:

1- Activar el Hyper-V en Windows 10: 

Para configurar el Docker como deseamos, necesitaremos ejecutarlo sin el uso de WSL2. Por ello, necesitaremos habilitar el Hyper-V.

Aquí la guía de como hacerlo:

https://docs.microsoft.com/es-es/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

2- Tener instalado Docker en la máquina en la que se va a instalar, Docker Desktop:

https://docs.docker.com/install/

3- Ajustar los parámetros del Docker:

Para lanzar la plataforma desde Docker, debemos incrementar la memoria que le otorgamos a Docker.

Empezaremos por lanzar el Docker Desktop y dirigirnos a la pestaña de Settings.

Una vez en ella, de seleccionaremos la opción Use the WSL 2 based engine:

Ahora nos dirigimos a la pestaña de Resources y ajustamos los recursos de la siguiente forma:

Pinchamos en Apply & Restart y deja que Docker se reinicie.

Tras satisfacer estos requisitos, estamos listos para lanzar la plataforma.

Despliegue

Paso 1: Descargar los ficheros de docker-compose para levantar los servicios de la plataforma

Estos ficheros en formato yml se encuentran en el repositorio de la plataforma en github. Para ello es necesario clonar el repositorio en local:

> git clone https://github.com/onesaitplatform/onesait-cloud-platform-community-deploy.git > cd onesait-cloud-platform-community-deploy

 

Paso 2: Levantar los servicios de persistencia

Nos situamos en el directorio donde se encuentra el docker-compose.yml encargado de levantar los servicios de bases de datos:

cd onesait-cloud-platform-community-deploy/op_data

 

En este directorio veremos varios ficheros:

/.env

Nos aseguramos que las claves tienen los siguientes valores:

clave

valor

clave

valor

REPOSITORY

registry.hub.docker.com

PERSISTENCE_TAG

mariadb

MODULE_TAG

2.0.0-ce

MONGO_TAG

latest-noauth

QUASAR_TAG

14

/docker-compose.yml: En el caso de que queramos levantar las bases de datos sin persistencia, ejecutaremos desde un terminal el siguiente comando en el mismo directorio donde se encuentra el fichero:

> docker-compose up -d

IMPORTANTE:

En el caso de levantar las bases de datos en modo efímero, al parar los servicios con docker-compose down, perderemos todos los datos

/docker-compose.persistent.yml: En el caso de que queramos persistir las bases de datos, en el fichero .env pondremos los directorios de nuestra máquina donde queramos alojar los datos, por defecto no tienen valor asignado. Como ejemplo podremos poner:

clave

valor ejemplo

clave

valor ejemplo

REALTIME_VOLUME

/Users/devopsuser/realtimedbdata

CONFIGDB_VOLUME

/Users/devopsuser/configdbdata

Y desde el terminal ejecutaremos el comando:

> docker-compose -f docker-compose.persistent.yml up -d

 

Una vez levantadas las bases de datos podremos ver en que estado se encuentran con el siguiente comando:

> docker ps

Deberíamos ver una salida como esta, en la que vemos lanzados configdb, realtimedb y quasar:

Si queremos ver los logs de un contenedor de base de datos, ejecutaremos:

> docker logs <container_name> ó > docker logs -f <container_name> (-f equivale a un tail)

Paso 3: Poblar de datos las bases de datos

En este mismo directorio (onesait-cloud-platform-community-deploy/op_data) hay otro fichero docker-compose encargado de levantar el servicio de carga inicial de datos.

En caso de configurar la plataforma mediante el hostname de la máquina, se debe reeemplazar 'localhost' en la variable SERVER_NAME del docker-compose.yml por el hostname de la máquina.

Como anteriormente hemos hecho, ejecutamos:

> docker-compose -f docker-compose.initdb.yml up

En este caso no incluímos el flag -d (detached mode) ya que el propio servicio se detiene una vez acabada su tarea.

Se debería lanzar en una segunda vez para poblar la realtimedb, cambiando en el fichero docker-compose.initdb.yml la variable LOADMONGODB=true.

> docker-compose -f docker-compose.initdb.yml up

Paso 4: Levantar los módulos de la plataforma

De la misma manera que hicimos con los servicios de persistencia, levantamos los distintos módulos de la plataforma con docker-compose, por orden de arranque, y en el directorio (onesait-cloud-platform-community-deploy/op-modules:

Path

Module

DBs up required

Modules up required

Path

Module

DBs up required

Modules up required

/control-panel

Platform's web console.

configdb, schedulerdb, realtimedb, quasar

 

/webprojects

Platform web hosting

configdb, schedulerdb, realtimedb, quasar

controlpanel

/keycloak (obligatoria desde 6.0.0-ce)

Authentication server

configdb, schedulerdb, realtimedb, quasar

controlpanel

/keycloak-manager (obligatoria desde 6.0.0-ce)

Authentication server

configdb, schedulerdb, realtimedb, quasar

controlpanel, keycloak

/router

Routing module

configdb, schedulerdb, realtimedb, quasar

 

/cacheserver

Cache server

configdb, schedulerdb, realtimedb, quasar

controlpanel

/iotbroker

Platform's IoT broker.

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver

/flowengine

Platform's Flow engine.

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver

/api-manager

API Manager Module.

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

/oauth-server (deprecada después de 6.0.0-ce)

Authentication server

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, 

/notebooks

Notebooks module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

/dashboard-engine

Dashboard module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

/rules-engine

Rules engine module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver

/dataflow

Dataflow module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

/devicesimulator

Device simulator module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

/digitaltwinbroker

Digital twin broker module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

/monitoringui

Monitoring UI module

configdb, schedulerdb, realtimedb, quasar

controlpanel, router, cacheserver, iotbroker

Cada directorio contiene:

  • fichero /.env con las siguientes variables de entorno:

clave

valor

descripción

clave

valor

descripción

REPOSITORY

registry.hub.docker.com  

registro que contiene la imagen del servicio

SERVERNAME

localhost

hostname de la máquina anfitriona

MODULE_TAG

2.0.0-ce

Tag de la imagen del servicio

  • fichero docker-compose.yml, que contiene la descripción del servicio, mapeo de volúmenes, puertos, subredes, etc...

En caso de configurar la plataforma mediante el hostname de la máquina, se debe reeemplazar 'localhost' en la variable SERVER_NAME (o SERVERNAME en el caso del flowengine) del docker-compose.yml por el hostname de la máquina.

Para levantar cada uno de estos módulos es necesario, desde linea de comandos, posicionarse en el directorio del módulo y ejecutar el comando:

> docker-compose up -d

Paso 5: Levantar servicio de proxy inverso (NGINX)

Vamos a la carpeta onesait-cloud-platform-community-deploy/op-modules/nginx-proxy  donde está el servicio de NGINX. Este contendor debe llevar mapeado un volumen con el fichero de configuración necesario para redireccionar las peticiones que lleguen al control panel.

Hay varios ficheros: nginx.conf dónde se indican todos los módulos y uno por cada módulo (controlpanel.conf, dashboardengine.conf, etc). Se debe editar únicamente el fichero nginx.conf y sustituir la cadena ${SERVER_NAME} por el hostname de la máquina anfitriona de Docker (se puede obtener desde linea de comando ejecutando el comando "hostname").

server { listen 443 ssl; # Replace ${SERVER_NAME} with name obtained from console command output: "hostname" server_name ${SERVER_NAME};
server { listen 443 ssl; # Replace ${SERVER_NAME} with name obtained from console command output: "hostname" server_name user-pc;

Por defecto, dentro del nginx.conf solamente está descomentada la línea del controlpanel, se descomentarán los include necesarios según los módulos levantados:

Nunca se deben descomentar include de módulos que no estén funcionando, porque el nginx se reiniciará constantemente al no encontrarlos.

 

A continuación, se deben generar los certificados con el script generate-certificates.sh

generate-certificates.sh
sh generate-certificates.sh

 

Y modificar las siguientes variables en el script.

generate-certificate.sh variables
# Set IP and COMMONNAME export IP="172.22.11.203" export COMMONNAME="localhost" # Comment SO not used SEP="//" # WINDOWS #SEP="" # OTHERS

Al ejecutarlo se generará un directorio ./tls que se mapeará al contenedor.

Desde la versión 6.0.0-ce, los modulos keycloak y keycloak-manager deben estar levantados y funcionando para poder acceder a la plataforma. Al ejecutar el docker-compose del keycloak-manager, es necesario que controlpanel y keycloak estén previamente levantados.

Una vez editado, levantamos el servicio igual que hemos hecho anteriormente, desde el directorio /nginx-proxy ejecutamos:

> docker-compose up -d

Y podremos acceder al control panel poniendo en el navegador la url https://<hostname>/controlpanel

 

Puedes acceder con estas credenciales:

  • administrator/Community2019!

  • developer/Community2019!

  • analytics/Community2019!

 

Estas credenciales son por defecto y exclusivamente con fines de prueba, se recomienda modificarlas.

Ejemplo: Ejecutar otro módulo

Para mostrar un ejemplo completo, se lanzará el módulo dashboardengine:

Comandos para lanzar los contenedores necesarios (desde el directorio op_moules):

> # First launch controlpanel > cd control-panel > docker-compose up -d > cd .. > # First launch keycloak and keycloak-manager > cd keycloak > docker-compose up -d > cd .. > cd keycloak-manager > docker-compose up -d > cd .. > # First launch router and cacheservice > cd cacheserver > docker-compose up -d > cd .. > cd router > docker-compose up -d > cd .. > # First launch iotbroker > cd iotbroker > docker-compose up -d > cd .. > # First launch dashbardengine > cd dashboard-engine > docker-compose up -d > cd ..

Descomentar líneas en ./op_modules/nginx-proxy/nginx.conf para los módulos levantados (puedes copiarlo en tu local y reemplazar {SERVER_NAME})

user www-data; worker_processes 4; pid /run/nginx.pid; events { worker_connections 4000; use epoll; multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # disable any limits to avoid HTTP 413 for large image uploads client_max_body_size 0; # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486) chunked_transfer_encoding on; server_tokens off; proxy_pass_header Server; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; ## # Virtual Host Configs ## # Importante para nombres de dominio muy largos server_names_hash_bucket_size 128; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; server { listen 443 ssl; # Replace ${SERVER_NAME} with name obtained from console command output: "hostname" server_name ${SERVER_NAME}; # SSL configuration (for https) add_header Strict-Transport-Security "max-age=31536000"; ssl_certificate /usr/local/tls/selfsigned.crt; ssl_certificate_key /usr/local/tls/selfsigned.key; ssl_protocols SSLv2 SSLv3 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'; # Uncomment if ControlPanel module is deployed # Required databases up (po_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] include /usr/local/conf.d/controlpanel.conf; # Uncomment if Keycloak module is deployed # Required modules up and uncommented (op_modules): [ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] include /usr/local/conf.d/keycloak.conf; # Uncomment if Router (Sematic inf. Broker) module is deployed # Required modules up and uncommented (op_modules): [ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] include /usr/local/conf.d/router.conf; # Uncomment if DigitalBroker (IoTBroker) module is deployed # Required modules up and uncommented (op_modules): [Router, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] include /usr/local/conf.d/digitalbroker.conf; # Uncomment if you want to use web projects. # Required modules up and uncommented (op_modules): [ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/web.conf; # Uncomment if you want to use APIs projects. # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/apimanager.conf; # Uncomment if DashboardEngine module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] include /usr/local/conf.d/dashboardengine.conf; # Uncomment if Notebooks module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/notebook.conf; # Uncomment if FlowEngine (Nodered) module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/flowengine.conf; # Uncomment if OauthServer module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/oauthserver.conf; # Uncomment if DeviceSimulator module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/devicesimulator.conf; # Uncomment if DigitalTwinBroker module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/digitaltwinbroker.conf; # Uncomment if MonitoringUI module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/monitoringui.conf; # Uncomment if RulesEngine Service module is deployed # Required modules up and uncommented (op_modules): [Router, DigitalBroker, ControlPanel] # Required databases up (op_data): [ConfigDB, SchedulerDB, RealTimeDB, Quasar] #include /usr/local/conf.d/rulesengineservice.conf; } }

Ahora se vuelve a levantar el módulo del proxy para recargar los cambios

# from /op_modules > cd nginx-proxy > docker-compose down > docker-compose up -d

Una vez hecho esto ya puedes acceder al módulo del dashboard desde el controlpanel!