Après avoir joué un peu avec le Mastodon et docker, j’ai eu envie de le déployer correctement. Je reprends l’article d’Agristan : https://angristan.fr/installer-instance-mastodon-debian-8/
Installation de Node.js
J’ai déjà ma propre installation, j’installe Yarn.
npm install -g yarn
Installation de Redis
apt install redis-server redis-tools
Installation de PostgreSQL
apt-get install postgresql postgresql-contrib
On crée un utilisateur et une base de données :
su - postgres
psql
CREATE USER mastodon CREATEDB;
\q
exit
Création de l’utilisateur Mastodon
On va mettre en place l’environnement de Mastodon avec cet utilisateur.
adduser --disabled-password --disabled-login mastodon
Pour se loger :
su - mastodon
Installation de Ruby
Installation des dépendances (en root) :
apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
Installation de rbenv
On se connecte avec l’utilisateur mastodon
su - mastodon
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
cd ~/.rbenv && src/configure && make -C src
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
On se reconnecte pour prendre en compte le nouvel environnement
exit
su - mastodon
Installation de ruby-build
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Installation de Ruby
rbenv install 2.4.1
Cela peut prendre quelques minutes ou quelques dizaines de minutes suivant la puissance de votre serveur.
Installation de Mastodon
cd ~
git clone https://github.com/tootsuite/mastodon.git live
cd live
Ensuite, on va utiliser la dernière version stable plutôt que le dépôt de développement continuellement mis à jour.
Note : $(git tag | tail -n 1)
est une commande qui récupère automatiquement le dernier tag, c’est à dire le numéro de la dernière version.
git checkout $(git tag | tail -n 1)
Ensuite on installe le reste :
gem install bundler
bundle install --deployment --without development test
bundle install --with development
yarn install
Configuration
Pour la configuration voir plus bas.
Mise en place de la base de données
RAILS_ENV=production bundle exec rails db:setup
Pré-compilation des fichiers CSS et JS
RAILS_ENV=production bundle exec rails assets:precompile
Mise en place des scripts Systemd
Pour fonctionner, Mastodon a besoin de 3 services. Pour pouvoir les gérer facilement, on va utiliser des scripts systemd.
À faire en root.
Processus web
vi /etc/systemd/system/mastodon-web.service
Collez :
[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
Processus en arrière-plan
vi /etc/systemd/system/mastodon-sidekiq.service
Collez :
[Unit]
Description=mastodon-sidekiq
After=network.target
[Service]
Type=simple
User=mastodon
WorkingDirectory=/home/mastodon/live
Environment="RAILS_ENV=production"
Environment="DB_POOL=20"
ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 20 -q default -q mailers -q pull -q push
TimeoutSec=15
Restart=always
[Install]
WantedBy=multi-user.target
Processus pour l’API
vi /etc/systemd/system/mastodon-streaming.service
Collez :
[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 active les services :
systemctl enable /etc/systemd/system/mastodon-*.service
Et on démarre le bazar :
systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
Si vous modifiez la configuration :
systemctl restart mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
Pour vérifier que tout est en route :
systemctl status mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
Mise à jour de Mastodon
Il y a souvent des mises à jour de Mastodon, surtout en ce moment. Pour mettre à jour votre instance, c’est très simple.
Sauvegarder les fichiers et la base de données avant de mettre à jour.
Déjà, une petite mise à jour des paquets ne fait pas de mal :
apt update && apt full-upgrade
On arrête tout :
systemctl stop mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
On récupère les sources, et on met à jour Mastodon, les dépendances Ruby et npm, on régénère les assets et on met à jour la BDD.
Note : $(git tag | tail -n 1)
est une commande qui récupère automatiquement le dernier tag, c’est à dire le numéro de la dernière version.
Aussi, toutes ces commandes ne sont pas forcément nécessaires à chaque fois, mais les exécuter ne vous fera pas de mal 😉 . Je vous recommande de lire les notes de versions avant de mettre à jour.
su - mastodon
cd live
git fetch
git checkout $(git tag | tail -n 1)
bundle install
npm upgrade 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
Et on redémarre tout :
systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service
Mise en place des crons
On édite le crontab :
crontab -e -u mastodon
Et on y ajoute :
@daily cd /home/mastodon/live && RAILS_ENV=production /home/mastodon/.rbenv/shims/bundle exec rake mastodon:daily
Installation du reverse proxy Nginx
On installe Nginx stable depuis les dépôts officiels :
wget -O - https://nginx.org/keys/nginx_signing.key | apt-key add -
echo "deb http://nginx.org/packages/debian/ $(lsb_release -sc) nginx" > /etc/apt/sources.list.d/nginx.list
apt update
apt install nginx
On ajoute la configuration :
nano /etc/nginx/conf.d/mastodon.conf
Et on y met (à adapter, ici c’est pour mstdn.io) :
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name www.mstdn.io mstdn.io;
# On redirige tout en HTTPS
return 301 https://mstdn.io$request_uri;
access_log /dev/null;
error_log /dev/null;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.mstdn.io mstdn.io;
# Ne s'applique pas si vous utilisez un sous-domaine
if ($host = www.mstdn.io) {
return 301 https://mstdn.io$request_uri;
}
access_log /var/log/nginx/mstdn-access.log;
error_log /var/log/nginx/mstdn-error.log;
# HTTPS
ssl_certificate /etc/letsencrypt/live/www.mstdn.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.mstdn.io/privkey.pem;
ssl_protocols TLSv1.2;
ssl_ecdh_curve prime256v1;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_prefer_server_ciphers on;
resolver 80.67.169.12 80.67.169.40 valid=300s;
resolver_timeout 5s;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=15768000";
add_header Referrer-Policy "strict-origin-when-cross-origin";
#Domaine à apdater à la fin
add_header Content-Security-Policy "default-src 'none'; font-src 'self'; media-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' data:; connect-src 'self' wss://mstdn.io; frame-ancestors 'none';";
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;
}
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;
}
error_page 500 501 502 503 504 /500.html;
}
Avec une belle configuration HTTPS inclue. 🙂
Pour que tout ça soit fonctionnel on va générer les certificats correspondants au domaine.