DesignSpark Electrical Logolinkedin
Ask a Question

Votre Datacenter personnel Raspberry Pi 4 Personal Partie 1: Ansible, Docker and Nextcloud

Le Pi 4 déborde de performances et est idéal comme serveur Cloud privé pour la maison ou le bureau.

Dans cette série d'articles, nous expliquons comment utiliser un Raspberry Pi 4 pour créer une solution de Cloud personnelle gérée à l'aide d'Ansible et de Docker, puissants outils utilisés par de nombreuses plates-formes de Cloud à grande échelle, permettant d'automatiser les tâches de configuration et de fournir une conteneurisation pour les applications.

Ce premier article examine la configuration initiale de Raspbian, suivie de la configuration d'Ansible et de Docker, et finalement l'installation de NextCloud à l'aide de ces outils.

NextCloud propose une gamme complète de services, y compris le partage de fichiers, la gestion d'agenda, la vidéoconférence et bien plus encore. Cependant, comme nous allons voir, cela n'est que le début, et, grâce à notre configuration d'outils, le Pi 4 peut rapidement avoir d'autres utilisations, comme un serveur Cloud personnel.

Matériel

Grâce à son processeur quatre cœurs, le Raspberry Pi 3 Modèle B n'est pas en reste, et le nouveau Pi 4 intègre une mise à niveau système sur circuit qui offre une amélioration significative des performances. De plus, avec des modèles disposant d'une mémoire RAM jusqu'à 4 Go, il est capable d'exécuter des charges de travail multiples, plus élevées et beaucoup plus avancées. Sans compter que les mises à niveau de 100 M vers 1 G d'Ethernet et d'USB 2.0 vers USB 3.0, le rendent parfait comme serveur personnel, auquel il est possible de connecter un stockage externe rapide.

Le kit de démarrage Raspberry Pi 4 4 Go Modèle B d'OKdo (192-5286) fournit tous les éléments nécessaires pour une mise en route rapide : un Pi 4 4 Go, des dissipateurs, un boîtier avec ventilateur, une alimentation secteur, des cordons, une carte Micro SD 32 Go et un lecteur de carte SD.

Configuration de base

Nous commençons donc par télécharger la dernière version de Raspbian et, comme il va s'agir d'un serveur "sans tête", il convient de sélectionner la variante Lite. Une fois décompressée, l'image doit être inscrite sur une carte SD et sur Linux, comme suit :

$ sudo dd if=2019-09-26-raspbian-buster-lite.img of=/dev/mmcblk0 bs=1M

Notez que le nom de fichier d'entrée (if) varie en fonction de la version de Raspbian, et que le nom de fichier de sortie (of) varie en fonction de votre système. Il est important d'utiliser la commande dd avec précaution, et en cas de doute ou si vous utilisez Windows ou un Mac, de consulter le guide d'installation.

Si vous envisagez de configurer votre Raspberry Pi via une connexion réseau, consultez la documentation SSH. Un serveur VNC peut être utilisé à la place, mais cela implique l'installation de la version de bureau complète de Raspbian, ce qui paraît exagéré pour un serveur et utilise davantage d'espace disque.

Une fois démarré, les dernières mises à jour de Raspbian peuvent être appliquées, comme suit :

$ sudo apt update
$ sudo apt dist-upgrade

Pour définir un nom d'hôte plus significatif, deux fichiers doivent être modifiés. Par exemple, à l'aide de nano :

$ sudo nano /etc/hostname
$ sudo nano /etc/hosts

Lorsque "raspberrypi" apparaît, remplacez-le dans chaque fichier par le nom d'hôte de votre choix. Par exemple, si vous utilisez "cloud", cela signifie qu'après avoir redémarré le Pi, vous pouvez vous connecter via SSH depuis un autre système Linux à l'aide de la commande :

$ ssh pi@cloud.local

Ansible

Ansible est un puissant logiciel open source pour l'approvisionnement, la gestion des configurations et le déploiement des applications. En bref, Ansible permet d'automatiser des tâches complexes qui peuvent rapidement devenir ennuyeuses et sujettes aux erreurs. Par ailleurs, en rédigeant un script Ansible pour effectuer une tâche, vous pouvez tricher un peu et prendre moins de notes, car vous n'avez pas à vous souvenir de toutes les étapes individuelles impliquées. De plus, la magie des "rôles" Ansible permet de tirer parti des tâches courantes qui ont été automatisées par d'autres personnes via des unités de travail pré-paramétrées.

Par conséquent, pour commencer, nous utilisons le système de gestion de paquets Raspbian pour installer Ansible, ainsi qu'un module Python permettant de gérer Docker :

$ sudo apt install ansible python3-docker

Ensuite, pour installer un rôle Ansible qui automatise la configuration de Docker, il suffit de saisir :

$ ansible-galaxy install geerlingguy.docker_arm

Notez que cela n'a pas installé Docker, mais plutôt un rôle appelé geerlingguy.docker_arm.

Il existe de nombreux rôles disponibles gratuitement pour automatiser toutes sortes de tâches. Pour plus de détails, consultez le site Web d'Ansible Galaxy.

Installation de Docker

Nous pouvons maintenant installer Docker à l'aide du système de gestion des paquets Raspbian (avec la commande apt ou apt-get), mais au lieu de cela, nous allons utiliser le rôle Ansible que nous venons d'installer, via un playbook Ansible, essentiellement une liste de tâches.

Les playbooks (ou listes d'instructions) sont écrits en YAML, et il est important de veiller à ce que toute indentation comporte des espaces et non des tabulations ! Si nous créons un fichier appelé docker.yml avec le contenu :

---
- name: "Docker playbook"
  hosts: localhost
  connection: local
  become: yes
  vars:
    docker_install_compose: false
    docker_users:
      - pi
  roles:
    - geerlingguy.docker_arm

Cela signifie que le playbook s'appelle "Docker playbook" et qu'il doit être exécuté sur l'ordinateur local, dans le cas présent, notre Raspberry Pi. La ligne "become: yes" signifie que nous devons devenir l'utilisateur racine avant d'exécuter les tâches. L'utilisateur "pi" se trouve dans la variable docker_users, ce qui signifie qu'il sera ajouté au groupe docker pour qu'il soit autorisé à gérer les conteneurs. Enfin, nous spécifions le rôle qui configure réellement Docker.

Plus généralement, un playbook Ansible permet de configurer plusieurs serveurs distants et, dans ces cas-là, ces derniers sont spécifiés dans la ligne commençant par "hosts:" au lieu de localhost (l'ordinateur local). De fait, ici, le playbook aurait pu être exécuté depuis un autre ordinateur qui utilise ensuite Ansible pour configurer à distance notre Raspberry Pi sur SSH, mais pour plus de simplicité, nous allons exécuter le playbook directement sur le Pi.

Passons maintenant à l'exécution de notre premier playbook.

$ ansible-playbook docker.yml

Notez qu'il n'était pas nécessaire d'ajouter un préfixe sudo à la commande. Cela est dû au fait que le playbook contient la ligne "become: yes", et que nous devenons des utilisateurs racines avant d'exécuter les tâches.

Si tout va bien, le résultat doit ressembler à celui ci-dessus.

Et l'exécution du playbook doit se terminer sans erreurs de "lecture".

Docker doit maintenant être installé et démarré. Il dispose d'une commande ps qui permet de voir les conteneurs en cours d'exécution. Observez ci-dessus comment la première exécution a échoué, car nous n'étions pas dans le groupe docker. Cependant, il suffisait de se déconnecter, puis de se reconnecter et de choisir le groupe docker pour utiliser les commandes et gérer Docker.

Bases de Docker

Docker fournit un système de conteneurisation dans lequel les applications sont regroupées avec toutes leurs interactions. En principe, vous pouvez déployer un conteneur Docker sur n'importe quelle version ou variante de Linux, à condition qu'elle dispose de Docker. Cela permet de réduire considérablement la charge de maintenance logicielle pour différentes distributions et versions. En outre, cela permet de regrouper soigneusement différents logiciels et de distribuer facilement les piles d'applications complexes.

La distribution de logiciels s'effectue par le biais d'images généralement publiées dans un registre en ligne, comme Docker Hub. Lorsque vous créez un conteneur, l'image requise est d'abord extraite du registre en ligne, et une fois qu'une copie locale est sur votre ordinateur, elle est alors utilisée pour créer le conteneur.

D'autres fonctionnalités très intéressantes de Docker incluent la mise en réseau privé qui peut être configurée entre conteneurs et la possibilité de mapper les ports sur les adresses IP externes aux ports à l'intérieur des conteneurs. Cela signifie que vous pouvez facilement avoir plusieurs conteneurs différents, basés sur des images identiques ou différentes, exécutés sur différents ports. Par exemple, des instances d'une application pour la maison et le travail, ou pour la production et les tests.

Étant donné que les données sont conservées séparément des conteneurs Docker, vous pouvez supprimer un conteneur et conserver les données d'application, puis déployer un nouveau conteneur qui peut utiliser une image mise à jour et qui est configuré de manière à utiliser les données stockées dans un volume existant.

Voici quelques commandes utiles :

  • docker image ls (liste des images sur cette machine)
  • docker ps (affichage des conteneurs en cours d'exécution)
  • docker volume ls (volumes des listes)
  • docker start|stop|restart (démarrage, arrêt ou redémarrage du conteneur)
  • docker logs (affichage des journaux du conteneur)
  • docker inspect (affichage de la configuration du conteneur)
  • docker volume inspect (affichage de la configuration du volume)
  • docker rm (suppression du conteneur)
  • docker volume rm (suppression du volume)

L'un des points essentiels à retenir avec Docker est que nous n'avons qu'une seule copie du système d'exploitation en cours d'exécution, contrairement à la virtualisation où nous en avons plusieurs. Cela signifie que Docker utilise bien plus efficacement les ressources, car nous n'avons pas besoin d'allouer des CPU et de la mémoire aux machines virtuelles qui ensuite exécutent chacune leur propre copie d'un système d'exploitation. Au lieu de cela, les applications s'exécutent côte à côte, et bien qu'elles soient placées dans leurs propres conteneurs, elles permettent une gestion simple et une sécurité accrue.

Installation de NextCloud

---
- name: "Nextcloud playbook"
  hosts: localhost
  connection: local
  become: yes
  tasks:
    - docker_container:
        restart: yes
        restart_policy: always
        name: nextcloud
        image: ownyourbits/nextcloudpi
        pull: yes
        volumes:
          - 'ncdata:/data'
        ports:
          - '80:80'
          - '443:443'
          - '4443:4443'

Nous observons ci-dessus le contenu du playbook, nextcloud.yml, que nous allons utiliser pour installer NextCloud via un conteneur Docker. Cette fois-ci, au lieu d'utiliser un "rôle" prêt à l'emploi, nous avons spécifié des tâches, la première et l'unique pour configurer un conteneur docker avec la configuration :

  • Toujours redémarrer le conteneur (app) en cas d'échec
  • Utiliser le nom "nextcloud" pour le conteneur
  • Déployer à l'aide de l'image de conteneur, ownyourbits/nextcloud-armhf
  • Toujours extraire la dernière version de l'image
  • Utiliser un volume appelé "ncdata" pour stocker les données utilisateur
  • Mapper les ports externes vers les ports internes : 80 > 80 et 443 > 443

Cette capacité de mappage permet une grande flexibilité, avec les données (ici, le volume ncdata est monté (il apparaît) à l'intérieur du conteneur sous /data) et les numéros de port utilisés pour la mise en réseau.

Pour exécuter le playbook, il suffit de saisir la commande :

$ ansible-playbook nextcloud.yml

Une fois de plus, l'opération doit se terminer sans défaillance. Les journaux du conteneur peuvent être vérifiés à l'aide de la commande :

$ docker logs nextcloud

Nous obtenons une sortie similaire à celle illustrée ci-dessus.

Configuration de NextCloud

Le conteneur NextCloud sélectionné est généralement utilisé seul dans le cadre d'une image de carte SD clé en main avec un nom d'hôte "nextcloudpi" configuré. Cependant, nous souhaitons pouvoir exécuter éventuellement d'autres tâches en même temps. Nous avons donc choisi un nom d'hôte plus générique pour notre Raspberry Pi. Une configuration supplémentaire est donc nécessaire.

Si nous accédons à http://cloud.local (ou à tout autre nom d'hôte configuré), nous sommes redirigés vers une page sécurisée et, au départ, une erreur de certificat devant être confirmée peut se présenter. Une page similaire à celle présentée ci-dessus s'affiche, contenant les informations de connexion pour les interfaces Web NextcloudPi et Nextcloud. Ces informations doivent être notées. De plus, si nous n'avons pas utilisé précédemment un nom d'hôte nextcloudpi, les deux URL doivent être modifiées pour pouvoir utiliser le nom d'hôte sélectionné.

Nous pouvons ensuite sélectionner Activate (Activer). L'interface Web NextcloudPi nous permet d'apporter facilement des modifications clés au système NextCloud, et nous devons la charger (celle avec le suffixe :4443). Pour que cela soit clair : https://<nom d'hôte>.local:4443.

Ici, nous devons sélectionner les domaines de confiance nc-trusted-domains dans le menu de gauche et saisir le domaine approprié. Par exemple, pour un nom d'hôte "cloud", il s'agit de "cloud.local". Sélectionnez ensuite Apply (Appliquer).

Nous pouvons maintenant consulter l'autre URL, https://<nom d'hôte>.local (sans suffixe :4443). Connectez-vous à l'aide de l'autre ensemble d'informations d'identification de la page d'activation. À ce stade, il est possible de créer des utilisateurs, de télécharger des fichiers, de collaborer, d'utiliser des applications et d'en installer de nouvelles.

NextCloud dispose d'un écosystème de développeurs dynamique et de nombreuses applications exceptionnelles qui peuvent être installées en un seul clic depuis l'interface Web. Des applications complémentaires pour Android et iOS sont également disponibles.

Conclusion

Nous avons emprunté le moyen le plus simple pour utiliser NextCloud rapidement sur notre Raspberry Pi, mais notre méthode permet de redéployer facilement si nécessaire, sur les mêmes ou d'autres cartes Pi ! De plus, comme nous allons le voir dans le prochain article, l'approche adoptée nous permet d'exécuter facilement des applications supplémentaires côte à côte et de les gérer en toute confiance.

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.

18 Jun 2020, 8:53

Commentaires