Serverpic V1 - Jusaba/Domo-Serverpic GitHub Wiki
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
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
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.
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:
- 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
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
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
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
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 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 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 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.
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")
}
});
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.
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 **
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
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
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.
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
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)