Jeedom-Kubernetes-Raspi

Objectif
Déployer une instance Jeedom sur Kubernetes/Raspberry, permettant les redémarrages automatiques lors de plantage. Les données sont stockées via une instance MYSQL indépendante dont les fichiers sont externalisés sur un serveur GlusterFS.

Les premiers tests n'étant pas probants via Helm (pas comptatible avec raspberry pour le moment?), il a fallu, dans un premier temps trouver les images compatibles et opérationnelles sur ARM, en les testant directement dans des conteneurs Docker simples.

Jeedom for arm32v7
Si l'installation de Jeedom sur une raspbian ou Hypriot parait chose courante, cela n'est plus le cas pour une utilisation Kubernetes les sources d'informations étant beaucoup plus rares...

Install
La solution que j'ai réussi à faire tourner provient du projet
jeedom-rpi.
ce projet utilise un containeur MySQl à part qu'il faut lier à l'exécution.

docker run --name jeedom --link jeedom-mysql:mysql --privileged -v /home/pi/jeedom/data:/var/www/html -e ROOT_PASSWORD=jeedom -p 9080:80 -p 9022:22 -d codafog/jeedom-rpi

Pour exposer Mosquitto (serveur MQTT)

docker run --name jeedom --link jeedom-mysql:mysql --privileged -v /home/pi/jeedom/data:/var/www/html -e ROOT_PASSWORD=jeedom -p 9080:80 -p 9022:22 -p 1883:1883 -d codafog/jeedom-rpi

MySql
Différentes solutions de bases de données sont possibles. J'ai choisi de partir sur une base de données contenue dans un autre conteneur.
Pour plus d'information sur l'installation de MySQL dans K8, voir l'article sur ce sujet: "Mysql On Raspberry Kubernetes".

Connexion base de données "externe"
Pour plus de résiliance, il faut externaliser le fichier de configuration et le mapper dans le fichier de déploiement Jeedom, pour obtenir une version opérationnelle lors d'un redémarrage post-crash du conteneur Jeedom, sans devoir passer par une nouvelle phase de "setup".

root@24af79140b62:~# cat /var/www/html/core/config/common.config.php
<?php
/* * ********************* Debug **************** */
define('DEBUG', 0);
/* * *********************** MySQL & Memcached ******************* */
global $CONFIG;
$CONFIG = array(
	//MySQL parametres
	'db' => array(
		'host' => 'K8MasterServerDNSName',
		'port' => '3306',
		'dbname' => 'jeedom',
		'username' => 'jeedom_username',
		'password' => 'jeedom_password',
	),
);

Mot de passe admin
Reset admin password
Dans MySQl, modifier le mot de passe pour l'utilisateur adminTmp, créé pour l'occasion:
REPLACE INTO user SET `login`='adminTmp',password='c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec',profils='admin', enable='1';

JMQTT (MQTT)
Suite à plusieurs tests infructueux avec MQTT, j'utilise JMQTT qui semble convenir d'avantage.

L'image Jeedom utilisée ne possède pas initialement les plugins et dépendances nécessaires à MQTT (JMQTT), qui doivent être réinstallés. Or lors d'une première tentative d'install des dépendances JMQTT, le script plante (cf. log JMQTT-dep), il faut donc installer make:

sudo apt-get install make

Il peut être judicieux de réaliser au préalable un update et upgrade des librairies.

Ceci peut être suffisant pour relancer une installation des dépendances via la page de config du plugin une fois installé par la console Web.

Pour ces premiers tests on utilise un serveur Mosquitto distant qu'il faut également configurer, en indiquant le serveur adéaquate de la partie host, en ayant préalablement décoché la case "installation locale".

Tout ces paramétrages font que l'image de base ne peut fonctionner automatiquement après un redémarrage post-crash k8. Il faut donc trouver un moyen pour conserver tout ces paramétrages en relançant un script de reconfiguration, ou bien en sauvegardant une image pleinement configurée...

Trouver la meilleure solution...
On peut notamment installer les librairies Mosquitto en utilisant par la méthode présentée ci-dessous. Tout n'est cependant pas forcément nécessaire, notamment la relance d'Apache qui semble fonctionner sans (à vérifier).
L'idéal serait de partir d'une image Docker contenant déjà l'ensemble des plugins paramétrés... (réaliser une telle image).

Complément Mosquito (vérifier si cela est nécessaire)

*Si cette image semble fonctionner correctement dans Docker, il n'en va pas de même pour Mosquitto et MQTT lors d'une migration dans Kubernetes. Une solution alternative aux explications ci-dessous, consiste à tiliser le plugin JMQTT plutôt que celui de MQTT, et de déployer un serveur Mosquitto indépendant.
*
Avant d'effectuer les modifs ci-dessous faire un essai avec l'exposition du port mosquitto au lancement de l'image Docker...
Rmq: L'exposition du port 1883 n'est pas suffisante, car lc configuration du serveur Jeedom n'est pas complète pour ce qui est du serveur Mosquitto (MQTT) présent dans le container. De plus un bug semble empêcher l'installation automatique par le Dashboard Web Jeedom. LA solution semble passer par son installation manuelle:
MQQT Lunarok
MQTT#_troubleshoting
how-to-test-the-mosquitto-server

    1  apt-get update
    2  apt-get upgrade
    3  sudo apt-get install mosquitto mosquitto-clients libmosquitto-dev
    4  sudo apt-get install make
    5  sudo pecl install Mosquitto-alpha
    6  /etc/init.d/apache2 restart
    7  /etc/init.d/mosquitto status
    8  /etc/init.d/mosquitto start

Si pecl n'est pas installé:

sudo apt-get update
sudo apt-get install php-pear php5-dev
sudo apt-get install libcurl3-openssl-dev

Ainsi la page d'admin de MQTT dans Jeedom semble opérationnelle suite à Démarage du démon sur cette même page.
Rmq: Suite au montage du répertoire /var/www/html sur une partition GlusterFs, seules les étapes de 1 à 4 ont été suffisantes pour relancer l'installation des dépendances JMQTT, dans l'administration du plugin Jeedom. A voir, si on peut réduire la liste...
Suite à un nouveau crash du serveur, et le lancement des étapes 1 à 4, le démarrage du démon JMQTT (Mosquitto j'imagine), tourne en boucle. Ce n'est seulement qu'àprès avoir relancer l'installation des dépendances par la page d'admin, que le démarrage peut se lancer sans problème. Vérifier, lors d'un crash suivant si cette opération n'est pas suffisante (sans lancer les étapes 1 à 4)

A terme il serait bien de créer un script sur la nouvelle install et automatiser son lancement en cas de crash relance...

Mosquito.so est présent en fin de fichier php.ini

...
; Local Variables:
; tab-width: 4
; End:
extension=mosquitto.so

Si Mosquitto n'est pas démarré par défaut dans le conteneur, il faut configurer son instance.

kc exec -ti jeedom-xxxxxxx-xxxx /bin/bash
/etc/init.d/mosquitto start

Personnaliser au préalable, notamment les mots de passe, la persistence des données (cf pv et pvc), ports...

# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

Liens

Liens
Pin interest & Jeedom on Raspberry

Jeedom & caméra de surveillance 1
Jeedom & caméra de surveillance 2
Jeedom & caméra sans le plugin
Doc sur l'esp32

Compilation d'une version complète

ojectif: créer une image de Jeedom la plus complète possible, qui soit opérationnelle immédiatement en cas de crash/relance du serveur Kubernetes.

L'instance du conteneur Jeedom utilise déjà des répertoires ainsi qu'une instance MySql extérieures, ce qui permet de conserver l'ensemble des modifications, notamment l'installation des plugins.

Ce qui est attendu par cette création d'une nouvelle image docker Jeedom:
* le fait d'utiliser un système stable (la version utilisée par codafog/jeedom-rpi ne permettant pas d'apt-get update).
* le fait d'intégrer l'ensemble des installations de libriaries nécessaires au bon fonctionnement des plugins (JMQTT notamment).

Voir si je n'ai pas commenté par ailleurs cette description technique, et l'exposer en détail ici.
Voir si je ne peux pas également inscrire une mise à jour des dépendances JMQTT au démarrage de l'instance.

Lien vers le repo docker pour l'image compilée:

https://hub.docker.com/r/jjlavaza/jeedom

jjlavaza/rpi-jeedom
jeedom dockerfile for armv7 with mosquitto client on php7 - jjlavaza/rpi-jeedom