Installer Mastodon sur Debian 9 Stretch
Mastodon est un réseau social se voulant être le pendant libre de Twitter. Voici comment installer son propre service (instance) Mastodon sur Debian 9 Stretch.
Cette documentation est très inspirée du HowTo Mastodon trouvé sur le site Evolix.Installation
Dépôts
Mastodon demande des version récentes de NodeJS et Yarn, cependant, les versions disponibles dans les dépôts Debian sont un peu dépassées (sarcasme), il nous faut donc directement utiliser les dépôts de NodsJS et Yarn afin des versions plus récentes.
# apt -y install curl # curl -sL https://deb.nodesource.com/setup_8.x | bash -E - # curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - # echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list # apt update
Installation des dépendences
On peux à présent installer le reste des dépendances nécessaire au fonctionnement de Mastodon.
Notez que Mastodon est fit pour fonctionner avec le serveur web NGinx, si vous utilisez Apache, il est cependant possible de le faire fonctionner avec mais ce n'est pas officiellement supporté.
# apt install nodejs yarn imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git curl g++ libprotobuf-dev protobuf-compiler pkg-config build-essential libreadline-dev libicu-dev libidn11-dev libssl-dev libjemalloc-dev tmux postgresql postgresql-client libpq-dev postgresql-contrib redis-server nginx-full
Utilisateur
Mastodon demande l'utilisation d'un compte utilisateur dédié.
# addgroup --system mastodon # adduser --gecos "Mastodon" --ingroup mastodon --home /opt/mastodon --disabled-login mastodon
Ruby
Là aussi, la version de ruby présente dans Debian est trop vieille pour Mastodon, il es nécessaire d'en installer une plus récente.
# su -s /bin/bash mastodon $ cd ~ $ git clone https://github.com/rbenv/rbenv.git ~/.rbenv $ cd ~/.rbenv && src/configure && make -C src $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile $ echo 'eval "$(rbenv init -)"' >> ~/.profile $ echo 'export RAILS_ENV="production"' >> ~/.profile $ source ~/.profile $ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build $ cd $ TMPDIR=~/tmp MAKE_OPTS=-j$(nproc) RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 2.7.2
PostgreSQL
Création de l'utilisateur PostgreSQL mastodon, pensez à conserver le mot de passe
# sudo -u postgres createuser mastodon -d -P -R
Mastodon
L'installation se fait via git.
# su -s /bin/bash mastodon $ cd ~ $ git clone https://github.com/tootsuite/mastodon.git $ cd mastodon $ git checkout v3.3.0 $ gem update --system $ gem install bundler $ bundle config set deployment 'true' $ bundle config set without 'development test' $ bundle install $ yarn install --pure-lockfile $ cp .env.production.sample .env.production
Puis on édite le fichier de configuration .env.production
selon nos besoin.
REDIS_HOST=127.0.0.1 REDIS_PORT=6379 DB_HOST=127.0.0.1 DB_USER=mastodon DB_NAME=mastodon_production DB_PASS=PASSWORD DB_PORT=5432 LOCAL_DOMAIN=mastodon.example.com LOCAL_HTTPS=true EMAIL_DOMAIN_WHITELIST=example.com DEFAULT_LOCALE=fr SMTP_SERVER=127.0.0.1 SMTP_PORT=25 SMTP_LOGIN= SMTP_PASSWORD= SMTP_FROM_ADDRESS=mastodon@mastodon.example.com #SMTP_DOMAIN= # defaults to LOCAL_DOMAIN #SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail SMTP_AUTH_METHOD=none SMTP_OPENSSL_VERIFY_MODE=none
Génération des clés d’applications et webpush :
$ echo PAPERCLIP_SECRET=$(bundle exec rake secret) >> .env.production $ echo SECRET_KEY_BASE=$(bundle exec rake secret) >> .env.production $ echo OTP_SECRET=$(bundle exec rake secret) >> .env.production $ bundle exec rake mastodon:webpush:generate_vapid_key >> .env.production
Initialisation de la base de données :
$ SAFETY_ASSURED=1 bundle exec rails db:setup
Compilation des assets :
$ bundle exec rails assets:precompile $ chmod -R u=rwX,g=rwX,o=rX /opt/mastodon/mastodon/public
SystemD
Mastodon utilise trois services SystemD pour fonctionner, il est nécessaire copiez les fichiers ~/mastodon/dist/mastodon-*.service
dans /etc/systemd/system/
puis de les adapter selon vos besoins
Activer les unités SystemD au boot et les démarrer.
# systemctl enable mastodon-{web,sidekiq,streaming} # systemctl start mastodon-{web,sidekiq,streaming}
Crontab
Se connecter avec l'utilisateur mastodon
et et l'ajouter dans son crontab via crontab -e
.
RAILS_ENV=production @daily /opt/mastodon/bin/tootctl media remove --background
NGinx
Créer un virtual host pour NGinx, copiez le fichier ~/mastodon/dist/nginx.conf
dans votre dossier de d'hôtes virtuelles NGinx et adaptez-le à vos beoins.
Exemple de fichier :
map $http_upgrade $connection_upgrade { default upgrade; '' close; } proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g; server { listen 80; listen [::]:80; server_name example.com; root /home/mastodon/live/public; location /.well-known/acme-challenge/ { allow all; } location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; ssl_protocols TLSv1.2; ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; # Uncomment these lines once you acquire a certificate: ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; keepalive_timeout 70; sendfile on; client_max_body_size 80m; root /opt/mastodon/mastodon/public; gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; add_header Strict-Transport-Security "max-age=31536000"; location / { try_files $uri @proxy; } location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) { add_header Cache-Control "public, max-age=31536000, immutable"; add_header Strict-Transport-Security "max-age=31536000"; try_files $uri @proxy; } location /sw.js { add_header Cache-Control "public, max-age=0"; add_header Strict-Transport-Security "max-age=31536000"; 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_set_header Proxy ""; proxy_pass_header Server; proxy_pass http://127.0.0.1:3000; proxy_buffering on; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_cache CACHE; proxy_cache_valid 200 7d; proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; add_header X-Cached $upstream_cache_status; add_header Strict-Transport-Security "max-age=31536000"; 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_set_header Proxy ""; 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; }
Activer ce vhost et redémarrer NGinx.
# cd /etc/nginx/sites-enabled # ln -s ../sites-availables/mastodon.example.com # systemctl restart nginx
Mises à jour
Le principe des mises à jour est basé sur un git pull et un git checkout.
# su -s /bin/bash mastodon $ cd ~ $ cd mastodon $ git fetch $ git checkout $VERSION $ bundle config set deployment 'true' $ bundle config set without 'development test' $ bundle install $ yarn install --pure-lockfile $ bundle exec rails db:migrate $ bundle exec rails assets:precompile $ chmod -R u=rwX,g=rwX,o=rX /opt/mastodon/mastodon/public $ ./bin/tootctl cache clear $ exit # systemctl restart mastodon-*.service
Pensez à lire les notes de versions.
Procéder comme suit si une mise à jour de Ruby est nécessaire :
# su -s /bin/bash mastodon $ cd ~ $ cd .rbenv/plugins/ruby-build/ $ git pull $ cd - $ TMPDIR=~/tmp MAKE_OPTS=-j$(nproc) RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install $RUBY_VERSION $ cd mastodon $ gem update --system
Trucs & astuces
Restreindre l’inscription à certains domaines de messagerie
EMAIL_DOMAIN_WHITELIST=example.com|example.org
Journaux
Mastodon utilise les logs standards, ils est donc possible de les consulter avec journalctl -u mastodon-web
(ou mastodon-sidekiq
ou mastodon-streaming
).
Passer un utilisateur en admin
Éditez le fichier .env.production
.
~/mastodon$ bundle exec rails mastodon:make_admin USERNAME=jdoe Congrats! jdoe is now an admin. o/
Passer l'instance en mono-utilisateur
Il est possible de passer une instance en mono-utilisateur si vous désirez être le seul à l'utiliser. Après vous êtes inscrit dessus et avoir confirmé votre compte, éditez le fichier .env.production
et décommentez la ligne SINGLE_USER_MODE=true.
# Registrations # Single user mode will disable registrations and redirect frontpage to the first profile SINGLE_USER_MODE=true
Puis, redémarrez Mastodon
# systemctl restart mastodon-*.service
La commande tootctl
La commande tootctl
permet de gérer Mastodon en lignes de commande, elle se trouve – dans notre cas dans – /opt/mastodon/mastodon/bin/
et doit être exécutée avec l'utilisateur mastodon
.
- Supprimer les diplicatats dans la base de données :
$ tootctl maintenance fix-duplicates
Attention, opération potentiellement destructrice, arrêtez les services de mastodon et faite une sauvegarde de votre base de données avant de l'exécuter.This task will take a long time to run and is potentially destructive. Please make sure to stop Mastodon and have a backup. Continue? (y/n)
- Vider le cache :
$ tootctl cache clear