Serverpic V1 - Jusaba/Domo-Serverpic GitHub Wiki

En este apartado seva a tratar la última versión de Serverpic.

La versión V1, respecto a la V0, lo único que conserva en el objetivo del servidor, internamente es totalmente distinto y la filosofía de funcionamiento no tiene nada que ver.

Como se explico en la página Serverpic, el hardware para la V0 se dedicaba en exclusiva a una instalación y, aunque no era necesario que físicamente estuviera ubicado en la misma instalación, la fiabilidad del sistema depende mucho de la fiabilidad del equipo donde este instalado el Servidor.

La versión V1 está diseñada para instalarse en cualquier equipo en la nube y pude funcionar de forma exclusiva para una instalación o para varias instalaciones, además, puede funcionar como servidor único de forma independiente o en modo multiservidor formando parte de una red de servidores funcionando con memoria compartida y con reparto de carga.

En esta versión ya no se utiliza base de datos externa, no es necesario instalar Mysql ni Apache ni otras muchas cosas, en realidad, para que funcione el servidor, solo se necesita Java y el fichero .jar con el código del servidor.

Inicialmente, la instalación se hizo de esa forma, más tarde, utilizamos Docker para ejecutar el servidor. No es este un sitio donde se vaya a explicar las bondades de Docker pero lo único que puedo decir es que no se como he podido vivir tantos años sin utilizar Docker.

Al igual que en la descripción de la V0, se deben describir las funcionalidades de la V1, como se instala y como arrancar el servidor, pero antes, haremos una breve descripción del funcionamiento en modo multiservidor

Principio de funcionamiento de Serverpic V1 en modo multiservidor

La fiabilidad en este modo de funcionamiento es muy superior a la de la versión V0. Disponer de una red de servidores hace posible que la 'caída' de uno de ellos no afecte al servicio pero, ¿ como funciona el modo multiservidor ?

En la siguiente figura se puede ver un sistema de este tipo

RedServidores_1.png

El funcionamiento es el siguiente.

Los dispositivos de una instalación se conectan a un mundo de Serverpic a través del router de la instalación. El mundo se utiliza para separar instalaciones de distintos usuarios, en este caso, el mundo sería micasa.jusaba.es, cuando la red de servidores se pone en fucnionamiento, uno de ellos lidera el arranque ( arranque memoria compartida, dns, ... ), imaginemos que en nuestra instalación el lider es Serverpic_1.com. En el arranque, Serverpic_1.com le dice al servidor DNS que dirija el tráfico de micasa.jusaba.es hacia el. Cada cierto tiempo, el sistema va cambiando el servidor que atiende a micasa.jusaba.es indicandoselo al servidor DNS, el siguiente será Serverpipc_2.com, luego Serverpic_3.com y así sucesivamante hasta llegar a Serverpic_N.com, una vez alcanzado el último servidor, vuelve a repetirse el ciclo empezando por Serverpic_1.com de forma que, los dispositivos, cuando vayan arrancando se irán conectando al servidor al que en ese momento el servidor de DNS está apuntando sin importar a cual se ha conectado por que, al compartir la memoria, de cara a los dispositivos simepre se conectan a un servidor micasa.jusaba.es.

Si un servidor cayera, el sistema se entera y excluye su dirección de la rotación de servidores en las DNS, todos los dispositivos conectados a ese servidor, perderán la conexión y pasado unos segundos intentarán reconectar a micasa.jusaba.es y el Servidor DNS los conducirá hacia el servidor que en ese momento este esperando conexiones.

Como se dijo este sistema ofrece una alta fiabilidad si bien, se complica bastante el funcionamiento interno y relentiza ligeramente las comunicaciones.

Este sistema, además de ser multiservidor también puede ser multiusuario. Puede atender más e una isntalación como si furan isntalaciones independientes que no tuvieran nada que ver entre ellas, otra ventaja respecto a la V0.

En la siguiente figura se presenta un sistema multiservidor con atendiendo a varias instalaciones.

RedServidores_2.png

Funcionalidades de Serverpic V1 📋

Como en V0. la funcionalidad más importante es mensaje pero hay otras que son muy interesantes y muy prácticas. En la siguiente tabla se describen las distintas funcionalidades de V1, algunas son evidentes y otras no se pueden entender sin conocer como funcionan los dispositivos. Cuando se trate el tema de los dispositivos se explicarán y se entenderán esas funcionalidades.

Como existen bastantes comandos, se distribuyen en los siguientes bloques:

Comandos Genericos del Servidor

- firmwares

	Lista los firmwares registrados para cada uno de los dispositivos

- usuarios

	El Servidor devuelve un listado con todos los dispositivos conectados a el.
	El formato de la información es el siguiente:
			
		cliente-:-servidor-:-fecha-:-UC-:-VF -:-UV-:-AD-:-TD

			cliente.- Nombre del usuario
			servidor.- Servidor dobnde está conectado este cliente 
			fecha.- Fecha y hora a la que se proporciona la informacion
			UC.- Ultimo comando tramitado por el cliente
			VF.- Número de versión de firmware del cliente
			UV.- Ultimo valor enviado/recibido por/del cliente
			AD.- Nombre del cliente push/telegram al que notificar el aviso desconexión
			TD.- Tipo de dispositivo para HomeKit

- servidores

	El Servidor devuelve un listado con los servidores conectados al ‘mundo’ al que pertenece el usuario 
	que lo solicita.
	El formato de la información es el siguiente:

		servidor-:-IP-:CC -:-fecha-:-VF

			servidor.- Nombre del servidor
			IP.- Dirección IP del servidor
			CC.- Número de clientes conectados a ese servidor
			fecha.- Fecha y hora a la que se proporciona la informacion
			VF.- Versión de firmware del servidor 
- nombre

	Devuelve el nombre del servidor al que esta conectado el dispositivo  
- broadcast

	broadcast-:<Texto Mensaje>  

	Manda a todos los usuarios conectados al servidor el texto <Texto Mnesaje>

- info	

	Manda un broadcast con el texto #Info
	Los dispositivos conectados al servidor, responden al comando #Info proporcionando información del 
	dispositivo
	La información que transmite el dispositivo se detalla en la librería Serverpic

- avisodesconexion

	Habilita a un dispositivo para enviar avisos push o telegram de desconexion/conexión del dispotivo
	Cuando el dispositivo está habilitado, el servidor mandará un aviso Push/Telegram cuando se desconecte o reconecte al 'mundo' que pertenece

		avisodesconexion-:-<Dispositivo>-:-<on/off>-:-<CP/CT>

			Dispositivo.- Nombre del cliente al que se le desea implementar el servicio
			On/off.- Habilita/deshabilita el servicio para este cliente
			CP/CT.-	Cliente Push/Telegram al que notificar la conexión/desconexion 

Comandos Genericos del Cliente

Relación de comandos genéricos para los usuarios/dispositivos Los dispositivos, cuando se conectan se comportan como un usuario más del sistema por lo que, cuando en estos comandos nos referimos a usuarios, lo hacemos de forma genérica, entre los usuarios se encuentran los dispositivos.

- mensaje

		mensaje-:-<Usuario>-:-<Texto Mensaje>

		Manda al usuario 'Usuario' el texto 'Texto Mnesaje'

			Usuario Julian manda      mensaje-:-Pepe-:-Hola
			Usuario Pepe recibe       Julian-:-Hola
- Latido

	El Servidor devuelve Ok al dispositivo que le manda el texto Latido
	Sirve para mantener la conexión con el servidor pues, tras 4 minutos sin actividad de un dispositivo,
	el servidor cierra el socket y lo elimina de la lista activa
	Existe la opcion de enviar 

		Latido-:-<Version firmware>

	El servidor memorizará la versión de firmware 'Version firmware' para ese dispositivo
- exit

	El servidor cierra el socket del cliente que lo envia y lo elimina de la lista de usuarios activos
- buzon

	El servidor remite al dispositivo que lo solicita el ultimo mensaje que se le envio cuando estaba 
	desconectado

Listas

Las listas se utilizan para agrupar varios clientes/dispositivos como un solo dispositivo A un grupo de dispositivos se le asigna un nombre de lista de forma que cualquier comando mandado a la lista se envia a todos los componentes de la misma

- lista

	Crea lista de broadcast de dispositivos

  	  	Opciones:

		lista-:-anadir-:-<Nombre Lista>-:-<Nombre Usuario> .- Añade un usuario a la lista
		lista-:-eliminar-:-<Nombre Lista>-:-<Nombre Usuario> .- Borra un usuario de la lista
		lista-:-info .- Devuleve relación de listas creadas
		lista-:-eliminar-:-<Nombre Lista> .- Elimina una lista

			Nombre Lista.- Nombre asignado a la lista
			Nombre Usuario.- Nombre del cliente  que se quiere añadir/eliminar a/de la lista

Push

Comandos para el servicio de alertas Push. Para utilizar este servicio es necesario tener una cuanta Pushover, más información en la web oficial de Pushover

- push (deprecated)
	
	Manda un pushover
  
		push-:-<Token>-:-<KEY>-:-<Dispositivo>-:-<Titulo>-:-<Mensaje>-:-<Sonido>
              
  	  	Este comando utiliza la aplicación Pushover para mandar mensajes emergentes
  	  	a teléfonos, tablets, ....
		
			Token.-	Parametro proporcionado por Pushover en la suscripción
			KEY.- Parametro proporcionado por Pushover al crear una aplicación
			Dispositivo.- Nombre del dispositivo registrado en Pusover al que se quiere enviar la    				  notificación
			Titulo.- Titulo de la notificación
			Mensaje.- Cuerpo del mensaje de la notificación
			Sonido.- Sonido del aviso cuando se reciba en un dispositivo ( lista de sonidos en 			     Pushover)
- createpush
	
	Crea un cliente push en el servidor

		createpush-:-<Nombre cliente>-:-<Token>-:-<KEY>-:-<Dispositivo>-:-<Sonido>

			Nombre cliente.- Nombre que se le quiere asignar en el servidor al cliente push
			Token.-	Parametro proporcionado por Pushover en la suscripción
			KEY.- Parametro proporcionado por Pushover al crear una aplicación
			Dispositivo.- Nombre del dispositivo registrado en Pusover al que se quiere enviar   		          la notificación
			Sonido.- Sonido del aviso cuando se reciba en un dispositivo ( lista de sonidos enPushover)
- sendpush
	
	Manda una alerta push a un cliente registrado en el servidor

		sendpush-:-<Nombre cliente>-:-<Titulo>-:-<Cuerpo Mensaje>

			Nombre cliente.- Nombre del cliente push registrado en el servidor
			Titulo.- Titulo de la notificación
			Mensaje.- Cuerpo del mensaje de la notificación
- delpush

	Borra un cliente push del servidor

		delpush-:-<Nombre cliente>

			Nombre cliente.- Nombre del cliente push registrado en el servidor 
- pushall
	
	Lista todos los clientes push creados en el servidor

Variables

Los dispositivos tienen la posibilidad de almacenar datos en variables en el servidor Cada dispositivo tiene sus variables, aunque dos dispositivos usen el mismo nombre para una variable estas son exclusivas para cada dispositivo, como ejemplo, los dispositivos tienen la posibilidad de guardar estadisticas de funcionamiento en unas variables cuyos nombres se repiten en cada dispositivo pero los datos son propios de cada dispositivo

- save

	Guarda una variable en el servidor para el uso del dispositivo

		save-:-<Nombre Variable>-:-<Valor>

			Nombre Variable.- Nombre de la variable que se desea crear/actualizar
			Valor.- Valos que se le asigna a la variable

		Ejemplo:

			save-:-temperatura-:-22
        
       Para el usuario que lo manda, el servidor crea una variable llamada
       temperatura y le asigna el valor 22
- load
	
	Recupera una variable almacenada en el servidor

		load-:-<Nombre Variable>

				Nombre Variable.- Nombre de la variable que se desea crear/actualizar

		Ejemplo:

			load-:-temepratura
              
		El servidor recupera el contenido de temperatura almacenada para este dispositivo 
		y se lo envia
- delete

	Borra una variable creada por el dispositivo

		delete:-<Nombre Variable>

			Nombre Variable.- Nombre de la variable que se desea crear/actualizar

		Ejemplo:

			delete-:-temperatura
- show

	El servidor devuelve un listado con todas las variables almacenadas para este usuario

Para poder gestionar las variables de un dispositivo desde un cliente terminal se crean los siguentes comandos

- delete

	Borra una variable de un dispositivo

		delete-:-<Dispositivo>-:-<Nombre variable>

			Dispositivo.- Nombre del dispositivo del que se quiere borrar la variable
			Nombre Variable.- Nombre de la variable que se desea borrar
- deleteall

	Borra todas las variables de un dispositivo

		deleteall-:-<Dispositivo>

			Dispositivo.- Nombre del dispositivo del que se quieren borrar todas las variable
- show

	Visualiza todas las variables de un dispositivo

		show-:-<Dispositivo>

			Dispositivo.- Nombre del dispositivo del que se quiere visualizar las variables
- showall

	Visualiza todas las variables de todos los dispositivos

Comando

Comando se utiliza para crear una lista de comandos que se ejecutaran de forma secuencial cuando se desee

- Comando

	Opciones:
		
		comando-:-add-:-<Nombre Lista>-:-<comando1>&<comando2>&..&<comandoN> 
			
			Crea una lista de comandos 

			Nombre Lista.- Nombre que se asigna a la lista de comandos
			comando1.-  Comandos que integran la lista y que se ejecutarán en orden secuencial
			comando2.-
			    .
				.
			comandoN.-	

		comando-:-delete-:-<Nombre Lista>
			
			Borra una lista de comandos

			Nombre Lista.- Nombre de la lista de comandos que se desea borrar

		comando-:-exec-:-<Nombre Lista>
			
			Ejecuta una lista de comandos

			Nombre Lista.- Nombre de la lista de comandos que se desea ejecutar
			
		comando-:-show
			
			Visualiza la lista de comandos registrados en el servidor

Cron

Cron se utiliza para añadir funcionalidades de temporizacion a los dispostivios de Serverpic.

- cron 

	Opciones

		cron-:-add-:-<Nombre Cron>-:-<Patron temporizacion>-:-<Comando>

			Crea una nueva tarea cron 

				Nombre Cron.- Nombre que se asigna a la tarea cron
				Patron temporizacion.- Patron para la secuencia de temporizacion estilo cron de linux
				Comando.- Comando que se ejecutará con el patron seleccionado

					Ejemplo:

						cron-:-add-:-luzsalon-:-*/10 * * * * *-:-mensaje-:-luz_comedor-:-Change

		cron-:-delete-:-<Nombre Cron>

			Borra un cron existente

				Nombre Cron.- Nombre de la tarea Cron que se quiere borrar

					Ejemplo:

						cron-:-delete-:-luzsalon

		cron-:-list

				Lista todas las tareas cron registradas

Mundo

Mundo se utiliza para notificar alarmas de caida de nodos dentro de un mundo Se establece un umbral de servidores minimos y cuando una caida provoca que el numero de servidores activos esta por debajo del umbral, notifica la alarma a los usuarios seleccionados de de Telegram.

-mundo

	Opciones

		mundo

			Devuelve la información del umbral de servidores y de los usuarios de Telegram habilitados 
			para recibir la alarma

			<Numero Servidores>-:-<Usuario Telegram 1>-:-...-:-<Usuario Telegram N>
		
		mundo-:-<Numero Servidores>-:-<Usuario Telegram 1>-:-...-:-<Usuario Telegram N>

			Registra los parametros bajo los que el sistema debe enviar avisos de desconexion 
			de servidores

			Numero Servidores.- Umbral de alarma para aviso de caida critica de servidores
			Usuario Telegram N.- Usuarios de telegram que recibiran la notificación.

Html

Serverpic V1 ademas de las funcionalidades via socket tiene otras funcionalidades via web. Estas otras funcionalidades se han creado para facilitar al acceso a Serverpic via web y poder implantar controles desde html y js

Las facilidades disponibles son las siguientes:

- upload

	Cargar en el servidor un nuevo firmware de dispositivo. El servidor, ordenará a todos
	los dispositivos que usen ese firmware la carga de la nueva versión

			mundo.jusaba.es:puerto/upload.html 

				mundo.jusaba.es .- Cualquier mundo de serverpic
				puerto .- Puerto web del mundo elegido 
				( el Puerto web es el puerto de serverpic + 1 ) 	
		
		Para que la telecarga funcione correctamente, el firmware debe denominarse con el formato 
		NombreIno_VersionIno.bin, por ejemplo SonOffS20_92.bin.

		Cuando Serverpic recibe esto, manda un broadcast de actualización de firmware con el nombre
		del nuevo firmware y todos lo dispositivos con ese software se actualizarán a la nueva versión.

- dispositivos

	El Servidor manda un JSON con información de los dispositivos conectados
			
			mundo.jusaba.es:puerto/dispositivos/

				mundo.jusaba.es .- Cualquier mundo de serverpic
				puerto .- Puerto web del mundo elegido 
				( el Puerto web es el puerto de serverpic + 1 ) 	

	La estructura de la información de cada usuario es la siguiente
				{
					"dateTime": "2020-03-17T19:59:16.223+0000",
					"user": "sonoff2",
					"hostname": "jusaba_com",
					"ultimoValor": "Off",
					"lastCommand": "Latido",
					"version": "92",
					"avisoDesconexion": "Julian",
					"valores": {
      					"Frecuencia": "50.00",
      					"Amperimetro": " 0.32",
    					"FactorPotencia": "0.49",
    					"Potencia": "  36.90",
    					"Energia": "  5128.64",
    					"Voltimetro": "235.30"
					}
				}	

	No es necesario describir cada uno de los campos por ser evidente

	Como alternativa, si se el solicita un solo cliente, se obtendrán los datos solo de ese 
	cliente.
	
			mundo.jusaba.es:puerto/dispositivos/<Nombre Dispositivo>   

				Nombre Dispositivo.- Nombre del dispositivo del que se quiere recibir el JSON

- usuario

	Manda un mensaje a un dispositivo, equivale a la orden tradicional de mensaje 
	Se utiliza para enviar ordenes desde una pagina html

			mundo.jusaba.es:puerto/usuario/<Destinatario>?mensaje=<Orden>

				mundo.jusaba.es .- Cualquier mundo de serverpic
				puerto .- Puerto web del mundo elegido 
						   ( el Puerto web es el puerto de serverpic + 1 ) 	
				Destinatario .- Dispositivo/Cliente al que se le quiere enviar el mensaje
				Orden .- COntenido del mensaje que se desea enviar
===============================================
- variables

	Desde html se ha creado una facilidad para manejar las variables de un dispositivo

		mundo.jusaba.es:puerto/save/<Destinatario>/<Nombre Variable>/<Valor Variable>
			Registra un valos para una variable de un dispositivo determinado 

				mundo.jusaba.es .- Cualquier mundo de serverpic
				puerto .- Puerto web del mundo elegido 
						   ( el Puerto web es el puerto de serverpic + 1 ) 	
				Destinatario .- Dispositivo/Cliente para el que se quiere registrar una variable
				Nombre Variable.- Nombre de la variable que se desea registrar
				Valor.- Valor deseado para esa variable

		mundo.jusaba.es:puerto/load/<Destinatario>/<Nombre Variable>
			Recupera el calor de una variable almacenada en el servidor para un dispositivo
				
				mundo.jusaba.es .- Cualquier mundo de serverpic
				puerto .- Puerto web del mundo elegido 
						   ( el Puerto web es el puerto de serverpic + 1 ) 	
				Destinatario .- Dispositivo/Cliente para del que se quiere recuperar la variable
				Nombre Variable.- Nombre de la variable que se desea registrar

- Comando

	Permite ejecutar cualquier comando de sevidor o usuario desde html. Si el comando es de servidor, recibiremos
	el resultado del comando, si es de dispositivo, se ejecutará el comando en el dispositivo pero recibiremos un 'Ok'

	 	mundo.jusaba.es:puerto/comando/<Comando>

				mundo.jusaba.es .- Cualquier mundo de serverpic
				puerto .- Puerto web del mundo elegido 
						   ( el Puerto web es el puerto de serverpic + 1 ) 	
				comando.- Comando que se quiere ejecutar

				ej: picservertest.jusaba.es:2001/comando/cron-:-list  lista todos los Cron registrados


- Acceso desde Java Script

	Para acceder desde Java Scritp a las facilidades web, utilizaremos JQuery de la siguiente forma

		
		$.getJSON ( <mundo><comando><argumentos>)
		Se solicita un comando que puede devolver un Json
		
		Ejemplo:

				$.getJSON ("http://picservertest.jusaba.es:2001/dispositivos", funtion (data){
					.
					.
				})

				Recibe un Json con todos los dispositivos del mundo picservertest.jusaba.es:2001 y lo entrega en el parametro
				data de la función que tratará el Json

		$.get ( <mundo><comando><argumentos>)
		Se ejecuta un coamndo comando que puede devolver texto plano

		Ejemplos:

				$.get ("http://picservertest.jusaba.es:2001/comando/show-:-web", function (data){
					.
					.
				})
		
				Recibe como texto plano las variables del usuario web existentes en el mundo picservertest.jusaba.es:2001

				$.get ("http://picservertest.jusaba.es:2001/save/Estufa/temperatura/20", function (data){})

				Crea en el mundo picservertest.jusaba.es:2001 una variable 'temperatura' con un valor '20' para el usuario 'Estufa'

				$.get ("http://picservertest.jusaba.es:2001/load/Estufa/temperatura", function (data){

				})

				Recupera el valor de la variable temperatura del dispositivo estufa y la trata en la funcion a la que se le pasa como 
				parametro 'data'

		Las peticiones GET tienen un limite de longitud en las variables que se pasan, para solventar este problema, solo para tratamiento
		de variables se puede utilizar peticiones POST: La estructura del comando seria

		$.post ( <mundo>+'/save/'+<Dispositivo>+'/',<valor variable>)

		Ejemplo:

			$.post ("http://picservertest.jusaba.es:2001/save/Estufa/temperatura/", 20, function (data){})

			Guarda '20' en la variable 'temperatura' del dispositivo 'Estufa' del mundo http://picservertest.jusaba.es:2001

		Se ha comprobado que esta forma de mandar un post modifica el contendio de la variablecodificandola para el envio web
		por lo que en la paractica no nos sirve para interactuar con el servidor, en la practica utilizaremos AJAX

		$.ajax({
        url:"http://picservertest.jusaba.es:2001/save/Estufa/temperatura/",
        type:"POST",
        data:'20',
        contentType:"text/plain",
        dataType:"text",
        success: function(){
          alert("OK")
        }
      });       


Instalación de Serverpic V1 🛠️

Esta versión tiene más opciones de instalación que la V0. Como que puede funcionar con Docker o sin el, ya se dan dos opciones de instalación y, dentro de cada una de ellas además, se puede optar por instalación manual y automática.

Instalación manual de Serverpic V1 sin Docker

Para la instalación manual, se debe proceder tal como se describe en el bloque Puesta en marcha de la Instalación V0 Manual.

Una vez preparada la Raspberry ( o cualquier otro Hardware ), para instalar Serverpic V1, primero instalaremos Java

sudo apt install default-jdk

Comprobaremos que se ha instalado identificando la versión

java -version

Una vez instalado Java, vamos a descargar el fichero jar de Serverpic V1

cd /home/pi
mkdir Serverpic
cd Serverpic
curl -O -J -L 'https://julian60:[email protected]/oscarsm91/serverpic/downloads/serverpic-0.0.1-SNAPSHOT.jar'

Ahora será necesario crearle un servicio para que arranque de forma automática cuando se ponga en marcha el equipo pero, como que hay varias opciones de arranque, se deja el detalle para el apartado Ejecucion de Serverpic V1, no obstante, para arrancarlo de forma inmediata y empezar a utilizar Serverpic, existe un paquete deb que crea un servicio para el servidor de forma que arranca de forma automática cuando se inica el equipo. Para bajar y descomprimir el paquete teclear

cd /home/pi		
wget https://www.dropbox.com/s/s4dasjbtphrmzuu/ServerpicV1.deb
sudo dpkg -i ServerpicV1.deb

Ya esta creado el servicio para gestionar Serverpic. Los comamdos disponibles del servicio son

sudo service serverpic start
sudo service serverpic stop
sudo service serverpic restart

Así mismo, el paquete, crea un alias de forma que para ver la actividad del servidor se debe teclear

serverpiclog

Cuando se desee salir del monitoreo del servidor se debe pulsar ** Ctrl + Z **

Instalación manual de Serverpic V1 con Docker

Antes de describir esta instalación es necesario justificar el uso de Docker. Como se decía anteriormente, no se va a hacer ningún tutorial ( por lo menos de momento ) de Docker en esta documentación pero si que se van a enumerar las ventajas de usar esta tecnología.

- Con Docker, Serverpic es multiplataforma
- Se simplifica la instalación y es independiente de la plataforma
- Permite actualización automática cuando se publica una nueva versión
- Se pueden tener varios servidores independientes en una misma máquina

Una vez enumeradas las bondades de utilizar Docker vamos a proceder a la instalación manual.

En primer lugar, al igual que en el apartado anterior, se procederá según se describe en el bloque Puesta en marcha de laInstalación V0 Manual.

Una vez preparado el equipo, se intalará Docker

sudo apt-get update -y
sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -	
sudo curl -sSL https://get.docker.com/ | sh
sudo groupadd docker
sudo usermod -aG docker pi

Ya tenemos instalado Docker y además se ha instalado como servicio, para habilitarlo ( el servicio )

sudo systemctl enable docker
sudo systemctl start docker

Docker ya está instalado, habilitado su servicio y arrancado

Ahora instalaremos Docker compose, un paquete que, si bien no es necesario, dará mucho juego para instalaciones de otros contenedores de esta tecnología.

La instalación se hace algo larga pero es muy sencilla

sudo apt install -y python python-pip libffi-dev python-backports.ssl-match-hostname
sduo pip install docker-compose

Ya tenmos instaldo Docker compose, ahora es necesario reiniciar el equipo

sudo reboot -h now

Ahora que tenemos Docker, instalar Serverpic es muy sencillo. Aunque las opciones de arranque se describen en Ejecución se Serverpic V1, un ejemplo de instalación/arranque de un servidor en su forma más básica sería:

docker run --name serverpic -p 1301:7000 -p 1302:7001 -d  --log-driver json-file --log-opt max-size=10m  jusaba/serverpic:latest -d

Esto arranca un contenedor llamado serverpic que escucha en los puertos 1301 ( servidor ) y 1302 ( web ) generando un fichero log de un maximo de 10 megas con la imagen jusaba/serverpic:latest

Aprovechando las bondades de Docker, podríamos tener en la misma máquina otro servidor identico cambiando unicamente los puertos de escucha y el nombre

docker run --name serverpic_1 -p 1303:7000 -p 1304:7001 -d  --log-driver json-file --log-opt max-size=10m  jusaba/serverpic:latest -d

Instalación automática de Serverpic V1

En lo que respecta a la instalación, por último, abordaremos una instalación automatica similar a la de la V0.

La primera parte del fichero de configuración es identica a la utilizada en el de la V0. Tras los datos de preparación de la Raspberry ( Password, IP's, SSH, ... ) se procede a intalar el servidor y en función de una variable del fichero de configuración se instalará con Docker o directamente

Primero, tal como en la versión V0, en /home/pi descargaremos los dicheros Instalacion.sh y configuracion

cd /home/pi
wget https://www.dropbox.com/s/ub3vvi2ttf17cze/Instalacion.sh
wget https://www.dropbox.com/s/08n2hgkhm4xjd8g/configuracion

El fichero configuracion se debe editar con los datos con los que precisamos para nuestra instalación

nano configuracion

Si se desea instalar con Dockker se debe respetar la línea Docker=Si, en caso contrario, se instalara Java y el fichero jar de Serverpic.

Una vez realizados todos los cambios deseados los guardamos pulsando Ctrl + O y salimos con Ctrl + X

A continuación se muestra el contenido del fichero configuración con los parametros por defecto. Las líneas que empiezan con # son comentarios que explican brevemente cada uno de los parametros. Los parametros a modificar se encuentran en las líneas que no empiezan por #

#----------------------------------------------------------
#Raspberry
#Cambia el password de la raspberry
#Si se quita esta linea, se mantendra el password existente
#----------------------------------------------------------
PasswordRasp=Serverpic2408
#----------------------------------------------------------
#SSH
#Cambia el puerto ssh
#Si se quita esta linea, se mantendra el puerto existente
#----------------------------------------------------------
PortSSH=1322
#----------------------------------------------------------
# Red STA 
# Este modo es STA, tanto etho como wlan0 se pueden conectar
# a una red existente
# Si se omite NombreSSID o PasswordSSID no se modifica la
# SSID existente en la raspberry
# Si se pone una direccion en IPETH0, se pondra una ip 
# estatica en eth0. Si se omite se mantendra 
# la configuracion para eth0
# Si se pone una direccion en IPWLAN0, se pondra una ip 
# estatica en wlan. Si se omite se mantendra 
# la configuracion para wlan0
# NO SE COMPRUEBAN POSIBLES ERRORES DE ASIGNACION
# LA RED DEBE SER 192.168.1.X
#----------------------------------------------------------
ModoRed=STA
NombreSSID=MiWifi
PasswordSSID=MiPassword
IPETH0=192.168.1.13
IPWLAN0=192.168.1.23
#----------------------------------------------------------
# Docker
# Se instala Docker, si se omite la linea Docker=Sim, se 
# hace una instalación sin Docker
#----------------------------------------------------------
Docker=Si

Ahora, una vez la instalación finalizada, es necesario reiniciar el equipo y conectarse a el con la IP con la que lo hemos configurado

sudo reboot -h now

Ejecución de Serverpic V1 ⚙️

La ejecución de ServerpicV1 admite bastantes posibilidades. Como que ademas, se puede instalar con o sin Docker, las posibilidades se multiplican por dos.

Vamos a tratar por separado las dos modalidades de funcionameinto.

Ejecución de Serverpic V1 sin Docker

Para ejecutar el jar de Serverpic directamente

java -jar serverpic-0.0.1-SNAPSHOT.jar --server.port=1302 --serverpic.puerto=1301 --spring.profiles.active="mq,dns"

Los parametros utilizados son los siguiente

--server.port.- Puerto donde escucha el servidor html. Si se omite su valor es 7001
--serverpic.puerto.- Puerto donde escucha serverpic. Si se omite, su valor es 7000
--spring.profiles.active

Como que en la instalación se tuvo en cuenta asignarle un servicio para su arranque automático, si se quieren variar los parámetros se debe editar el fichero /usr/local/bin/serverpic

nano /usr/local/bin/serverpic

Se debe modificar la linea que llama a Serverpic tanto en la opción start como en la opción restart Una vez modificado, salvar los cambios con Ctrl + O y salimos con Ctrl + X

Ejecución de Serverpic V1 con Docker

Para la ejecución con Docker, se debe arrancar el contenedor de Serverpic. El contenedor necesita algún parámetro más de los descritos en el apartado anterior. El arranque sería de la siguiente forma

docker run --name serverpic_test -p 2000:7000 -p 2001:7001 -d -e "SPRING_PROFILES_ACTIVE=mq,dns" -e "MUNDO=picservertest" --hostname salmeo_com --log-driver json-file --log-opt max-size=10m  jusaba/serverpic:latest -d

La descripción de los parámetros es la siguiente

--server.port.- Puerto donde escucha el servidor html. Si se omite su valor es 7001
--serverpic.puero.- Puerto donde escucha serverpic. Si se omite, su valor es 7000
--MUNDO.- MUNDO en el que se quiere el servidor, podría ser uno por usuario o por instalación
--hostname.- Nombre del host donde se hospeda el servidor
--spring.profiles.active.- Variable para habilitar Serverpic como multiservidor
--log-driver.- Utiliza un controlador de registro diferente al predeterminado de Docker (json)
--log-opt max-size.- Longitud máxima del fichero de registro

En cada mundo, uno y solo uno de los servidores de un Mundo debe gestionar Telegram por lo que debe añadirse un nuevo parametro a SPRING_PROFILES_ACTIVE en la ejecución del Docker del servidor encargado de telegram, así el campo en la ejecución del Docker del servidor encargado de Telegram quedará de la siguiente forma

"SPRING_PROFILES_ACTIVE=mq,dns,telegram"

De igual forma, uno y solo uno de los servidores de un Mundo debe gestionar Cron de ese Mundo, al Servidor seleccionado se le debe añadir un nuevo parametro a SPRING_PROFILES_ACTIVE en la ejecución.

"SPRING_PROFILES_ACTIVE=mq,dns,cron"

Si en el servidor coincide la gestión de Telegram y Cron

"SPRING_PROFILES_ACTIVE=mq,dns,telegram,cron"

Será deseable que los contenedores arranquen automaticamente cuando arranaca la máquina por lo que en el arranque habrá que incluir

--restart=always o --restart unless-stopped

Si queremos que todos los contenedores que ya están correindo tengan esta particularidad, en el terminal de la máquina en cuenstión teclearemos

 docker update --restart unless-stopped $(docker ps -q)
⚠️ **GitHub.com Fallback** ⚠️