Mastodon est une application de gestion communautaire entièrement gratuite et libre sur vos instances virtuelles Scaleway Elements. L'outil permet de créer un réseau social privé, sécurisé, et chiffré permettant de partager des photos, des messages et bien plus encore, sans mobiliser de prestataire externe.

À l’époque où le Projet “Ensemble”, en place depuis le début du Covid, nous a permis de collaborer étroitement avec le gouvernement dans le cadre de leurs offres de télétravail, nous nous sommes rendu compte à quel point Mastodon gagnait en traction auprès de la communauté libriste française.

Mastodon est un logiciel populaire, libre et open-source, qui vous permet d'héberger votre réseau social sur vos instances virtuelles. Libre à vous de configurer votre propre code de conduite, vos propres conditions de service et vos propres politiques de modération.

L’outil offre la possibilité d'utiliser le service Object Storage compatible S3 pour stocker les contenus multimédia téléchargés sur la plateforme, ce qui la rend flexible et évolutive.

Les instances Mastodon sont connectées en tant que réseau social fédéré en utilisant le protocol standardisé ActivityPub, sans serveur central. Cela permet aux utilisateurs de différents réseaux et services d'interagir entre eux.

Comme il n'y a pas de serveur central, un utilisateur peut choisir de rejoindre ou de quitter un serveur Mastodon spécifique, selon la politique du serveur, sans pour autant quitter le réseau social Mastodon.  

Puisque Mastodon fait partie de Fediverse, des interactions deviennent possibles avec les utilisateurs d'autres plateformes supportant le même protocole, comme PeerTube, Friendica ou encore GNU Social.

La plateforme offre également des fonctionnalités de confidentialité permettant aux utilisateurs d'en ajuster les paramètres pour chacun de leurs messages.

Ceux qui souhaitent déployer eux-mêmes un environnement Mastodon sur une instance virtuelle peuvent le faire en suivant la configuration avancée, détaillée dans ce billet.

Pré requis :

  • Vous avez un compte et êtes connecté à console.scaleway.com
  • Vous avez configuré votre clé SSH
  • Vous disposez d’une Instance Virtuelle Scaleway fonctionnant sur Ubuntu Focal Fossa (20.04 LTS)
  • Vous avez un nom de domaine ou un sous-domaine pointant vers l'instance
  • Vous avez activé les ports SMTP pour l'envoi de notifications par courriel

Installation de Mastodon

Préparer l'installation

1 . Connectez-vous à votre instance via SSH. Pour en savoir plus, consultez notre documentation. (en anglais)
2 . Mettez à jour le cache des paquets APT et les logiciels déjà installés sur l'instance :

apt update && apt upgrade -y

3 . Vérifiez que curl est installé sur le système et ajoutez un dépôt externe pour obtenir la version requise de Node.js, puis installez-le en exécutant les commandes suivantes :

apt install curl -y
curl -sL https://deb.nodesource.com/setup_12.x | bash -

4 . Mastodon utilise le gestionnaire de paquets Yarn. Installez le dépôt qui correspond à la version requise de yarn en exécutant les commandes suivantes :

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
apt update

5 . L'application dépend également de quelques autres paquets, qui doivent être installés avant l'installation du logiciel :

  • Imagemagick pour les opérations liées aux images uploadés
  • FFmpeg pour la conversion des fichiers GIF en MP4
  • Protobuf avec libprotobuf-dev et protobuf-compiler, utilisé pour la détection des langues
  • Nginx as comme serveur web « front-end »
  • Redis est utilisé pour le stockage « in-memory » de la structure des données de Mastodon
  • PostgreSQL est le moteur de la base de données SQL pour l’application
  • Node.js est utilisé pour l'API de streaming de Mastodon
  • Yarn est un gestionnaire de paquets de Node.js
  • Certbot est un outil de gestion des certificats TLS émis par l'autorité de certification (CA) à but non lucratif Let’s Encrypt
  • Ainsi que quelques autres paquets de développement et g++ - Ces paquets sont nécessaires pour la compilation de Ruby en utilisant ruby-build.

Pour les installer, utilisez le gestionnaire de paquets apt :

apt install -y imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev nginx redis-server redis-tools postgresql postgresql-contrib certbot python3-certbot-nginx yarn libidn11-dev libicu-dev libjemalloc-dev

6 . Nous allons utiliser rbenv pour gérer les versions de Ruby. Mastodon doit être installé pour un seul utilisateur Linux, donc, nous devons d'abord créer un utilisateur sous lequel Mastodon fonctionnera. Le paramètre --disabled-login désactive la possibilité de se connecter directement au compte de l'utilisateur afin d’en renforcer la sécurité :

adduser --disabled-login mastodon

7 . Ensuite, connectez-vous au compte d'utilisateur mastodon et allez dans le répertoire home de l'utilisateur :

su mastodon
cd

8 . Ensuite, installez rbenv et ruby-build :

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
# Redémarrez le shell de l'utilisateur
exec bash
# Vérifiez si rbenv est correctement installé
type rbenv
# Installez ruby-build sous la forme d'un plugin rbenv
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

9 . Continuez en installant et en activant la version de Ruby utilisée par Mastodon. Il est possible que cette étape nécessite un peu de temps :

RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.6.6
rbenv global 2.6.6

10 . Enfin, installez le bundler en exécutant la commande suivante :

gem install bundler --no-document

Une fois que cette étape est terminée, vous pouvez retourner au compte root en tapant exit.

Configuration de PostgreSQL

1 . Mastodon a besoin d'un accès à une base de données PostgreSQL. Pour cela, accédez au compte d'utilisateur postgres, puis lancez la commande psql :

sudo -u postgres psql

2 . Créez maintenant un utilisateur mastodon pour PostgreSQL et quittez ensuite le shell psql :

CREATE USER mastodon CREATEDB;
\q

Télécharger l'application Mastodon

1 . Connectez-vous au compte de l'utilisateur mastodon :

su - mastodon

2 . Ensuite, entrez dans le dossier home de l'utilisateur et clonez le dépôt Git de Mastodon dans un répertoire nommé live :

git clone https://github.com/tootsuite/mastodon.git live && cd live

3 . Maintenant, lancez la commande suivante pour vous rendre dans la dernière branche stable du projet

git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)

4 . Continuez ensuite en installant les dépendances Ruby restantes :

bundle config deployment 'true'
bundle config without 'development test'
bundle install -j$(getconf _NPROCESSORS_ONLN)

5 . Utilisez ensuite yarn pour installer les dépendances de node.js :

yarn install --pure-lockfile

6 . Une fois que cela est fait, retournez au compte racine en tapant exit.

Demander un certificat TLS Let's Encrypt

1 . Avant de demander le certificat, arrêtez d'abord l'application Nginx :

systemctl stop nginx

2 . Pour demander un certificat, utilisez maintenant l’outil certbot, avec la validation TLS SNI en mode autonome. Remplacez exemple.com par votre propre nom de domaine :

certbot certonly --standalone -d exemple.com

3 . Sachant que la validité des certificats Let's Encrypt est de 90 jours, un cron-job peut être utilisé pour les renouveler et pour redémarrer nginx automatiquement. Il suffit alors de créer un nouveau fichier et de l'ouvrir dans un éditeur de texte comme nano :

nano /etc/cron.daily/letsencrypt-renew

4 . Puis copiez le contenu suivant dans le fichier, enregistrez-le et quittez nano :

#!/usr/bin/env bash
certbot renew
systemctl reload nginx

5 . Pour terminer cette étape, autorisez l'exécution du script et redémarrez le démon cron. Il exécutera le script quotidiennement :

chmod +x /etc/cron.daily/letsencrypt-renew
systemctl restart cron

Configuration de Nginx

1 . Commencez par copier le fichier de configuration d'exemple livré avec Mastodon dans votre dossier sites-available de Nginx et créez un lien symbolique vers celui-ci dans le dossier sites-enabled :

cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon
ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

2 . Ensuite, ouvrez le fichier de configuration dans un éditeur de texte, par exemple nano :

nano /etc/nginx/sites-available/mastodon

3 . Remplacez example.com dans le fichier de configuration par votre propre nom de domaine ou sous-domaine. Remplacez-le également par votre nom de domaine dans toutes les occurrences suivantes.

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

upstream backend {
    server 127.0.0.1:3000 fail_timeout=0;
}

upstream streaming {
    server 127.0.0.1:4000 fail_timeout=0;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g;

server {
  listen 80;
  listen [::]:80;
  server_name example.com;  <- /!\ Remplacez example.com par votre nom de domaine /!\
  root /home/mastodon/live/public;
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  # Uncomment these lines once you acquire a certificate:
  # ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem; <- /!\ Remplacez example.com par votre nom de domaine et décommentez cette ligne /!\
  # ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; <- /!\ Remplacez example.com par votre nom de domaine et décommentez cette ligne /!\

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 80m;

  root /home/mastodon/live/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    add_header Strict-Transport-Security "max-age=31536000";
    try_files $uri @proxy;
  }

  location /sw.js {
    add_header Cache-Control "public, max-age=0";
    add_header Strict-Transport-Security "max-age=31536000";
    try_files $uri @proxy;
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://backend;
    proxy_buffering on;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_cache CACHE;
    proxy_cache_valid 200 7d;
    proxy_cache_valid 410 24h;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    add_header X-Cached $upstream_cache_status;
    add_header Strict-Transport-Security "max-age=31536000";

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://streaming;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

Une fois que vous avez terminé les modifications, enregistrez le fichier en appuyant sur CTRL+O, puis quittez nano en appuyant sur CTRL+X.

Paramétrage de l'application Mastodon

1 . Connectez-vous au compte d'utilisateur mastodon :

su - mastodon

2 . Rendez-vous dans le répertoire /home/mastodon/live et lancez l'outil d’installation de Mastodon :

cd /home/mastodon/live
RAILS_ENV=production bundle exec rake mastodon:setup

Le logiciel d'installation interactif vous guide tout au long du processus d'installation.
Lorsqu'on vous le demande, entrez le nom de domaine ou le sous-domaine de l'instance. Quand on vous demande d'utiliser le Docker, choisissez No. La plupart des autres valeurs sont déjà pré-remplies avec les paramètres nécessaires. Modifiez-les si nécessaire pour votre propre configuration.

Pour configurer Mastodon avec Object Storage, choisissez Amazon S3 comme fournisseur de services et saisissez les informations suivantes pour le compte. Un token API valide est nécessaire pour la configuration avec Object Storage.
Quand on vous le demande, entrez les paramètres comme suit :

Provider Amazon S3
S3 bucket name: [scaleway_bucket_name]
S3 region: fr-par
S3 hostname: s3.fr-par.scw.cloud
S3 access key: [scaleway_access_key]
S3 secret key: [scaleway_secret_key]

Note: Si votre bucket est situé à Amsterdam, utilisez nl-ams comme région et s3.nl-ams.scw.cloud comme nom d'hôte.

Une fois la configuration terminée, l'installateur commencera à compiler l'application. Cela peut prendre un peu de temps.

3 . Une fois l'application installée, on vous demandera si vous souhaitez créer un compte administrateur pour votre instance Mastodon. Tapez Yes pour créer le compte. Saisissez le nom d'utilisateur de l'utilisateur admin, suivi de votre adresse électronique. Un mot de passe aléatoire sera généré. Prenez-en note, car vous en aurez besoin pour vous connecter à votre instance Mastodon.

All done! You can now power on the Mastodon server 🐘

Do you want to create an admin user straight away? Yes
Username: admin  ← Saisissez le nom d'utilisateur de votre compte administrateur Mastodon
E-mail: me@myemail.com ← Saisissez votre adresse électronique
You can login with the password: 9dc4d92d93a26e9b6c021bb75b4a3ce2

4 . Tapez exit pour revenir au compte root.

Installation des services SystemD

Les scripts SystemD sont utilisés pour gérer les services sur les systèmes Ubuntu. Trois scripts différents sont nécessaires pour Mastodon. Ces scripts sont fournis avec le package de Mastodon, vous pouvez les copier à leur destination finale, puis activer les services.

1 . Copiez les scripts Mastodon systemd dans leur destination finale :

cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/

2 . Ensuite, relancez le démon systemd :

systemctl daemon-reload

3 . Maintenant, démarrez les services et activez-les, afin qu'ils démarrent automatiquement lors du prochain redémarrage du système :

systemctl start mastodon-web mastodon-sidekiq mastodon-streaming
systemctl enable mastodon-web mastodon-sidekiq mastodon-streaming

4 . Pour terminer cette étape, vérifiez si tous les services fonctionnent :

systemctl status mastodon-*.service

Si tout fonctionne, ouvrez un navigateur web et connectez-vous à votre nom de domaine. Vous pourrez alors voir la page d'accueil de votre instance Mastodon :

Vous pouvez vous connecter avec le compte administrateur que vous avez créé lors de l'installation afin de configurer des paramètres supplémentaires de votre instance, relier l'instance à une autre pour rejoindre un réseau fédéré, créer un autre compte utilisateur et commencer à partager des messages et des photos sur votre timeline. Si vous avez configuré l’Object Storage, tous les fichiers téléchargés vers l'instance sont automatiquement stockés dans votre bucket Object Storage et intégrés dans la timeline des utilisateurs :

Pour plus d'informations et la configuration avancée de Mastodon, veuillez consulter la documentation officielle.