02 - Installation de Pleroma sur Raspberry Pi 4, auto-hébergé chez Free.fr

Installation de Pleroma sur Raspberry Pi 4

Dimensionnement

Je possède plusieurs modèles de raspberry, mais je préfère partir sur un récent : le raspberry Pi 4 pour ses performances. En effet, je dispose de 4 coeurs ARM 64 bits, de 8 Go de RAM, de l'USB type-C et 2 ports USB3 pour rajouter du stockage. Si je laisse de côté le problème de la modération, je pense être en capacité d'héberger ainsi une cinquantaine de comptes à terme.

A l'échelle du fédivers, ça peut sembler peu, mais c'est pourtant une valeur supérieure à la médiane des instances mastodon.

C'est un moyen de tendre vers le small web, sans y parvenir, et évidemment, je n'accepterai pas un influenceur dessus (!).

Nom de domaine, IP et let's encrypt

Pour le nom de domaine, j’ai demandé une IP fullstack sur free puis un nom de domaine (espace abonné); ça finit forcément par .hd.free.fr. Au départ, j'avais commencé à regarder no-ip, mais beaucoup de FAI utilisent désormais du CGNAT, ce qui me compliquerait bien trop la tâche pour héberger un serveur chez moi.

Pour rappel nic.eu.org propose des noms de domaine gratuits pour les habitants ou les assos de l’UE (comme par exemple mast.eu.org).

Ensuite, il faut ouvrir le port 80 et 443 sur mafreebox.freebox.fr, en les redirigeant vers le raspberry Pi, puis mettre ce dernier en bail statique DHCP (à partir de l’adresse mac) pour qu’à chaque reboot il récupère la même IP.

Installation du système

Ca faisait quelques temps que je n'avais pas installé un raspberry; habituellement, j'utilisais dd, ou un utilitaire quelconque de création d'image. Désormais, pour raspbian, il y a un petit utilitaire pratique, rpi-imager, qui permet d’écrire l'image sur la clé ou la carte microSD, et d'activer directement un service SSH (plus besoin de créer à la main un fichier vide "ssh" dans /boot).

Pour l’install de pleroma, finalement, je me suis peu servi de ce guide; c’est assez simple, j’ai suivi : https://docs-develop.pleroma.social/backend/installation/debian_based_en/

# après récupération de l'adresse IP par le serveur DHCP
ssh pi@192.168.X.X

sudo apt update
sudo apt full-upgrade

# on configure proprement le hostname
hostname raspleroma.hd.free.fr
# verification et rajout dans /etc/hosts
editor /etc/hostname
editor /etc/hosts

sudo apt install -y git build-essential postgresql postgresql-contrib gcc make cmake file libmagic1 libmagic-dev ffmpeg exiftool libncurses5

wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb

# J’ai choisi `erlang-mini` pour des raisons d’économie d’espace.
sudo apt-get install -y erlang-mini elixir
elixir -v

sudo apt install -y erlang-dev erlang-nox libimage-exiftool-perl

sudo useradd -r -s /bin/false -m -d /var/lib/pleroma -U pleroma
sudo mkdir -p /opt/pleroma
sudo chown -R pleroma:pleroma /opt/pleroma
sudo -Hu pleroma git clone -b stable https://git.pleroma.social/pleroma/pleroma /opt/pleroma
cd /opt/pleroma
sudo -Hu pleroma mix deps.get
sudo -Hu pleroma MIX_ENV=prod mix pleroma.instance gen

sudo -Hu pleroma mv config/{generated_config.exs,prod.secret.exs}
# on édite la configuration de pleroma pour verifier que tout est Ok
sudo editor config/setup_db.psql
sudo editor config/prod.secret.exs

# Si ok, on crée la bdd et on lance le serveur
sudo -Hu postgres psql -f config/setup_db.psql
sudo -Hu pleroma MIX_ENV=prod mix phx.server

sudo apt install -y nginx certbot
sudo certbot certonly --email <mail> -d raspleroma.hd.free.fr
sudo systemctl enable --now nginx.service
sudo cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/pleroma.nginx
sudo ln -s /etc/nginx/sites-available/pleroma.nginx /etc/nginx/sites-enabled/pleroma.nginx
sudo cp /opt/pleroma/installation/pleroma.service /etc/systemd/system/pleroma.service
sudo systemctl daemon-reload
sudo systemctl enable --now pleroma.service

sudo journalctl -xn150 -fu pleroma

sudo rm /etc/nginx/sites-enabled/default
# on remplace example.tld par notre fqdn et on met les bons chemins pour les certificats SSL
sudo editor /etc/nginx/sites-enabled/pleroma.nginx
# test de la configuration
sudo nginx -t
# si ok
sudo service nginx restart

# création d'un utilisateur administrateur et modérateur
sudo -Hu pleroma MIX_ENV=prod mix help pleroma.user
sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new Remsd1 <mail> --admin --moderator --name Fritange --bio "un admin en errance sur un #raspi4. Instance éphémère" -y

Pour Erlang et Elixir, il vaut mieux installer les dépôts dédiés sur https://www.erlang-solutions.com/downloads/. En effet, avec les packages distribués par erlang-solutions, et sans passer par les dépôts, j’ai eu des conflits de package avec libwxgtk et libwxbase, mais une fois les dépôts erlang correctement configurés, ça s’est résolu avec apt install -f.

Dans Pleroma, le fichier config/prod.exs charge tous les autres fichiers de configuration listés à l'intérieur de celui-ci.

Modifications simples, fédérations, blocages d'instances et optimisations

J'ai commencé à rajouter un message de bienvenu sur mon instance. Dans le fichier config/prod.secret.exs, j'ai rajouté :

config :pleroma, :welcome,
  direct_message: [
    enabled: true,
    sender_nickname: "Remsd1",
    message: "Bonjour, bienvenue sur mon instance pleroma sur raspberry Pi !"
  ]

Si vous regardez la source de ce fichier markdown, vous remarquerez que j'ai utilisé la syntaxe JSON; en effet, tout comme en Json, il faut faire attention aux virgules à la fin de chaque ligne (et ne pas en mettre à la fin de la dernière ligne).

systemctl restart pleroma

On crée ensuite un 1er utilisateur :

sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new Toto <mail> --name IanMurdockTheBest --bio "un admirateur de Ian Murdock" -y

L'utilisateur a du recevoir le message de bienvenue.

On va également rajouter fail2ban sur le raspberry pour éviter par exemple les attaques par force brute :

sudo apt install -y fail2ban

Fédération

Pour la Fédération, j'ai rajouté la configuration suivante, dans la section config :pleroma, :instance,

  # changements REMY
  registrations_open: false,
  invites_enabled: true,
  account_approval_required: true,
  account_activation_required: true,
  federating: true,
  federation_reachability_timeout_days: 2,
  remote_post_retention_days: 7,
  healthcheck: true,
  report_strip_status: true
  # Fin changements
systemctl restart pleroma

J'ai désactivé les inscriptions, ouvertes par défaut, pour éviter de voir débarquer trolls et bots, même si on peut valider les inscriptions (pas configuré par défaut). Ma configuration ci-dessus, permet tout de même d'envoyer des invitations ou de rajouter des membres à la main.

Blocage

Pleroma utilise un système assez avancé, nommé MRF, qui peut servir à mettre en place de nombreuses règles, mais là, on va l'utiliser juste pour la règle reject.

Pour le blocage, je me suis basé sur la liste de l'instance Mastodon chaos.social. Vous pouvez la transformer pour l'écrire dans votre fichier config/prod.secret.exs, ainsi :

cd /opt/pleroma
wget https://raw.githubusercontent.com/chaossocial/about/master/blocked_instances.md
echo -en "config :pleroma, :mrf_simple, reject: [\n"; awk '/\|/ {print "\t\""$2"\""}' /root/blocked_instances.md |tail -n +3; echo "]" >> config/prod.secret.exs
systemctl restart pleroma

On peut modifier ça à volonté, en mettre dans federated_timeline_removal au lieu de reject (pour du contenu nsfw par exemple), etc…

Optimisation

Stockage

Pleroma donne la possibilité de stocker en S3. Je pourrai utiliser un stockage scaleway, mais vu la faible quantité de stockage utilisé, j'ai, pour l'instant, uniquement mis une clé USB de 64Go :

sudo fdisk -l
# chez moi, la clé est sur /dev/sda; le système est sur carte microSD pour le moment
sudo fdisk /dev/sda
# m
# p
# g

J'ai fait une table de partition GPT sur ma clé; je la formatte en ext4 :

sudo mkfs.ext4 /dev/sda

Je récupère son UUID avec blkid et je rajoute celui-ci dans mon /etc/fstab :

sudo mkdir /mnt/sda
echo 'UUID=<...UUID récupéré avant...>  /mnt/sda ext4 defaults,noatime 0 0' > /etc/fstab
sudo mount -fav
sudo mount -a

Ensuite, on édite le fichier de configuration de pleroma pour modifier le chemin pour les uploads :

config :pleroma, Pleroma.Uploaders.Local, uploads: "/mnt/sda"
systemctl restart pleroma

Mise à jour - decembre 2022

Suite à quelques remarques sur le fédivers et la parution de ces articles sur ce blog, j'ai fait d'autres tests : mise à jour de Pleroma, sauvegarde, et changement de frontend.

Mise à jour de Pleroma

En utilisant git et les commandes pleroma, c'est assez simple (utilisation de la documentation officielle):

cd /opt/pleroma
git branch -a
tag=$(git describe --tags `git rev-list --tags --max-count=1`)
git checkout $tag
sudo -Hu pleroma mix deps.get
service pleroma stop
sudo -Hu pleroma MIX_ENV=prod mix ecto.migrate
service pleroma start

Personalisation

Là aussi, la documentation est plutôt complète.

Pour rajouter des thèmes (disponibles ici) :

cd /opt/pleroma/priv/static/static/themes/
wget https://plthemes.vulpes.one/themes/ekko/ekko.json
wget https://plthemes.vulpes.one/themes/cyberpunk/cyberpunk.json
wget https://plthemes.vulpes.one/themes/fauux-sp/fauux-sp.json

Ensuite, dans l'interface administrateur, on chargera les nouveaux thèmes.

Charger soapbox-FE

Soapbox-FE amène une vraie modification de l'UI et de l'UX dans Pleroma. C'est un frontend beaucoup plus moderne.

Il suffit de suivre la documentation de Soapbox-FE ici.

Sauvegarde

De manière assez simple, en local :

cd /opt/pleroma
sudo rsync -aP /opt/pleroma /opt/pleroma.bckp
_DATE=`date +%Y%m%d`
sudo -Hu postgres pg_dump -d pleroma --format=custom -f ~postgres/${_DATE}_pgdump.sql

Ici, on a une sauvegarde très minimaliste, en local (!). Pour plus de sécurité, on appliquera le principe du 3,2,1.


Revenir à la partie 1 - Motivations pour un Pleroma auto-hébergé Partie 1 - 11/2022,


Passez à la partie 3 - Premier retour d'expérience utilisateur et administrateur de Pleroma Partie 3 - 11/2022.