Depuis plusieurs semaines je grappille ici et là des informations sur mastodon, dans le but d’installer ma propre instance. Maintenant que j’ai terminé j’ouvre cet article afin d’y regrouper toutes mes trouvailles.

Voici le fruit des mes recherches.

Installation des dépendances

sudo apt -y install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev nginx redis-server redis-tools postgresql postgresql-contrib letsencrypt yarn libidn11-dev libicu-dev

Installation de Docker-ce

sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common sudo curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" sudo apt update sudo apt install docker-ce sudo groupadd docker sudo usermod -aG docker $USER

Installation de Docker-compose

sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/bin/docker-compose sudo chmod +x /usr/bin/docker-compose

Déploiement de l’image

Rien de bien compliquer. Je clone le dépôt git de mastodon dans le dossier /srv

cd /srv sudo git clone https://github.com/tootsuite/mastodon.git cd mastodon

Pour une utilisation en production il faut activer les données persistantes pour postgresql et redis. Il suffit de dé-commenter les lignes volume dans le docker-compose.yml comme suit :

db: restart: always image: postgres:alpine volumes: - ./postgres:/var/lib/postgresql/data redis: restart: always image: redis:alpine volumes: - ./redis:/data

Je copie ensuite le fichier exemple pour la configuration de mastodon.

sudo cp .env.production.sample .env.production

Je procède ensuite à la compilation de l’image.

docker-compose build

L’image est maintenant compilée, passons à la configuration.

Configuration

Tout ce passe dans le fichier .env.production.

sudo nano .env.production

Nom de domaine de l’instance et activation de ssl fortement recommandé.

LOCAL_DOMAIN=toot.draconis.me LOCAL_HTTPS=true

Je définis la langue par défaut.

DEFAULT_LOCALE=fr

Configuration du serveur smtp pour l’envoi des courriels admin et  les activation de comptes. J’utilise l’adresse courriel fournit avec mon nom de domaine.

SMTP_SERVER=serveir smtp SMTP_PORT=587 SMTP_LOGIN=no-reply@draconis.me SMTP_PASSWORD=password SMTP_FROM_ADDRESS=no-reply@draconis.me

Pour terminer la configuration il faut générer trois clés avec la commande :

docker-compose run --rm web rake secret

Chaque clé sera de cette forme :

d250201baf31243159865836db1826b8cf1d442ea5cc37119908cadde0d160b3f248b6e47a8035c62d7fd9538fb3a5bcec6bc808040bc4995426a5c27b230420

Il faut ensuite les lignes suivantes, il faut une clé par ligne.

PAPERCLIP_SECRET= SECRET_KEY_BASE= OTP_SECRET=

Activation de l’image docker

Création de la base donnée.

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

Pré-compilation des fichiers CSS et JS.

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

Démarrage de l’instance en tant que démon.

docker-compose up -d

L’instance est maintenant prête et fonctionnelle. Pour plus de commodités je place nginx en tant que reverse proxy.

Configuration du reverse proxy Nginx

sudo nano /etc/nginx/conf.d/mastodon.conf

map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; #listen [::]:80; server_name toot.draconis.me; location /.well-known/acme-challenge/ { allow all; } location / { return 301 https://$host$request_uri; } access_log /dev/null; error_log /dev/null; } server { listen 443 ssl http2; #listen [::]:443 ssl http2; server_name toot.draconis.me; access_log /var/log/nginx/mstdn-access.log; error_log /var/log/nginx/mstdn-error.log; # HTTPS ssl_certificate /etc/letsencrypt/live/toot.draconis.me/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/toot.draconis.me/privkey.pem; ssl_protocols TLSv1.2; ssl_ecdh_curve prime256v1; ssl_ciphers EECDH+AESGCM:EECDH+AES; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_dhparam /etc/nginx/ssl/dhparam2.pem; add_header Strict-Transport-Security 'max-age=15768000; includeSubDomains; preload'; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy "strict-origin-when-cross-origin"; add_header Content-Security-Policy "frame-ancestors 'none'; object-src 'none'; script-src 'self'; base-uri 'none';"; keepalive_timeout 70; sendfile on; client_max_body_size 0; root /home/mastodon/live/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; 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; }

Avant de lancer nginx il me faut forger le dhparam. Cela peu prendre plusieurs minutes.

sudo test -d /etc/nginx/ssl || mkdir -p /etc/nginx/ssl sudo nice openssl dhparam -out /etc/nginx/ssl/dhparam2.pem 4096

Puis générer les certificats avec let’sencrypt et enfin démarrer nginx

sudo apt install letsencrypt sudo letsencrypt certonly -d toot.draconis.me --agree-tos -m admin@draconis.me --rsa-key-size 4096 --standalone sudo service nginx start

Mon instance est disponible ! Rendez-vous à la page d’accueil https://mastoc.fr pour la création de mon compte et lui donner les droits d’administration.

sudo docker-compose run --rm web rake mastodon:make_admin USERNAME=draconis Congrats! draconis is now an admin. \o/ Navigate to https://toot.draconis.me/admin/settings to get started

https://mastoc.fr/admin permet d’accéder à l’interface d’administration qui permettra de modérer, de personnaliser la page /about/more, d’accéder à une interface pour Sidekiq/PGSQL.

Pour terminer je rajoute une tâche cron pour gérer les souscriptions PuSH et entre autres d’alléger l’instance.

sudo crontab -e @daily docker-compose run --rm mastodon-web rake mastodon:daily

Le travail est maintenant terminé il n’y a plus qu’a profiter.

Conclusion

Il faut maintenant interagir avec d’autres personnes  pour augmenter le nombre d’instances vues. Et comme dirait l’autre y a plus qu’à tooter !

Sources :

https://psychedeli.cat/mastodon/

https://cloud.zaclys.com/Mastodon-config-nginx,p167,528

https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Docker-Guide.md

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