Docker OPZ2

Docker, Portainer, LMS

On a déjà installé le Logitech Media Player (LMS) sur la Orange Pi Zero 2 (OPZ2) via la ligne de commande (CLI).

Dans les lignes ci-dessous on installe le LMS en tant que composant Docker. On va utiliser Portainer pour gérer nos containers avec une belle interface graphique. Est-ce que les ressources limitées de la OPZ2, en particulier son petit Giga de mémoire vive, seront suffisants pour le confort d'une interface qui répond vite et bien ? C'est ce que nous allons vérifier dans les lignes suivantes !

Docker permet de gérer des applications "enfermées" dans un container en utilisant le noyau Linux de la machine sur lequel il est installé. C'est une technologie très utilisée depuis une dizaine d'années, mais c'est une technologie rarement mise en ouvre sur un ordinateur consommant 1W !

Le seul risque finalement c'est de perdre du temps. Et même quand un projet n'aboutit pas, il permet souvent d'apprendre.

Autre point : il y a encore un an la question de la consommation électrique n'était pas un sujet des plus importants. Fin 2022 cela commence à le devenir. Il ne s'agit pas de se priver de tout, mais peut-être que les cartounettes qui ne consomment rien peuvent nous aider à réduire la facture énergétique. Et enfin, en suivant des lignes parallèles peut-on mettre Blondie dans un container ?

Orange Pi Zero 2 ?

En 2022 après JC, toutes les cartounettes à 35€ ont disparu du marché. Toutes ? Non, car une entreprise chinoise résiste encore et toujours à la crise des composants, et la vie n'est pas facile pour ceux qui veulent utiliser ces cartes alors qu'il existe des prisons dorées telles qu'Apple ou Roon vantées à tour de bras sur les forums spécialisés qui ont encore un peu d'électricité pour tourner.

La potion magique de Xunlung est composée de deux ingrédients :

  • la carte est disponible

  • elle coûte dans les 35€

Les performances sont satisfaisantes pour en faire un serveur musical et le facteur de forme propose tous les connecteurs du même côté de la carte : de quoi simplifier la fabrication de boîtes en impression 3D.

On a déjà raconté tout ça 1000 fois, nom d'un petibonum, plus la peine de présenter la carte, allons à l'essentiel. Nous avons installé la dernière version de Linux Debian dans un autre épisode : maintenant en route pour Docker et portainer !

On parle de Docker sur la Orange Pi Zero 2

Docker a été créé en 2011 et rendez vous sur la page de Wikipédia pour en savoir plus. Il a longtemps été à la mode et aujourd'hui on en parle sur audiofolies. Docker peut être manipulé avec la ligne de commande, mais nous voulons exactement le contraire, nous allons installer une interface web splendide : portainer.io.

Contrairement à ce qui existait au début des années 2000 en terme de virtualisation, Docker se contente d'utiliser les ressources sous jacentes du système d'exploitation, pour exécuter des composants logiciels, appelés containers.

Docker can package an application and its dependencies in a virtual container that can run on any Linux, Windows, or macOS computer.

Docker utilise les fonctions d'isolation du noyau Linux pour gérer des composants indépendants. Avec cette indépendance, il est tout à fait possible de faire tourner trois versions du serveur audio sur la même carte.

Installation de Docker

Vous trouverez tout en bas de cet article la liste des commandes, sans commentaires. En attendant, voici la liste des commandes à passer pour installer docker et portainer, avec quelques commentaires et des photos d'écran. L'installation prend une dizaine de minutes environ :

apt-get remove docker docker-engine docker.io containerd runc

apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

apt update

sudo usermod -aG docker $USER

apt-get install docker-ce docker-ce-cli containerd.io

La commande suivante permet de tester l'installation. L'image invoquée n'est pas présente sur la carte de la OPZ2, docker la télécharge (pull) et la lance :

docker run hello-world

Installer portainer

Portainer sur sa page web indique cela "Easily deploy, configure and secure containers in minutes on Docker, Kubernetes, Swarm and Nomad in any cloud, datacenter or device".

En résumé on va gérer les containers avec une belle interface. Le plus drôle, c'est que portainer est aussi un container : on utilise un container pour gérer les containers : Inception !

root@orangepizero2:~# sudo docker pull portainer/portainer-ce:latest

latest: Pulling from portainer/portainer-ce

772227786281: Pull complete

96fd13befc87: Pull complete

651bf10f23a7: Pull complete

0cae852aa454: Pull complete

Digest: sha256:70a61e11a899c56f95c23f734c0777b26617729fcb8f0b61905780f3144498e3

Status: Downloaded newer image for portainer/portainer-ce:latest

docker.io/portainer/portainer-ce:latest

root@orangepizero2:~# sudo docker run -d -p 9051:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

172779bb00fc61ab0518d03967ce8430fc38e97b46280579967762acdae70c7c

root@orangepizero2:~#

La première commande commande en gras ci-contre récupère la dernière image de portainer en local (pull)

La seconde commande - indigeste - lance le container :

  • le port d'entrée sera 9051*

  • le nom du container sera portainer

  • docker doit le relancer s'il est arrété

*Par défaut le port du LMS est 9000. Celui de portainer aussi. En indiquant le port 9051, portainer sera gérable à partir de ce port. On laisse le port 9000 disponible pour notre LMS.

En utilisant l'IP de la carte et le port 9051 dans un navigateur, on voit que portainer est installé et fonctionne.

Le port 9051 est un hommage à une célèbre boisson du sud de la France qui aura détruit de nombreux foies et causé grand nombre d'accidents de la route. Aujourd'hui ce numéro de port aura moins de conséquences.

Le premier écran de portainer vous propose de gérer docker en local : il faut cliquer sur la grosse baleine en bas de l'écran pour gérer docker sur la cartounette.

LMS dans Docker

Afin de disposer de LMS dans Docker avec portainer, il faut effectuer les étapes suivantes :

  1. définir quelle image du LMS récupérer depuis le site de docker, parmi toutes celles qui sont proposées. Comme dans github, n'importe qui peut récupérer une image, la bricoler et ensuite la proposer à la communauté : il faut choisir la bonne image !

  2. paramétrer le container avec l'interface web de portainer et le déployer

1- Récupérer l'image du LMS

Sur le hub docker si l'on cherche "logitechmediaserver" on trouve de nombreuses images pour le LMS :

  1. à l'adresse hub.docker

  2. quand on cherche logitechmediaserver

  3. on choisi l'image de la communauté maintenue par Michael Herger :

  1. Nous avons le choix via les Tags entre différentes versions, on va choisir la "stable"

  2. il faudra définir où se trouvent les dossiers de musique, de configuration et de playlist pour le container

  3. il faudra définir le mappage des ports externes / internes.

Je propose que l'on conserve les adresses de ports du LMS telles quelles, parce que nous avons de nombreux lecteurs audios qui ont des ports définis par défaut.

C'est pour cela que l'on a mappé portainer sur 9051. En conservant 9000 pour le LMS, inutile d'aller reconfigurer tous nos lecteurs réseau.

Maintenant nous savons que nous voulons construire un container avec l'image suivante :

lmscommunity/logitechmediaserver

et devons définir quelques paramètres (où sont les fichiers de musique et sur quels ports le container communique avec l'extérieur).

On va utilise Portainer pour l'installation.

2 - Paramètrer le container et le lancer

Pour créer un container, dans notre nawigateur ouaibe :

  1. à l'adresse de notre OPZ2, sur le port 9051

  2. dans le menu Containers

  3. on ajoute un container

La page qui s'ouvre est celle de creation de container...

On a une première partie assez simple :

  • défini un nom pour notre container

  • on indique quelle image prendre, on veut la stable : lms/community/logitechmediaserver:stable

  • on mappe les ports : 9000 c'est pour l'interface graphique, 9090 pour la CLI du LMS et 3083 pour la mise à jour des players (dans l'ancien temps des Logitech Touch)

Dans la partie Advanced Settings, dans l'onglet Command & logging, je vous propose de cocher

interactive & TTY

comme sur l'écran ci-contre.

Cela permettra d'ouvrir une CLI dans le conteneur si besoin.

Vous vous souvenez de la page lue sur le hub docker ? Il y a avait des indications pour lancer le container sur la ligne de commande.

Comme nous le lançons avec portainer, il faut configurer correctement le container dans portainer.

Nous avons traité le cas des ports, il reste la question des volumes.

Où se trouve la musique à indexer ?

Sur la OPZ2, elle est sur un disque USB qui est monté dans /media/Musiques.

Cela veut dire qu'il faut créer un volume qui relie :

/media/Musiques avec le paramètres /music du container. Idem pour /playlist.

C'est dans l'onglet "Volumes" que se trouve notre bonheur.


Dans l'onglet

  1. Volumes

  2. cliquez sur "map additional volume"

  3. saisissez "/music"

  4. cliquez sur "Bind"

  5. saisisez "/media/Musiques"

Voilà, vous avez créé une volume mappé. Refaites la même chose pour "/playlist" et "/media/Musiques".

Bien entendu si votre musiques est sur un NAS quelconque, remplacez "/media/Musiques" par le point de montage sur votre NAS.

Ces deux points là suffisent.

Ensuite, vous pouvez cliquer sur "Deploy the container".

L'image va prendre quelques minutes à être téléchargée depuis docker jusque sur la OPZ2. Le message "Deployment in progress" est affiché, c'est normal.

Notez que si vous vous êtes trompé ou que vous avez oublié quelque chose, ce n'est pas grave. On peut lancer le container qui ne va pas fonctionner correctement, mais on peut revenir dessus, l'éditer et le relancer.

Quand c'est tout bon, portainer passe sur la page de la liste des Containers, comme ci-dessous.

Et voilà, on vient de "containeriser" le LMS et il est en train de tourner. Sur l'interface portainer montre les ports mappés. Comme d'habitude le LMS sera accessible via l'adresse IP de la carte et sur le port 9000.

Avant d'aller plus loin, si vous avez coché "Interactive" tantôt, vous pouvez vérifier que le conteneur voit les fichiers de musique à indexer.

Cliquez sur le symbole de la ligne de commande pour votre LMS, comme sur la copie d'écran -ci-contre.

Et là, déplacez vous dans le dossier music

cd /music

et tapez :

ls

pour voir la liste de vos fichiers de musique.

Cela correspond au mappage de volume que nous avons effectué tantôt.

Si votre mappage fonctionne, vous pouvez passer à la suite, configurer le LMS pour lui indiquer où se trouve les fichiers à indexer.

Dans le navigateur, à l'adresse IP de la carte, sur le port 9000, dans les Basic Settings, on indique pour le Media Folder :

/music

et de même pour le paramètre Playlist Folder.

Quand c'est ok, on clique sur Apply en bas à droite de l'écran et le LMS va commencer à indexer la musique.

On n'oubliera pas d'ajouter le plugin Material Skin pour avoir une belle interface ouaibe.

Portainer permet aussi de visualiser des statistiques pour chaque container actif. Ici on voit (sur une base de 30 secondes de refresh) :

  • l'occupation mémoire, autour de 250Mo,

  • l'utilisation du CPU, qui ronronne la plupar du temps mais avec un pic à 45% quand on a lancé "Radio Paradise" qui diffuse du FLAC via internet, un petit pic quand on a connecté un second lecteur puis lancé un album. Le fait est que c'est l'interface qui consomme le plus de ressources CPU

  • le traffic réseau agrégé

  • les IO

Le sujet à suivre est le comportement vis à vis de la mémoire : 250MB c'est 25% du Go disponible sur la OPZ2 et d'autres containers vont être installés. L'écran ci-dessus est tiré de la version de DEV de LMS et la question de la mémoire est à suivre, je vais comparer avec la version stable.

Dans la liste tuyaux de portainer, des candidats potentiels tels que homer, samba, transmission, Kodi... On verra comment se comporte la carte !

Conclusion

Difficile de tirer une conclusion définitive sur seulement quelque jours d'utilisation. On note les points suivants :

  • Monitoring : utiliser Docker plus portainer sur la OPZ2, cela permet de gérer les applications (et les différentes versions éventuelles) avec un tableau de bord. En plus de cela portainer permet d'obtenir des statistiques individuelles pour chaque container : avoir du monitoring sur les process, c'est confortable, avoir l'informations, les mesures, afin de ne pas être dans le noir

  • Performances : pas de performances ressenties à la baisse pour le LMS

  • Un petit radiateur passif pour le OPZ2 ne ferait pas de mal. La température du processeur est entre 48 / 52°, c'est une température habituelle pour ce processeur sur cette carte, cependant le "test du doigt" - poser son pouce sur le processeur fait baisser immédiatement la température - indique qu'on peut facilement gagner quelques degrés.

Est-ce qu'il va y avoir des lecteurs pour cet article, est-ce que l'on ne va pas trop loin dans les machins compliqués ? Je ne sais pas, cependant j'utilise la carte pour acquérir des compétences supplémentaires sur des sujets qui m'intéressent et cela me fait plaisir de partager le chemin et de donner d'éventuelles idées.

Si vous voulez quelque chose de "simple", une installation du LMS sur la ligne de commande suffit bien. Si vous avez envie d'explorer, une seconde carte sd ne coûte que quelques euros et vous pouvez passer un peu de temps à essayer, il n'y a pas d'impact, juste à gérer la frustration quand ça ne marche pas et que l'on ne comprend pas pourquoi.

Blondie sur Radio Paradise (en FLAC), via le LMS, dans un container. On a mis Blondie dans un Container !

Une page plus complète permet de décrire l'installation d'autres containers avec Portainer et la OPZ2, par exemple "faire un NAS".

Quelques commandes

Ci dessous, la liste des commandes passées et quelques commentaires, en mode brut

# Première connexion avec ssh ->trouver l'ip de la carte et le password c'est orange pi

# mise à jour de l'OS

# installation de deux bricoles

ssh orangepi@orangepiIP password = orangepi


sudo apt update

sudo apt upgrade

sudo apt install bpytop

sudo apt install neofetch


# dans la session SSH lancer l'appli de configuration

# configurer la timezone et le keyboard

sudo orangepi-config

timezone

keyboard


# quand c'est ok, on reboote :

sudo reboot


---------------------- Création nouvel utilisateur

# ouvrir la session SSH avec l'utlisateur root

# on crée l'utilisateur "renaud" ou "julien" ou "bob"

# on change le passwd pour l'utilisateur root !

# on reboot

ssh root@orangepiIP password = orangepi

adduser renaud

usermod -aG sudo renaud

passwd

sudo reboot


----------------------- Monter un disque USB

# ce coup-ci on se connecte avec le nouvel utilisateur "renaud" par exemple

# on va connecter un disque USB et configurer pour qu'il soit monté à chaque démarrage


ssh renaud@orangepiIP password = orangepi

# ajout du disque usb disk, on fait la liste de ce que voit la machine

sudo fdisk -l


Disk /dev/sda: 4.55 TiB, 5000947302400 bytes, 9767475200 sectors ...

Disk model: My Passport

/dev/sda1 2048 9767473151 9767471104 4.5T Microsoft basic data


# on édite crontab pour ajouter le montage du disque au start de la machine

sudo crontab -e


# ajouter à la fin du fichier la ligne suivante :

@reboot mount /dev/sda1 /media


# ensuite ctrl+s et ctrl+x (save and exit)


# on reboot

sudo reboot


--------------------------- DOCKER


# install Docker

sudo su


apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

apt-get install docker-ce docker-ce-cli containerd.io

sudo usermod -aG docker $USER


## run docker and test (si TLS error, relancer la ligne ci-dessous jusqu'à ce que ça fonctionne )

docker run hello-world


--------------------------- PORTAINER


# installer portainer (récupère l'image et la lance sur le port 9051)

sudo docker pull portainer/portainer-ce:latest

sudo docker run -d -p 9051:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest



-------------------------- LMS

# installation du LMS pour ceux qui veulent le serveur audio dans Docker

sudo docker pull lmscommunity/logitechmediaserver:latest


-------------------------- Ajouter la liste des applications compatibles pi.hosted


# EN CHINE SANS VPN : - get a local copy of pi hosted

sudo git clone https://github.com/novaspirit/pi-hosted.git

python3 -m http.server

web browser = http://192.168.1.120:8000/pi-hosted/template/portainer-v2-arm64.json


# Dans portainer


1 - ajouter l'adresse dans Settings App Templates :

http://192.168.1.120:8000/pi-hosted/template/portainer-v2-arm64.json


2 - App Templates Menu => toutes les applications préparées pour l'installation


# Dans le reste du monde ou avec un VPN


1 - ajouter l'adresse dans Settings App Templates :

https://github.com/novaspirit/pi-hosted/blob/master/template/portainer-v2-arm64.json

2 - App Templates Menu => toutes les applications préparées pour l'installation



# installer File browser

# sur la ligne de commande (ou via portainer templates)

docker pull filebrowser/filebrowser:latest


On accède à file browser via port :8082, admin/admin

=> configurer les users pour créer un nouveau compte user admin et désactiver le compte admin


Dans Portainer, dans "Volumes" du container :

/srv bind to /media


Ce qui permet de voir le disque USB via File Browser


--------------------------------- SAMBA ?

# Installer samba => un enfer dans portainer et ça marche pas super, plus simple de faire une installation classique




--------------------------------- ZEROTIER

# Installer Zerotier sur la ligne de commande


curl -s https://install.zerotier.com | sudo bash


## then use idZerotier from zerotier website


zerotier-cli join idZerotier



-------------------------------- HOMER

# Install homer


Avant de l'installer dans portainer, il faut passer ce script sur la ligne de commande


1 - wget -qO- https://raw.githubusercontent.com/pi-hosted/pi-hosted/master/tools/install_homer.sh | bash

2 - se connecter à Homer sur le port 8902 (pas certain par défaut)

3 - modifier le dossier /portainer/Files/Homer pour fabriquer une belle page d'accueil

4 - le mieux est d'utiliser Visual Studio Code avec une connexion SSH sur la OPZ2 via le plugin ssh FS

5 - la configuration est dans le fichier config.yml


C'est pas mieux Dashy ? Err... Dashy plante complètement la OPZ2 ! testé d'autres, Homer à la mérite de fonctionner, même si la configuration demande 5 minutes d'apprentissage



-------------------------------- SAMBA NO DOCKER + PORTAINER


# 1 - installer samba (pas dans Docker) sur la ligne de commande


sudo apt-get install samba samba-common-bin


# 2 - On va partager le dossier /media

# en éditant le conf file


sudo nano /etc/samba/smb.conf


# ajouter à la fin du fichier


[opz2share]

path = /home/pi/shared

writeable=Yes

create mask=0777

directory mask=0777

public=no


# et apprès on ajoute un utilisateur pour samba

sudo smbpasswd -a renaud


# et on redémarre le service

sudo systemctl restart smbd


------------------------------------- Filezilla

# permet de télécharger les fichiers d'une seedbox en local par exemple

# FileZilla est visible par défaut sur le port 3000 (web browser :

1 - installation via portainer

2 - dans la configuration, dans Volumes

container /media Bind

host /media

Ce qui permet de voir avec FileZilla le disque USB