Installation de Mastodon

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.

 

 

Déployer une instance Mastodon sur Docker

Mastodon est un réseau social de micro-blogging libre et décentralisé. Il est une bonne alternative à Twitter. Voici comment tester un peu ses possibilités.

Prérequis

Avoir installé Docker.

Installation

Pour faire simple (bien que brutal) cloner le dépôt Github du projet.

$ git clone https://github.com/tootsuite/mastodon.git

Ensuite copier et éditer le fichier de configuration.

$ cp .env.production.sample .env.production

L’éditer et remplir les champs suivants :

LOCAL_DOMAIN= # d'abord remplis avec localhost j'ai ensuite laissé vide parce que mon instance est locale (pour mes tests)
LOCAL_HTTPS=false # true si certificat

Pour la configuration SMTP utiliser Mailgun ou tout autre serveur SMTP.

SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=toto
SMTP_PASSWORD=1234
SMTP_FROM_ADDRESS=notifications@example.com
SMTP_DOMAIN=example.com

Ajouter l’option SMTP_DOMAIN ce qui vous évitera des heures de recherches.

Lancer ensuite un build

docker-compose build

Puis générer la clé secrète

docker-compose run --rm web rake secret

Si tout ce passe bien recopier la clé dans le fichier .env.production

Créer la base de données

docker-compose run --rm web rails db:migrate

Et compiler les assets

docker-compose run --rm web rails assets:precompile

Vous pouver lancer le monstre :

docker-compose up

Ou en mode démon :

docker-compose up -d

Connectez vous sur le port 3000 : http://localhost:3000

Exemple Configuration
# Service dependencies
REDIS_HOST=redis
REDIS_PORT=6379
DB_HOST=db
DB_USER=postgres
DB_NAME=postgres
DB_PASS=
DB_PORT=5432

# Federation
LOCAL_DOMAIN=
LOCAL_HTTPS=false



# Application secrets
# Generate each with the `rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=
SECRET_KEY_BASE=<secret>
OTP_SECRET=

# Registrations
# Single user mode will disable registrations and redirect frontpage to the first profile
# SINGLE_USER_MODE=true
# Prevent registrations with following e-mail domains
# EMAIL_DOMAIN_BLACKLIST=example1.com|example2.de|etc
# Only allow registrations with the following e-mail domains
# EMAIL_DOMAIN_WHITELIST=example1.com|example2.de|etc

# Optionally change default language
DEFAULT_LOCALE=fr

# E-mail configuration
# Note: Mailgun and SparkPost (https://sparkpo.st/smtp) each have good free tiers
SMTP_SERVER=smtp.mailgun.org
SMTP_PORT=587
SMTP_LOGIN=
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=notifications@example.com
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
#SMTP_AUTH_METHOD=plain
#SMTP_OPENSSL_VERIFY_MODE=peer
#SMTP_ENABLE_STARTTLS_AUTO=true

# Optional asset host for multi-server setups
# CDN_HOST=assets.example.com

# S3 (optional)
# S3_ENABLED=true
# S3_BUCKET=
# AWS_ACCESS_KEY_ID=
# AWS_SECRET_ACCESS_KEY=
# S3_REGION=
# S3_PROTOCOL=http
# S3_HOSTNAME=192.168.1.123:9000


# S3 (Minio Config (optional) Please check Minio instance for details)
# S3_ENABLED=true
# S3_BUCKET=
# AWS_ACCESS_KEY_ID=
# AWS_SECRET_ACCESS_KEY=
# S3_REGION=
# S3_PROTOCOL=https
# S3_HOSTNAME=
# S3_ENDPOINT=

# Optional alias for S3 if you want to use Cloudfront or Cloudflare in front
# S3_CLOUDFRONT_HOST=


# Streaming API integration
# STREAMING_API_BASE_URL=


# Advanced settings
# If you need to use pgBouncer, you need to disable prepared statements:
# PREPARED_STATEMENTS=false
Administration

Créer un utilisateur avec l’interface de création de compte et le définir comme administrateur.

docker-compose run --rm web rails mastodon:make_admin USERNAME=<user>

 

Sources

https://angristan.fr/installer-instance-mastodon-debian-8/

https://blog.lertsenem.com/creer-son-instance-mastodon-perso-vite-fait-mal-fait-fr.html

https://github.com/tootsuite/mastodon

https://korben.info/synchroniser-mastodon-twitter.html