One place for hosting & domains

      distance

      Comment installer et configurer Zabbix et configurer des serveurs à distance sur Ubuntu 20.04


      L’auteur a choisi le Computer History Museum comme bénéficiaire d’une donation dans le cadre du programme Write for Donations.

      Introduction

      Zabbix est un logiciel de surveillance open-source pour les réseaux et les applications. Il permet de surveiller en temps réel des milliers de métriques collectées à partir de serveurs, de machines virtuelles, de périphériques réseau et d’applications web. Ces métriques peuvent vous aider à déterminer la santé actuelle de votre infrastructure informatique et à détecter les problèmes liés aux composants matériels ou logiciels avant que les clients ne se plaignent. Les informations utiles sont stockées dans une base de données afin que vous puissiez analyser les données au fil du temps et améliorer la qualité des services fournis ou planifier la mise à niveau de votre équipement.

      Zabbix utilise plusieurs options pour rassembler des métriques, notamment la surveillance sans agent des services aux utilisateurs et l’architecture client-serveur. Pour collecter les métriques du serveur, il utilise un petit agent sur le client surveillé pour rassembler les données et les envoyer au serveur Zabbix. Zabbix prend en charge la communication cryptée entre le serveur et les clients connectés, de sorte que vos données sont protégées lorsqu’elles circulent sur des réseaux non sécurisés.

      Le serveur Zabbix stocke ses données dans une base de données relationnelle alimentée par MySQL ou PostgreSQL. Vous pouvez également stocker des données historiques dans des bases de données NoSQL comme Elasticsearch et TimescaleDB. Zabbix fournit une interface web qui vous permet de visualiser les données et de configurer les paramètres du système.

      Dans ce tutoriel, vous allez configurer Zabbix sur deux machines Ubuntu 20.04. L’un sera configuré comme le serveur Zabbix, et l’autre comme un client que vous surveillerez. Le serveur Zabbix utilisera une base de données MySQL pour enregistrer les données de surveillance et utilisera Nginx pour servir l’interface web.

      Conditions préalables

      Pour suivre ce tutoriel, vous aurez besoin de :

      • Deux serveurs Ubuntu 20.04 configurés en suivant le Guide de configuration initiale du serveur pour Ubuntu 20.04, comprenant un non root user avec des privilèges sudo et un pare-feu configuré avec ufw. Sur un serveur, vous installerez Zabbix ; ce tutoriel fera référence à ce dernier comme étant le serveur Zabbix. Il surveillera votre second serveur ; ce second serveur sera appelé le second serveur Ubuntu.

      • Le serveur qui fera fonctionner le serveur Zabbix nécessite l’installation de Nginx, MySQL et PHP. Suivez les étapes 1 à 3 de notre guide LAMP Stack Ubuntu 20.04 pour les configurer sur votre serveur Zabbix.

      • Un nom de domaine enregistré. Tout au long de ce tutoriel, nous utiliserons your_domain. Vous pouvez acheter un nom de domaine sur Namecheap, en obtenir un gratuitement avec Freenom, ou utiliser le bureau d’enregistrement de domaine de votre choix.

      • Les deux enregistrements DNS suivants ont été configurés pour votre serveur Zabbix. Si vous utilisez DigitalOcean, veuillez consulter notre documentation DNS pour plus de détails sur la façon de les ajouter.

        • Un enregistrement A avec your_domain pointant sur l’adresse IP publique de votre serveur Zabbix.
        • Un enregistrement A avec www.your_domain​​​​​​ pointant sur l’adresse IP publique de votre serveur Zabbix.

      En outre, comme le serveur Zabbix est utilisé pour accéder à des informations précieuses sur votre infrastructure auxquelles vous ne voudriez pas que des utilisateurs non autorisés accèdent, il est important que vous gardiez votre serveur sécurisé en installant un certificat TLS/SSL. Ceci est facultatif mais fortement encouragé. Si vous souhaitez sécuriser votre serveur, suivez les instructions du guide Let’s Encrypt sur Ubuntu 20.04 après l’étape 3 de ce tutoriel.

      Étape 1 – Installer le serveur Zabbix

      Tout d’abord, vous devez installer Zabbix sur le serveur sur lequel vous avez installé MySQL, Nginx et PHP. Connectez-vous à cette machine en tant que non-root user :

      • ssh sammy@zabbix_server_ip_address

      Zabbix est disponible dans le gestionnaire de packages d’Ubuntu, mais il est dépassé. Utilisez donc le dépôt officiel de Zabbix pour installer la dernière version stable. Téléchargez et installez le paquet de configuration du dépôt :

      • wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb
      • sudo dpkg -i zabbix-release_5.0-1+focal_all.deb

      Vous verrez le résultat suivant :

      Output

      Selecting previously unselected package zabbix-release. (Reading database ... 64058 files and directories currently installed.) Preparing to unpack zabbix-release_5.0-1+focal_all.deb ... Unpacking zabbix-release (1:5.0-1+focal) ... Setting up zabbix-release (1:5.0-1+focal) ...

      Mettez à jour l’index des packages afin que le nouveau dépôt soit inclus :

      Ensuite, installez le serveur Zabbix et le frontend web avec le support de la base de données MySQL :

      • sudo apt install zabbix-server-mysql zabbix-frontend-php

      Installez également l’agent Zabbix, qui vous permettra de recueillir des données sur l’état du serveur Zabbix lui-même.

      • sudo apt install zabbix-agent

      Avant de pouvoir utiliser Zabbix, vous devez créer une base de données contenant les données que le serveur Zabbix collectera auprès de ses agents. Vous pouvez le faire lors de la prochaine étape.

      Étape 2 – Configurer la base de données MySQL pour Zabbix

      Vous devez créer une nouvelle base de données MySQL et la remplir avec quelques informations de base afin de la rendre compatible avec Zabbix. Vous créerez également un utilisateur spécifique pour cette base de données afin que Zabbix ne se connecte pas à MySQL avec le compte root.

      Connectez-vous à MySQL en tant que root user :

      Créez la base de données Zabbix avec le support des caractères UTF-8 :

      • create database zabbix character set utf8 collate utf8_bin;

      Créez ensuite un utilisateur que le serveur Zabbix utilisera, donnez-lui accès à la nouvelle base de données et définissez le mot de passe de l’utilisateur :

      • create user zabbix@localhost identified by 'your_zabbix_mysql_password';
      • grant all privileges on zabbix.* to zabbix@localhost;

      Cela prend soin de l’utilisateur et de la base de données. Sortez de la console de la base de données.

      Ensuite, vous devez importer le schéma et les données initiales. L’installation de Zabbix vous a fourni un fichier qui permet de configurer cela.

      Exécutez la commande suivante pour configurer le schéma et importer les données dans la base de données zabbix. Utilisez zcat car les données dans le fichier sont compressées :

      • zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

      Entrez le mot de passe pour l’utilisateur MySQL zabbix que vous avez configuré lorsque vous y avez été invité.

      L’exécution de cette commande peut prendre une minute ou deux. Si vous voyez l’erreur ERROR 1045 (28000): Access denied for userzabbix@ 'localhost' (using password: YES) alors assurez-vous que vous avez utilisé le bon mot de passe pour l’utilisateur zabbix.

      Pour que le serveur Zabbix puisse utiliser cette base de données, vous devez définir le mot de passe de la base de données dans le fichier de configuration du serveur Zabbix. Ouvrez le fichier de configuration dans votre éditeur de texte préféré. Ce tutoriel utilisera nano :

      • sudo nano /etc/zabbix/zabbix_server.conf

      Cherchez la section suivante du dossier :

      /etc/zabbix/zabbix_server.conf

      ...
      ### Option: DBPassword                           
      #       Database password. Ignored for SQLite.   
      #       Comment this line if no password is used.
      #                                                
      # Mandatory: no                                  
      # Default:                                       
      # DBPassword=
      ...
      

      Ces commentaires dans le dossier expliquent comment se connecter à la base de données. Vous devez définir la valeur du DBPassword dans le fichier au mot de passe de l’utilisateur de votre base de données.   Ajoutez cette ligne après ces commentaires pour configurer la base de données :

      /etc/zabbix/zabbix_server.conf

      ...
      DBPassword=your_zabbix_mysql_password
      ...
      

      Enregistrez et fermez zabbix_server.conf en appuyant sur CTRL+X, puis sur Y et enfin sur ENTER si vous utilisez nano.

      Vous avez maintenant configuré le serveur Zabbix pour vous connecter à la base de données. Ensuite, vous configurerez le serveur web Nginx pour servir le frontend Zabbix.

      Étape 3 – Configurer Nginx pour Zabbix

      Pour configurer Nginx automatiquement, installez le paquet de configuration automatique :

      • sudo apt install zabbix-nginx-conf

      Vous obtiendrez ainsi le fichier de configuration/etc/zabbix/nginx.conf, ainsi qu’un lien vers celui-ci dans le répertoire de configuration de Nginx /etc/nginx/conf.d/zabbix.conf.

      Ensuite, vous devez apporter des modifications à ce dossier. Ouvrez le fichier de configuration :

      • sudo nano /etc/zabbix/nginx.conf

      Le fichier contient une configuration de bloc serveur Nginx générée automatiquement. Il contient deux lignes qui déterminent le nom du serveur et le port sur lequel il écoute :

      /etc/zabbix/nginx.conf

      server {
      #        listen          80;
      #        server_name     example.com;
      ...
      

      Décommentez les deux lignes, et remplacez example.com par votre nom de domaine. Vos paramètres ressembleront à ceci :

      /etc/zabbix/nginx.conf

      server {
              listen          80;
              server_name     your_domain;
      ...
      

      Enregistrez et fermez le fichier. Ensuite, procédez à un test pour vous assurer qu’il n’y a aucune erreur de syntaxe dans aucun de vos fichiers Nginx et relancez la configuration :

      • sudo nginx -t
      • sudo nginx -s reload

      Maintenant que Nginx est configuré pour servir le frontend de Zabbix, vous allez apporter quelques modifications à votre configuration PHP afin que l’interface web de Zabbix fonctionne correctement.

      Note : Comme mentionné dans la section « Prérequis », il est recommandé d’activer SSL/TLS sur votre serveur. Si vous souhaitez le faire, suivez notre tutoriel Ubuntu 20.04 Let’s Encrypt avant de passer à l’étape 4 afin d’obtenir un certificat SSL gratuit pour Nginx. Ce processus détectera automatiquement le blocage de votre serveur Zabbix et le configurera pour le HTTPS. Après avoir obtenu vos certificats SSL/TLS, vous pouvez revenir et compléter ce tutoriel.

      Étape 4 – Configurer PHP pour Zabbix

      L’interface web de Zabbix est écrite en PHP et nécessite quelques réglages spéciaux du serveur PHP. Le processus d’installation de Zabbix a créé un fichier de configuration PHP-FPM qui contient ces paramètres. Il se trouve dans le répertoire /etc/zabbix et est chargé automatiquement par PHP-FPM. Vous devez apporter une petite modification à ce dossier, alors ouvrez-le avec ce qui suit :

      • sudo nano /etc/zabbix/php-fpm.conf

      Le fichier contient les paramètres PHP qui répondent aux exigences nécessaires pour l’interface web Zabbix. Toutefois, le réglage du fuseau horaire est commenté par défaut. Pour être sûr que Zabbix utilise la bonne heure, vous devez définir le fuseau horaire approprié :

      /etc/zabbix/php-fpm.conf

      ...
      php_value[max_execution_time] = 300
      php_value[memory_limit] = 128M
      php_value[post_max_size] = 16M
      php_value[upload_max_filesize] = 2M
      php_value[max_input_time] = 300
      php_value[max_input_vars] = 10000
      ; php_value[date.timezone] = Europe/Riga
      

      Décommentez la ligne de fuseau horaire mise en évidence dans le bloc de code précédent et changez-la pour votre fuseau horaire. Vous pouvez utiliser cette liste de fuseaux horaires pris en charge pour trouver celui qui vous correspond. Maintenant, enregistrez et fermez le fichier.

      Redémarrez PHP-FPM pour appliquer ces nouveaux paramètres :

      • sudo systemctl restart php7.4-fpm.service

      Vous pouvez maintenant démarrer le serveur Zabbix :

      • sudo systemctl start zabbix-server

      Ensuite, vérifiez si le serveur Zabbix fonctionne correctement :

      • sudo systemctl status zabbix-server

      Vous verrez le résultat suivant :

      Output

      ● zabbix-server.service - Zabbix Server Loaded: loaded (/lib/systemd/system/zabbix-server.service; disabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-12 05:59:32 UTC; 36s ago Process: 27026 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS) ...

      Enfin, permettez au serveur de démarrer au moment du démarrage :

      • sudo systemctl enable zabbix-server

      Le serveur est configuré et connecté à la base de données. Ensuite, mettez en place le frontend web.

      Étape 5 – Configurer les paramètres de l’interface web Zabbix

      L’interface web vous permet de voir les rapports et d’ajouter des hôtes que vous souhaitez surveiller, mais elle nécessite une configuration initiale avant de pouvoir être utilisée. Lancez votre navigateur et allez à l’adresse http://zabbix_server_name ou https://zabbix_server_name si vous avez configuré Let’s Encrypt. Sur le premier écran, vous verrez un message de bienvenue. Cliquez sur Next step pour continuer.

      Sur l’écran suivant, vous verrez le tableau qui énumère toutes les conditions préalables à l’exécution de Zabbix.

      Conditions préalables

      Toutes les valeurs de ce tableau doivent être correctes, vérifiez donc qu’elles le sont. N’oubliez pas de faire défiler vers le bas et d’examiner toutes les conditions préalables. Une fois que vous avez vérifié que tout est prêt, cliquez sur Next step pour continuer.

      L’écran suivant demande des informations sur la connexion à la base de données.

      Connexion à la BD

      Vous avez parlé de votre base de données au serveur Zabbix, mais l’interface web Zabbix a également besoin d’un accès à la base de données pour gérer les hôtes et lire les données. Saisissez donc les identifiants MySQL que vous avez configurés à l’étape 2. Cliquez sur Next step pour continuer.

      Sur l’écran suivant, vous pouvez laisser les options à leurs valeurs par défaut.

      Détails du serveur Zabbix

      Le Name est facultatif ; il est utilisé dans l’interface web pour distinguer un serveur d’un autre dans le cas où vous avez plusieurs serveurs de surveillance. Cliquez sur Next step pour continuer.

      L’écran suivant affichera le résumé de pré-installation afin que vous puissiez confirmer que tout est correct.

      Résumé

      Cliquez sur Next step pour passer à l’écran final.

      La configuration de l’interface web est maintenant terminée. Ce processus crée le fichier de configuration /usr/share/zabbix/conf/zabbix.conf.php, que vous pouvez sauvegarder et utiliser à l’avenir. Cliquez sur Finish pour passer à l’écran de connexion.   L’utilisateur par défaut est Admin et le mot de passe est zabbix.

      Avant de vous connecter, installez l’agent Zabbix sur votre deuxième serveur Ubuntu.

      Étape 6 – Installer et configurer l’agent Zabbix

      Vous devez maintenant configurer le logiciel d’agent qui enverra les données de surveillance au serveur Zabbix.

      Connectez-vous au deuxième serveur Ubuntu :

      • ssh sammy@second_ubuntu_server_ip_address

      Tout comme sur le serveur Zabbix, exécutez les commandes suivantes pour installer le package de configuration du dépôt :

      • wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb
      • sudo dpkg -i zabbix-release_5.0-1+focal_all.deb

      Ensuite, mettez à jour l’index des packages :

      Installez ensuite l’agent Zabbix :

      • sudo apt install zabbix-agent

      Bien que Zabbix supporte le cryptage par certificat, la mise en place d’une autorité de certification dépasse le cadre de ce tutoriel. Mais vous pouvez utiliser des clés pré-partagées (PSK) pour sécuriser la connexion entre le serveur et l’agent.

      D’abord, générez une PSK :

      • sudo sh -c "openssl rand -hex 32 > /etc/zabbix/zabbix_agentd.psk"

      Montrez la clé en utilisant le chat pour que vous puissiez la copier quelque part :

      • cat /etc/zabbix/zabbix_agentd.psk

      La clé ressemblera à quelque chose comme ça :

      Output

      75ad6cb5e17d244ac8c00c96a1b074d0550b8e7b15d0ab3cde60cd79af280fca

      Gardez-la pour plus tard ; vous en aurez besoin pour configurer l’hôte.

      Maintenant, modifiez les paramètres de l’agent Zabbix pour établir sa connexion sécurisée au serveur Zabbix. Ouvrez le fichier de configuration de l’agent dans votre éditeur de texte :

      • sudo nano /etc/zabbix/zabbix_agentd.conf

      Chaque paramètre de ce dossier est documenté par des commentaires informatifs tout au long du dossier, mais vous ne devez modifier que certains d’entre eux.

      Vous devez d’abord modifier l’adresse IP du serveur Zabbix. Trouvez la section suivante :

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: Server
      #       List of comma delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies.
      #       Incoming connections will be accepted only from the hosts listed here.
      #       If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally
      #       and '::/0' will allow any IPv4 or IPv6 address.
      #       '0.0.0.0/0' can be used to allow any IPv4 address.
      #       Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
      #
      # Mandatory: yes, if StartAgents is not explicitly set to 0
      # Default:
      # Server=
      
      Server=127.0.0.1
      ...
      

      Changez la valeur par défaut pour l’IP de votre serveur Zabbix :

      /etc/zabbix/zabbix_agentd.conf

      ...
      Server=zabbix_server_ip_address
      ...
      

      Par défaut, le serveur Zabbix se connecte à l’agent. Mais pour certains contrôles (par exemple, la surveillance des journaux), une connexion inverse est nécessaire. Pour un fonctionnement correct, vous devez spécifier l’adresse du serveur Zabbix et un nom d’hôte unique.

      Trouvez la section qui configure les contrôles actifs et modifiez les valeurs par défaut :

      /etc/zabbix/zabbix_agentd.conf

      ...
      ##### Active checks related
      
      ### Option: ServerActive
      #       List of comma delimited IP:port (or DNS name:port) pairs of Zabbix servers and Zabbix proxies for active checks.
      #       If port is not specified, default port is used.
      #       IPv6 addresses must be enclosed in square brackets if port for that host is specified.
      #       If port is not specified, square brackets for IPv6 addresses are optional.
      #       If this parameter is not specified, active checks are disabled.
      #       Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1]
      #
      # Mandatory: no
      # Default:
      # ServerActive=
      
      ServerActive=zabbix_server_ip_address
      
      ### Option: Hostname
      #       Unique, case sensitive hostname.
      #       Required for active checks and must match hostname as configured on the server.
      #       Value is acquired from HostnameItem if undefined.
      #
      # Mandatory: no
      # Default:
      # Hostname=
      
      Hostname=Second Ubuntu Server
      ...
      

      Ensuite, trouvez la section qui configure la connexion sécurisée au serveur Zabbix et activez le support des clés pré-partagées. Trouvez la section TLSConnect, qui ressemble à ceci :

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSConnect
      #       How the agent should connect to server or proxy. Used for active checks.
      #       Only one value can be specified:
      #               unencrypted - connect without encryption
      #               psk         - connect using TLS and a pre-shared key
      #               cert        - connect using TLS and a certificate
      #
      # Mandatory: yes, if TLS certificate or PSK parameters are defined (even for 'unencrypted' connection)
      # Default:
      # TLSConnect=unencrypted
      ...
      

      Ajoutez ensuite cette ligne pour configurer le support des clés pré-partagées :

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSConnect=psk
      ...
      

      Ensuite, localisez la section TLSAccept, qui ressemble à ceci :

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSAccept
      #       What incoming connections to accept.
      #       Multiple values can be specified, separated by comma:
      #               unencrypted - accept connections without encryption
      #               psk         - accept connections secured with TLS and a pre-shared key
      #               cert        - accept connections secured with TLS and a certificate
      #
      # Mandatory: yes, if TLS certificate or PSK parameters are defined (even for 'unencrypted' connection)
      # Default:
      # TLSAccept=unencrypted
      ...
      

      Configurez les connexions entrantes pour prendre en charge les clés pré-partagées en ajoutant cette ligne :

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSAccept=psk
      ...
      

      Ensuite, trouvez la section TLSPSKIdentity, qui ressemble à ceci :

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSPSKIdentity
      #       Unique, case sensitive string used to identify the pre-shared key.
      #
      # Mandatory: no
      # Default:
      # TLSPSKIdentity=
      ...
      

      Choisissez un nom unique pour identifier votre clé pré-partagée en ajoutant cette ligne :

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSPSKIdentity=PSK 001
      ...
      

      Vous l’utiliserez comme identifiant PSK lorsque vous ajouterez votre hôte via l’interface web Zabbix.

      Définissez ensuite l’option qui pointe vers votre clé pré-partagée créée précédemment. Repérez l’option TLSPSKFile :

      /etc/zabbix/zabbix_agentd.conf

      ...
      ### Option: TLSPSKFile
      #       Full pathname of a file containing the pre-shared key.
      #
      # Mandatory: no
      # Default:
      # TLSPSKFile=
      ...
      

      Ajoutez cette ligne pour pointer l’agent Zabbix vers votre fichier PSK que vous avez créé :

      /etc/zabbix/zabbix_agentd.conf

      ...
      TLSPSKFile=/etc/zabbix/zabbix_agentd.psk
      ...
      

      Enregistrez et fermez le fichier. Vous pouvez maintenant redémarrer l’agent Zabbix et le configurer pour qu’il démarre au moment du démarrage :

      • sudo systemctl restart zabbix-agent
      • sudo systemctl enable zabbix-agent

      Pour faire bonne mesure, vérifiez que l’agent Zabbix fonctionne correctement :

      • sudo systemctl status zabbix-agent

      Vous verrez le statut suivant, indiquant que l’agent est en cours d’exécution :

      Output

      ● zabbix-agent.service - Zabbix Agent Loaded: loaded (/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-06-12 08:19:54 UTC; 25s ago ...

      L’agent écoutera au port 10050 pour les connexions à partir du serveur. Configurez l’UFW pour permettre les connexions à ce port :

      Pour en savoir plus sur UFW, consultez le tutoriel Comment configurer un pare-feu avec UFW sur Ubuntu 20.04.

      Votre agent est maintenant prêt à envoyer des données au serveur Zabbix. Mais pour l’utiliser, vous devez y accéder à partir de la console web du serveur. Dans l’étape suivante, vous allez compléter la configuration.

      Étape 7 – Ajouter le nouvel hôte au serveur Zabbix

      L’installation d’un agent sur un serveur que vous souhaitez surveiller ne représente que la moitié du processus. Chaque hôte que vous souhaitez surveiller doit être enregistré sur le serveur Zabbix, ce que vous pouvez faire via l’interface web.

      Connectez-vous à l’interface web du serveur Zabbix en naviguant à l’adresse http://zabbix_server_name ou https://zabbix_server_name :

      L'écran de connexion Zabbix

      Lorsque vous vous êtes connecté, cliquez sur Configuration et ensuite sur Hosts dans la barre de navigation de gauche. Cliquez ensuite sur le bouton Create host dans le coin supérieur droit de l’écran. Cela ouvrira la page de configuration de l’hôte.

      Créer un hôte

      Ajustez le Host name et l’adresse IP pour refléter le nom d’hôte et l’adresse IP de votre second serveur Ubuntu, puis ajoutez l’hôte à un groupe. Vous pouvez sélectionner un groupe existant, par exemple des serveurs Linux ou créer votre propre groupe. L’hôte peut faire partie de plusieurs groupes. Pour ce faire, entrez le nom d’un groupe existant ou nouveau dans le champ de saisie Groups et sélectionnez la valeur souhaitée dans la liste proposée.

      Avant d’ajouter le groupe, cliquez sur l’onglet Templates.

      Ajout d'un modèle à l'hôte

      Tapez Template OS Linux by Zabbix agent dans le champ Search, puis sélectionnez-le dans la liste pour ajouter ce modèle à l’hôte.

      Ensuite, naviguez jusqu’à l’onglet Encryption. Sélectionnez PSK pour les connexions vers l’hôte et les connexions depuis l’hôte. Définissez ensuite l’identité PSK à PSK 001, qui est la valeur de la TLSPSKIdentity de l’agent Zabbix que vous avez configuré précédemment. Définissez ensuite la valeur PSK à la clé que vous avez générée pour l’agent Zabbix. C’est celle qui est stockée dans le fichier /etc/zabbix/zabbix_agentd.psk sur la machine de l’agent. 

      Configurer le cryptage

      Enfin, cliquez sur le bouton Add au bas du formulaire pour créer l’hôte.

      Vous verrez votre nouvel hôte dans la liste. Attendez une minute et rechargez la page pour voir les étiquettes vertes indiquant que tout fonctionne bien et que la connexion est cryptée.

      Zabbix montre votre nouvel hôte

      Si vous avez des serveurs supplémentaires à surveiller, connectez-vous à chaque hôte, installez l’agent Zabbix, générez un PSK, configurez l’agent et ajoutez l’hôte à l’interface web en suivant les mêmes étapes que celles que vous avez suivies pour ajouter votre premier hôte.

      Le serveur Zabbix surveille maintenant votre deuxième serveur Ubuntu. Maintenant, configurez des notifications par courrier électronique pour être informé des problèmes.

      Étape 8 – Configurer les notifications par courrier électronique

      Zabbix supporte automatiquement plusieurs types de notifications : courriel, OTRS, Slack, Télégramme, SMS, etc. Vous pouvez voir la liste complète des intégrations sur le site de Zabbix. 

      À titre d’exemple, ce tutoriel permettra de configurer les notifications pour le Type de support de courrier électronique.

      Cliquez sur Administration, puis sur Media types dans la barre de navigation de gauche. Vous verrez la liste de tous les types de médias. Il existe deux options préconfigurées pour les courriels : pour la notification en texte clair et pour les notifications en HTML. Dans ce tutoriel, vous utiliserez la notification en texte clair. Cliquez sur Email. 

      Ajustez les options SMTP en fonction des paramètres fournis par votre service de courrier électronique. Ce tutoriel utilise les capacités SMTP de Gmail pour configurer les notifications par e-mail. Si vous souhaitez obtenir plus d’informations sur la configuration, voir Comment utiliser le serveur SMTP de Google. 

      Note : Si vous utilisez la vérification en 2 étapes avec Gmail, vous devez générer un mot de passe d’application pour Zabbix. Vous n’aurez à saisir un mot de passe d’application qu’une seule fois lors de l’installation. Vous trouverez des instructions sur la manière de générer ce mot de passe dans le Centre d’aide Google.

      Si vous utilisez Gmail, tapez smtp.gmail.com pour le champ du serveur SMTP, 465 pour le champ du port du serveur SMTP, gmail.com pour SMTP helo, et votre courriel pour le SMTP email. Choisissez ensuite SSL/TLS pour la Connection security et Username and password pour Authentification. Entrez votre adresse Gmail comme Username et le mot de passe de l’application que vous avez généré à partir de votre compte Google comme mot de passe.

      Mise en place du type de support de courrier électronique

      Sous l’onglet Message templates, vous pouvez voir la liste des messages prédéfinis pour les différents types de notifications. Enfin, cliquez sur le bouton Update au bas du formulaire pour mettre à jour les paramètres du courrier électronique.

      Vous pouvez maintenant tester l’envoi de notifications. Pour ce faire, cliquez sur le lien Test souligné dans la ligne correspondante.

      Vous verrez une fenêtre pop-up. Saisissez votre adresse électronique dans le champ de saisie Send to et cliquez sur le bouton Test . Vous verrez un message sur l’envoi réussi et vous recevrez un message test.

      Tester le courrier électronique

      Fermez la fenêtre pop-up en cliquant sur le bouton Cancel.

      Maintenant, créez un nouvel utilisateur. Cliquez sur Administration et ensuite sur Users dans la barre de navigation de gauche. Vous verrez la liste des utilisateurs. Cliquez ensuite sur le bouton Create user dans le coin supérieur droit de l’écran. Cela ouvrira la page de configuration de l’utilisateur :

      Créer un utilisateur

      Entrez le nouveau nom d’utilisateur dans le champ de saisie Alias et créez un nouveau mot de passe. Ensuite, ajoutez l’utilisateur au groupe de l’administrateur. Tapez Zabbix administrators dans le champ Groups et sélectionnez-le dans la liste proposée.

      Une fois que vous avez ajouté le groupe, cliquez sur l’onglet Media et cliquez sur le lien souligné Add (et non le bouton Add en dessous). Vous verrez une fenêtre pop-up.

      Ajouter un courriel

      Sélectionnez l’option Email du menu déroulant Type. Saisissez votre adresse électronique dans le champ Send to. Vous pouvez laisser les autres options aux valeurs par défaut. Cliquez sur le bouton Add en bas pour soumettre. 

      Naviguez maintenant vers l’onglet Permissions. Sélectionnez Zabbix Super Admin dans le menu déroulant User type. 

      Enfin, cliquez sur le bouton Add au bas du formulaire pour créer l’utilisateur.

      Note : Utiliser le mot de passe par défaut n’est pas sûr. Afin de modifier le mot de passe de l’utilisateur intégré Admin, cliquez sur l’alias dans la liste des utilisateurs. Cliquez ensuite sur Change password, entrez un nouveau mot de passe et confirmez les changements en cliquant sur le bouton Update.

      Vous devez maintenant activer les notifications. Cliquez sur l’onglet Configuration, puis sur Actions dans la barre de navigation de gauche.  Vous verrez une action pré-configurée, qui est responsable de l’envoi des notifications à tous les administrateurs de Zabbix. Vous pouvez revoir et modifier les paramètres en cliquant sur son nom. Pour les besoins de ce tutoriel, utilisez les paramètres par défaut. Pour activer l’action, cliquez sur le lien en rouge Disabled dans la colonne Status.

      Vous êtes maintenant prêt à recevoir des alertes. Dans l’étape suivante, vous en générerez un pour tester votre configuration de notification.

      Étape 9 – Génération d’une alerte de test

      Au cours de cette étape, vous générerez une alerte de test pour vous assurer que tout est connecté. Par défaut, Zabbix garde une trace de l’espace disque disponible sur votre serveur. Il détecte automatiquement tous les supports de disque et ajoute les contrôles correspondants. Cette découverte est exécutée toutes les heures, vous devez donc attendre un certain temps pour que la notification soit déclenchée.

      Créez un fichier temporaire suffisamment important pour déclencher l’alerte d’utilisation du système de fichiers de Zabbix. Pour ce faire, connectez-vous à votre deuxième serveur Ubuntu si vous n’êtes pas déjà connecté :

      • ssh sammy@second_ubuntu_server_ip_address

      Ensuite, déterminez l’espace libre dont vous disposez sur le serveur. Vous pouvez utiliser la commande df pour le savoir :

      La commande df indiquera l’utilisation de l’espace disque de votre système de fichiers, et le -h rendra la sortie lisible à l’oeil humain. Vous verrez une sortie comme celle-ci :

      Output

      Filesystem Size Used Avail Use% Mounted on /dev/vda1 78G 1.4G 77G 2% /

      Dans ce cas, l’espace libre est de 77G. Votre espace libre peut être différent.

      Utilisez la commande fallocate, qui vous permet de pré-allouer ou de désallouer de l’espace à un fichier, pour créer un fichier qui occupe plus de 80 % de l’espace disque disponible. Cela sera suffisant pour déclencher l’alerte :

      • fallocate -l 70G /tmp/temp.img

      Après environ une heure, Zabbix déclenchera une alerte concernant la quantité d’espace disque disponible et exécutera l’action que vous avez configurée, en envoyant le message de notification. Vous pouvez vérifier dans votre boîte de réception si le message provient du serveur Zabbix. Vous verrez un message du type :

      Problem started at 09:49:08 on 2020.06.12
      Problem name: /: Disk space is low (used > 80%)
      Host: Second Ubuntu Server
      Severity: Warning
      Operational data: Space used: 71.34 GB of 77.36 GB (92.23 %)
      Original problem ID: 106
      

      Vous pouvez également accéder à l’onglet monitoring et ensuite au Dashboard pour voir la notification et ses détails. 

      Tableau de bord principal

      Maintenant que vous savez que les alertes fonctionnent, supprimez le fichier temporaire que vous avez créé afin de récupérer votre espace disque :

      Au bout d’une minute, Zabbix enverra le message de récupération et l’alerte disparaîtra du tableau de bord principal.

      Conclusion

      Dans ce tutoriel, vous avez appris à mettre en place une solution de surveillance simple et sécurisée qui vous aidera à surveiller l’état de vos serveurs. Il peut désormais vous avertir des problèmes, et vous avez la possibilité d’analyser les processus qui se produisent dans votre infrastructure informatique.

      Pour en savoir plus sur la mise en place d’une infrastructure de surveillance, consultez notre page thématique sur la surveillance.



      Source link

      Comment accéder à distance aux applications GUI en utilisant Docker et Caddy sur Ubuntu 18.04


      L’auteur a choisi le Free and Open Source Fund pour recevoir un don dans le cadre du programme Write for Donations.

      Introduction

      Même avec la popularité croissante des services cloud, le besoin d’exécuter des applications natives existe toujours.

      En utilisant noVNC et TigerVNC,vous pouvez exécuter des applications natives dans un conteneur Docker et y accéder à distance à l’aide d’un navigateur web. En outre, vous pouvez exécuter votre application sur un serveur disposant de plus de ressources système que celles dont vous disposez localement, ce qui peut offrir une plus grande flexibilité lors de l’exécution de grandes applications.

      Dans ce tutoriel, vous allez conteneuriser Mozilla Thunderbird, un client de messagerie électronique, en utilisant Docker. Ensuite, vous le sécuriserez et lui donnerez un accès à distance en utilisant le serveur web de Caddy.

      Lorsque vous aurez terminé, vous pourrez accéder à Thunderbird depuis n’importe quel appareil en utilisant simplement un navigateur web. En option, vous pourrez également accéder localement aux fichiers de ce site en utilisant WebDAV. Vous aurez également une image de Docker entièrement autonome que vous pourrez exécuter n’importe où.

      Conditions préalables

      Avant de commencer ce guide, vous aurez besoin de ce qui suit :

      Étape 1 &mdash ; Créer la Configuration de supervisord

      Maintenant que votre serveur fonctionne et que Docker est installé, vous êtes prêt à commencer à configurer le conteneur de votre application. Comme votre conteneur est constitué de plusieurs composants, vous devez utiliser un gestionnaire de processus pour les lancer et les surveiller. Ici, vous utiliserez supervisord. supervisord est un gestionnaire de processus écrit en Python qui est souvent utilisé pour orchestrer des conteneurs complexes. 

      Tout d’abord, créez et entrez un répertoire appelé thunderbird pour votre conteneur : 

      • mkdir ~/thunderbird
      • cd ~/thunderbird

      Maintenant, créez et ouvrez un fichier appelé supervisord.conf utilisant nano ou votre éditeur préféré :

      Ajoutez maintenant ce premier bloc de code dans supervisord.conf, qui définira les options globales de supervisord :

      ~/thunderbird/supervisord.conf

      [supervisord]
      nodaemon=true
      pidfile=/tmp/supervisord.pid
      logfile=/dev/fd/1
      logfile_maxbytes=0
      

      Dans ce bloc, vous configurez supervisord lui-même. Vous devez mettre nodaemon sur true parce qu’il sera placé à l’intérieur d’un conteneur Docker comme point d’entrée. Par conséquent, vous voulez qu’il reste au premier plan. Vous mettez également en place pidfile vers un chemin accessible par un non-root user (nous y reviendrons plus tard), et logfile vers stdout pour que vous puissiez voir les journaux. 

      Ensuite, ajoutez un autre petit bloc de code à supervisord.conf. Ce bloc démarre TigerVNC, qui est un serveur combiné VNC/X11 :

      ~/thunderbird/supervisord.conf

      ...
      [program:x11]
      priority=0
      command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce bloc, vous configurez le serveur X11. X11 est un protocole de serveur d’affichage, qui permet aux applications graphiques de s’exécuter. Notez qu’à l’avenir il sera remplacé par Wayland, mais l’accès à distance est encore en développement.

      Pour ce conteneur, vous utilisez TigerVNC et son serveur VNC intégré. Cela présente un certain nombre d’avantages par rapport à l’utilisation d’un serveur X11 et VNC séparé :

      • Temps de réponse plus rapide, car le dessin de l’interface graphique est fait directement sur le serveur VNC plutôt que d’être fait sur un framebuffer intermédiaire (la mémoire qui stocke le contenu de l’écran).
      • Le redimensionnement automatique de l’écran, qui permet à l’application distante de se redimensionner automatiquement en fonction du client (dans ce cas, la fenêtre de votre navigateur web).

      Si vous le souhaitez, vous pouvez changer l’argument pour l’option -desktop de Thunderbird à quelque chose d’autre de votre choix. Le serveur affichera votre choix comme titre de la page web utilisée pour l’accès à votre application.

      Maintenant, ajoutons un troisième bloc de code à supervisord.conf pour démarrer easy-novnc : 

      ~/thunderbird/supervisord.conf

      ...
      [program:easy-novnc]
      priority=0
      command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce bloc, vous mettez en place easy-novncun serveur autonome qui fournit une wrapper autour de noVNC Ce serveur joue deux rôles. Tout d’abord, il fournit une page de connexion simple qui vous permet de configurer des options pour la connexion, et vous permet de définir des options par défaut. Deuxièmement, il permet à VNC de se substituer à WebSocket, qui permet d’y accéder au moyen d’un navigateur web ordinaire. 

      Habituellement, le redimensionnement se fait du côté client (c’est-à-dire la mise à l’échelle de l’image), mais vous utilisez l’option resize=remote pour profiter pleinement des ajustements de la résolution à distance de TigerVNC. Cela permet également de réduire la latence sur les appareils plus lents, tels que les Chromebooks bas de gamme :

      Note : Ce tutoriel utilise easy-novnc. Si vous le souhaitez, vous pouvez utiliser websockify et un serveur web séparé à la place. L’avantage d’easy-novnc est que l’utilisation de la mémoire et le temps de démarrage sont nettement plus faibles et que c’est autonome. easy-novnc fournit également une page de connexion plus propre que celle par défaut de noVNC et permet de définir des options par défaut qui sont utiles pour cette configuration (telles que resize=remote).

      Ajoutez maintenant le bloc suivant à votre configuration pour lancer OpenBox, le gestionnaire de fenêtres :

      ~/thunderbird/supervisord.conf

      ...
      [program:openbox]
      priority=1
      command=/usr/bin/openbox
      environment=DISPLAY=:0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce bloc, vous mettez en place OpenBox, un gestionnaire léger de fenêtres X11. Vous pouvez sauter cette étape, mais sans elle, vous n’auriez pas de barres de titre ou ne pourriez pas redimensionner les fenêtres.

      Enfin, ajoutons le dernier bloc à supervisord.conf, qui lancera l’application principale : 

      ~/thunderbird/supervisord.conf

      ...
      [program:app]
      priority=1
      environment=DISPLAY=:0
      command=/usr/bin/thunderbird
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce dernier bloc, vous fixez la priorité à 1 pour s’assurer que Thunderbird se lance après TigerVNC, sinon il rencontrerait une condition de course et ne démarrerait pas au hasard. Nous avons également réglé autorestart=true pour rouvrir automatiquement l’application si elle se ferme par erreur. La variable d’environnement DISPLAY indique à l’application de s’afficher sur le serveur VNC que vous avez configuré précédemment.

      Voici ce à quoi votre supervisord.conf complété ressemblera : 

      ~/thunderbird/supervisord.conf

      [supervisord]
      nodaemon=true
      pidfile=/tmp/supervisord.pid
      logfile=/dev/fd/1
      logfile_maxbytes=0
      
      [program:x11]
      priority=0
      command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      
      [program:easy-novnc]
      priority=0
      command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      
      [program:openbox]
      priority=1
      command=/usr/bin/openbox
      environment=DISPLAY=:0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      
      [program:app]
      priority=1
      environment=DISPLAY=:0
      command=/usr/bin/thunderbird
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Si vous voulez conteneuriser une autre demande, remplacez /usr/bin/thunderbird avec le chemin d’accès à l’exécutable de votre application. Sinon, vous êtes maintenant prêt à configurer le menu principal de votre interface graphique.

      Maintenant que votre gestionnaire de processus est configuré, mettons en place le menu de l’OpenBox. Ce menu nous permet de lancer des applications à l’intérieur du conteneur. Nous inclurons également un terminal et un moniteur de processus pour le débogage, si nécessaire.

      Dans le répertoire de votre candidature, utilisez nano ou votre éditeur de texte préféré pour créer et ouvrir un nouveau fichier appelé menu.xml: 

      • nano ~/thunderbird/menu.xml

      Ajoutez maintenant le code suivant à menu.xml:

      ~/thunderbird/menu.xml

      <?xml version="1.0" encoding="utf-8"?>
      <openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
          <menu id="root-menu" label="Openbox 3">
              <item label="Thunderbird">
                  <action name="Execute">
                      <execute>/usr/bin/thunderbird</execute>
                  </action>
              </item>
              <item label="Terminal">
                  <action name="Execute">
                      <execute>/usr/bin/x-terminal-emulator</execute>
                  </action>
              </item>
              <item label="Htop">
                  <action name="Execute">
                      <execute>/usr/bin/x-terminal-emulator -e htop</execute>
                  </action>
              </item>
          </menu>
      </openbox_menu>
      

      Ce fichier XML contient les éléments de menu qui apparaîtront lorsque vous ferez un clic droit sur le bureau. Chaque élément est constitué d’une étiquette et d’une action.

      Si vous voulez conteneuriser une autre demande, remplacez /usr/bin/thunderbird avec le chemin d’accès à l’exécutable de votre application et modifiez le label de l’article. 

      Étape 3 &mdash ; Créer le Dockerfile

      Maintenant que l’OpenBox est configurée, vous allez créer le Dockerfile, qui relie tout.

      Créez un Dockerfile dans le répertoire de votre conteneur :

      • nano ~/thunderbird/Dockerfile

      Pour commencer, ajoutons un peu de code pour élaborer easy-novnc: 

      ~/thunderbird/Dockerfile

      FROM golang:1.14-buster AS easy-novnc-build
      WORKDIR /src
      RUN go mod init build && 
          go get github.com/geek1011/easy-novnc@v1.1.0 && 
          go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
      

      Dans un premier temps, vous construisez easy-novnc. Cela se fait dans une étape séparée pour des raisons de simplicité et de gain d’espace &mdash ; vous n’avez pas besoin de toute la chaîne d’outils Go dans votre image finale. Notez le @v1.1.0 dans la commande de construction. Cela garantit que le résultat est déterministe, ce qui est important car Docker met en cache le résultat de chaque étape. Si vous n’aviez pas spécifié de version explicite, Docker ferait référence à la dernière version d’easy-novnc au moment où l’image a été construite pour la première fois. En outre, vous voulez vous assurer que vous téléchargez une version spécifique de easy-novnc, au cas où des modifications de rupture seraient apportées à l’interface CLI. 

      Créons maintenant la deuxième étape, qui deviendra l’image finale. Ici, vous utiliserez Debian 10 (buster) comme image de base. Notez que, comme il s’exécute dans un conteneur, il fonctionnera quelle que soit la distribution que vous utilisez sur votre serveur.

      Ensuite, ajoutez le bloc suivant à votre Dockerfile: 

      ~/thunderbird/Dockerfile

      ...
      FROM debian:buster
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && 
          rm -rf /var/lib/apt/lists && 
          mkdir -p /usr/share/desktop-directories
      

      Dans cette instruction, vous installez Debian 10 comme image de base, puis vous installez le strict minimum requis pour exécuter des applications graphiques dans votre conteneur. Notez que vous exécutez apt-get update dans le cadre de la même instruction, pour éviter les problèmes de mise en cache de Docker. Pour gagner de la place, vous supprimez également les listes de paquets téléchargées par la suite (les paquets mis en cache sont eux-mêmes supprimé par défaut). Vous créez également /usr/share/desktop-directories car certaines applications dépendent du répertoire existant.

      Ajoutons un autre petit bloc de code :

      ~/thunderbird/Dockerfile

      ...
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && 
          rm -rf /var/lib/apt/lists
      

      Dans cette instruction, vous installez des utilitaires et des paquets utiles à usage général. Les points suivants présentent un intérêt particulier xdg-utils (qui fournit les commandes de base utilisées par les applications de bureau sous Linux) et ca-certificates (qui installe les certificats racine pour nous permettre d’accéder aux sites HTTPS). 

      Maintenant, nous pouvons ajouter les instructions pour la demande principale :

      ~/thunderbird/Dockerfile

      ...
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends thunderbird && 
          rm -rf /var/lib/apt/lists
      

      Comme auparavant, nous installons ici l’application. Si vous conteneurisez une autre application, vous pouvez remplacer ces commandes par celles nécessaires à l’installation de votre application spécifique. Certaines applications nécessiteront un peu plus de travail pour fonctionner dans Docker. Par exemple, si vous installez une application qui utilise Chrome, Chromium, ou QtWebEngine, vous devrez utiliser l’argument de la ligne de commande --no-sandbox parce qu’il ne sera pas soutenu au sein de Docker. 

      Ensuite, commençons à ajouter les instructions pour ajouter les derniers fichiers dans le conteneur :

      ~/thunderbird/Dockerfile

      ...
      COPY --from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
      COPY menu.xml /etc/xdg/openbox/
      COPY supervisord.conf /etc/
      EXPOSE 8080
      

      Ici, vous ajoutez à l’image les fichiers de configuration que vous avez créés précédemment et vous copiez le binaire easy-novnc de la première étape.

      Le bloc de code suivant crée le répertoire de données et ajoute un utilisateur dédié à votre application. Ceci est important, car certaines applications refusent de s’exécuter en tant que root. Il est également bon de ne pas exécuter les applications en tant que root, même dans un conteneur.

      ~/thunderbird/Dockerfile

      ...
      RUN groupadd --gid 1000 app && 
          useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && 
          mkdir -p /data
      VOLUME /data
      

      Pour assurer la cohérence des UID/GID pour les fichiers, vous fixez explicitement les deux à 1000. Vous montez également un volume sur le répertoire de données pour vous assurer qu’il persiste entre les redémarrages.

      Enfin, ajoutons les instructions pour tout lancer :

      ~/thunderbird/Dockerfile

      ...
      CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
      

      En réglant la commande par défaut sur supervisord, le gestionnaire lancera les processus nécessaires à l’exécution de votre application. Dans ce cas, vous utilisez CMD plutôt qu’ENTRYPOINT. Dans la plupart des cas, cela ne ferait pas de différence, mais l’utilisation de CMD est plus adaptée à cette fin, pour plusieurs raisons. Premièrement, supervisord ne prend pas d’arguments qui seraient pertinents pour nous, et si vous fournissez des arguments au conteneur, ils remplacent CMD et sont annexés à ENTRYPOINT.  Deuxièmement, l’utilisation de CMD nous permet de fournir une commande entièrement différente (qui sera exécutée par /bin/sh -c) lors du passage des arguments au conteneur, ce qui rend le débogage plus facile.

      Et enfin, vous devez exécuterchown comme root avant de démarrer supervisord pour éviter les problèmes d’autorisation sur le volume de données et pour permettre aux processus enfant d’ouvrir stdout. Cela signifie également que vous devez utiliser gosu au lieu de l’instruction USER pour changer d’utilisateur. 

      Voici ce à quoi votre Dockerfile complété ressemblera :

      ~/thunderbird/Dockerfile

      FROM golang:1.14-buster AS easy-novnc-build
      WORKDIR /src
      RUN go mod init build && 
          go get github.com/geek1011/easy-novnc@v1.1.0 && 
          go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
      
      FROM debian:buster
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && 
          rm -rf /var/lib/apt/lists && 
          mkdir -p /usr/share/desktop-directories
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && 
          rm -rf /var/lib/apt/lists
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends thunderbird && 
          rm -rf /var/lib/apt/lists
      
      COPY --from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
      COPY menu.xml /etc/xdg/openbox/
      COPY supervisord.conf /etc/
      EXPOSE 8080
      
      RUN groupadd --gid 1000 app && 
          useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && 
          mkdir -p /data
      VOLUME /data
      
      CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
      

      Sauvegardez et fermez votre Dockerfile. Nous sommes maintenant prêts à construire et à faire fonctionner notre conteneur, puis à accéder à Thunderbird &mdash, une application GUI.

      Étape 4 &mdash ; Création et utilisation du conteneur

      L’étape suivante consiste à construire votre conteneur et à le mettre en marche au démarrage. Vous mettrez également en place un volume pour préserver les données de l’application entre les redémarrages et les mises à jour.

      Construisez d’abord votre conteneur. Veillez à exécuter ces commandes dans le répertoire ~/thunderbird :

      • docker build -t thunderbird .

      Créez maintenant un nouveau réseau qui sera partagé entre les conteneurs de l’application :

      • docker network create thunderbird-net

      Créez ensuite un volume pour stocker les données de l’application :

      • docker volume create thunderbird-data

      Enfin, lancez-le et réglez-le pour qu’il redémarre automatiquement :

      • docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-app thunderbird

      Notez que si vous le souhaitez, vous pouvez remplacer le thunderbird-app après l’option --name par un nom différent. Quel que soit votre choix, votre application est maintenant conteneurisée et en cours d’exécution. Utilisons maintenant le serveur web Caddy pour le sécuriser et nous y connecter à distance.

      Étape 5 &mdash ; Mise en place de Caddy

      Au cours de cette étape, vous configurerez le serveur web Caddy pour fournir une authentification et, éventuellement, un accès à distance aux fichiers via WebDAV. Par souci de simplicité, et pour vous permettre de l’utiliser avec votre proxy inverse existant, vous le ferez fonctionner dans un autre conteneur.

      Créez un nouveau répertoire et déplacez-vous à l’intérieur de celui-ci :

      Créez maintenant un nouveau Dockerfile en utilisant nano ou votre éditeur préféré :

      Ajoutez ensuite les directives suivantes :

      ~/caddy/Dockerfile

      FROM golang:1.14-buster AS caddy-build
      WORKDIR /src
      RUN echo 'module caddy' > go.mod && 
          echo 'require github.com/caddyserver/caddy/v2 v2.0.0' >> go.mod && 
          echo 'require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3' >> go.mod
      RUN echo 'package main' > caddy.go && 
          echo 'import caddycmd "github.com/caddyserver/caddy/v2/cmd"' >> caddy.go && 
          echo 'import _ "github.com/caddyserver/caddy/v2/modules/standard"' >> caddy.go && 
          echo 'import _ "github.com/mholt/caddy-webdav"' >> caddy.go && 
          echo 'func main() { caddycmd.Main() }' >> caddy.go
      RUN go build -o /bin/caddy .
      
      FROM debian:buster
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends gosu && 
          rm -rf /var/lib/apt/lists
      
      COPY --from=caddy-build /bin/caddy /usr/local/bin/
      COPY Caddyfile /etc/
      EXPOSE 8080
      
      RUN groupadd --gid 1000 app && 
          useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && 
          mkdir -p /data
      VOLUME /data
      
      WORKDIR /data
      CMD ["sh", "-c", "chown app:app /data && exec gosu app /usr/local/bin/caddy run -adapter caddyfile -config /etc/Caddyfile"]
      

      Ce Dockerfile construit Caddy avec le plugin WebDAV activé, puis le lance sur le port 8080 avec le Caddyfile dans /etc/Caddyfile. Enregistrez et fermez le fichier.

      Ensuite, vous allez configurer le serveur web de Caddy. Créez un fichier nommé Caddyfile dans le répertoire que vous venez de créer :

      Ajoutez maintenant le bloc de code suivant à votre Caddyfile :

      ~/caddy/Caddyfile

      {
          order webdav last
      }
      :8080 {
          log
          root * /data
          reverse_proxy thunderbird-app:8080
      
          handle /files/* {
              uri strip_prefix /files
              file_server browse
          }
          redir /files /files/
      
          handle /webdav/* {
              uri strip_prefix /webdav
              webdav
          }
          redir /webdav /webdav/
      
          basicauth /* {
              {env.APP_USERNAME} {env.APP_PASSWORD_HASH}
          }
      }
      

      Ce Caddyfile est un proxy du répertoire root vers le conteneur thunderbird-app que vous avez créé à l’étape 4 (le Docker le résout en l’IP correcte). Il servira également de navigateur de fichiers en lecture seule sur /files et fera fonctionner un serveur WebDAV sur /webdav que vous pourrez monter localement pour accéder à vos fichiers. Le nom d’utilisateur et le mot de passe sont lus à partir des variables d’environnement APP_USERNAME et APP_PASSWORD_HASH. 

      Maintenant, construisez le conteneur :

      • docker build -t thunderbird-caddy .

      Caddy v.2 vous demande de hacher le mot de passe que vous souhaitez. Exécutez la commande suivante et n’oubliez pas de remplacer mypass avec un mot de passe fort de votre choix : 

      • docker run --rm -it thunderbird-caddy caddy hash-password -plaintext 'mypass'

      Cette commande produira une chaîne de caractères. Copiez ceci dans votre presse-papiers en préparation de l’exécution de la prochaine commande.

      Vous êtes maintenant prêt à faire fonctionner le conteneur. Veillez à remplacer myuser avec un nom d’utilisateur de votre choix, et remplacez mypass-hash par la sortie de la commande que vous avez exécutée à l’étape précédente. Vous pouvez également changer le port (8080 ici) pour accéder à votre serveur sur un port différent : 

      • docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-web --env=APP_USERNAME="myuser" --env=APP_PASSWORD_HASH="mypass-hash" --publish=8080:8080 thunderbird-caddy

      Nous sommes maintenant prêts à accéder et à tester notre application.

      Étape 6 &mdash ; Tester et gérer l’application

      Accédez à votre application et assurez-vous qu’elle fonctionne.

      Ouvrez d’abord http://votre_serveur_ip:8080 dans un navigateur web, connectez-vous avec les identifiants que vous avez choisis auparavant, et cliquez sur Connect. 

      Page de connexion NoVNC 

      Vous devriez maintenant être en mesure d’interagir avec l’application, et celle-ci devrait automatiquement se redimensionner pour s’adapter à la fenêtre de votre navigateur.

      Menu principal de Thunderbird

      Si vous faites un clic droit sur le bureau noir, vous devriez voir un menu qui vous permet d’accéder à un terminal. Si vous cliquez avec le bouton du milieu de la souris, vous devriez voir une liste de fenêtres.

      Clic droit sur NoVNC

      Ouvrez maintenant http://votre_serveur_ip:8080/files/ dans un navigateur web. Vous devriez pouvoir accéder à vos fichiers.

      Accès au fichier NoVNC webdav

      En option, vous pouvez essayer de monter http://your_server_ip:8080/webdav/ dans un client WebDAV. Vous devez pouvoir accéder à vos fichiers et les modifier directement. Si vous utilisez l’option de carte lecteur réseau dans l’explorateur Windows, vous devrez soit utiliser un mandataire inverse pour ajouter le HTTPS, ou définir HKLMSYSTEMCurrentControlSetServicesClientWebParametersBasicAuthLevel à DWORD:2. 

      Dans les deux cas, votre application GUI native est maintenant prête à être utilisée à distance.

      Conclusion

      Vous avez maintenant configuré avec succès un conteneur Docker pour Thunderbird et ensuite, à l’aide de Caddy, vous avez configuré l’accès à ce conteneur via un navigateur web. Si jamais vous devez mettre à jour votre application, arrêtez les conteneurs, exécutez docker rm thunderbird-app thunderbird-web, reconstruisez les images, puis relancez les commandes d’exécution du docker à partir des étapes précédentes ci-dessus. Vos données seront toujours préservées puisqu’elles sont stockées dans un volume.

      Si vous voulez en savoir plus sur les commandes de base du Docker, vous pouvez lire ceci tutoriel ou cette fiche d’aide. Pour une utilisation à plus long terme, vous pouvez également envisager d’activer le HTTPS (qui nécessite un domaine) pour une sécurité supplémentaire.

      En outre, si vous déployez plus d’une application, vous pouvez utiliser Docker Compose ou Kubernetes au lieu de démarrer chaque conteneur manuellement. Et n’oubliez pas que ce tutoriel peut servir de base pour exécuter toute autre application Linux sur votre serveur, y compris :

      • Wine, une couche de compatibilité pour l’exécution d’applications Windows sous Linux.
      • GIMP, un éditeur d’images open-source.
      • Cutter, une plateforme de rétro-ingénierie open-source.

      Cette dernière option démontre le grand potentiel de la conteneurisation et de l’accès à distance aux applications GUI. Grâce à cette configuration, vous pouvez désormais utiliser un serveur doté d’une puissance de calcul considérablement plus importante que celle dont vous disposez localement pour faire fonctionner des outils gourmands en ressources comme Cutter.



      Source link

      Comment accéder à distance aux applications GUI en utilisant Docker et Caddy sur Ubuntu 20.04


      L’auteur a choisi le Free and Open Source Fund pour recevoir un don dans le cadre du programme Write for Donations.

      Introduction

      Même avec la popularité croissante des services en nuage, le besoin d’exécuter des applications natives existe toujours.

      En utilisant noVNC et TigerVNC,vous pouvez exécuter des applications natives dans un conteneur Docker et y accéder à distance à l’aide d’un navigateur web. En outre, vous pouvez exécuter votre application sur un serveur disposant de plus de ressources système que celles dont vous disposez localement, ce qui peut offrir une plus grande flexibilité lors de l’exécution de grandes applications.

      Dans ce tutoriel, vous allez conteneuriser Mozilla Thunderbird, un client de messagerie électronique, en utilisant Docker. Ensuite, vous le sécuriserez et lui donnerez un accès à distance en utilisant le serveur web de Caddy.

      Lorsque vous aurez terminé, vous pourrez accéder à Thunderbird depuis n’importe quel appareil en utilisant simplement un navigateur web. En option, vous pourrez également accéder localement aux fichiers de ce site en utilisant WebDAV. Vous aurez également une image de Docker entièrement autonome que vous pourrez exécuter n’importe où.

      Conditions préalables

      Avant de commencer ce guide, vous aurez besoin de ce qui suit :

      Étape 1 &mdash ; Créer la “Configuration de supervisord

      Maintenant que votre serveur fonctionne et que Docker est installé, vous êtes prêt à commencer à configurer le conteneur de votre application. Comme votre conteneur est constitué de plusieurs composants, vous devez utiliser un gestionnaire de processus pour les lancer et les surveiller. Ici, vous utiliserez supervisord. supervisord est un gestionnaire de processus écrit en Python qui est souvent utilisé pour orchestrer des conteneurs complexes.

      Tout d’abord, créez et entrez un répertoire appelé thunderbird pour votre conteneur :

      • mkdir ~/thunderbird
      • cd ~/thunderbird

      Maintenant, créez et ouvrez un fichier appelé supervisord.conf utilisant nano ou votre éditeur préféré :

      • nano ~/thunderbird/supervisord.conf

      Ajoutez maintenant ce premier bloc de code dans supervisord.conf, qui définira les options globales de supervisord :

      ~/thunderbird/supervisord.conf

      [supervisord]
      nodaemon=true
      pidfile=/tmp/supervisord.pid
      logfile=/dev/fd/1
      logfile_maxbytes=0
      

      Dans ce bloc, vous configurez supervisord lui-même. Vous devez mettre nodaemon à l'heure parce qu’il sera placé à l’intérieur d’un conteneur Docker comme point d’entrée. Par conséquent, vous voulez qu’il reste au premier plan. Vous mettez également en place pidfile vers un chemin accessible par un non-root user (nous y reviendrons plus tard), et logfile vers stdout pour que vous puissiez voir les journaux.

      Ensuite, ajoutez un autre petit bloc de code à supervisord.conf. Ce bloc démarre TigerVNC, qui est un serveur combiné VNC/X11 :

      ~/thunderbird/supervisord.conf

      ...
      [program:x11]
      priority=0
      command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce bloc, vous configurez le serveur X11. X11 est un protocole de serveur d’affichage, qui permet aux applications graphiques de s’exécuter. Notez qu’à l’avenir il sera remplacé par Wayland, mais l’accès à distance est encore en développement.

      Pour ce conteneur, vous utilisez TigerVNC et son serveur VNC intégré. Cela présente un certain nombre d’avantages par rapport à l’utilisation d’un serveur X11 et VNC séparé :

      • Temps de réponse plus rapide, car le dessin de l’interface graphique est fait directement sur le serveur VNC plutôt que d’être fait sur un framebuffer intermédiaire (la mémoire qui stocke le contenu de l’écran).
      • Le redimensionnement automatique de l’écran, qui permet à l’application distante de se redimensionner automatiquement en fonction du client (dans ce cas, la fenêtre de votre navigateur web).

      Si vous le souhaitez, vous pouvez changer l’argument pour l’option -desktop de Thunderbird à quelque chose d’autre de votre choix. Le serveur affichera votre choix comme titre de la page web utilisée pour accéder à votre demande.

      Maintenant, ajoutons un troisième bloc de code à supervisord.conf pour démarrer easy-novnc :

      ~/thunderbird/supervisord.conf

      ...
      [program:easy-novnc]
      priority=0
      command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce bloc, vous mettez en place easy-novncun serveur autonome qui permet de faire le tour de noVNC. Ce serveur joue deux rôles. Tout d’abord, il fournit une page de connexion simple, qui vous permet de configurer des options pour la connexion et de définir des options par défaut. Deuxièmement, il utilise un proxy VNC sur WebSocket, qui permet d’y accéder au moyen d’un navigateur web ordinaire.

      Habituellement, le redimensionnement se fait du côté client (c’est-à-dire la mise à l’échelle de l’image), mais vous utilisez l’option resize=remote pour profiter pleinement des ajustements de la résolution à distance de TigerVNC. Cela permet également de réduire la latence sur les appareils plus lents, tels que les Chromebooks bas de gamme :

      Note : Ce tutoriel utilise easy-novnc. Si vous le souhaitez, vous pouvez utiliser websockify et un serveur web séparé à la place. L’avantage d’easy-novnc est que l’utilisation de la mémoire et le temps de démarrage sont nettement plus faibles et que c’est autonome. easy-novnc fournit également une page de connexion plus propre que celle par défaut de noVNC et permet de définir des options par défaut qui sont utiles pour cette configuration (telles que resize=remote).

      Ajoutez maintenant le bloc suivant à votre configuration pour lancer OpenBox, le gestionnaire de fenêtres :

      ~/thunderbird/supervisord.conf

      ...
      [program:openbox]
      priority=1
      command=/usr/bin/openbox
      environment=DISPLAY=:0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce bloc, vous mettez en place OpenBox, un gestionnaire léger de fenêtres X11. Vous pouvez sauter cette étape, mais sans elle, vous n’auriez pas de barres de titre ou ne pourriez pas redimensionner les fenêtres.

      Enfin, ajoutons le dernier bloc à supervisord.conf, qui lancera l’application principale :

      ~/thunderbird/supervisord.conf

      ...
      [program:app]
      priority=1
      environment=DISPLAY=:0
      command=/usr/bin/thunderbird
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Dans ce dernier bloc, vous fixez la priority à 1 pour s’assurer que Thunderbird se lance après TigerVNC, sinon il rencontrerait une condition de course et ne démarrerait pas au hasard. Nous avons également réglé autorestart=true pour rouvrir automatiquement l’application si elle se ferme par erreur. La variable d’environnement DISPLAY indique à l’application de s’afficher sur le serveur VNC que vous avez configuré précédemment.

      Voici ce à quoi votre supervisord.conf complété ressemblera :

      ~/thunderbird/supervisord.conf

      [supervisord]
      nodaemon=true
      pidfile=/tmp/supervisord.pid
      logfile=/dev/fd/1
      logfile_maxbytes=0
      
      [program:x11]
      priority=0
      command=/usr/bin/Xtigervnc -desktop "Thunderbird" -localhost -rfbport 5900 -SecurityTypes None -AlwaysShared -AcceptKeyEvents -AcceptPointerEvents -AcceptSetDesktopSize -SendCutText -AcceptCutText :0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      
      [program:easy-novnc]
      priority=0
      command=/usr/local/bin/easy-novnc --addr :8080 --host localhost --port 5900 --no-url-password --novnc-params "resize=remote"
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      
      [program:openbox]
      priority=1
      command=/usr/bin/openbox
      environment=DISPLAY=:0
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      
      [program:app]
      priority=1
      environment=DISPLAY=:0
      command=/usr/bin/thunderbird
      autorestart=true
      stdout_logfile=/dev/fd/1
      stdout_logfile_maxbytes=0
      redirect_stderr=true
      

      Si vous voulez conteneuriser une autre demande, remplacez /usr/bin/thunderbird avec le chemin d’accès à l’exécutable de votre application. Sinon, vous êtes maintenant prêt à configurer le menu principal de votre interface graphique.

      Maintenant que votre gestionnaire de processus est configuré, mettons en place le menu de l’OpenBox. Ce menu nous permet de lancer des applications à l’intérieur du conteneur. Nous inclurons également un terminal et un moniteur de processus pour le débogage si nécessaire.

      Dans le répertoire de votre candidature, utilisez nano ou votre éditeur de texte préféré pour créer et ouvrir un nouveau fichier appelé menu.xml:

      • nano ~/thunderbird/menu.xml

      Ajoutez maintenant le code suivant à menu.xml:

      ~/thunderbird/menu.xml

      <?xml version="1.0" encoding="utf-8"?>
      <openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
          <menu id="root-menu" label="Openbox 3">
              <item label="Thunderbird">
                  <action name="Execute">
                      <execute>/usr/bin/thunderbird</execute>
                  </action>
              </item>
              <item label="Terminal">
                  <action name="Execute">
                      <execute>/usr/bin/x-terminal-emulator</execute>
                  </action>
              </item>
              <item label="Htop">
                  <action name="Execute">
                      <execute>/usr/bin/x-terminal-emulator -e htop</execute>
                  </action>
              </item>
          </menu>
      </openbox_menu>
      

      Ce fichier XML contient les éléments de menu qui apparaîtront lorsque vous ferez un clic droit sur le bureau. Chaque élément est constitué d’une étiquette et d’une action.

      Si vous voulez conteneuriser une autre application, remplacez /usr/bin/thunderbird par le chemin d’accès à l’exécutable de votre application et modifiez le label de l’article.

      Étape 3 &mdash ; Créer le Dockerfile

      Maintenant que l’OpenBox est configurée, vous allez créer le Dockerfile, qui relie tout.

      Créez un Dockerfile dans le répertoire de votre conteneur :

      • nano ~/thunderbird/Dockerfile

      Pour commencer, ajoutons un peu de code pour élaborer easy-novnc:

      ~/thunderbird/Dockerfile

      FROM golang:1.14-buster AS easy-novnc-build
      WORKDIR /src
      RUN go mod init build && 
          go get github.com/geek1011/easy-novnc@v1.1.0 && 
          go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
      

      Dans un premier temps, vous construisez easy-novnc. Cela se fait dans une étape séparée pour des raisons de simplicité et de gain d’espace &mdash ; vous n’avez pas besoin de toute la chaîne d’outils Go dans votre image finale. Notez le @v1.1.0 dans la commande de construction. Cela garantit que le résultat est déterministe, ce qui est important car Docker met en cache le résultat de chaque étape. Si vous n’aviez pas spécifié de version explicite, Docker ferait référence à la dernière version d’easy-novnc au moment où l’image a été construite pour la première fois. En outre, vous voulez vous assurer que vous téléchargez une version spécifique de easy-novnc, au cas où des modifications de rupture seraient apportées à l’interface CLI.

      Créons maintenant le deuxième niveau, qui deviendra l’image finale. Ici, vous utiliserez Debian 10 (buster) comme image de base. Notez que, comme il s’exécute dans un conteneur, il fonctionnera quelle que soit la distribution que vous utilisez sur votre serveur.

      Ensuite, ajoutez le bloc suivant à votre Dockerfile:

      ~/thunderbird/Dockerfile

      ...
      FROM debian:buster
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && 
          rm -rf /var/lib/apt/lists && 
          mkdir -p /usr/share/desktop-directories
      

      Dans cette instruction, vous installez Debian 10 comme image de base, puis vous installez le strict minimum requis pour exécuter des applications graphiques dans votre conteneur. Notez que vous exécutez apt-get update dans le cadre de la même instruction pour éviter les problèmes de mise en cache de Docker. Pour gagner de la place, vous supprimez également les listes de paquets téléchargées par la suite (les paquets mis en cache sont eux-mêmes supprimé par défaut). Vous créez également /usr/share/desktop-directories car certaines applications dépendent du répertoire existant.

      Ajoutons un autre petit bloc de code :

      ~/thunderbird/Dockerfile

      ...
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && 
          rm -rf /var/lib/apt/lists
      

      Dans cette instruction, vous installez des utilitaires et des paquets utiles à usage général. Les points suivants présentent un intérêt particulier xdg-utils (qui fournit les commandes de base utilisées par les applications de bureau sous Linux) et ca-certificates (qui installe les certificats racine pour nous permettre d’accéder aux sites HTTPS).

      Maintenant, nous pouvons ajouter les instructions pour la demande principale :

      ~/thunderbird/Dockerfile

      ...
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends thunderbird && 
          rm -rf /var/lib/apt/lists
      

      Comme auparavant, nous installons ici l’application. Si vous conteneurisez une autre application, vous pouvez remplacer ces commandes par celles nécessaires à l’installation de votre app spécifique. Certaines applications nécessiteront un peu plus de travail pour fonctionner dans Docker. Par exemple, si vous installez une application qui utilise Chrome, Chromium, ou QtWebEngine, vous devrez utiliser l’argument de la ligne de commande --no-sandbox parce qu’il ne sera pas soutenu au sein de Docker.

      Ensuite, commençons à ajouter les instructions pour ajouter les derniers fichiers dans le conteneur :

      ~/thunderbird/Dockerfile

      ...
      COPY --from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
      COPY menu.xml /etc/xdg/openbox/
      COPY supervisord.conf /etc/
      EXPOSE 8080
      

      Ici, vous ajoutez à l’image les fichiers de configuration que vous avez créés précédemment et vous copiez le binaire easy-novnc de la première étape.

      Le bloc de code suivant crée le répertoire de données et ajoute un utilisateur dédié à votre application. Ceci est important car certaines applications refusent de s’exécuter en tant que root. Il est également bon de ne pas exécuter les applications en tant que root, même dans un conteneur.

      ~/thunderbird/Dockerfile

      ...
      RUN groupadd --gid 1000 app && 
          useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && 
          mkdir -p /data
      VOLUME /data
      

      Pour assurer la cohérence des UID/GID pour les fichiers, vous fixez explicitement les deux à 1000. Vous montez également un volume sur le répertoire de données pour vous assurer qu’il persiste entre les redémarrages.

      Enfin, ajoutons les instructions pour tout lancer :

      ~/thunderbird/Dockerfile

      ...
      CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
      

      En réglant la commande par défaut sur supervisord, le gestionnaire lancera les processus nécessaires à l’exécution de votre demande. Dans ce cas, vous utilisez CMD plutôt qu’ENTRYPOINT. Dans la plupart des cas, cela ne ferait pas de différence, mais l’utilisation de CMD est mieux adapté à cette fin pour quelques raisons. Premièrement, supervisord ne prend pas d’arguments qui seraient pertinents pour nous, et si vous fournissez des arguments au conteneur, ils remplacent CMD et sont annexés à ENTRYPOINT. Deuxièmement, l’utilisation de CMD nous permet de fournir une commande entièrement différente (qui sera exécutée par /bin/sh -c) lors du passage des arguments au conteneur, ce qui rend le débogage plus facile.

      Et enfin, vous devez exécuterchown comme root avant de démarrer supervisord pour éviter les problèmes d’autorisation sur le volume de données et pour permettre aux processus enfant d’ouvrir stdout. Cela signifie également que vous devez utiliser gosu au lieu de l’instruction USER pour changer d’utilisateur.

      Voici ce à quoi votre Dockerfile complété ressemblera :

      ~/thunderbird/Dockerfile

      FROM golang:1.14-buster AS easy-novnc-build
      WORKDIR /src
      RUN go mod init build && 
          go get github.com/geek1011/easy-novnc@v1.1.0 && 
          go build -o /bin/easy-novnc github.com/geek1011/easy-novnc
      
      FROM debian:buster
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends openbox tigervnc-standalone-server supervisor gosu && 
          rm -rf /var/lib/apt/lists && 
          mkdir -p /usr/share/desktop-directories
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends lxterminal nano wget openssh-client rsync ca-certificates xdg-utils htop tar xzip gzip bzip2 zip unzip && 
          rm -rf /var/lib/apt/lists
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends thunderbird && 
          rm -rf /var/lib/apt/lists
      
      COPY --from=easy-novnc-build /bin/easy-novnc /usr/local/bin/
      COPY menu.xml /etc/xdg/openbox/
      COPY supervisord.conf /etc/
      EXPOSE 8080
      
      RUN groupadd --gid 1000 app && 
          useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && 
          mkdir -p /data
      VOLUME /data
      
      CMD ["sh", "-c", "chown app:app /data /dev/stdout && exec gosu app supervisord"]
      

      Sauvegardez et fermez votre Dockerfile. Nous sommes maintenant prêts à construire et à faire fonctionner notre conteneur, puis à accéder à Thunderbird &mdash, une application GUI.

      Étape 4 &mdash ; Construire et faire marcher le conteneur

      L’étape suivante consiste à construire votre conteneur et à le mettre en marche au démarrage. Vous mettrez également en place un volume pour préserver les données de l’application entre les redémarrages et les mises à jour.

      Construisez d’abord votre conteneur. Veillez à exécuter ces commandes dans le répertoire ~/thunderbird :

      • docker build -t thunderbird .

      Créez maintenant un nouveau réseau qui sera partagé entre les conteneurs de l’application :

      • docker network create thunderbird-net

      Créez ensuite un volume pour stocker les données de l’application :

      • docker volume create thunderbird-data

      Enfin, lancez-le et réglez-le pour qu’il redémarre automatiquement :

      • docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-app thunderbird

      Notez que si vous le souhaitez, vous pouvez remplacer le thunderbird-app après l’option --name avec un nom différent. Quel que soit votre choix, votre demande est maintenant conteneurisée et en cours d’exécution. Utilisons maintenant le serveur web Caddy pour le sécuriser et nous y connecter à distance.

      Étape 5 &mdash ; Mettre en place Caddy

      Au cours de cette étape, vous configurerez le serveur web Caddy pour fournir une authentification et, éventuellement, un accès à distance aux fichiers via WebDAV. Par souci de simplicité, et pour vous permettre de l’utiliser avec votre proxy inverse existant, vous le ferez fonctionner dans un autre conteneur.

      Créez un nouveau répertoire et déplacez-vous à l’intérieur de celui-ci :

      Créez maintenant un nouveau Dockerfile en utilisant nano ou votre éditeur préféré :

      Ajoutez ensuite les directives suivantes :

      ~/caddy/Dockerfile

      FROM golang:1.14-buster AS caddy-build
      WORKDIR /src
      RUN echo 'module caddy' > go.mod && 
          echo 'require github.com/caddyserver/caddy/v2 v2.0.0' >> go.mod && 
          echo 'require github.com/mholt/caddy-webdav v0.0.0-20200523051447-bc5d19941ac3' >> go.mod
      RUN echo 'package main' > caddy.go && 
          echo 'import caddycmd "github.com/caddyserver/caddy/v2/cmd"' >> caddy.go && 
          echo 'import _ "github.com/caddyserver/caddy/v2/modules/standard"' >> caddy.go && 
          echo 'import _ "github.com/mholt/caddy-webdav"' >> caddy.go && 
          echo 'func main() { caddycmd.Main() }' >> caddy.go
      RUN go build -o /bin/caddy .
      
      FROM debian:buster
      
      RUN apt-get update -y && 
          apt-get install -y --no-install-recommends gosu && 
          rm -rf /var/lib/apt/lists
      
      COPY --from=caddy-build /bin/caddy /usr/local/bin/
      COPY Caddyfile /etc/
      EXPOSE 8080
      
      RUN groupadd --gid 1000 app && 
          useradd --home-dir /data --shell /bin/bash --uid 1000 --gid 1000 app && 
          mkdir -p /data
      VOLUME /data
      
      WORKDIR /data
      CMD ["sh", "-c", "chown app:app /data && exec gosu app /usr/local/bin/caddy run -adapter caddyfile -config /etc/Caddyfile"]
      

      Ce Dockerfile construit Caddy avec le plugin WebDAV activé, puis le lance sur le port 8080 avec le Caddyfile à /etc/Caddyfile. Enregistrez et fermez le fichier.

      Ensuite, vous allez configurer le serveur web de Caddy. Créer un fichier nommé Caddyfile dans le répertoire que vous venez de créer :

      Ajoutez maintenant le bloc de code suivant à votre Caddyfile :

      ~/caddy/Caddyfile

      {
          order webdav last
      }
      :8080 {
          log
          root * /data
          reverse_proxy thunderbird-app:8080
      
          handle /files/* {
              uri strip_prefix /files
              file_server browse
          }
          redir /files /files/
      
          handle /webdav/* {
              uri strip_prefix /webdav
              webdav
          }
          redir /webdav /webdav/
      
          basicauth /* {
              {env.APP_USERNAME} {env.APP_PASSWORD_HASH}
          }
      }
      

      Ce Caddyfile est un proxy du répertoire root vers le conteneur thunderbird-app que vous avez créé à l’étape 4 (le Docker le résout dans l’IP correcte). Il servira également de navigateur de fichiers en lecture seule sur /files et fera fonctionner un serveur WebDAV sur /webdav que vous pourrez monter localement pour accéder à vos fichiers. Le nom d’utilisateur et le mot de passe sont lus à partir des variables d’environnement APP_USERNAME et APP_PASSWORD_HASH.

      Maintenant, construisez le conteneur :

      • docker build -t thunderbird-caddy .

      Caddy v.2 vous demande de hacher le mot de passe que vous souhaitez. Exécutez la commande suivante et n’oubliez pas de remplacer mypass avec un mot de passe fort de votre choix :

      • docker run --rm -it thunderbird-caddy caddy hash-password -plaintext 'mypass'

      Cette commande produira une chaîne de caractères. Copiez ceci dans votre presse-papiers en préparation de l’exécution de la prochaine commande.

      Vous êtes maintenant prêt à faire fonctionner le conteneur. Veillez à remplacer myuser par le nom d’utilisateur de votre choix, et remplacez <^>mypass-hash par la sortie de la commande que vous avez exécutée à l’étape précédente. Vous pouvez également changer le port (8080<^> ici) pour accéder à votre serveur sur un port différent :

      • docker run --detach --restart=always --volume=thunderbird-data:/data --net=thunderbird-net --name=thunderbird-web --env=APP_USERNAME="myuser" --env=APP_PASSWORD_HASH="mypass-hash" --publish=8080:8080 thunderbird-caddy

      Nous sommes maintenant prêts à accéder et à tester notre application.

      Étape 6 &mdash ; Tester et gérer l’application

      Accédez à votre application et assurez-vous qu’elle fonctionne.

      ouvrez d’abordhttp://votre_serveur_ip:8080 dans un navigateur web, connectez-vous avec les identifiants que vous avez choisis auparavant, et cliquez sur Connect.

      Page de connexion NoVNC

      Vous devriez maintenant être en mesure d’interagir avec l’application, et celle-ci devrait automatiquement se redimensionner pour s’adapter à la fenêtre de votre navigateur.

      Menu principal de Thunderbird

      Si vous faites un clic droit sur le bureau noir, vous devriez voir un menu qui vous permet d’accéder à un terminal. Si vous cliquez sur le milieu, vous devriez voir une liste de fenêtres.

      Clic droit sur NoVNC

      Ouvrez maintenant http://votre_serveur_ip:8080/files/ dans un navigateur web. Vous devriez pouvoir accéder à vos dossiers.

      Accès au fichier NoVNC webdav

      En option, vous pouvez essayer de monter http://votre_serveur_ip:8080/webdav/ dans un client WebDAV. Vous devriez pouvoir accéder et modifier vos fichiers directement. Si vous utilisez l’option de carte lecteur réseau dans l’explorateur Windows, vous devrez soit utiliser un proxy inverse pour ajouter le HTTPS, soit définir HKLMSYSTEMCurrentControlSetServicesClientWebParametersBasicAuthLevel à DWORD:2.

      Dans les deux cas, votre application GUI native est maintenant prête à être utilisée à distance.

      Conclusion

      Vous avez maintenant configuré avec succès un conteneur Docker pour Thunderbird et ensuite, à l’aide de Caddy, vous avez configuré l’accès à ce conteneur via un navigateur web. Si jamais vous devez mettre à jour votre application, arrêtez les conteneurs, exécutez docker rm thunderbird-app thunderbird-web, reconstruisez les images, puis relancez les commandes d’exécution du docker à partir des étapes précédentes ci-dessus. Vos données seront toujours préservées puisqu’elles sont stockées dans un volume.

      Si vous voulez en savoir plus sur les commandes de base du Docker, vous pouvez lire ce tutoriel ou cette fiche d’aide. Pour une utilisation à plus long terme, vous pouvez également envisager d’activer le HTTPS (qui nécessite un domaine) pour une sécurité supplémentaire.

      En outre, si vous déployez plusieurs applications, vous pouvez utiliser Docker Compose ou Kubernetes au lieu de démarrer chaque conteneur manuellement. Et n’oubliez pas que ce tutoriel peut servir de base pour exécuter toute autre application Linux sur votre serveur, y compris :

      • Wine, une couche de compatibilité pour l’exécution d’applications Windows sous Linux.
      • GIMP, un éditeur d’images open-source.
      • Cutter, une plateforme de rétro-ingénierie open-source.

      Cette dernière option démontre le grand potentiel de la conteneurisation et de l’accès à distance aux applications GUI. Grâce à cette configuration, vous pouvez désormais utiliser un serveur doté d’une puissance de calcul considérablement plus importante que celle dont vous disposez localement pour faire fonctionner des outils gourmands en ressources comme Cutter.



      Source link