/home/zergy

There are no place like ::1 (Oui, ici, on est moderne, on utilise IPv6)

Installer Mastodon sur Debian 9 Stretch

Rédigé par Zergy Aucun commentaire

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

# adduser --gecos "Mastodon" --home /var/lib/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.

# sudo -iu 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
$ echo 'export RAILS_ENV="production"' >> ~/.bash_profile
$ source ~/.bash_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.5.3

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.

# sudo -iu mastodon
$ git clone https://github.com/tootsuite/mastodon.git
$ cd mastodon
$ git checkout v2.6.1
$ 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 /var/lib/mastodon/mastodon/public

SystemD

Mastodon utilise trois services SystemD pour fonctionner, il est nécessaire de créer dans /etc/systemd/system/ les fichiers suivants :

  • mastodon-web.service
  • mastodon-sidekiq.service
  • mastodon-streaming.service
mastodon-web.service
[Unit]
Description=mastodon-web
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/var/lib/mastodon/mastodon
Environment="RAILS_ENV=production"
Environment="PORT=3000"
ExecStart=/var/lib/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb
ExecReload=/bin/kill -SIGUSR1 $MAINPID
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target
mastodon-sidekiq.service
[Unit]
Description=mastodon-sidekiq
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/var/lib/mastodon/mastodon
Environment="RAILS_ENV=production"
Environment="DB_POOL=5"
ExecStart=/var/lib/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target
mastodon-streaming.service
[Unit]
Description=mastodon-streaming
After=network.target

[Service]
Type=simple
User=mastodon
WorkingDirectory=/var/lib/mastodon/mastodon
Environment="NODE_ENV=production"
Environment="PORT=4000"
ExecStart=/usr/bin/npm run start
TimeoutSec=15
Restart=always

[Install]
WantedBy=multi-user.target

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 cd /var/lib/mastodon/mastodon && /var/lib/mastodon/.rbenv/shims/bundle exec rake mastodon:media:remove_remote

NGinx

Créer un virtual host pour NGinx. Celui présenté ce dessous utiliser Let's Encrypt, à adapter selon vos besoins.

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  # Useful for Let's Encrypt
  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;

  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 0;

  root /var/lib/mastodon/mastodon/public;

  gzip on;
  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 ~ ^/(packs|system/media_attachments/files|system/accounts/avatars) {
    add_header Cache-Control "public, max-age=31536000, immutable";
    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 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_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.

# sudo -iu mastodon
$ 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 /var/lib/mastodon/mastodon/public
$ exit
# systemctl restart mastodon-*.service

Pensez à lire les notes de versions.

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

Les commentaires sont fermés.

Fil RSS des commentaires de cet article