Migration d'une instance Mastodon

Pourquoi migrer mon instance Mastodon ?

Une semaine après l’installation de ma première instance Mastodon, il est déjà temps de migrer. Mais la raison n’est pas le besoin de plus de ressources pour l’instance.

Non, c’est plutôt que je n’était pas totalement satisfait de ma première installation, et que je rencontrais certains bugs récurrents dont je ne trouvais pas la source.
Donc je me suis dit, autant refaire une installation propre maintenant que je connais bien l’outil.
Premier point, je suis passé de Ubuntu 16.04 LTS à Debian 8.7, principalement pour bénéficier des packages de dotdeb.org dont notamment redis-server en v3.2.8 contre v3.0.6 sur Ubuntu. Et pour simplifier un petit peu l’installation, j’ai utilisé EasyEngine pour mettre en place nginx et redis.
Le principal avantage de EasyEngine est qu’il permet d’organiser très proprement les fichiers de configuration de Nginx avec une nomenclature claire et simple.
Je suis également passer de Cloudflare à Let’s Encrypt notamment pour bénéficier d’un meilleur chiffrement et de plus d’options sur les headers Nginx.

Préparer le nouveau serveur

Pour la migration il vous faut exporter la base de donnée postgresql et faire une copie du dossier /home/mastodon. Pour cela il faudra arrêter tous les services de mastodon et avoir préalablement préparé le nouveau serveur. Pour cela commençons par réinstaller ce qui est nécessaire pour Mastodon.

Installation des dépendances

echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
apt-get update
apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl

Installation de NodeJS

curl -sL https://deb.nodesource.com/setup_4.x | bash -
apt-get install nodejs
npm install -g yarn

Installation de PostgreSQL (en v9.6 via les backports) et création de l’utilisateur mastodon, avec un mot de passe et de la base de donnée mastodon_production

apt-get -t jessie-backports install postgresql postgresql-contrib
su - postgre
psql
CREATE USER mastodon CREATEDB;
ALTER USER "mastodon" WITH PASSWORD 'new_password';
CREATE DATABASE mastodon_production OWNER mastodon;
\q
exit

Pour l’installation de Nginx et Redis, comme dit précédemment, j’ai utilisé EasyEngine, on installe donc d’abord EE :

wget -qO ee rt.cx/ee && bash ee

Et on installe Nginx et Redis :

ee stack install --nginx --redis

Installation des dépendances pour Ruby :

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

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

Il faut alors se déconnecter puis se reconnecter en tant que mastodon pour appliquer les modifications faites au bash

exit
su - mastodon

On installe ruby-build

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

Puis on installe Ruby, en version 2.4.1 désormais

rbenv install 2.4.1
rbenv global 2.4.1

On peut désormais remettre en place la configuration de Nginx avant de commencer la migration.
Mise en place des services :

wget https://git.virtubox.net/virtubox/mastodon/raw/master/services/mastodon-web.service -O /etc/systemd/system/mastodon-web.service
wget https://git.virtubox.net/virtubox/mastodon/raw/master/services/mastodon-streaming.service -O /etc/systemd/system/mastodon-streaming.service
wget https://git.virtubox.net/virtubox/mastodon/raw/master/services/mastodon-sidekiq.service -O /etc/systemd/system/mastodon-sidekiq.service

Pour créer le virtualhost avec EasyEngine :

ee site create votredomaine.com

Vous pouvez ensuite editer /etc/nginx/sites-availables/votredomaine.com, en se basant sur le modèle d’Angristan

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;

}

Transfert des données depuis l’ancien serveur

A partir de là, cette fois on ne clone pas le dépôt Github puisque l’on veut réutiliser l’installation précédente. Pour réaliser la copie depuis le serveur précédent, il faut tout d’abord arrêter les services de mastodon sur l’ancien serveur:

systemctl stop mastodon* redis

On dump ensuite l’ancienne base de donnée :

pg_dump mastodon_production > fichier_de_sortie

Pour les fichier, j’ai simplement zippé le dossier /home/mastodon avant de le transférer sur le nouveau serveur avec scp.

zip backupmaston -r /home/mastodon

Pourquoi ne pas utiliser rsync ? Car lors de l’extraction du zip, il est facile de ne pas écraser les fichiers déjà présent, notamment pour rbenv et rbenv-build en utilisant “N” lorsque le programme unzip nous demande ce que l’on souhaite faire.
Pour importer la base de donnée après le transfert sur le nouveau serveur :

su - postgre
psql mastodon_production < fichier_d_entree
exit

Ne pas oublier après le transfert de vérifier les propriétaires des fichiers dans /home/mastodon, ne pas hésiter à faire :

chown -R mastodon:mastodon /home/mastodon

Il faut également penser à copier votre certificat Let’s Encrypt

Relancer mastodon après le transfert

Ne pas oublier de modifier le fichier .env.production avec le mot de passe postgreSQL notamment.
Pour relancer mastodon, cela se déroule comme une mise à jour si ce n’est que l’on installe bundler

su - mastodon
cd live
gem install bundler --no-ri
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

Puis activer et démarrer les services :

systemctl enable /etc/systemd/system/mastodon-*.service
systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Mise en place des crons

crontab -e -u mastodon

Et ajouter les lignes

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

Voilà ! Vous pouvez désormais changer vos DNS pour pointer votre domaine vers le nouveau serveur.
N’hésitez pas à me signaler d’éventuelles erreurs en commentaire ou à proposer des améliorations.

Si vous souhaitez mettre en place une architecture basée sur plusieurs serveurs, je vous recommande l’article matuni.xyz.

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