Installer une instance Mastodon sur Ubuntu 16.04 LTS

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

Screenshot_44

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

Commentaires

licence creative common

L’ensemble des articles publiés sur jesuisadmin.fr sont mis à disposition
selon les termes de la licence CC BY-NC-SA 4.0.

Article précédent Article suivant