Alors que ce nouveau réseau social fait actuellement beaucoup parler de lui, je me suis décidé à créer ma propre instance Mastodon pour contribuer à ce projet.

J’en ai donc profiter pour faire un tutorial listant les étapes à suivre pour lancer vous aussi votre instance dès aujourd’hui. Je suis parti sur un VPS tournant avec Ubuntu 16.04 LTS et du côté ressources 8 vCores, 8Go de RAM et 50Go de SSD. Je verrais à l’usage si l’instance nécessite plus de ressources.

Pour suivre les étapes de ce tutorial, un utilisateur avec les droits sudo est suffisant, vous n’avez pas besoin de vous connecter en tant que root.

Installer les pré-requis

sudo apt-get update

Installation de nodejs

curl -sL https://deb.nodesource.com/setup_4.x | sudo bash - sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs sudo npm install -g yarn

Installation de redis-server

sudo apt-get install redis-server redis-tools

Installation de postgresql

sudo apt-get install postgresql postgresql-contrib sudo su - postgres psql CREATE USER mastodon CREATEDB; \q

Il nous faut également activer le daemon d’authentification pour que les utilisateurs puissent se connecter dans mot de passe :

sudo sed -i '/^local.*postgres.*peer$/a host all all 127.0.0.1/32 ident' /etc/postgresql/9.?/main/pg_hba.conf sudo apt-get install pidentd sudo systemctl enable pidentd sudo systemctl start pidentd sudo systemctl restart postgresql

Installation de Ruby

On installe les dépendances pour Ruby.

sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

On créer un utilisateur mastodon :

adduser --disabled-password --disabled-login mastodon

Puis on s’identifie avec cet utilisateur

su - mastodon

On installe rbenv et rbenv-build :

adduser --disabled-password --disabled-login mastodon git clone https://github.com/rbenv/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc source ~/.bashrc

On se déconnecte pour appliquer la modification au bash, puis on installe ruby-build.

exit su - mastodon git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Puis on installe Ruby v2.4.1 pour Mastodon :

rbenv install 2.4.1 rbenv global 2.4.1

On vérifie la version de ruby installé via la commande :

ruby -v

Installation de Mastodon

Nous allons pouvoir passer à l’installation de Mastodon et pour cela on commence par cloner le dépôt Github, puis on utilise git checkout pour sélectionner la dernière release plutôt que de rester sur la branche master :

cd ~ git clone https://github.com/tootsuite/mastodon.git live cd live git checkout $(git tag | tail -n 1)

On installe bundler pout gérer l’installation des dépendances et on désactive la documentation pour chaque gem.

echo "gem: --no-document" > ~/.gemrc gem install bundler --no-ri

Puis on passe à l’installation

bundle install --deployment --without development test yarn install

On peut désormais copier le fichier de configuration d’exemple et l’éditer avec nos informations :

cp .env.production.sample .env.production nano .env.production

Les informations à remplir sont :

# Service dependencies REDIS_HOST=localhost REDIS_PORT=6379 DB_HOST=/var/run/postgresql DB_USER=mastodon DB_NAME=mastodon_production DB_PASS= DB_PORT=5432 # Federation LOCAL_DOMAIN=votredomaine.com LOCAL_HTTPS=true

Ainsi que la partie SMTP qui permettra aux utilisateurs de confirmer leur inscription :

# E-mail configuration SMTP_SERVER=mail.votredomaine.com SMTP_PORT=587 SMTP_LOGIN=noreply@votredomaine.com SMTP_PASSWORD=VotreMotdePasse SMTP_FROM_ADDRESS=noreply@votredomaine.com

Pour la partie application secret, utilisez la commande bundle exec rake secret pour générer 3 clés et vous n’avez plus qu’à les copier dans le fichier de configuration.

Pour mettre en place l’instance du côté base de donnée et assets :

RAILS_ENV=production bundle exec rails db:setup RAILS_ENV=production bundle exec rails assets:precompile

Création des services systemd

Pour le processus web

nano /etc/systemd/system/mastodon-web.service

[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.target

**Pour le processus en arrière-plan **

nano /etc/systemd/system/mastodon-sidekiq.service

[Unit] Description=mastodon-sidekiq After=network.target [Service] Type=simple User=mastodon WorkingDirectory=/home/mastodon/live Environment="RAILS_ENV=production" Environment="DB_POOL=5" ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push TimeoutSec=15 Restart=always [Install] WantedBy=multi-user.target

Pour le processus de l’API

nano /etc/systemd/system/mastodon-streaming.service

[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.target

On peut alors activer les services :

systemctl enable /etc/systemd/system/mastodon-*.service

Et enfin démarrer l’instance Mastodon :

sudo systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

On ajoute alors les crons nécessaire pour Mastodon :

crontab -u mastodon -e

RAILS_ENV=production @daily cd /home/mastodon/live && /home/mastodon/.rbenv/shims/bundle exec rake mastodon:daily

Mise en place du reverse-proxy Nginx :

Nous avons désormais une instance mastodon qui fonctionne, mais nous allons devoir mettre en place un reverse-proxy avec Nginx afin de pouvoir utiliser directement notre domaine pour y accéder.

On commence par installer nginx :

wget -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add - sudo echo "deb http://nginx.org/packages/ubuntu/ $(lsb_release -sc) nginx" > /etc/apt/sources.list.d/nginx.list sudo apt update sudo apt install nginx

On créer un fichier de configuration en se basant sur le modèle d’Angristan :

nano /etc/nginx/sites-enabled/votredomaine.com

map $http_upgrade $connection_upgrade { default upgrade; '' close; } # redirection http vers https server { listen 80; listen [::]:80; server_name www.votredomaine.com votredomaine.com; return 301 https://votredomaine.com$request_uri; access_log /dev/null; error_log /dev/null; } # block https server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.votredomaine.com votredomaine.com; if ($host = www.votredomaine.com) { return 301 https://votredomaine.com$request_uri; } access_log /var/log/nginx/votredomaine.com-access.log; error_log /var/log/nginx/votredomaine.com-error.log; # configuration ssl avec letsencrypt ssl_certificate /etc/letsencrypt/live/votredomaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/votredomaine.com/privkey.pem;; ssl_protocols TLSv1.2; ssl_ciphers EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES; ssl_prefer_server_ciphers on; # ajout des headers pour le HSTS, CSP et Referrer-Policy add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"; add_header Content-Security-Policy "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self' wss://votredomaine.com;"; add_header Referrer-Policy "strict-origin-when-cross-origin"; keepalive_timeout 70; sendfile on; client_max_body_size 0; gzip off; 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; 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_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; tcp_nodelay on; } error_page 500 501 502 503 504 /500.html; }

Puis on installe Let’s Encrypt pour générer notre certificat SSL :

cd /opt git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto certonly --webroot -w /home/mastodon/live -d www.votredomaine.com -d votredomaine.com --email vous@votredomaine.com --text --rsa-key-size 4096

Mettre à jour Mastodon

Mastodon est très régulièrement mis à jour, cependant pour des raisons de stabilité, il est préférable d’attendre des releases pour mettre à jour son instance. Il ne sera donc pas nécessaire de lancer 10 fois par jour la commande git pull, et il vous suffit après une release d’utiliser les commandes suivantes sans oublier de remplacer tags/vX.X.X par l’identifiant de la release.

su - mastodon cd live git fetch git checkout vX.X.X bundle install --deployment --without development test NODE_ENV=production npm upgrade --global 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 exit

Si une mise à jour de Ruby est nécessaire pour l’installation d’une release, il vous faudra faire :

rbenv install 2.4.1 gem install bundler --no-ri

Note pour la release v1.1.2, pour utiliser la nouvelle fonctionnalitée des avatars GIF, utilisez la commande suivante pour générer une version statiques sur des avatars mis en ligne précédemmment. Sinon vos utilisateurs devront ré-uploader l’avatar pour en bénéficier.

RAILS_ENV=production bundle exec rake mastodon:maintenance:add_static_avatars

Il ne reste plus qu’à redémarrer l’instance :

sudo systemctl restart mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Création du compte administrateur

Votre instance est désormais fonctionnelle, il vous suffit donc de vous inscrire et de valider votre adresse mail pour créer votre compte.

Ensuite, pour définir ce compte en tant qu’administrateur de l’instance utiliser la commande suivante :

RAILS_ENV=production bundle exec rails mastodon:make_admin USERNAME=votre-utilisateur

Mon instance Mastodon.top

Ayant des ressources à disposition, j’ai lancé mon instance Mastodon, que vous pouvez rejoindre à l’adresse mastodon.top. Nous sommes déjà 90 utilisateurs et vu l’utilisation des ressources, cela ne devrait pas être un problème d’héberger plus de monde.

Vous pouvez visualiser les statistiques de l’instance sur la page about ainsi que le monitoring en temps-réel à l’adresse status.mastodon.top.

N’hésitez pas à donner votre avis sur ce tutoriel, à corriger d’éventuelles erreurs ou à demander de l’aide pour mettre en place votre instance !

Vous pouvez aussi me suivre sur Mastodon : thomas_virtubox@mastodon.top