Actions simples pour améliorer la fiabilité d'un serveur domotique.

Aujourd'hui un petit article pour présenter quelques astuces de fiabilisation à ceux d'entre vous qui, comme moi, utilisent un Raspberry PI pour faire tourner leur serveur domotique Domoticz.


J'en avais déjà parlé dans un précédent article, pour moi la domotique n'a de sens que dans le cadre d'une solution fiable. Il n'y a rien de plus frustrant que de devoir réinitialiser son installation, devoir intervenir physiquement sur les objets connectés pour débrancher et rebrancher, rien de plus frustrant qu'un interface web qui ne répond plus, rien de plus frustrant que de voir un capteur d'ouverture remonter un état clos au serveur domotique alors que la porte en question est grande ouverte devant nos yeux ! 
Sans compter le facture "confiance" associé à la fiabilité d'un la solution : qui confirait le contrôle de fonctions de sécurité essentielles, telles que le chauffage ou l'accès à la maison, à une solution non fiable qui fonctionne de manière aléatoire ? 

La perfection n'existant pas dans notre bas monde, jamais nous n'aurons une solution fiable à 100%. 

L'objectif sera donc de mettre en place de petites choses qui permettent de s'approcher le plus possible de ce seuil, sachant que jamais nous ne l'atteindrons. 



Identification du périmètre !


Avant de lancer les premières actions la première chose à faire est d'identifier les choses qui sont vraiment importantes qu'il va falloir sécuriser à tout prix, les choses importantes et identifier les choses qui pourraient arriver (gérer les risques).
Ce travail sera à faire chacun de votre coté en fonction de vos critères et de la solution que vous avez en place et/ou de ce que vous comptez déployer dans le futur. 

Pour ma part voici ce que j'ai identifié : 

Essentiel :

Sécuriser les programme que j'ai écris pour ne pas perdre toutes ces heures de travail en cas de panne d'une carte mémoire ou d'un disque dur.

Important : 


  • Garantir la communication entre le Raspberry et les différents matériels qui y sont connectés. Il arrive que sur la durée, certains ports USB ne répondent plus ou que l'interface réseau plante. Il faut alors rebooter manuellement. 
  • Garantir que les services logiciels sur le serveur fonctionnent en continue 24h/24 sans failles. Il est rare qu'un serveur ne doivent pas être relancé de temps en temps.
  • Connaitre l'état des principaux serveurs sur le réseau. 
  • Sécuriser le fonctionnement des équipements qui permettent de communiquer et de controler les capteurs domotiques et les objets connectés. 

Gestion du risque : 


  • Prévention des panne d'électricité.
  • Prévenir les corruption du système d'exploitation ou les perte de données dues à une défaillance du système de fichier du serveur domotique. 

Je vais vous décrire les actions simples que j'ai mis en place et qui dans l'ensemble répondent à chacun de ces items. Ceci va permettre d'augmenter de manière très importante le taux de fiabilité de notre solution. 


Sécurisation des données :



Comme nous le savons tous, la petite carte SD ou micro SD sur laquelle tourne nos Raspberry est une solution d'accès performante et rapide pour lancer le système Raspbian et permettre à ce dernier de s'exécuter dans de bonnes conditions. Mon Raspberry PI qui héberge mon serveur domotique s'arrête et se relance en moins d'une minute, tous les services activés ! 
Par contre, cette carte est un organe fragile ! Il peut arriver que des données soient corrompues, elle dispose d'un cycle de lectures/écriture qui n'est pas infini, certaines de ces cartes mémoire ont des durée de vie limitées et quand le secteur de boot est corrompu il n'y a plus qu'à la jeter et en acheter une autre. 

La première chose qu'il va falloir sécuriser c'est cet organe essentiel car : 
  • Elle contient les programmes que nous avons écrit et la perte de ces heures de travail serait une vraie catastrophe.
  • Elle contient toutes les données de notre serveur domotique, ainsi que les historiques de nos capteurs. 
  • Elle contient tout l'environnement Linux que nous avons personnalisé au fur et à mesure pour y avoir tous nos outils de travail et notre contexte personnalisé. 

Une carte SD de qualité : 

L'action la plus simple et immédiate pour sécuriser la carte micro SD c'est de s'en procurer une de qualité. Pour ma part j'en ai essayé pas mal et j'ai chez moi 4 Raspberry PI, dont deux PI3 qui tournent 24h/24 depuis au moins deux ans.
La pire expérience que j'ai faite c'est l'achat d'une carte Micro SD, pourtant d'une marque connue, sur l'application "WISH" sur mon téléphone. J'ai payé une carte de 128Gb moins de 9€, port compris ! Un record ! 
La carte a bien fonctionné ...  au moins 3 jours ! Un record aussi ! 

De tous mes essais, les cartes SD qui tournent vraiment le mieux et sans aucun problème sur mes Raspberry PI, ce sont les SanDisk Ultra Class 10. 16Go suffisent mais l'écart de prix avec les 32Go étant désormais infime, je ne prends plus que des 32. 
Toutefois faites attention aux faux ! Car même dans ce domaine cela existe. Pour l'éviter je vous conseil de vous procurer ces cartes sur des sites réputés ou alors en boutique (Darty ou LDLC par exemple).

Voici ce que je peux vous proposer : 
Une bonne carte micro SD: http://amzn.to/2HiwTlB

- J'ai la même en 16Go qui tourne sur mon premier RPI2, avec une distribution openelec pour faire tourner Kodi, depuis 3 ans sans jamais un seul problème !
- Vous remarquerez le logo A1 sur la carte. Il représente une nouvelle norme qui certifie la compatibilité des cartes SD pour faire tourner des applications. Je n'ai pas pu tester s'il y a une vraie différence ou si c'est uniquement du marketing.
- La carte étant de class 10 elle vous garanti un débit des accès en lecture écriture. Cette norme est importante pour un RPI.

Accéder à un disque réseau : 

Une carte SD de qualité améliore la pérennité des données et surtout le taux de fiabilité de l'OS et des serveurs qui vont devoir accéder au système de fichier.
Toutefois c'est loin d'être suffisant car une carte SD reste une carte SD et un jour ou l'autre, que ce soit dans un an ou dans 10 ans, il faudra la changer !

Et à ce moment là, si nous n'avons pas sauvegardé nos données sensibles, il n'y aura aucun recours possible. Le salue viendra de notre NAS !

Un NAS, ou disque réseau, est désormais un matériel INDISPENSABLE ! Malgré l’avènement des solutions dans le Cloud, je reste un fervent défenseur de ces équipement car rien ne remplacera leur capacité à nous fournir des services variés et puissants, à nous garantir la maîtrise de l'accès et la sécurité de nos données et à nous offrir une performance inégalée de débit d'accès aux données.

Pour ma part j'ai un petit NAS Synology DS214se contenant deux disques durs. Synology est peut être une marque un peu plus chère que QNAP (ou d'autres sans marques) mais franchement la qualité de l'interface et les services fournis par l'équipement sont vraiment à la hauteur !

Le DS214se apparemment ne se fait plus, part contre vous pouvez trouver le modèle équivalent sous la référence DS216se ici :
Le DS216se un très bon NAS a petit prix : https://amzn.to/2w8eaIA

Voici quelques exemple d'usages pour mon NAS : 
  • Il contient la vidéothèque à laquelle vont accéder les Raspberry avec Kodi qui sont derrière chaque télévision de la maison. 
  • Il va servir à sauvegarder en double les photos de nombreuses années de vacances qui sont stockées sur mon PC.
  • Il sert de serveur WEB. 
  • Il sert de "cloud" privé pour mes documents au travers d'une fonction WebDAV.
  • Il sert de disque réseau pour tous les équipements souhaitant accéder à un espace disque sauvegardé ! Et c'est ici que nous allons l'utiliser en domotique ! 

Les NAS Synology fonctionnent avec un OS de type Linux. Ils sont donc compatibles avec tous les standards de ce système.
De plus, petit cadeau bonux, lorsque vous possédez un NAS Synology, le constructeur vous permet d'accéder à son système de dynDNS gratuitement. Très pratique pour tous ceux qui ne disposent pas d'adresse IP fixe ou qui souhaitent ne pas en disposer pour sécuriser leur installation.

Monter un répertoire :


La présence d'un NAS sur notre réseau local va nous permettre d’associer un répertoire du système de fichier du RPI sur le NAS.
Ceci va avoir un double avantage :

  1. Etant donné que nous voyons notre NAS comme un disque sur un PC, nous pourrons donc écrire des programmes (et les sauvegarder) directement depuis le PC avec un éditeur Windows. Pour ma part j'utilise l'excellent Notepad++.
  2. Depuis le RPI, nous aurons accès à tout l'espace et à la sécurité de stockage offert par le NAS. Nous pourrons donc effectuer des sauvegardes de tout ce qui va être important. 
Pour "associer" (monter) un répertoire d'un NAS à un répertoire sur la carte SD du RPI, il va falloir utiliser la commande "mount". Plusieurs protocoles sont disponibles. Les principaux sont NFS et SMB (ou des équivalents qui sont SAMBA ou CIFS). 
Pour ma part j'ai choisi CIFS pour le contrôle avec login/password mais la démarche avec NFS est la même. Voici comment faire : 

Sur le NAS : 


- Activez SMB dans l'onglet "Services de fichiers" :



- Créez un utilisateur spécifique avec un login/password et un espace disque associé dans "homes". Ici j'ai créé l'utilisateur RPI. 




Sur le RPI : 

- Si les packets CIFS ne sont pas installés il faut le faire :

apt-get install cifs-utils

- Créer le répertoire qui sera associé à celui sur le NAS. Pour ma part j'ai créé un dossier qui s'appelle "/mnt/nasgarage" (oui mon NAS est dans le garage !) !
cd /mnt
sudo mkdir /mnt/nasgarage

- Lancer la commande pour réaliser le montage :
sudo mount -t cifs -o username=RPI,password=password //192.168.1.200/homes/RPI /mnt/nasgarage

En adaptant à votre environnement : l'adresse IP et le répertoire derrière correspondent au NAS.

Vous aurez donc ensuite accès à votre NAS directement depuis le Raspberry.
Il n'y aura plus qu'à créer les répertoires nécessaires sur le NAS et les associer par des liens à des répertoires sur le RPI.

Exemple d'arborescence cible : 


Voici comment j'ai organisé tout ça. Dans le répertoire home/RPI du NAS j'ai créé deux sous répertoires : Prog et Save.



Ensuite sur Raspberry j'ai créé le lien vers le répertoire Prog dans lequel il y aura toute l'arborescence de mes programmes :
cd /home/pi/
sudo ln -s /mnt/nasgarage/Prog ./Prog

Tout ce qui sera stocké dans ces répertoires vont bénéficier de facto de la sécurisation d'un disque réseau. Le RAID par exemple si vous avez configuré votre NAS de cette manière. 
Sinon, pour ma part, j'utilise un programme que je lance régulièrement et qui permet de synchroniser des répertoires différents. Je synchronise mes photos par exemple entre mon disque dur de mon PC et un répertoire sur mon NAS. Et je synchronise également le répertoire Prog entre le NAS et un disque mon PC. Ainsi, il existera quasiment à tout moment deux copies de ce même répertoire. En cas de perte de l'un ou d'erreur disque qui corromprait un fichier, je peux facilement réaliser une restauration. 


Ce programme de synchronisation est gratuit et s'appel SyncBack. 




Réaliser des sauvegardes 

Maintenant que les fichiers de nos programmes sont en sécurité, il y a deux choses importantes que nous pouvons sauvegarder pour anticiper tout problème de pertes de données.

La base de données domoticz 


Cette base de données est la mémoire du système. C'est elle qui contient toute les configurations de nos devices et leurs logs sur toute une année.
Il y a deux manière de sauvegarder cette base.

1- Depuis le navigateur : en allant dans Réglages / Sauvegarde/Restauration :


Vous pourrez récupérer le fichier "domoticz.db" directement dans le navigateur et le stocker pour le sauvegarder.

2-Sauvegardes automatiques : Domoticz embarque la possibilité de sauvegarder sa base de données automatiquement. Pour activer cette fonction il faut aller dans "Réglages / Paramètres" et cocher la case : Activer la sauvegarde automatique



L'activation de cette fonction va générer la création d'un répertoire /home/domoticz/backups qui lui même contiendra 3 sous répertoires dans lesquels domoticz va stocker des sauvegardes de sa base toutes les heures, tous les jours et tous les mois.


Il faut être root pour accéder à ces répertoires.

Sauvegarder une image de la carte SD 

La sauvegarde la plus complète qui peut etre réalisée pour restaurer le système dans sa totalité en cas, de panne, c'est faire une copie de la carte SD.
Cette copie se fera au niveau matériel. C'est à dire secteur par secteur de la carte mémoire. L'avantage c'est qu'a partir d'une telle sauvegarde, vous pourrez retrouver votre système à l'identique même en changeant de carte SD.

Si vous avez suivi le chapitre précédent sur le montage d'un répertoire sur un lecteur réseau, il sera alors très facile de lancer une copie de la totalité de la carte SD car l'espace cible sera justement ce répertoire réseau !

Pour rappel, j'ai monté un disque réseau dans le répertoire /mnt/nasgarage. Ce répertoire correspond à un répertoire (/home/RPI/) sur mon NAS.
Je crée donc dans ce dernier un sous répertoire nommé "Save" et dessous encore un nommé "SdImg". Ces répertoires serviront à conserver des copies de la carte SD du Raspberry.

Dans ce contexte la commande à lancer est : 
sudo dd if=/dev/mmcblk0 of=/mnt/nasgarage/Save/SdImg/Nom_fichier.img bs=512

Je vous laisse regarder sur le net des explications sur la commande dd si vous souhaitez approfondir. Mais la chose la plus importante est de ne pas inverser la source et la cible ! On copie bien if (Input file) sur of (Output file). Si vous vous trompez vous écraserez votre carte SD et tout ce qu'elle contient de manière définitive.


Arrêt et relance des systèmes 


La sauvegarde des données est une étape extrêmement importante pour la sécurisation d'une solution domotique, et même plus largement, pour la sécurisation de tout système !
Mais la particularité d'un système domotique, est qu'il est sollicité en permanence par un flux de données qu'il doit gérer. De plus, un serveur domotique doit fonctionner sans aucune faille 7j/7 et 24h/24. Et il est extrêmement rare d'avoir des systèmes informatique et électroniques capables de garantir un tel fonctionnement sans aucune dégradation du niveau de service.
Que ce soit une occupation mémoire qui augmente, des ports qui se figent, des communications entre équipement qui "bagottent", au fil du temps le système se dégrade petit à petit.
Pour éviter ces dysfonctionnements, la solution c'est le reboot !
Après une petite page de pub, nous allons voir comment gérer cela proprement.





Reboot du Raspberry


Pour rebooter un RPI rien de plus facile. On débranche et on rebranche !
Sinon de manière logicielle on peut lancer la commande :
sudo shutdown -r now

Mais nous n'allons pas fiabiliser notre solution domotique en lançant des reboot à la main ! Nous allons automatiser cela en utilisant la fonction "crontab" des systèmes linux.
Crontab est un mécanisme qui permet de dire au système de lancer des actions de manière régulières.
Je vous laisse regarder sur le net si vous souhaitez plus d'informations.
Pour ma part, je vais me contenter de décrire de manière la plus pragmatique possible comment gérer le reboot de notre système.

Pour programmer des actions qui seront lancées par le daemon cron, il va falloir ajouter des lignes dans le fichier de configuration "/etc/crontab".
Chaque ligne représente une action à lancer avec la fréquence associée.
Nous allons demander à notre RPI d'effectuer un reboot tous les jours à 3h du matin. Il faudra donc ajouter la ligne suivante à la crontab :
# reboot a 3h00 tous les jours
0 3     * * *   root    /home/pi/Prog/Bash/amd_reboot.sh

Cette ligne va demander au RPI d’exécuter le script amd_reboot.sh en tant que root, tous les jours à 3h.
Et voici le contenu de ce script :
ladate=`date +%c`
sudo echo $ladate" RPI reboot" >> /var/log/amd_reboot.log
sudo shutdown -r now

Je préfère passer par un script plutôt que de lancer directement la commande de reboot afin de pouvoir gérer les logs et également d'ajouter d'autres fonctions si besoin.


Actions au redémarrage ! 

Le reboot chaque nuit du système va permettre de relancer de manière propre tous les services.
Mais certains de ces "services", surtout ceux que nous avons créés, ne se relanceront pas tout seuls. Je pense notamment à la partition de notre disque réseau que nous avons monté précédemment.
Je pense aussi à des programmes, comme celui qui va permettre la détection de l'appuie sur un Dash Button, qui doivent être lancé à chaque démarrage de la machine

Il va nous falloir exécuter à chaque démarrage du serveur un script qui exécutera toutes les actions dont nous aurons besoin.
Pour ce faire, nous allons ajouter une nouvelle ligne à notre crontab :

#Au reboot
@reboot root /home/pi/script_local/amd_start_at_boot.sh

Cette ligne fait appel à une définition spécifique "@reboot" qui dit au démon cron d'executer la commande  "/home/pi/script_local/amd_start_at_boot.sh" en tant que root lorsque l'ordinateur redémarre.


Toutefois attention : au reboot le répertoire de notre NAS ou nous avons nos programmes n'est pas encore monté ! Il faudra donc que ce script qui effectue les première actions au reboot, soit stocké en local sur la carte SD. 



Et voici le code du programme amd_start_at_boot.sh : 
#! /bin/bash
# -*- coding: utf-8 -*-
# Monte la partition NAS
sudo /home/pi/script_local/amd_mount_nas.sh
# Si la partition est monteee alors on peut lancer les commandes souhaitées
if [ $? = 0 ];
then
    #Commande 1 : lance le demon qui detecte l'appuie sur un Dash Button
    cd /home/pi/Prog/Python/DashButton
    sudo nohup ./amd_dash_button.py &
    #Commande 2 : ....
fi


Comme vous pouvez le constater la première chose qui est faite c'est justement de monter la partition avec le NAS. Une fois la partition montée, le PI aura accès à tous les programmes stockés dans le répertoire /home/pi/Prog.

Voici le code du script qui monte la partition :

#! /bin/bash
### BEGIN INIT INFO
# Provides:          mountnfs
# Required-Start:    $local_fs
# Required-Stop:
# Should-Start:      $network $portmap nfs-common  udev-mtab
# Default-Start:     S
# Default-Stop:
# Short-Description: Wait for network file systems to be mounted
# Description:       Network file systems are mounted by
#                    /etc/network/if-up.d/mountnfs in the background
#                    when interfaces are brought up; this script waits
#                    for them to be mounted before carrying on.
### END INIT INFO

. /lib/init/vars.sh
. /lib/init/mount-functions.sh
. /lib/lsb/init-functions

############################################################################
# amd_mount_nas.sh
#
# Version : 1.0
# Monte la partition sur le nas garage.
# Ce script est à lancer à chaque démarrage systeme.
# un fichier de conf pour prendre les informations
#
# (c) AMD
#
############################################################################
nom_programme=$0
ladate=`date`

echo "$0 : $ladate : AMD: Lancement programme" >> /var/log/messages

sudo mount -t cifs -o username=RPI,password=votre_passwd//192.168.1.200/homes/RPI /mnt/nasgarage 2>> /var/log/messages
res=$?
count=1
nb_essai=3
while [ $res != 0 ] && [ $count -le $nb_essai ]
do
    echo "$0 : $ladate : AMD : Essai connexion NAS nunemo $count(sur $nb_essai)" >> /var/log/messages
    sudo mount -t cifs -o username=RPI,password=votre_passwd //192.168.1.200/homes/RPI /mnt/nasgarage 2>> /var/log/messages
    res=$?
    let "count += 1"
    if [ $res != 0 ] && [ $count -le $nb_essai ];
    then
        sleep 10
    fi
done

if [ $res = 0 ];
then
    echo "$0 : $ladate : AMD : mount OK ($res)" >> /var/log/messages
else
    echo "$0 : $ladate : AMD : Erreur mount ($res)" >> /var/log/messages
fi

exit $res

Bien entendu il vous faudra personnaliser ce script en fonction de l'arborescence de vos dossiers et de votre contexte. L'idée principale est de montrer :

  1. Comment lancer des commandes au reboot du système. 
  2. Comment monter une partition sur un NAS au reboot en faisant plusieurs essais car le NAS peut mettre quelques secondes s'il était en veille. 


Actions sur l'interface domoticz 

Il arrive également que que ce soit la équipements de réception connectés au RPI qui ne répondent plus. Cela m'est arrivé principalement avec mon récepteur RFX rfxtrx433e qui "freeze". C'est quand même assez rare il faut l'admettre, mais lorsque cela arrive c'est génant et on ne s'en apperçoit pas tout de suite.
Domoticz est capable de gérer cette situation ! En tout cas d'essayer !
Dans l'onglet matériel il y a un paramètre appelé "Délais d'attente des données". Ce paramètre indique au serveur domoticz qu'il faut relancer le matériel associé si aucune données n'est reçue pendant la durée indiquée.




Depuis que j'ai activé cette fonction (plus de 6 mois) je n'ai jamais eu une interruption d'émission et réception due au rfxtrx433e .
La même chose est réalisable pour les autres équipements : dongle ZWAVE ....


Conclusion 


Nous avons vu dans cet article comment mettre en place facilement quelques actions simples qui vont sécuriser notre solution domotique :

  • Sécurisation des données pour ne plus perdre les programmes ou les configurations qui nous ont demandé des heures de travail pour être mises en place. 
  • Sécurisation du système pour réaliser une reprise en cas de panne.
  • Fiabilisation du fonctionnement et de la continuité de service.

Depuis que j'ai mis en place ces quelques actions, depuis plus de 6 mois domoticz tourne sans quasiment aucune faille, aucune perte de données et offrant une qualité d'accès à toutes ses fonctions de très bon niveau. En résumé je n'ai quasiment plus aucun problème.

Ce que je n'ai pas géré, c'est le cas de la panne d’électricité. Mais cela fait partie de mes futurs projets.

Et si cet article ou les autres dans ce blog vous semblent utiles, n'hésitez pas à cliquer sur le lien ci-dessous pour aller sur Amazon ! Sans vous couter quoi que ce soit, cela m'aidera à investir dans de nouveaux matériels que je ne manquerai pas de vous présenter.




Soutenez la blogoculture ...

Vous appréciez les articles frais et vitaminés de ce blog et vous voulez faire un geste pour encourager ce partage, saluer le travail, ou parce y avez trouvé des choses utiles ( et que vous êtes sympa ) ?

... c'est possible et vous avez le choix !
Si vous avez un compte Paypal et quelques euros à offrir sans vous mettre sur la paille, subventionnez la culture domotique à l'ancienne !
Vous ne dépenserez pas un radis de plus en faisant votre achat sur Amazon à partir de ce lien.
Economisez du blé avec Amazon Prime ! Offre d'essais 1 mois gratuit (et renouvelable).
Soyez chou et aidez les petits producteurs de blog à se faire connaitre auprès de vos amis facebook !

Merci

Commentaires

  1. Bonjour, et merci pour ton article concernant ces sujets essentiels, les solutions sont efficaces. J'ai rencontré deux soucis, l'un lors de l'install de cifs-utils qui a nécessité un sudo pour que ça aboutisse, et l'autre sur la commande du mount qui me renvoyait un message "Operation not supported". Finalement j'ai trouvé la solution ici (https://goo.gl/Qw4RpY), il fallait indiquer une version précédente du protocole SMB, ça ne fonctionne plus en 2.0.

    RépondreSupprimer

Enregistrer un commentaire