Table des matières

Les couches logicielles utilisées

Nous installerons successivement les logiciels libres suivants :

Exemples de plugins :

La ligne de commande rebutant généralement bien des gens, nous installerons rapidement Portainer, une interface web (donc graphique) de gestion conteneur Docker simple. Pour pouvoir exploiter Docker et cette interface au maximum de leur capacité et ajouter les piles logicielles (stack) en plus des simples conteneurs, nous auront besoin d'installer Dockerswarm. Pour nous éviter l'installation de Docker directement sur le Pi, nous utiliserons Hypriot comme système d'exploitation hôte.

Pour simplifier encore plus l'utilisation, un dépôt sera créé sur GitHub (actuellement xtremxpert/portainer-template) pour pouvoir être utilisé à la place des gabarits standards. Au fur et à mesure des demandes des membres de LinuQ, nous créerons les piles logicielles et les déploierons via le Docker Hub (hub.docker.com). En plus de ces images, ils nous faut répondre à la problématique d'aujourd'hui ; configurer la partie web. Nous créerons donc une pile qui permettra non seulement d'aiguiller le trafic vers les bons services, mais également d'auto-configurer vos nouveaux noms d'hôtes auprès de Cloudflare et de générer un certificat SSL valide via Let's Encrypt. Nous pourrons peut-être même y intégrer un client de mise à jour automatisé des changements d'adresses IP publiques (ddclient).

Préalables utiles

Un Raspberry Pi

Pour le matériel, nous utilisons un Raspberry Pi. Quand on acquiert le dernier né, le modèle 3 Model B+, il est tout nu mais il faut installer un système d’exploitation, pas de panique c'est facile. Si vous avez un modèle 3 B, c'est parfait (nous ne recommandons pas l'utilisation des modèles précédents, à moins de n'installer que quelques services, où le modèle 2 peut faire l'affaire).

Donc nous utilisons le modèle 3 B+ qui a un processeur ARM32v7 à 64 bits, mais nous n'utiliserons que les applications roulant sur du 32 bits, d'où le modèle 3 B qui peut aussi être utilisé.

Donc, le matériel utilisé :

LinuQ prévois faire un achat de groupe pendant l'été ou en septembre 2018. Si vous êtes intéressés, écrivez à info@linuq.org

En plus d'utiliser votre Pi pour ce projet, vous pourrez y installer Raspbian. C'est une distribution GNU/Linux basée sur Debian optimisée pour le Raspberry, une version totalement libre qui donne accès à plus de 50 000 logiciels libres compatibles entre eux. S'ils ne sont pas déjà installés par la distribution (bien qu'il y en ait déjà pas mal) on ira les chercher sur le dépôt pré configuré par l'installation avec apt install (on le fera plusieurs fois). Il y a deux versions, l'une avec un bureau graphique et plusieurs logiciels préinstallés, l'autre toute nue sans bureau graphique. Pour commencer on va prendre la version complète, un fois à l'aise on pourra prendre une version légère pour monter un serveur.

Un truc super : les cartes SD ne sont pas chères, on peut donc en avoir plusieurs, on peut alors très facilement avoir plusieurs versions du système et des logiciels, il suffit de choisir la carte de l'installer et de brancher le Raspberry.

Autres préalables

1) Hypriot

Source de l'image : blog.hypriot.com

Téléchargement de l'image de Hypriot

  1. Pour débuter il faut récupérer l'image de Hypriot, notre système d'exploitation hôte sur lequel Docker est pré-configuré. La dernière version disponible est la 1.9.0. mais faut-il prendre la 1.8.0 pour la config actuelle à vérifier ?
  2. Sélectionner le lien hypriotos-rpi-v1.9.0.img.zip pour télécharger l'archive.
  3. Quand le téléchargement du fichier est terminé, aller à la section ci-dessous correspondant au système d'exploitation installé sur l'ordinateur utilisé pour le téléchargement.
  4. La suite de la procédure consistera à décompresser le fichier (archive) reçu et à le copier sur une carte mémoire SD.

Préparation de la carte mémoire

Sous Linux

Sous Linux, nous utiliserons la commande dd :

$ lsblk

En fonction de votre type d’adaptateur, celle-ci se présentera sous la forme /dev/sdX ou /dev/mmcblkY (le plus fréquent que j'utiliserai dans les exemples).

Un fois identifiée, nous allons nous assurer que celle-ci soit démontée, puis nous lancerons le transfert de l'image sur la carte SD. Les deux commandes sont :

$ umount /dev/mmcblkY
$ sudo dd if=hypriot-rpi-201???.img of=/dev/mmcblkY bs=1M

Cette opération peux prendre quelques minutes. Une fois complétée, la carte est prête à être utilisée pour démarrer votre Raspberry Pi.

Remarque de François : il n'est pas nécessaire de formater la carte au préalable, la fonction dd recopie une image disque bit par bit en ignorant le contenu précédent.

Sous Windows

Pour débuter avec Windows, il faudra télécharger et installer 7 zip pour décompresser l'image d'Hypriot et Win32 Disk Imager pour mettre celle-ci sur la carte SD.

Une fois ces deux logiciels installés, suivre ces étapes :

Sous Os X

La procédure est similaire à celle sous Linux, sauf que pour identifier notre périphérique, nous utiliserons cette commande :

$ diskutil list

On remarquera maintenant que les disques sont tous présentés comme /dev/diskX. On va ensuite faire le même genre de commande qu'en Linux, sauf qu'il faut ajouter devant diskX pour la commande dd seulement (pour raw) et utiliser diskutils au lieux de umount

$ diskutil unmountdisk /dev/disk5
$ sudo dd if=hypriotos-rpi-201???.img of=/dev/rdisk5 bs=1m

Cette opération peux prendre quelques minutes. Une fois complétée, la carte est prête à être utilisée pour démarrer votre Raspberry Pi.

Démarrage de Hypriot sur le Pi

  1. Insérer la carte SD dans votre Pi
  2. Brancher le câble d'alimentation pour le démarrer
  3. Au premier lancement avec cette carte mémoire, attendre la fin du chargement (boot).
  4. Faire un retour de chariot (enter)
  5. “HypriotOS (Debian GNU/Linux 9) black-pearl tty1”
  6. Comme vous pouvez le voir, Hypriot utilise le système d'exploitation Debian.
  7. Hypriot attend votre authentification avec le compte et mot de passe par défaut.
  8. Authentifiez-vous avec le nom d'usager “pirate” et le mot de passe “hypriot”.
  9. Si vous ne pouvez pas utiliser de clavier avec votre Raspberry Pi, il vous faudra identifier l'adresse IP qui lui a été octroyée par votre réseau. Pour la connaître, faire la commande “ifconfig” sur votre Pi ou aller dans le panneau d'administration de votre routeur. Par exemple : 192.168.10.109
  10. Conectez-vous ensuite sur votre Pi en SSH à partir d'un ordinateur sur votre réseau avec la commande ci-dessous :
$ ssh pirate@192.168.10.109

Note: Si le compte en cours utilisé sur votre ordinateur a le même nom que celui que vous utilisez pour vous connecter au Pi, vous n'avez pas à le spécifier (voir image):

  1. Si le message “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!” s'affiche, copier la ligne à l'écran (on suppose dans cette procédure que votre nom d'utilisateur est “jean”) : “ssh-keygen -f ”/home/jean/.ssh/known_hosts“ -R 192.168.10.109

(Connection ssh vers Hypriot)

2) Portainer et Traefik

Présentation de Portainer

Avant de poursuivre cette précédure, nous vous recommandons la lecture de la page d'aperçu détaillée du site officiel de Portainer :

Installation de Portainer (préalables)

On va faire un minimum de ligne de commande avant d'installer Portainer, on commence par se créer un compte utilisateur et lui donner des droits d'administration :

Ajouter un utilisateur ayant votre prénom (saisir un mot de passe, votre “Full Name” et ignorer les autres questions par des retours de chariot “enter”) :

$ sudo adduser jean

Ajouter l'utilisateur au groupe existant “docker” :

$ sudo usermod -aG docker jean

Lui donner les privilèges d'administrateur :

$ sudo usermod -aG sudo jean

Redémarrer votre PI (attendre que Hypriot soit redémarré):

$ sudo reboot

Faudrait aussi changer le mot de passe de pirate à moins qu'on puisse effacer l'utilisateur pirate, du moins si on ne le supprime pas

Initialisation de Dockerswarm et lancement de la pile Portainer (incluant client agent et Traefik)

Une fois le Pi redémarré, vous pouvez faire “enter” sur le Pi pour voir l'invite de commande “login:”. Vous pouvez faire les commandes ci-desous sur le Pi, mais je vous recommande d'utiliser une connection SSH et le les lancer de votre ordinateur pour plus de commodité.

Connectez-vous avec votre nouvel utilisateur administrateur (ex: jean) par SSH à partir d'un ordinateur connecté au même réseau que votre Pi:

ssh jean@192.168.10.109

Supprimer le compte générique pirate de mon système (raisons de sécurité) :

$ sudo userdel pirate

Mettre à jour les paquets du Host Debian Hypriot :

sudo apt update && sudo apt dist-upgrade

Pendant que les mises à jour s'effectuent sur le Pi, configurez votre routeur afin de rediriger les ports 443, 22 (et 80 si possible) vers l'adresse que votre routeur a attribuée à votre Pi: (cliquer sur l'image pour l'agrandir) Assurez-vous que les cases sont cochées, puis statut à “Enable”. Sauvegardez la configuration du routeur et quittez sa console d'administration.

:-x Access / VirtualServer / (image)

Nos sources sont hébergées dans le Famagit (GitHub) de LinuQ (voir section “Préalables” ci-dessus) : Vous pourrez vous inscrire à ce dépôt puisque vous vous êtes créé un compte GitHub précédemment. Ceci vos permettra de contribuer aux sources qui y sont hébergées (avec l'expérience, un jour).

J'exécute ce script qui initialise Dockerswarm, lance la pile de Portainer (incluant le client agent et le Traefik correspondant) avec ces commandes :

$ wget https://framagit.org/linuq/easy-pi-hosting/raw/master/install.sh

Message : “Enregistre : “install.sh”

$ wget https://framagit.org/linuq/easy-pi-hosting/raw/master/docker-compose.yml

Message : “«docker-compose.yml» enregistré” Avant d'aller plus loin, vous devez connaître la réponse à ces 6 questions que vous devrez saisir dans le script qui suivra: 1- “Host name for Portainer service: ” adresse pour rejoindre l'administration de Portainer (ex: rpi01.votredomaine.ca) 2- “Host name for Traefik service: ” adresse pour rejoindre l'interface de visualisation de Traefix (interface entre le web et tous les Dockers) (ex: traefik01.votredomaine.ca) 3- “Email for Lets'Encrypt recovery: ” votre adresse courriel (ex: joe_bloe@gmail.com) (si vous vous faites pirter votre certificat, vous utiliserez cette adresse pour l'annuler) 4- “Email for your Cloudflare account: ” adresse utilisée quand vous avez créé votre compte chez Cloudflare (ex: joe_bloe@gmail.com) 5- “Cloudflare Global API Key: ” (la clé copiée tantôt au bas de la page Création d'un compte chez Cloudflare) 6- “Domaine name for the Docker network: ” (votredomaine)

Permettre l'exécution du script :

chmod +x install.sh

Lancer le script :

$ ./install.sh

Message :

Automated installation of Portainer/Traefik stack

To be able to complete this installation, you must have before
installed Hypriot on your Raspberry-pi (3 or better recommanded).
You must also have registered an internet domaine name and 
open an account at Cloudflare and transfer your DNS server (FREE) there.

Did you get your internet domain name and your Cloudflare account info? ([y]es or [n]o): 

Répondre “y” (enter) Répondre aux 6 questions tel que décrit ci-dessus.

Réponse du script :

Did you get your internet domain name and your Cloudflare account info? ([y]es or [n]o): y
Host name for Portainer service: rpi01
Host name for Traefic service: traefik01
Email for Lets'Encrypt recovery: joe_bloe@gmail.com
Email for your Cloudflare account: joe_bloe@gmail.com
Cloudflare Global API Key: 59766315cdd5d7793e08e438e7d5b88945176
Domaine name for the Docker network: (votredomaine)
Swarm initialized: current node (z42z6cirp03hz579z4cn9xtbu) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0pfq9zijgzbb4t56eqo1q18c5q6r5prlhhr9u02chv8vfed8v4-60i4kvi1wpxcdnqst1l7nj7ii 192.168.10.109:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

w00380tla27fc74kjqx7gtck4
Creating network maestro_agent_network
Creating service maestro_proxy
Creating service maestro_agent
Creating service maestro_portainer
Installation complete, take a coffee and then navigate to your server URL :
HTTPS://
Create you administrative user and then enjoy free hosting your life yourself

Any bugs can be reported here : https://framagit.org/linuq/easy-pi-hosting/issues
French documentation of the projet is here : https://linuq.org/projets/auto-hebergement_maison

Lister les services disponibles :

$ docker service ls
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                        PORTS
slahlcbtosav        maestro_agent       global              1/1                 portainer/agent:latest       
7zpp5m2khdc9        maestro_portainer   replicated          1/1                 portainer/portainer:latest   *:30001->9000/tcp
dl76rp129dqv        maestro_proxy       replicated          1/1                 traefik:latest               *:80->80/tcp, *:443->443/tcp, *:30000->8080/tcp

Et voilà, Portainer est lancé! :-) Notez le port alloué à Portainer est 30001.

Maintenant, toujours d'un ordinateur dans le même réseau, ouvrez votre navigateur et donnez-lui votre adresse et le port 30001 :

http://192.168.10.109:30001

Portainer devrait vous assister dans la création de votre compte administrateur…

https://linuq.org/_media/projets/linuq2.png

Remplacer l'URL du template par défaut :

https://raw.githubusercontent.com/portainer/templates/master/templates.json

par celle-ci pour un raspberry pi:

https://framagit.org/linuq/easy-pi-hosting-template/raw/master/templates.pi.json

ou par celle-ci pour un ordinateur de type pc ou mac:

https://framagit.org/linuq/easy-pi-hosting-template/raw/master/templates.pc.json

(à changer dans sa forme finale) dans le champs URL.

Tour de Portainer

(Exemple de tableau de bord de Portainer)

(Schéma de Dockerswarm, source: FedYeti.com)

Liste des gabarits Portainer

Sur le site Docker Hub, il y a plusieurs images disponibles.

arm32v7

3) Les images d'intérêt

Voici les images actuellement envisagés dans ce projet, les commentaires, leur état d'avancement et la page décrivant les démarches effectuées pour chacune d'elles :

NextCloud

NextCloud

Dokuwiki

Dokuwiki

Odoo

Odoo (avec Postgres) [ Benoît Vézina : plan ]

PhP

PhP [Benoît Vézina : dev] Une image du gestionnaire de BD PhpMyAdmin sera aussi incluse dans cette section car c'est l'outil d'administration (des instances) de cette base de donnée utilisées par plusieurs images applicatives.

RaspAP

RaspAP [Benoît Vézina : dev]

MariaDB

MariaDB [Benoît Vézina : non débutée]

MySQL

MySQL [Benoît Vézina : non débutée]

Piwigo

Piwigo [pas débutée]

Diaspora

Diaspora [pas débutée]

Mastodon

Mastodon [pas débutée]

Pure Data

https://puredata.info/docs/raspberry-pi/ https://vimeo.com/52265243 https://wiki.labomedia.org/index.php/Pure_Data_vs_RaspberryPi https://fr.flossmanuals.net/puredata/introduction/ Jean à Daniel: tu connais Sonic Pi pré-installé sur Raspbian? https://sonic-pi.net/

CouchPotato

CouchPotato

4) Alternative à Hypriot

On peut aussi créer notre propre fichier image comme alternative à Hypriot :

version: '3.4'

services:
  agent:
    image: portainer/agent
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - agent_network
    deploy:
      mode: global
      labels:
        - "traefik.enable=false"

  portainer:
    image: portainer/portainer
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    networks:
      - agent_network
      - proxied_network
    ports:
      - "9000"
    volumes:
      - portainer_data:/data
    deploy:
      labels:
        - "traefik.docker.network=proxied"
        - "traefik.backend=portainer"
        - "traefik.frontend.rule=Host:$PORTAINER_HOSTNAME"
        - "traefik.port=9000"
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

  proxy:
    image: traefik
    networks:
      - proxied_network
    environment:
      - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL}
      - CLOUDFLARE_API_KEY=${INPUT_CLOUDFLARE_APIKEY}
    ports:
      - "8080"
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "sslcerts:/etc/acme/"
    deploy:
      labels:
        - "traefik.frontend.rule=Host:${TRAEFIK_HOSTNAME}"
        - "traefik.port=8080"
        - "traefik.backend=traefik"
        - "traefik.frontend.entryPoints=http"
        - "traefik.enable=true"
        - "traefik.protocol=http"
      placement:
        constraints:
          - node.role == manager
    command:
      - "--api"
      - "--debug"
      - "--entrypoints=Name:http Address::80 Redirect.EntryPoint:https"
      - "--entrypoints=Name:https Address::443 TLS"
      - "--defaultentrypoints=http,https"
      - "--acme"
      - "--acme.dnschallenge=true"
      - "--acme.dnschallenge.provider=cloudflare"
      - "--acme.entryPoint=https"
      - "--acme.onHostRule=true"
      - "--acme.storage=/etc/acme/acme.json"
      - "--acme.onDemand=false"
      - "--acme.email=${LETSENCRYPT_EMAIL}"
      - "--docker"
      - "--docker.swarmMode"
      - "--docker.domain=${DOCKER_DOMAIN}"
      - "--docker.watch"

networks:
  proxied_network:
    external:
      name: proxied_network

  agent_network:
    driver: overlay

volumes:
  portainer_data:
    driver: local
  sslcerts:
    driver: local

5) Construction d'une image

La page construction d'une image explique comment installer un gestionnaire de machine virtuelle, monter une image Ubuntu 18.04 LTS, charger une image amd64 et la convertir en ARM32.

6) Alternative au Pi : un serveur Linux

On peut profiter des avantages de l’autohébergement de nos services à la maison sans toutefois disposer d'un Raspberry Pi. La solution consiste en l'installation d'un système d'exploitation serveur (sur un portable ou un poste de table -une tour-), dont le processeur permet la virtualisation), de l'ajout de Docker et d'y installer ensuite les services désirés. * Autohébergement maison sur un serveur Linux

7) Astuces

Compte et mot de passe par défaut du Raspberry Pi

Trouver l'adresse IP de son Raspberry Pi

pi@raspberrypi:~ $ ifconfig

      eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
      inet 192.168.0.140  netmask 255.255.255.0  broadcast 192.168.0.255
      inet6 fe80::dcce:19df:6791:1436  prefixlen 64  scopeid 0x20<link>
      ether b8:27:eb:b5:7d:28  txqueuelen 1000  (Ethernet)
      RX packets 20272  bytes 4579886 (4.3 MiB)
      RX errors 0  dropped 4  overruns 0  frame 0
      TX packets 268  bytes 39798 (38.8 KiB)
      TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      lo: flags=73<UP,LOOPBACK,RUNNING> 4 mtu 65536
      inet 127.0.0.1  netmask 255.0.0.0
      inet6 ::1  prefixlen 128  scopeid 0x10<host>
      loop  txqueuelen 1000  (Boucle locale)
      RX packets 36  bytes 2160 (2.1 KiB)
      RX errors 0  dropped 0  overruns 0  frame 0
      TX packets 36  bytes 2160 (2.1 KiB)
      TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
      inet 192.168.0.165  netmask 255.255.255.0  broadcast 192.168.0.255
      inet6 fe80::20ee:7f61:2fea:6473  prefixlen 64  scopeid 0x20<link>
      ether b8:27:eb:e0:28:7d  txqueuelen 1000  (Ethernet)
      RX packets 6713  bytes 3898049 (3.7 MiB)
      RX errors 0  dropped 1  overruns 0  frame 0
      TX packets 205  bytes 28694 (28.0 KiB)
      TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
       

On voit ici qu'il y a 3 connexions eth0 est la connection filaire et l'adresse IP est 192.168.0.140, l0 est l'adresse du localhost IP est 127.0.0.1 (en tapant cette adresse dans le fureteur on se connecte sur le raspberry lui-même) et l'adresse wlan0 du wifi qui est ici 192.168.0.165. il est possible d'avoir plusieurs connexions, ici le wifi du rasperry est activé et en même temps il est braché filaire, chaque branchement a sa propre adresse ainsi un ping (pour vérifier si l'adresse est accessible) peut être envoyé pour chaque adresse depuis un autre ordinateur connecté au même réseau local ;

dpt@dpt-Dell-System-XPS-L322X ~ $ ping 192.168.0.165 PING 192.168.0.165 (192.168.0.165) 56(84) bytes of data. 64 bytes from 192.168.0.165: icmp_seq=1 ttl=64 time=1.64 ms 64 bytes from 192.168.0.165: icmp_seq=2 ttl=64 time=1.74 ms 64 bytes from 192.168.0.165: icmp_seq=3 ttl=64 time=1.76 ms

dpt@dpt-Dell-System-XPS-L322X ~ $ ping 192.168.0.140 PING 192.168.0.140 (192.168.0.140) 56(84) bytes of data. 64 bytes from 192.168.0.140: icmp_seq=1 ttl=64 time=1.62 ms 64 bytes from 192.168.0.140: icmp_seq=2 ttl=64 time=64.5 ms 64 bytes from 192.168.0.140: icmp_seq=3 ttl=64 time=42.2 ms

Mot de passe d'administration NextCloud oublié

Q : Vous avez oublié votre mot de passe d'administration de Nextcloud, n'avez pas configuré la messagerie afin de pouvoir le récupérer et aimeriez le réinitialiser. R :

8) Vidéos maison du projet

Cette section présente des vidéos créés par les collaborateurs du projet Héberges ta vie. Répertoire des vidéos de Benoît Vézina

9) Références utiles

Portainer.io : Site officiel de Portainer (voir section “DETAILED OVERVIEW” du bouton “LIVE DEMO”) Docker Hub : Site officiel de Docker Hub (voir lien “Explore” pour découvrir les Repositories officiels disponibles). Docker Community : Communauté Docker (pour s'impliquer avec des enthousiastes de Docker qui partagent une passion pour les containers virtuels, les microservices et les appications distribuées). blog.hypriot.com :

Tutoriels Dockers for beginners : Configuration initiale, exécuter votre premier container, Webapps avec Docker, déployer une App avec Swarm). blog de Yohann Ciurlik : Blog d'un utilisateur (dernière mise à jour en octobre 2017) présente Portainer, une interface pour gérer vos containers Docker et clusters Swarm https://raspbian-france.fr/ : Tutoriels de grande qualité surtout si vous préférez le français à une autre langue