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.