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
etlibwxbase
, mais une fois les dépôts erlang correctement configurés, ça s’est résolu avecapt 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.