Tuto NRX800 - Script de personnalisation

Bonjour à tous,

Après de longues heures de boulot (et un café tombé sur le PC :woozy_face:), je vous présente ce petit script pour personnaliser le NRX800 !

Dans le menu principal vous avez plusieurs menu pour installer des logiciels selon plusieurs méthodes, par containers, par packages (apt), par package npm (node-red est présinstallé de cette manière); vous avez d’autres sections pour installer des outils systèmes, les pilotes GPIO et RTC (cas d’OS vierge comme un nouveau Debian), et plein de petites choses…

On commence par le menu de containers.
Les containers chargés sont personnalisables dans la section du code
« function activate_globals_variables_containers() », vous pouvez donc en supprimer et en ajouter sans problèmes, leur chargement est dynamique selon le contenu de cette section. Il est possible de sélectionner à ce stade plusieurs containers, l’enchainement sera automatique (pareil pour les package etc).

Les packages chargés sont personnalisables également dans la section …"function activate_globals_variables_packages() " (étonnant non ! :thinking:), comme pour les containers c’est un chargement dynamique !

Et vous serez étonnés surement de constater qu’il en est de même pour les packages npm ! :sweat_smile:
Personnalisables dans la section « function activate_globals_variables_packages_npm() »

On arrives dans le menu des Outils Système

Vous pourrez paramétrer facilement les outils les plus courants pour la sécurité et la gestion par exemple les menus pour Fail2Ban avec les paramètres gérés avec le menu :

Voila c’est plus convivial qu’en ligne de commande ! (oui je suis fainéant :laughing:)

Un spécial Wireguard @fgtoul (j’ai vidé mon stock d’aspirine :rofl:)

On peut ensuite se connecter sur une interface web qui permet de gérer Wireguard

Et voila le peer est créé, on peut télécharger la config, le qr-code, scanner le qr-code directement depuis l’appli du playstore wireguard etc

et faire des sauvegardes

Ensuite nous avons le menu pour installer les pilotes dédiés pour le NRX800

Puis le menu « Divers » vous propose des paramétrages divers

comme étendre la partition du lecteur nvme (bridé à 4Go pour faciliter le download d’images)

ou installer un motd personnalisable dans la fonction "function menu_6_misc_config_motd() "
ou redémarrer le nrx

ce qui donnes ensuite

Il y a ensuite le menu « Inventaire » qui permet de faire un état des lieux du système pour analyse à différents stades (après donwload d’une image, post install de logiciel etc )

et le menu « Langage » qui permet aussi bizarre que celui puisse paraitre :innocent: de changer la langue du script (on peut assez facilement ajouter une langue autre que le français et l’anglais dans cette section de toutes les fonctions

Définit les textes en fonction de la langue sélectionnée

if [ « $G_LANG » = « fr » ]; then

else

fi
)

Voila j’ai essayé de rendre le code le plus homogène possible et le plus commenté, si vous trouvez des bogues ou si vous avez besoin d’explications supplémentaires n’hésitez pas, par la suite je mettrai ce tuto dans le wiki (si si @grocrabe désolé pour le retard :woozy_face:) avec plus d’explications en fonction des retours.

le code
nrx800-config.zip (92,0 Ko)

Vous pouvez uploader le script avec filezilla, puis une fois en ssh
le rendre exécutable avec la commande : sudo chmod +x nrx800-config.sh


et le lancer avec la commande : sudo bash nrx800-config.sh

si vous avez besoin d’aide a ce niveau, je vais faire un mini tuto à part pour cela et compléterai dans le wiki ensuite. Pour l’édition du script, j’utilise Notepad++

Bonne journée

8 « J'aime »

Bonjour @cce66
c’est un sacré boulot, merci pour le partage.
Linuxien de la 1ère heure mais vite attiré par les simplicités de configurations des autres OS, je n’ai plus (ou presque plus) d’excuse pour ne pas acquérir un NRX800. Quoi que, je suis tenace et ces lignes de commandes barbares ne m’attirent plus du tout :rofl: l’avenir le dira :slight_smile:
Bonne journée

@fgtoul

Comme moi, on va monter un club des anciens !!! :rofl:

Je dirais qu’entre hier ou on avait le choix entre mémoire et livres ou docs (en roosbeef la plupart du temps) aux années 2000 avec l’avènement de google et sa recherche en ligne et aujourd’hui ou avec l’IA ou on lui pose une question et on a tout de suite une réponse avec des exemples commentés on a fait un bond de géant coté codage, je dirais qu’on dégrossit à 50% avec l’IA pour tout ce qui est généralités et simplicités et le reste bah c’est l’humain …mais de moins en moins mais si on regarde le bon coté des choses si cela permet de réduire le temps de codage cela permet de faire plus de projets donc je dirais que c’est bénéfique ! :slightly_smiling_face:

Par exemple j’ai donné à manger le script à Grok et je lui ai demandé « peut tu me faire une synthèse de ce que fait le script stp » et il m’a répondu en -7s :

Le script nrx800-config.sh est un outil d’installation et de configuration pour le système NRX800 basé sur Debian, utilisant un Raspberry Pi CM4. Il automatise l’installation de logiciels, la gestion des containers Docker, la configuration système et réseau, et fournit des fonctionnalités de débogage et de gestion d’erreurs. Voici une synthèse de ses principales fonctionnalités :

  1. Configuration initiale :

    • Définit des variables globales (modèle NRX800, version, langue, fuseau horaire, OS).
    • Configure la langue (français/anglais) et affiche un message de bienvenue.
    • Vérifie l’OS (Debian), le fuseau horaire, et l’exécution en root.
    • Installe whiptail pour les interfaces de menu si nécessaire.
  2. Gestion des containers Docker :

    • Gère une liste de containers (Node-Red, Home-Assistant, Grafana, etc.) avec leurs commandes d’installation/désinstallation.
    • Crée des répertoires pour chaque container avec des permissions spécifiques.
    • Permet de lancer un shell dans un container actif.
  3. Installation de logiciels et pilotes :

    • Installe des packages système (Grafana, Mosquitto, etc.), des modules npm (Node-Red, Directus), et des extensions Node-Red (GPIO, SerialPort).
    • Gère des pilotes pour le Raspberry Pi (GPIO, I2C, RTC, Bluetooth, etc.) avec activation/désactivation via overlays.
  4. Outils système :

    • Installe et configure des outils comme Docker, Fail2Ban, OpenSSH, Ufw, et WireGuard.
    • Gère le système de fichiers en lecture seule (overlay) et configure NTP pour la synchronisation horaire.
  5. Gestion réseau :

    • Récupère et valide l’IP, le masque de sous-réseau, la passerelle, et le DNS.
    • Liste les ports ouverts et valide les configurations réseau.
  6. Inventaire et maintenance :

    • Liste les packages installés (dpkg, npm, Node-Red) et leurs dépendances.
    • Liste les services systemd (actifs, inactifs, masqués, en échec).
    • Permet la mise à jour du système (apt-get update et full-upgrade) avec une barre de progression.
  7. Gestion des erreurs et débogage :

    • Redirige les sorties vers un fichier de log (NRX800_err.log).
    • Active des options de débogage (erreurs, pipelines, variables non définies).
    • Gère les permissions des répertoires et fichiers.
  8. Interface utilisateur :

    • Utilise whiptail pour des menus interactifs (sélection de langue, containers, options de configuration).
    • Affiche des messages avec des couleurs et des icônes Unicode pour une meilleure lisibilité.
  9. Autres fonctionnalités :

    • Permet de redémarrer le système avec confirmation.
    • Implémente un verrou pour éviter les exécutions parallèles et un timeout de 30 minutes.

En résumé, ce script est un outil complet pour configurer, gérer et maintenir un système NRX800, avec un focus sur l’automatisation, la domotique, la sécurité, et la gestion réseau, tout en offrant une interface conviviale et un suivi des erreurs robuste.

J’aimes bien Grok :star_struck: , je vais lui demander de faire un tutoriel sur le script ! :rofl:

3 « J'aime »

Bonjour @cce66
Avec un nrx vierge on peut tout installé d un coup ?
Merci à toi

Bonjour @seraphinou

Tout installer, non car il y a des doublons voire des triplons par exemple pour node-red tu peux installer en container, par un package standard ou par un package npm. Mais l’avantage, c’est que tu installes et désinstalles depuis le script !

merci @cce66
on le trouve ou le script ?
bonne journee

tu le trouves dans le tuto

tu as juste à suivre le tuto ensuite pour l’installer et l’exécuter :wink:

3 « J'aime »

Bonsoir,
tout d’abord merci pour ce partage, une automatisation des tâches permettra de reproduire les actions et de retrouver son environnement lors de réinstallations.
J’ai noté quelques bizarreries dont je viens vous faire part.

  • Le menu de gestion des packages m’indique que Node-Red n’est pas installé alors que j’accède bien à la page des flows configurés pas GCE. Une installation ne risquerait-elle pas d’écraser la configuration.
  • Après avoir installé Mosquitto, si je veux installer un autre package j’ai toujours la présentation de Mosquitto et non celle du package choisi, quel qu’il soit.
  • Malgré une configuration complète en fr_FR.UTF-8 les accents dans la barre de titre ne sont pas bien rendus (oui je sais c’est un détail mais j’en profite pour le signaler).
    Petite suggestion :
  • Ajouter l’installation du package RpiMonitor

Bonne soirée

@Bonsoir @mj59500

Merci pour ce retour !

C’est normal, Nore-red a été installé avec un package NPM donc n’est pas détecté de la même manière, il doit être présent dans le menu de gestion des package NPM

Les trois méthodes d’installation de Node-RED diffèrent par leur approche, environnement et gestion. On peut installer les trois méthodes sur un même système, mais avec des précautions :
(Attention : Utilisez des ports différents par ex. 1880, 1881, 1882 et vérifiez les versions pour éviter les incompatibilités.)

Ligne 251 (Docker) :

[« Node-Red »]=‹ sudo docker run -d --name node-red -p 51880:1880 -v « /home/${G_USERNAME}/docker/node-red/data:/data » --user « $(id -u ${G_USERNAME}):$(id -g ${G_USERNAME}) » --restart unless-stopped nodered/node-red:latest ›

Exécute Node-RED dans un conteneur Docker. Utilise l’image nodered/node-red:latest, mappe le port 51880 à 1880, persiste les données dans /home/${G_USERNAME}/docker/node-red/data, s’exécute avec l’utilisateur spécifié et redémarre automatiquement sauf si arrêté. Isolé dans un conteneur, aucun conflit avec les autres. Nécessite Docker. Portable.

Ligne 509 (Paquet système) :

[« Node-Red »]=« sudo apt-get update && sudo apt-get install -y node-red && sudo systemctl enable node-red && sudo systemctl start node-red && systemctl status node-red --no-pager »

Installe Node-RED comme service système via apt-get sur un système Debian/Ubuntu, configure un service système avec systemctl, démarre et active Node-RED. Intégré au système, mais dépend des paquets système. Peut entrer en conflit avec l’installation NPM si les versions diffèrent.

Ligne 562 (NPM) :

[« Node-red »]=« sudo npm install -g --unsafe-perm node-red@3.1.3 »

Installe Node-RED globalement via npm avec la version 3.1.3. Simple, mais nécessite Node.js et peut créer des conflits de dépendances. Moins intégré au système. Risque de conflits avec la version système si les ports ou dépendances se chevauchent.

Effectivement, je vois pour corriger merci pour le bug trouvé (plus le nombre de lignes et de fonctions augmentent plus c’est dur de tout retester d’autant que j’ai remis en forme tout le code pour harmoniser ! :woozy_face: du coup j’en ai trouvé un autre dans la fonction enfin un doublon de commande)

Pour ajouter un package, il suffit de demander à grok par exemple en collant la fonction complète :

ajoute l’installation du package rpimonitor stp : #### Tableaux pour la gestion des packages

Tables for packages management

function activate_globals_variables_packages() {

}

et il répond tout de suite (quel gain de temps ! :slightly_smiling_face:) :

function activate_globals_variables_packages() {

  declare -gA G_PACKAGE_NAME=(
    ["Grafana"]="grafana"
    ["Home-Assistant"]="home-assistant"
    ["InfluxDB"]="influxdb"
    ["Jeedom"]="jeedom"
    ["Lighttpd"]="lighttpd"
    ["Mosquitto"]="mosquitto"
    ["Node-Red"]="node-red"
    ["OpenHABian"]="openhabian"
    ["Php"]="php"
    ["Portainer"]="portainer"
    ["Rpimonitor"]="rpimonitor"  # Ajout
    ["Sqlite3"]="sqlite3"
    ["Syncthing"]="syncthing"
    ["Zigbee2Mqtt"]="zigbee2mqtt"
  )

  declare -gA G_PACKAGE_RESUME_FR=(
    ["Grafana"]="Grafana est un outil de visualisation et d'analyse de données, souvent utilisé avec des bases de données comme InfluxDB ou Prometheus."
    ["Home-Assistant"]="Home-Assistant est une plateforme de domotique centralisée pour contrôler et automatiser les appareils connectés."
    ["InfluxDB"]="InfluxDB est une base de données temporelle optimisée pour les données de séries temporelles et les métriques."
    ["Jeedom"]="Jeedom est une solution de domotique open source pour piloter et automatiser votre maison."
    ["Lighttpd"]="Lighttpd est un serveur web léger et rapide, idéal pour les applications simples."
    ["Mosquitto"]="Mosquitto est un broker MQTT léger pour la communication entre appareils IoT."
    ["Node-Red"]="Node-Red est un outil de programmation visuelle pour connecter des appareils IoT et des services."
    ["OpenHABian"]="OpenHABian est un système domotique optimisé basé sur OpenHAB, conçu pour fonctionner efficacement sur Raspberry Pi."
    ["Php"]="Php est un environnement d'exécution PHP pour développer et exécuter des applications web."
    ["Portainer"]="Portainer est une interface de gestion web pour administrer les containers et services Docker."
    ["Rpimonitor"]="Rpimonitor est un outil de surveillance des performances système pour Raspberry Pi, affichant des statistiques comme CPU, RAM et disque."  # Ajout
    ["Sqlite3"]="Sqlite3 est une base de données SQL légère et embarquée, sans serveur."
    ["Syncthing"]="Syncthing est un outil open-source de synchronisation de fichiers entre plusieurs appareils, sans serveur central."
    ["Zigbee2Mqtt"]="Zigbee2Mqtt est une passerelle pour connecter les appareils Zigbee à un broker MQTT."
  )

  declare -gA G_PACKAGE_RESUME_EN=(
    ["Grafana"]="Grafana is a data visualization and analytics tool, commonly used with databases like InfluxDB or Prometheus."
    ["Home-Assistant"]="Home-Assistant is a centralized home automation platform to control and automate connected devices."
    ["InfluxDB"]="InfluxDB is a time-series database optimized for time-series data and metrics."
    ["Jeedom"]="Jeedom is an open-source home automation solution to control and automate your home."
    ["Lighttpd"]="Lighttpd is a lightweight and fast web server, ideal for simple applications."
    ["Mosquitto"]="Mosquitto is a lightweight MQTT broker for communication between IoT devices."
    ["Node-Red"]="Node-Red is a visual programming tool to connect IoT devices and services."
    ["OpenHABian"]="OpenHABian is an optimized home automation system based on OpenHAB, designed to run efficiently on Raspberry Pi."
    ["Php"]="Php is a PHP runtime environment for developing and running web applications."
    ["Portainer"]="Portainer is a web management interface to administer Docker containers and services."
    ["Rpimonitor"]="Rpimonitor is a system performance monitoring tool for Raspberry Pi, displaying statistics like CPU, RAM, and disk usage."  # Ajout
    ["Sqlite3"]="Sqlite3 is a lightweight, serverless SQL database."
    ["Syncthing"]="Syncthing is an open-source file synchronization tool that syncs files between devices without a central server."
    ["Zigbee2Mqtt"]="Zigbee2Mqtt is a gateway to connect Zigbee devices to an MQTT broker."
  )

  declare -gA G_PACKAGE_CMD_INS=(
    ["Grafana"]="sudo apt update && sudo apt install -y grafana && sudo systemctl enable grafana-server && sudo systemctl start grafana-server && systemctl status grafana-server --no-pager"
    ["Home-Assistant"]="sudo apt-get update && sudo apt-get install -y home-assistant && sudo systemctl enable home-assistant && sudo systemctl start home-assistant && systemctl status home-assistant --no-pager"
    ["InfluxDB"]="sudo apt-get update && sudo apt-get install -y influxdb2 && sudo systemctl enable influxdb && sudo systemctl start influxdb"
    ["Jeedom"]="sudo wget -O /tmp/install_jeedom.sh https://www.jeedom.com/install && sudo chmod +x /tmp/install_jeedom.sh && sudo /tmp/install_jeedom.sh && rm -f /tmp/install_jeedom.sh"
    ["Lighttpd"]="sudo apt-get install -y lighttpd && sudo systemctl enable lighttpd && sudo systemctl restart lighttpd && systemctl status lighttpd --no-pager"
    ["Mosquitto"]="sudo apt-get install -y mosquitto && sudo systemctl enable mosquitto && sudo systemctl restart mosquitto && systemctl status mosquitto --no-pager"
    ["Node-Red"]="sudo apt-get update && sudo apt-get install -y node-red && sudo systemctl enable node-red && sudo systemctl start node-red && systemctl status node-red --no-pager"
    ["Php"]="sudo apt-get install -y php"
    ["Rpimonitor"]="sudo apt-get update && sudo apt-get install -y rpimonitor && sudo systemctl enable rpimonitor && sudo systemctl start rpimonitor && systemctl status rpimonitor --no-pager"  # Ajout
    ["Sqlite3"]="sudo apt-get install -y sqlite3"
    ["Syncthing"]="sudo apt-get update && sudo apt-get install -y syncthing && sudo systemctl enable syncthing@${USER} && sudo systemctl start syncthing@${USER} && systemctl status syncthing@${USER} --no-pager"
    ["Zigbee2Mqtt"]="sudo curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs git make g++ gcc libsystemd-dev && sudo npm install -g pnpm && sudo mkdir /opt/zigbee2mqtt && sudo chown -R ${USER}: /opt/zigbee2mqtt && git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt && cd /opt/zigbee2mqtt && pnpm i --frozen-lockfile && sudo pnpm run build && cp /opt/zigbee2mqtt/data/configuration.example.yaml /opt/zigbee2mqtt/data/configuration.yaml && cd /opt/zigbee2mqtt && sudo pnpm start"
  )

  declare -gA G_PACKAGE_CMD_UNINS=(
    ["Grafana"]="sudo systemctl stop grafana-server && sudo systemctl disable grafana-server && sudo apt-get remove --purge -y grafana && sudo rm -rf /var/lib/grafana /etc/grafana"
    ["Home-Assistant"]="sudo systemctl stop home-assistant && sudo systemctl disable home-assistant && sudo apt-get remove --purge -y home-assistant"
    ["InfluxDB"]="sudo systemctl stop influxdb && sudo systemctl disable influxdb && sudo apt-get remove --purge -y influxdb2"
    ["Jeedom"]="sudo rm -rf /usr/local/bin/jeedom /var/www/html/jeedom /var/lib/mysql/jeedom"
    ["Lighttpd"]="sudo systemctl stop lighttpd && sudo systemctl disable lighttpd && sudo apt-get remove --purge -y lighttpd"
    ["Mosquitto"]="sudo systemctl stop mosquitto && sudo systemctl disable mosquitto && sudo apt-get remove --purge -y mosquitto"
    ["Node-Red"]="sudo systemctl stop node-red && sudo systemctl disable node-red && sudo apt-get remove --purge -y node-red"
    ["Php"]="sudo apt-get remove --purge -y php"
    ["Rpimonitor"]="sudo systemctl stop rpimonitor && sudo systemctl disable rpimonitor && sudo apt-get remove --purge -y rpimonitor"  # Ajout
    ["Sqlite3"]="sudo apt-get remove --purge -y sqlite3"
    ["Syncthing"]="sudo systemctl stop syncthing@${USER} && sudo systemctl disable syncthing@${USER} && sudo apt-get remove --purge -y syncthing"
    ["Zigbee2Mqtt"]="sudo systemctl stop zigbee2mqtt && sudo systemctl disable zigbee2mqtt && sudo rm -rf /opt/zigbee2mqtt"
  )

}

Après il y a plus qu’à remplacer le code dans le script, c’est pareil pour les container, les packages NPM, les pilotes, les menus étant dynamiques l’ajout ou la suppression sera mis à jour au prochain lancement du script

1 « J'aime »

Bonsoir @cce66,

merci pour le nouveau morceau de script, à peine le temps de poser le problème qu’il est déjà résolu. Je teste ça demain. Il va vraiment falloir que je m’intéresse à l’IA :wink:
Bon week-end

2 « J'aime »