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

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

ES | EN

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:

clavevalor
REPOSITORYregistry.hub.docker.com
PERSISTENCE_TAGmariadb
MODULE_TAG2.0.0-ce
MONGO_TAGlatest-noauth
QUASAR_TAG14

/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:

clavevalor 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
/control-panelPlatform's web console.configdb, schedulerdb, realtimedb, quasar
/webprojectsPlatform web hostingconfigdb, 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

/routerRouting moduleconfigdb, schedulerdb, realtimedb, quasar
/cacheserverCache serverconfigdb, schedulerdb, realtimedb, quasarcontrolpanel
/iotbrokerPlatform's IoT broker.configdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver
/flowenginePlatform's Flow engine.configdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver
/api-managerAPI Manager Module.configdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker
/oauth-server (deprecada después de 6.0.0-ce)Authentication serverconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, 
/notebooksNotebooks moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker
/dashboard-engineDashboard moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker
/rules-engineRules engine moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver
/dataflowDataflow moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker
/devicesimulatorDevice simulator moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker
/digitaltwinbrokerDigital twin broker moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker
/monitoringuiMonitoring UI moduleconfigdb, schedulerdb, realtimedb, quasarcontrolpanel, router, cacheserver, iotbroker

Cada directorio contiene:

  • fichero /.env con las siguientes variables de entorno:
clavevalordescripción
REPOSITORYregistry.hub.docker.com  registro que contiene la imagen del servicio
SERVERNAMElocalhosthostname de la máquina anfitriona
MODULE_TAG2.0.0-ceTag 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").

nginx.conf before set SERVER_NAME
	server {
         
        listen 443 ssl;
        # Replace ${SERVER_NAME} with name obtained from console command output: "hostname"
        server_name ${SERVER_NAME};
nginx.conf after set 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!


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})

nginx.conf for dashboardengine
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!