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.6.0

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 v2.7.2
$ gem update --system
$ gem install bundler
$ bundle install --deployment --without development test
$ 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&nbsp:

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 install --deployment --without development test
$ 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
$ 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
Vus : 219
Publié par Zergy : 37