X
    Categories: Blog 1001 ActusCoding

Création d’une instance Mastodon sur un VPS Ubuntu16

Mastodon est le nouveau réseau social en vogue. Inspiré de Twitter, il à l’avantage d’être décentralisé et 100% Open Source, un réseau social sans censure et sans publicité ! Il fonctionne sous forme d’instance qui s’associe à d’autres instances pour créer un immense réseau. Je vous propose de créer votre propre instance Mastodon sur un votre serveur. Nous allons pour ce tutoriel loué un VPS chez OVH avec ce modèle:

Pour démarrer je pense que c’est suffisant, l’avantage du VPS c’est que si ma configuration s’avère insuffisante, je peux améliorer mon VPS en quelques clics dans le manager OVH.

Pour ce tutoriel, les droits sudo seront suffisant, pas besoin d’utiliser l’accès Root.

 

 

1/ 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 peut vérifier la version de ruby installée via la commande :

ruby -v

2/ Installation de Mastodon

On commence par cloner le dépôt Github, puis on utilise git checkout pour sélectionner la dernière release :

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, pour ma part j’ai choisi d’utiliser MailGun :


SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=postmaster@VOTRE_DOMAINE.fr
SMTP_PASSWORD=75c13176234365434c92e395b8423384
SMTP_FROM_ADDRESS=noreply@VOTRE_DOMAINE.fr
SMTP_DOMAIN= VOTRE_DOMAINE.fr
SMTP_DELIVERY_METHOD=smtp
SMTP_AUTH_METHOD=none
SMTP_OPENSSL_VERIFY_MODE=none
#SMTP_ENABLE_STARTTLS_AUTO=true

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 :

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, si comme moi vous partez d’un serveur vide, il faudra adapter votre fichier de configuration tout d’abord en HTTP pour activer le certificat letsencrypt puis repasser votre fichier de conf en HTTPS :

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 pull
git checkout $(git tag | tail -n 1)
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

 

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 !

PS: Voici une petite astuce pour ceux qui n’arriverait pas à activer letsencrypt sur leurs serveurs, une petite commande a ajouter à votre fichier de conf en HTTP:


location ~ /.well-known {
allow all;
root /home/mastodon/live;
}