Depuis quelques jours, il y a comme une "hype" autour de Mastodon. Pour poser les bases, si vous ne savez pas du tout de quoi je parle, Mastodon est un réseau social à la Twitter, mais qui est open-source, libre et décentralisé. Il se construit autour d'instances qui communiquent entre elles.
Pour en savoir plus sur Mastodon, voici quelques ressources pour commencer.
En français :
- Mastodon, qu’est-ce que c’est ?
- Mastodon : mais en fait, comment ça marche ?
- Mastodon : tabula rasa sur le microblogging
- Welcome to Mastodon
- Découvrez Mastodon, un clone de Twitter libre, open source et décentralisé
- Mastodon Social
- tvn - Mastodon
- Le réseau social Mastodon, un « Twitter plus proche de l’esprit originel »
- Ce que Mastodon nous dit de Twitter
- Débuter sur Mastodon : 9 questions pour tout comprendre au réseau social décentralisé
En anglais :
- Le site officiel
- The power to build communities, a response to Mark Zuckerberg
- Learning from Twitter’s mistakes
- Two reasons why organizations should switch to self-hosting social media
- Welcome to Mastodon
- Le GitHub du projet
- La liste des instances
- Des statistiques sur les instances à partir du lien ci-dessus
- User guide
- Mastodon.social is an open-source Twitter competitor that’s growing like crazy
Ça fait 2 mois que je suis inscrit sur l'instance principale, mastodon.social, alors j'avoue que je n'ai pas trop compris pourquoi depuis quelques jours il y a une énorme vague d'inscriptions.

Cette instance a environ 40 000 membres. En une semaine, le nombre d'inscrits a doublé alors qu'elle existe depuis des mois ! Elle est gérée par Eugen, le créateur de Mastodon. Il a dû mettre en place plusieurs serveurs pour soutenir la charge. D'ailleurs, je vous encourage à lui faire un don pour qu'il continue son travail. :)
C'est là qu'est le problème : c'est un réseau social décentralisé, mais pour l'instant la majorité des utilisateurs se concentrent sur une instance.
La solution ? Créer tout plein d'instances ! J'ai donc décidé d'écrire un tutoriel pour faciliter la tâche à ceux qui voudraient se lancer.
Je me base sur le guide officiel, mais je vais essayer de rendre ça plus complet, et en français. :)
Edit 2018: La documentation est désormais complète et bien foutue, et est potentiellement plus à jour que ce tutoriel, que je ne maintiens plus. Si vous parlez anglais, merci de préférer le lien au dessus.
Sommaire
Installation d'une instance sous Debian 8
Sachez que la marche à suivre est probablement la même sous Ubuntu, mais je n'ai pas testé.
Je vous conseille vivement de partir d'un serveur vide.
Pour ceux qui sont à l'aise avec Docker, il est possible de faire tourner Mastodon avec.
Installation des dépendances
À faire en root ou avec sudo.
On ajoute les backports pour ffmpeg.
echo "deb http://httpredir.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
apt update && apt full-upgrade -y
apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file curl git pkg-config libprotobuf-dev protobuf-compilerInstallation de Node.js
curl -sL https://deb.nodesource.com/setup_6.x | bash -
apt install nodejs
npm install -g yarnInstallation de Redis
apt install redis-server redis-toolsInstallation de PostgreSQL
apt-get install postgresql postgresql-contribOn crée un utilisateur et une base de données :
su - postgres
psql
CREATE USER mastodon CREATEDB;
\q
exitCréation de l'utilisateur Mastodon
On va mettre en place l'environnement de Mastodon avec cet utilisateur.
adduser --disabled-password --disabled-login mastodonPour se login :
su - mastodonInstallation de Ruby
Installation des dépendances (en root) :
apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-devInstallation de rbenvOn se connecte avec l'utilisateur mastodon
su - mastodon
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profileOn se reconnecte pour prendre en compte le nouvel environnement
exit
su - mastodonInstallation de ruby-build
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-buildInstallation de Ruby
rbenv install 2.5.0
rbenv global 2.5.0Cela peut prendre quelques minutes ou quelques dizaines de minutes suivant la puissance de votre serveur.
Installation de Mastodon
cd ~
git clone https://github.com/tootsuite/mastodon.git live
cd liveEnsuite, on va utiliser la dernière version stable plutôt que le dépôt de développement continuellement mis à jour.
Pour cela regardez sur cette page quelle est la dernière version stable.
git checkout vX.x.xEnsuite on installe le reste :
gem install bundler
bundle install --deployment --without development test
yarn installConfiguration
Passons à la configuration. :)
Tout se situe dans le fichier .env.production :
cp .env.production.sample .env.production
nano .env.productionVoici quelques lignes à modifier :
REDIS_HOST=localhost
DB_HOST=/var/run/postgresql
DB_USER=mastodon
DB_NAME=mastodon_production
LOCAL_DOMAIN=domainedevotreinstance.tldPour les 3 lignes suivantes, il faut générer un secret avec RAILS_ENV=productionbundle exec rake secret :
PAPERCLIP_SECRET=
SECRET_KEY_BASE=
OTP_SECRET=Ça va vous donner quelque chose du genre :
d250201baf31243159865836db1826b8cf1d442ea5cc37119908cadde0d160b3f248b6e47a8035c62d7fd9538fb3a5bcec6bc808040bc4995426a5c27b230420Il faut en générer 3, donc.
Ensuite générer les clé pour les notifications Push avec RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_keyVous devriez obtenir quelque chose comme ceci, copiez-le dans .env.production
VAPID_PRIVATE_KEY=arSiUfz1Gj7c6itsvGWQ-P6owXGOynsBgZ8phEveaTk=
VAPID_PUBLIC_KEY=BEX6bhfung_oXFV6WBEiKs7-LheNmEIAIkf-gLP7x40Vrh8fise6-XduD-EclCqHnULfXeFjtSXZ0rAeAIaQDPE=Pour les lignes concernant SMTP, elles servent à envoyer des mails pour activer les comptes. Vous pouvez utiliser votre serveur mail personnel, Mailgun, d'autres services SMTP ou encore la boite mail de votre registrar associée à votre nom de domaine.
Profitez-en pour vérifier que votre hébergeur ne bloque pas SMTP... (vous sentez l'heure de perdue pour rien ? :D)
Enfin, choisissez la langue par défaut :
DEFAULT_LOCALE=frMise en place de la base de données
RAILS_ENV=production bundle exec rails db:setupPré-compilation des fichiers CSS et JS
RAILS_ENV=production bundle exec rails assets:precompileMise en place des scripts Systemd
Pour fonctionner, Mastodon a besoin de 3 services. Pour pouvoir les gérer facilement, on va utiliser des scripts systemd.
À faire en root.
Processus web
nano /etc/systemd/system/mastodon-web.serviceCollez :
[Unit]
Description=mastodon-web
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="PORT=3000"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.targetProcessus en arrière-plan
nano /etc/systemd/system/mastodon-sidekiq.serviceCollez :
[Unit]
Description=mastodon-sidekiq
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=20"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 20 -q default -q mailers -q pull -q push
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.targetProcessus pour l'API
nano /etc/systemd/system/mastodon-streaming.serviceCollez :
[Unit]
Description=mastodon-streaming
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="NODE_ENV=production"
Environment="PORT=4000"
ExecStart=/usr/bin/npm run start
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.targetOn active les services :
systemctl enable /etc/systemd/system/mastodon-*.serviceEt on démarre le bazar :
systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.serviceSi vous modifiez la configuration :
systemctl restart mastodon-web.service mastodon-sidekiq.service mastodon-streaming.servicePour vérifier que tout est en route :
systemctl status mastodon-web.service mastodon-sidekiq.service mastodon-streaming.serviceTout doit être au vert :

Si vous avez une erreur et que vous voulez voir les logs :
journalctl -u mastodon-<nomduservice>Mise à jour de Ruby
Il est possible qu'une mise à jour de Mastodon demande une nouvelle version de Ruby. Lisez bien les notes de mise à jour. ;)
Dans ce cas là, pour installer la version de Ruby en question (remplacez X.X.X par la version de ruby) :
su - mastodon
cd /home/mastodon/.rbenv/plugins/ruby-build && git pull && cd -
rbenv install X.X.X
rbenv global X.X.X
gem install bundler --no-riEt procéder ensuite à la mise à jour de Mastodon.
Mise à jour de Mastodon
Il y a souvent des mises à jour de Mastodon, surtout en ce moment. Pour mettre à jour votre instance, c'est très simple.
Sauvegarder les fichiers et la base de données avant de mettre à jour.
Déjà, une petite mise à jour des paquets ne fait pas de mal :
apt update && apt full-upgradeOn arrête tout :
systemctl stop mastodon-web.service mastodon-sidekiq.service mastodon-streaming.serviceOn récupère les sources, et on met à jour Mastodon, les dépendances Ruby et npm, on régénère les assets et on met à jour la BDD.
Aussi, toutes ces commandes ne sont pas forcément nécessaires à chaque fois, mais les exécuter ne vous fera pas de mal ;-) .
Lisez absolument les notes de versions avant de mettre à jour.
su - mastodon
cd live
git fetch
git checkout vX.x.x
gem install bundler
bundle install
npm upgrade yarn
yarn install
RAILS_ENV=production bundle exec rails assets:clean
RAILS_ENV=production bundle exec rails assets:precompile
RAILS_ENV=production bundle exec rails db:migrate
exitSi vous avez une erreur avec la version de Yarn, exécutez ceci en root :
npm i -g yarnEt on redémarre tout :
systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.serviceMise en place du cron
Depuis fin mai 2017, une mise à jour fait que tous les travaux effectués par le cron sont déportés dans Sidekiq, un des 3 services de Mastodon, ce qui permet d'étaler le boulot et de fonctionner sur des installations sans crontab disponible.
Néanmoins voici une petite astuce pour libérer énormément d'espace sur votre instance. En effet les médias (images et vidéos, le pièces jointes)des autres instances sont mis en cache sur votre serveur et ne sont jamais effacés. Cela consomme beaucoup d'espace et Mastodon étant tourné vers l'instantanéité, il y a peu de chance que de vieux médias servent. Ainsi, on peut mettre en place un cron journalier qui va supprimer les medias externes en cache, vieux de plus de X jours.
On édite le crontab :
crontab -e -u mastodonEt on y ajoute :
@daily cd /home/mastodon/live && RAILS_ENV=production NUM_DAYS=30 /home/mastodon/.rbenv/shims/bundle exec rails mastodon:media:remove_remoteInstallation du reverse proxy Nginx
On installe Nginx stable depuis les dépôts officiels :
wget -O - https://nginx.org/keys/nginx_signing.key | apt-key add -
echo "deb http://nginx.org/packages/debian/ $(lsb_release -sc) nginx" > /etc/apt/sources.list.d/nginx.list
apt update
apt install nginxOn ajoute la configuration :
nano /etc/nginx/conf.d/mastodon.confEt on y met (à adapter, ici c'est pour mstdn.io) :
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name www.mstdn.io mstdn.io;
# On redirige tout en HTTPS
return 301 https://mstdn.io$request_uri;
access_log /dev/null;
error_log /dev/null;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.mstdn.io mstdn.io;
# Ne s'applique pas si vous utilisez un sous-domaine
if ($host = www.mstdn.io) {
return 301 https://mstdn.io$request_uri;
}
access_log /var/log/nginx/mstdn-access.log;
error_log /var/log/nginx/mstdn-error.log;
# HTTPS
ssl_certificate /etc/letsencrypt/live/www.mstdn.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.mstdn.io/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ecdh_curve prime256v1;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_prefer_server_ciphers on;
resolver 80.67.169.12 80.67.169.40 valid=300s;
resolver_timeout 5s;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=15768000";
add_header Referrer-Policy "strict-origin-when-cross-origin";
root /home/mastodon/live/public;
location / {
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_pass_header Server;
proxy_pass http://127.0.0.1:3000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
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_pass http://127.0.0.1:4000;
proxy_buffering off;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
error_page 500 501 502 503 504 /500.html;
location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
add_header Cache-Control "public, max-age=604800, immutable";
try_files $uri @proxy;
# On doit ajouter de nouveaux les headers
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Strict-Transport-Security "max-age=15768000";
access_log off;
log_not_found off;
}Avec une belle configuration HTTPS inclue. :)
Pour que tout ça soit fonctionnel on va générer les certificats correspondants au domaine.
Génération des certificats Let's Encrypt
On installe le client depuis les backports :
apt install -t jessie-backports letsencryptOn arrête Nginx pour libérer le port 80 :
service nginx stopOn génère le certificat :
letsencrypt certonly -d www.domaine.tld -d domaine.tld --agree-tos -m contact@domaine.tld --rsa-key-size 4096 --standaloneN'oubliez pas de faire pointer le/les sous domaine(s) correspondant(s) sur l'IPv4/v6 de votre serveur.
Et on démarre Nginx :
service nginx startEt voilà, votre instance de Mastodon devrait être accessible via votre nom de domaine ! :D
Création du compte administrateur
Vous arrivez donc sur cette page :

Créez-vous un compte, et si tout se passe bien, vous allez recevoir votre mail.
Petit conseil en passant, essayez de créer des comptes avec une adresse de mail-tester.com, et suivez ses conseils pour améliorer votre note, ça évitera que vous alliez dans les spams.
Une fois votre compte créé, devenez administrateur (dans le dossier live, en tant que mastodon) :
RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=angristanEt... vous êtes prêts à découvrir le fediverse ! :D
Votre administration se trouve sur https://votreinstance.tld/admin/

Mon instance
Comme dit précédemment, l'instance principale, mastodon.social, est surchargée. D'ailleurs, au moment ou je finis mon article, Eugen vient de fermer les inscriptions.
D'ailleurs, je vous encourage à le soutenir sur Patreon, pour d'une part lui permettre de travailler à plein temps sur Mastodon et d'autre part de lui permettre de scaler son instance.
Ceci étant dit, vous pouvez vous inscrire sur tout un tas d'autres instances. Des listes sont disponibles ici et là.
Moi je fais tourner ma propre instance : mstdn.io :D
Voici les stats au moment de la publication de cet article :

Edit : 1 mois plus tard ! :D

Donc bien sûr, du bon chiffrement des familles, de l'IPv6, et un serveur plutôt costaud derrière (Xeon, SSD). Pour l'instant, les inscriptions sont ouvertes, je verrai en fonction de la charge, je ne sais pas encore combien ça consomme en fonction du nombre d'utilisateurs. Je vais ajouter quelques informations sur la page about, avec les règles, des petits graphiques, et puis combien ça coute.
Edit : C'est fait !
Je vous invite à aller dessus, bien sûr, mais le principe de Mastodon c'est que y'a tout plein d'instances disponibles. Faites votre choix, ou montez la votre ! :D
Aussi, je n'ai pas encore vu de tutoriel de ce genre passer, donc n'hésitez pas à vous en inspirez et à parler de Mastodon un peu partout autour de vous. C'est comme ça que ça va marcher !
Allez, on se retrouve sur Mastodon : angristan@mstdn.io :D
PS : Boostez mon pouet !
Image de une : b_cavello sur Mastodon




RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=angristanVoilà l'erreur que j'ai ...mastodon@Travelpandas:~/live$ RAILS_ENV=production bundle exec rails --trace mastodon:make_admin USERNAME=oufmilo rails aborted! Don't know how to build task 'mastodon:make_admin' (see --tasks) /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/task_manager.rb:59:in[]' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:159:ininvoke_task' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:116:inblock (2 levels) in top_level' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:116:ineach' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:116:inblock in top_level' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:125:inrun_with_threads' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:110:intop_level' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/commands/rake/rake_command.rb:23:inblock in perform' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/rake-12.3.1/lib/rake/application.rb:186:instandard_exception_handling' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/commands/rake/rake_command.rb:20:inperform' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/command.rb:48:ininvoke' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/railties-5.2.1/lib/rails/commands.rb:18:in<top (required)>' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:inrequire' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:inblock in require_with_bootsnap_lfi' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/loaded_features_index.rb:65:inregister' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:20:inrequire_with_bootsnap_lfi' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:29:inrequire' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies.rb:287:inblock in require' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies.rb:253:inload_dependency' /home/mastodon/live/vendor/bundle/ruby/2.5.0/gems/activesupport-5.2.1/lib/active_support/dependencies.rb:287:inrequire' bin/rails:4:in'` Je ne sais pas quoi faire ... Si quelqu'un a une poste je suis preneur .. merci/etc/apt/sources.list.d/nginx.list, fait unapt updateetapt install -t jessie-backports nginx:)systemctl status nginx.serviceounginx -tpour afficher l'erreurnpm install -g browserify?df -h? Tu semble avoir un problème d'espaceRAILS_ENV=production bundle exec rails db:setup?