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.