Rpi4 : Nas & pi-hole / nextcloud – google wifi – freebox delta

R

L’idée de cet article est de vous guider pour installer et configurer un Raspberry Pie (RPI4) afin qu’il vous serve à la fois de bloqueur de publicité (grâce à Pi-Hole) mais aussi de pseudo NAS (Network-attached storage) à moindre coût.

Je vous préviens tout de suite, ce n’est pas forcément facile et rapide à mettre en place. J’ai testé beaucoup de différentes configurations, de différents logiciels et de différentes approches ; je vous épargnerai les détails ici pour directement aller au plus efficace et simple à mettre en oeuvre.

Let’s go.

1) Acheter son RPI

La version tout-en-un est disponible ici. Vous pouvez dépenser moins si vous avez déjà du matériel chez vous.

Je conseille de prendre un RPI4 car la partie NAS est gourmande en ressources. Pour Pi-Hole, n’importe quel RPI fera l’affaire.

2) Acheter son disque dur

J’ai choisi un Crucial P1 1To (NVMe) avec un boîtier compatible (USB 3, NVMe, USB-C). Attention certains disque dur ne sont pas compatible avec un RPI…

3) Installer et configurer le RPI

Le RPI ne permet pas pour l’instant de booter directement sur un disque externe… Les emmerdes commencent :-). Du coup la seule solution c’est de mettre le /boot sur la SD card et le reste sur le disque dur.

3.1) Flashez votre SD card avec la dernier Raspbian 10 Buster. Pour flasher j’utilise BalenaEtcher, c’est top.

3.2) Flashez votre SSD avec la même chose.

3.3) Ajoutez un fichier vide dans le dossier /boot de la SDCard et du SSD nommé “ssh”.

3.4) Démarrez votre RPI sans avoir branché votre SSD. Une fois démarré, branchez votre SSD.

3.5) Dans le terminal taper la commande sudo blkid et identifier votre disques : /dev/mmcblk0p1 et /dev/mmcblk0p2 sont les 2 partitions de la SD card ; /dev/sda1 et /dev/sda2 sont les 2 partitions de votre SSD. Notez-le PARTUUID de la 2ème partition de votre SSD (rootfs), cela ressemble à PARTUUID=”698e33bd-02“.

3.6) Faire au cas où une sauvegarde de /boot/cmdline.txt (sudo cp /boot/cmdline.txt /boot/cmdline.txt.backup) et modifiez ce fichier (SD Card) pour que le RPI boot sur le SSD au lieu de la SD Card. Pour cela remplacez le PARTUUID. Par exemple PARTUUID=555608af-01 deviendra PARTUUID=698e33bd-02 (celui noté à l’étape précédente).

3.7) Rebootez votre RPI (cela peut prendre beaucoup de temps, attendez 10 minutes).

3.8) Pour permettre au SSD d’utiliser le boot de la SD Card, tapez la commande lsblk -o name,label,partuuid puis sudo nano /etc/fstab pour remplacer le PARTUUID du /boot (exemple : 698e33bd-01 deviendra 555608af-01)

3.9) Rebootez votre RPI

3.10) Il faut maintenant redimensionner la partition sur le SSD (cela ne se fait pas automatiquement). Pour cela tapez sudo fdisk /dev/sda puis les commandes suivantes :

Disk identifier: 0x0634f60c
Device Boot Start End Sectors Size Id Type
/dev/sda1 8192 532480 524289 256M c W95 FAT32 (LBA)
/dev/sda2 540672 4292607 3751936 1.8G 83 Linux

Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (532481-500118191, default 589815): 540672 (il faut entrer ce chiffre, il doit correspondre avec celui-ci-dessus)
Last sector, +/-sectors or +/-size{K,M,G,T,P} (540672-500118191, default 500118191): (appuyez juste sur entrer pour confirmer)
Created a new partition 2 of type ‘Linux’ and of size 238.2 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: n

Enfin saisissez sudo resize2fs /dev/sda2.

Maintenant, si vous faite df -h, vous devriez voir votre SSD avec son véritable espace de stockage.

3.11) Rebootez votre RPI

3.12) On peut tout mettre à jour à partir de là, si on le fait avant, votre RPI risque de freezer :  sudo apt-get update && sudo apt-get dist-upgrade && sudo apt-get upgrade puis sudo raspi-config / update (via l’interface)

3.13) Si vous avez besoin d’accéder à votre RPI depuis un autre device de votre maison il y a plusieurs possibilités pour le faire.
Pour transférer des fichiers le mieux est de le faire via SSL (car cela consomme moins de CPU et fait donc moins chauffer votre RPI) : ssh [email protected] / password (par défaut c’est [email protected] avec le mot de passe “raspberry”).
Si vous avez besoin d’accéder à l’interface graphique de votre RPI sans devoir brancher celui-ci à un écran, utilisez VNC : sudo apt-get install realvnc-vnc-server puis dans la configuration de votre RPI, onglet interface, il faut activer (cocher) VNC. Ensuite depuis les appareils où vous souhaitez pouvoir accéder à votre RPI, installez le client vnc-viewer. Lancez le viewer, saississez l’ip de votre RPI (à récupérer via ifconfig) et vous pourrez à partir de là contrôler graphiquement votre RPI (pas top pour transférer des fichiers mais bien pour tout le reste).

4) Installer et configurer pi-hole

4.1) Saisissez dans le terminal de votre RPI curl -sSL https://install.pi-hole.net | bash pour l’installer.

4.2) Votre RPI doit maintenant devenir votre serveur DNS. Pour cela allez dans l’espace d’administration de votre box (exemple chez free c’est http://mafreebox.freebox.fr), puis dans l’espace DHCP et saisissez l’ip de votre RPI en tant que serveur dns (192.168.0.63 par exemple). Accédez ensuite à votre espace pi-hole via http://192.168.0.63/admin.

4.3) Vous avez une configuration plus compliquée chez vous ? Google Wifi ? Une smart TV directement branchée à la box ? Dans ce cas laisser votre RPI en serveur dns sur votre box et définissez un scope d’ip restreint (exemple de .10 à .50) sur celle-ci, cela servira à vos appareils qui sont directement branchés sur votre box. Pour les autres appareils qui sont par exemple connecté à différents endpoint wifi (via Google wifi par exemple) : spécifiez dans la config Google wifi (ou autre) un scope avec une seule ip possible (192.168.86.63 à 192.168.86.63 avec 192.168.86.63 l’ip réservée de votre RPI/pi-hole) puis comme serveur dns celui de votre rpi : 192.168.86.63. Dans l’espace admin du pi-hole (sur votre RPI), spécifiez un scope large (.50 à .250) et mettez votre Google wifi en router en spécifiant son ip (exemple : 192.168.86.1). Vous avez maintenant 3 serveurs dhcp. Cela vous permettra d’avoir le nom des appareils dans les logs de votre pi-hole car sans cette config, vous ne verriez que Google wifi comme appareil et ne pourriez pas apprécier toutes les data que vous donne pi-hole.

5) Installer et configurer votre système de backup dans le cloud

Au départ je pensais que cette partie serait simple mais la réalité en a décidé autrement. On peut faire des backups de deux façons : soit sous une forme de séries de bundle crypté soit sous la forme de synchronisation de fichiers. Dans le premier cas, vos données sont sauvegardées en ligne mais vous ne pouvez pas les voir directement, les données sont hachées, sauvegardées parfois dans une série de zip crypté (.zip.aes). Dans le 2ème cas, vos données sont synchronisées entre votre/vos device(s) et le serveur, vous pouvez les voir et partagez celles-ci avec d’autres personnes.
J’ai l’habitude du 2ème cas et c’est ce que je cherchais à faire avec mon RPI en mode NAS. Mon premier réflexe était donc d’installer (comme sur mon ordinateur portable) le client de synchronisation de Google, d’Amazon ou encore de Dropbox. Et bien le bilan est que ce n’est pas possible d’utiliser ces logiciels sur un RPI… (je vous passe les détails et les dizaines de workarounds que j’ai testé : Borg, Duplicity, compiler les sources du client Dropbox puis essayer de run le client sur l’architecture RPI via ExaGear, rsync, etc). Néanmoins il y a une solution.

5.1) Trouvez un serveur pour stocker vos fichiers. Cela peut être Dropbox, Google storage ou alors votre “propre” serveur. Personnellement j’ai choisi DigitalOcean (1 droplet à 5$ + un space à 5$) car c’est la configuration qui fonctionne le mieux pour moi dans mon optique de sync les fichiers.

5.2) Si vous souhaitez ne pas sync vos fichiers mais faire simplement des backups, vous pouvez utiliser Duplicati. Je l’ai essayé et cela fonctionne bien.

5.3) Si vous souhaitez synchroniser vos fichiers je vous conseille NextCloud, un fork de Owncloud.

5.4) Installez next-cloud-server sur votre serveur (ici mon droplet digitalocean) :
sudo apt install snapd
sudo snap install nextcloud
sudo nextcloud.manual-install user password
sudo nextcloud.occ config:system:set trusted_domains 1 –value=example.com
(ne pas oublier de faire pointer vos DNS sur l’ip de votre serveur avant la suite)
sudo ufw allow 80,443/tcp
sudo nextcloud.enable-https lets-encrypt

5.5) Installer next-cloud-client sur votre RPI :
sudo apt update
sudo apt dist-upgrade -y
sudo apt upgrade -y
sudo apt-get install build-essential git cmake openssl libssl-dev sqlite3 libsqlite3-dev qt5-default libqt5webkit5-dev qttools5-dev qttools5-dev-tools python-sphinx texlive-latex-base inotify-tools qt5keychain-dev -y
sudo apt-get install doxygen -y
sudo apt-get install extra-cmake-modules -y
sudo apt-get install kio-dev -y cd /home/pi git clone https://github.com/nextcloud/client_theming.git

cd client_theming git submodule update –init
cd client git submodule update –init
cd ..
mkdir build-1
cd build-1
cmake -D OEM_THEME_DIR=`pwd`/../nextcloudtheme ../client sed -i ‘s/Icon=nextcloud/Icon=Nextcloud/g’ src/gui/nextcloud.desktop sed -i ‘s/Icon\[\(.*\)\]=nextcloud/Icon\[\1\]=Nextcloud/g’ src/gui/nextcloud.desktop
make
sudo make install

Il faut ensuite créer / modifier 3 fichiers :
sudo nano /etc/environment LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/arm-linux-gnueabihf
sudo nano /etc/ld.so.conf.d/arm-linux-gnueabihf.conf /usr/local/lib/arm-linux-gnueabihf
sudo nano /etc/ld.so.conf.d/x86_64-linux-gnu.conf /usr/local/lib/arm-linux-gnueabihf

Et enfin :
sudo ldconfig
sudo reboot
nextcloud

Si l’installation de nextcloud-client vous parait trop compliqué, une autre approche consiste à créer un disque WebDAV. Vous pouvez le faire simplement en suivant ce tutoriel. Le principe est d’avoir un dossier ‘réseau’ lié à votre nextcloud-server (compatible WebDAV) sur votre RPI et de simplement glisser déposer vos fichiers à sauvegarder dedans.

5.6) Si vous avez choisi d’utiliser le next-cloud-client, il faut maintenant le configurer pour utiliser space (de DigitalOcean) au lieu du droplet (de DigitalOcean).
D’ailleurs pourquoi utiliser space au lieu du serveur ? Car cela coûte 10x moins cher, littéralement. C’est la différence entre des block storage volume (cher) et des scalable object storage (pas cher).

Activez External Storage Support plugin dans votre administration de votre next-cloud-server. Ajouter un external storage (toujours via l’admin). Dans Bucket saississez le nom de votre space, dans host celui du space (ex: fra1.digitaloceanspaces.com), dans region fra1 (cela dépend de ce que vous avez choisi sur DO), puis saisissez les 2 clés (access et secret) que vous pouvez récupérer sur DigitalOcean. Activer SSL et activer le partage (settings avancés).

5.7) Transférer tous vos documents / photos / vidéos de vos différents appareils sur votre RPI (faire un dossier backup par exemple) via SSH (filezilla, cyberduck).

5.8) Lancez le next-cloud-client, ajoutez un dossier à synchroniser (backup) et sélectionnez le dossier distant, votre space DigitalOcean.

5.9) La synchro commence, si vous avez des erreurs comme « please reduce your request rate », limitez l’upload à 200 ko/s (oui c’est lent quand on est en fibre mais cela est imposé par DO) et dans les paramètres avancés de l’external storage choisissez “Never” pour “Check for changes”.

5.10) Si cela ne fonctionne toujours pas (difficulté pour voir les fichiers depuis nextcloud, lenteurs, erreurs, etc.) alors cela vient surement de l’installation via snap, il faut donc supprimer l’installation du nexcloud-server via snap puis le réinstaller à la main (assez long et compliqué). C’était mon cas… Vous avez aussi toujours la possibilité de faire un dossier WebDAV (voir plus haut).

5.11) Vous pouvez maintenant voir vos fichiers à 3 endroits : sur votre RPI (via VNC), sur votre serveur next-cloud (exemple nextcloud.votredomaine.com), et sur l’espace space de DigitalOcean. Vous pouvez aussi partager des documents / photos à d’autres via votre serveur next-cloud.

Il y a des dizaines de raisons pour que tout ce qui est expliqué ne fonctionne pas. C’est pourquoi je ne vais pas dans le détail, DuckDuckGo est votre ami. Deux pistes tout de même si votre RPI freeze ou reboot aléatoirement :

– au-delà de 80 degrés (vcgencmd measure_temp pour checker), le RPI peut freeze ou reboot, dans ce cas enlevez le boitier ou ajoutez un ventilo.

– sous-alimentation : si vous branchez un clavier, une souris, un écran et votre SSD sur l’usb 3 avec une charge de travail importante (transfert des fichiers ssh par exemple), le RPI n’a pas assez de puissance pour tout alimenter et va s’éteindre, la solution : branchez votre SSD sur l’usb 2 et enlever les autres périphériques ou alors alimenter votre ssd à part.

Plus de détails ici, ici et ici.

2 comments

Leave a Reply to Arnaud Knobloch Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  • Bonjour Arnaud

    Pas mal du tout ton installation !
    Je suis actuellement avec un Raspberry pi 3 Et Pihole tourne sans problème depuis plusieurs mois maintenant
    Mon idée serait d’y joindre Nextcloud

    Tu en penses quoi ?

    je suis avec l’os Raspian

    A plus

Arnaud Knobloch
Arnaud Knobloch Téléphone
Arnaud Knobloch Email