Quelques lecteurs du site on acheté une Orange Pi Zero 2, puisque c'est disponible, pas cher et que ça fonctionne correctement. Mais du coup les questions arrivent, surtout depuis les articles avec Docker + Portainer. Ces dernières semaines, puisque je n'ai pas encore trouvé de boulot, j'ai eu le temps d'expérimenter. Dans les lignes ci-dessous on va parler :
de la grande muraille numérique et comment contourner le problème des RAW guithub,
des templates pour Portainer qui simplifient l'installation (pas toujours) et comment on fait derrière la muraille
du monitoring de la carte, parce que comme Alain Aspect, nous aussi, quand on veut savoir, on mesure !
Et on va bourriner plutôt que d'être élégant, par avance je présente mes plus plates...
La Chine dispose de ses propres outils et sociétés pour gérer l'internet. Les services de Google / Alphabet ne fonctionnent pas et c'est toute une technologie alternative qui a été développée pour ne pas enrichir les multinationales occidentales.
En plus de cela, une sorte de grande muraille numérique se développe au fil des années. Les occidentaux présents en Chine qui gèrent leurs mails depuis gmail et qui ont l'habitude de consulter wikipédia sont obligés de recourir aux services de VPN.
La Chine fait la chasse aux VPN et quand arrive l'heure du comité central du Parti Communiste pour la désignation du prochain dirigeant, la pression sur l'accès internet occidental augmente.
Récemment la Chine a mis en place une technique qui consiste a chercher des signatures "VPN" dans le flux. Le bordel dans cette histoire c'est que l'accès aux fichiers RAW de github est devenu impossible.
L'équipe de pi-hosted travaille constamment à proposer une liste d'application via les templates de Portainer.
Bien entendu on peut installer tous les containers que l'on souhaite du moment qu'ils sont compatibles avec l'architecture et que ça rentre dans les ressources disponibles de la machine.
L'avantage de la liste proposée par la petite communauté pi-hosted c'est quelle offre des containers garantis fonctionnels et pré configurés pour bien fonctionner (parfois entre eux) avec une Raspberry (ou une Orange Pi). On veut l'utiliser !
Le problème, c'est que cette liste s'appuie sur un fichier RAW exposé par github et que cette liste n'est pas accessible depuis l'internet chinois et souvent même avec un VPN !
Portainer permet de configurer où la liste des temlpates se trouve. A priori c'est cette adresse qui est définie :
https://raw.githubusercontent.com/pi-hosted/pi-hosted/master/template/portainer-v2-amd64.json
Dans le menu de gauche (non visible sur la copie d'écran ci-contre) sélectionnez Settings puis la roue dentée Settings.
La page ci-contre s'affiche et permet de définir où se trouve la liste des Templates.
Comme nous sommes en Chine et que nous ne pouvons pas accéder au RAW, on vas se débrouiller autrement, en mode bourrin.
L'idée consiste à récupérer le repository depuis github sur le disque local et ensuite : de le "servir" et le référencer dans les paramètres.
Il y a une question que vous devez traiter avant de récupérer le repository, c'est de savoir où vous voulez le stocker. Personnellement j'ai choisi de le mettre sur le disque dur connecté à la Orange Pi et pas sur la carte SD.
Le disque est monté dans le dossier /media/opz2. Donc, sur la ligne de commande :
cd /media/opz2
ensuite la commande suivante permet de faire la liste des fichiers et dossiers :
ls -la
j'ai déjà récupéré le repo, je vais l'effacer pour le recopier à nouveau (le repo est mis à jour plusieurs fois par semaine).
La première commande supprime le repo (si présent) :
rm pi-hosted/ -r -f
La seconde permet de récupérer la dernière version :
git clone https://github.com/pi-hosted/pi-hosted.git
Pour installer Raspberry Pi Monitoring comme expliqué plus bas, je vous propose de cloner aussi un autre repo avec la commande suivante :
git clone https://github.com/oijkn/Docker-Raspberry-PI-Monitoring.git
Parce que nous en aurons besoin ensuite !
Dans les paramètres de Portainer, quand on spécifie la liste des templates, on indique une adresse ouaibe. Comment faire pour avoir le repo "servi" par un serveur avec une adresse locale ? Il y a de nombreuses possibilités, mais il y en a une qui tient en une seule ligne ! Whaoo ! Et comment on fait ? La documentation est à cette adresse. Il s'agit tout simplement de lancer le serveur http de python.
La commande est la suivante (à condition d'être resté dans le même dossier) :
python3 -m http.server
Cela lance le serveur http de pyhton sur le port 8000.
Avec un navigateur, je peux voir, sur l'adress IP de ma carte et sur le port 8000 (192.168.1.120:8000) la liste des dossiers et fichiers, comme sur l'image ci-contre.
En parcourant les dossiers, je vais dans template et là se trouve le fichier que je veux utiliser comme template (le arm64.json) :
Je peux cliquer dessus pour le visualiser.
Et maintenant l'information qui intéresse, c'est l'adresse du fichier RAW que l'on récupère dans le navigateur.
En l'occurrence (chez moi) il s'agit de :
http://192.168.1.120:8000/pi-hosted/template/portainer-v2-arm64.json
Retour dans portainer pour indiquer où se trouve le fichier json des templates. L'URL c'est l'adresse que l'on vient de récupérer en ajoutant http:// devant :
http://192.168.1.120:8000/pi-hosted/template/portainer-v2-arm64.json
Bon, si vous tapez Ctrl X ou que vous fermez brutalement la session SSH, le process python n'est plus actif et il faudra recommencer à venir dans le dossier et relancer la commande python. Il y a un truc bien dégueulasse pour s'éviter cette peine et qui est vraiment nul en terme de sécurité : vous pouvez ajouter le service au démarrage de la machine, par exemple dans le fichier crontab.
Pour cela tapez la commande suivante :
sudo crontab -e
Et ensuite ajoutez la ligne suivante :
@reboot sleep 30 && cd /media/opz2 && python3 -m http.server
Puis Ctrl S pour enregistrer et Ctrl X pour quitter... La ligne ci-dessus :
demande au moment du reboot
d'attendre 30 secondes (le temps que le disque soit monté)
puis de se déplacement dans le dossier /media/opz2 (là où sont stockés les repos partagés)
puis de lancer le serveur http python
Voilà c'est fini en mode bourrin pour la grande muraille numérique.
Ah, ce serait intéressant de monitorer la carte, de savoir la température du processeur, l'occupation mémoire, quels sont les containers qui utilisent le réseau, la mémoire...
Mmoui, tout cela existe l'ami, c'est une stack qui est présente dans la liste des Templates.
Whaa, et c'est facile à installer ?
Bhé non, c'est pour ça que je vais faire une documentation.
Moi j'aime beaucoup Grafana qui est un outil formidable. Aujourd'hui, nous ne sommes pas en train de monitorer plusieurs dizaines de milliers de serveurs, juste on regarde quel container envoie des trames sur le réseau : c'est le LMS ! C'est le serveur audio installé sur la Orange Pi Zero 2.
Dans Portainer, dans la liste des Templates (que l'on sait récupérer même en Chine) se trouve une stack : Raspberry Pi Docker Monitor.
Une stack, c'est un ensemble de containers que l'on a regroupés pour qu'ils travaillent ensemble sur une fonction spécifique.
Si l'on clique sur "Raspberry Pi Docker Monitor" alors le détail est affiché et il y a une information super importante; il faut exécuter un script de pré-installation !
De deux choses l'une :
vous n'êtes pas en Chine et vous pouvez exécuter la commande sur la ligne de commande...
Ou alors vous êtes en Chine et les ennuis vont commencer !
Alors on reprend :
si vous êtes du bon côté de la muraille, sur la ligne de commande vous pouvez taper : wget -qO- https://raw.githubusercontent.com/pi-hosted/pi-hosted/master/tools/rpi_docker_monitor.sh | bash
si vous êtes en Chine, il faut suivre les étapes ci-dessous...
Pour parvenir à ses fins il faut :
avoir récupéré le repo du monitoring, avec la commande git clone https://github.com/oijkn/Docker-Raspberry-PI-Monitoring.git et avoir le serveur http python démarré (on parle de tout ça ci-dessus)
aller via la ligne de commande, dans le dossier du repository de pi-hosted téléchargé plus tôt, modifier le script d'installation et l'exécuter !
Le script à modifier est dans le dossier pi-hosted/tools. Chez moi, il est accessible dans le dossier /media/opz2/pi-hosted/tools/ :
Ci-dessous la copie du fichier original :
en italique se trouvent des lignes que l'on peut supprimer parce que l'on ne vas pas sur internet chercher le script
en gras se trouve la référence au fichier raw qui contient des paramètres. Cette référence doit être modifiée parce qu'en Chine on n'accède pas aux RAWs de github.
#!/bin/bash
function error {
echo -e "\\e[91m$1\\e[39m"
exit 1
}
function check_internet() {
printf "Checking if you are online..."
wget -q --spider http://github.com
if [ $? -eq 0 ]; then
echo "Online. Continuing."
else
error "Offline. Go connect to the internet then run the script again."
fi
}
check_internet
echo "Creating directories..."
sudo mkdir -p /portainer/Files/AppData/Config/prometheus/config || error "Failed to create config directory!"
sudo mkdir -p /portainer/Files/AppData/Config/prometheus/data || error "Failed to create data directory for Prometheus!"
sudo mkdir -p /portainer/Files/AppData/Config/grafana/data || error "Failed to create data directory for Grafana!"
echo "Downloading Prometheus config files if they don't exist"
if [ -d /portainer/Files/AppData/Config/prometheus/config/prometheus.yml ];
then
echo "/portainer/Files/AppData/Config/prometheus/config/prometheus.yml is a directory removing"
rm -rf '/portainer/Files/AppData/Config/prometheus/config/prometheus.yml/'
fi
if [ ! -f /portainer/Files/AppData/Config/prometheus/config/prometheus.yml ];
then
sudo wget -O /portainer/Files/AppData/Config/prometheus/config/prometheus.yml https://raw.githubusercontent.com/oijkn/Docker-Raspberry-PI-Monitoring/main/prometheus/prometheus.yml || error "Failed to download prometheus.yml file!"
fi
if [ -d /portainer/Files/AppData/Config/grafana/grafana.ini ];
then
echo "/portainer/Files/AppData/Config/grafana/grafana.ini is a directory removing"
rm -rf '/portainer/Files/AppData/Config/grafana/grafana.ini'
fi
sudo touch /portainer/Files/AppData/Config/grafana/grafana.ini || error "Failed to touch grafana.ini file!"
echo "Setting permissions..."
sudo chown -R 472:472 /portainer/Files/AppData/Config/grafana/data || error "Failed to set permissions for Grafana data!"
echo "Done You are ready to goto next step in the install document"
Comment retrouver l'adresse du fichier yml à passer en paramètre au script ? Si l'on a toujours le serveur python actif, on va parcourir la liste des dossier proposés pour aller à l'adresse suivante http://192.168.1.120:8000/Docker-Raspberry-PI-Monitoring/prometheus/prometheus.yml
Quand on connait l'adresse, on peut modifier le fichier de script d'installation avec la commande suivante pour éditer le fichier :
sudo nano rpi_docker_monitor.sh
Ensuite on supprime toutes les lignes jusqu'à check_internet compris.
Et on modifie la partie en gras pour remplacer :
https://raw.githubusercontent.com/oijkn/Docker-Raspberry-PI-Monitoring/main/prometheus/prometheus.yml
par l'adresse locale du fichier :
http://192.168.1.120:8000/Docker-Raspberry-PI-Monitoring/prometheus/prometheus.yml
L'adresse IP dépend est celle de votre machine et l'arborescence est celle que vous avez chez vous. Bon courage.
Quand le fichier de script est modifié avec nano, Ctrl S + Ctrl X pour enregistrer et quitter l'éditeur, et ensuite il faut le lancer.
En étant dans le dossier du fichier on tape la commande suivante :
sudo ./rpi_docker_monitor.sh
La sortie écran doit ressembler à la copie ci-dessous :
Une fois que le script de pré-installation est passé, déployez la stack : dans les Templates de portainer, vous avez sélectionné Raspberry Pi Docker Monitor et vous cliquez sur le bouton "Deploy the Stack" (patientez 2 heures en Chine).
La stack est composée de quatre containers : cadvisor, node-exporter, prometheus, grafana.
On récolte les informations, on les stocke et on les montre. Prometheus c'est le Time Serie Database, et la rôle de Grafana c'est de montrer des Time Series sous forme de Dashboards.
Pour voir les données de monitoring de la carte, il faut :
lancer grafana en se signant avec admin admin puis changer le mot de passe du compte administrateur
connecter une source de données, en l'occurence le prometheus de la stack
récupérer le fichier json d'un rapport tout bien préparé
l'importer dans Grafana
et enfin profiter du monitoring
On va détailler tout cela...
Vous avez exécuté le script de pré-installation et déployé la stack puis patienté jusqu'à ce que les quatre containers de la stack soient "running".
La suite se passe dans Grafana... Ouvrez le navigateur et rendez-vous à l'adresse IP de la carte, port 3000 avec le navigateur, par exemple : http://192.168.1.120:3000/
Je n'ai pas de copie d'écran, juste entrez admin / admin pour vous signer et l'écran d'après Grafana demande un nouveau mot de passe pour le compte admin. Voilà qui est fait.
Ensuite en bas à droite de l'écran se trouve un roue dentée pour la configuration. On veut définir Prometheus comme la data source par défaut.
Cliquez sur Data Sources comme dans la copie d'écran ci-contre.
Comme type de Data Source, sélectionnez Prometheus
Dans la partie URL entrez la chaine suivante :
http://monitoring-prometheus:9090/
Ensuite faite défiler la page et en bas cliquez sur Save & Test. Si vous avez "du vert" c'est que la connexion s'est bien passée.
Puis, en haut à droite sélectionnez le menu des Dashboards (les quatre carrés) et sélectionnez Browse.
Puis en haut à gauche cliquez sur New et ensuite "Import". On laisse en plan Grafana car maintenant il faut aller chercher le fichiers json qui contient la description du dashboard à cette adresse :
https://github.com/oijkn/Docker-Raspberry-PI-Monitoring/blob/main/grafana/dashboard_by_oijkn.json
Il faut recopier les +3000 lignes dans le presse-papiers... Si vous n'arrivez pas à voir le fichier en RAW sur github, parce que vous êtes en Chine, comme on a déjà récupéré le repo (il y a deux heures) on peut aussi utiliser la copie locale.
On peut récupérer le contenu du fichier en allant à l'adresse suivante :
https://raw.githubusercontent.com/oijkn/Docker-Raspberry-PI-Monitoring/main/grafana/dashboard_by_oijkn.json
Parce que le fichier est sur notre carte et que l'on a le serveur http python qui nous sert un dossier contenant les repos dont on a besoin...
Ctrl A et Ctrl C pour tout sélectionner et pour copier...
Puis retour dans grafana...
Dans Grafana, dans Import via panel json, collez les 3000 lignes récupérées puis cliquez sur Load.
Puis sur l'écran suivant cliquez sur "Import".
Et voilà, avec un peu de chance vous aurez un écran qui ressemble à la copie ci dessous... Moins les données ! Parce que monitoring tourne depuis plusieurs jours alors que le votre commence à peine.
J'espère que je n'ai rien oublié et que cette page va vous permettre d'installer sans trop de souffrance le monitoring. Si l'on regarde un peu mes données par rapport aux processus qui tournent, on peu en tirer des informations. La carte réalise les fonctions de :
serveur Audio avec le LMS
NAS avec un partage SAMBA
transfert de fichiers avec FileZilla
navigation sur les fichiers partagés avec FileBrowser
elle a aussi un portainer qui contrôle les autres portainers sur les autres cartes de la maison (qui n'ont que l'agent portainer, pas le portainer complet)
d'autres containers pas gourmands tels que Homer ou Snipett-Box
Si l'on regarde les données sur 24 heures, on voit que le processeur n'est jamais très sollicité, avec 10% quand le LMS sert la musique. J'ai vu un pic à 12% avec Filezilla en train de descendre des fichiers de distributions Linux de la seedbox.
Le gros consommateur de CPU c'est le serveur Audio, ensuite on a FileZilla et le lmonitoring. Tout ça pour une consommation très réduite de ressources.
Avec seulement 1Go de mémoire vive, les ressources sont comptées. On voit que l'on a des pics... Qu'est ce que c'est ?
Usual suspects. Les Pics c'est le LMS, le serveur audio qui consomme la RAM et qui de temps en temps la restitue.
Ensuite on a FileZilla lors de la copie de gros fichiers...
Ci dessous les stats du lecteur audio (Raspi Zero 2 W). On voit bien que squeezelite, le client du serveur, reçoit des données quand on écoute la musique, et en reçoit beaucoup dans le cas de fichiers FLACs en 24 bits.
Et une autre Raspberry, une vieille A3+ qui embarque Octoprint dans un container :
"Quand on veut savoir, on mesure". La stack - un peu difficile à installer en Chine - offerte par le travail de la communauté permet d'avoir un monitoring de qualité. Le rapport proposé dans Grafana éclaire bien ce qui se passe sur la machine. Sur les machines même, parce que j'ai installé Docker + Portainer sur des machines sur lesquelles je ne pensais pas que cela puisse marcher.
Le point critique, ce n'est pas le processeur mais la mémoire embarquée. J'ai aussi modifié la SWAP sur les deux cartes Raspberry qui n'ont que 512Mo de RAM et qui ne sont pas puissantes, parce que sans cela, tout était figé. Enfin quoi qu'il en soit, ces installations ont fonctionné bien mieux que ce que je pensais. C'est long à installer mais à l'usage c'est fluide, pas de différence dans Grafana entre une machine de prod du cloud d'un géant de la banque et la Orange Pi Zero 2.
Je suis persuadé qu'avec le nouveau processeur RK3588S gravé en 8nm et mettons 8Go de RAM, on a de quoi faire une machines géniale et je suis impatient de financer la veille sur une carte Khadas ou Radxa ou la future Orange PI 5 ! A l'opposé un processeur Risc d'ici la fin de l'année, maintenant que des distros tournent bien, ce serait aussi intéressant à gratter !