Déployer une instance Mastodon en 5 minutes avec Docker

published on April 4, 2017, 9:09 p.m. by eliotberriot | 0

Vous le savez peut-être, il y a une hype grandissante autour de Mastodon depuis quelques jours / heures.

Si vous ne connaissez pas, Mastodon est une alternative à Twitter libre, open-source et décentralisée : pour rejoindre le réseau, il faut vous inscrire sur une instance (un peu comme les "Pod" de Diaspora*). Une instance peut accueillir un nombre illimité d'utilisateur et communiquer avec d'autres instances.

Certaines instances publiques sont mises à disposition, telles que https://mastodon.xyz ou https://mastodon.social. Cependant, la philosophie derrière ce type d'outils est de déployer sa propre instance lorsque c'est possible pour rendre l'ensemble du réseau plus résistant et plus décentralisé, tout en allégeant la charge sur les instances publiques les plus grosses.

Un tutoriel pas à pas à été publié par @angristan pour installer le tout sur Debian 8, mais si vous êtes comme moi pressé et peu désireux d'encombrer votre système avec des dépendances, des serveurs de base de données, de cache et autres joyeusetés, il est très facile de déployer votre propre instance avec Docker et docker-compose.

Installation d'une instance Mastodon

Je pars du principe que vous avez docker et docker-compose d'installé. La configuration que je vous propose est en reverse proxy, avec Nginx devant Mastodon, afin que vous puissiez servir d'autres sites sur les ports 80 et 443 de votre serveur.

Sur le serveur ou vous souhaitez installer l'instance en question, rendez-vous dans le dossier /srv.

Clonez le dépôt Git de Mastodon:

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

Placez vous dans le dossier nouvellement créé:

cd /srv/mastodon

Créez le fichier d'environnement:

cp .env.production.sample .env.production

Lancez le build:

docker-compose build

Créez les secrets nécessaires pour faire fonctionner Mastodon. Il en faut trois, donc exécutez trois fois la commande suivante et conservez les résultats dans un fichier à part:

docker-compose run --rm web rake secret

Éditez le fichier d'environnement:

nano .env.production

Éditez-le en fournissant les valeurs adéquates. Le fichier est globalement bien commenté en lui même, les valeurs indispensables aux fonctionnement de l'instance sont:

LOCAL_DOMAIN=example.com -> vers votre domaine personnel, par exemple mastodon.mondomaine.com
PAPERCLIP_SECRET=un des secrets générés précédemment
SECRET_KEY_BASE=un des secrets générés précédemment
OTP_SECRET=un des secrets générés précédemment

par défaut, dans le docker-compose.yml, l'application et le serveur de streaming écoutent sur les ports 3000 et 4000. Si ces ports sont déjà occupés sur votre serveur, éditez le fichier et remplacez par des ports plus adaptés.

Créez la base de données:

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

Compilez les fichiers statiques:

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

Vous devriez maintenant pouvoir lancer votre instance avec:

docker-compose up -d

Les logs sont visibles via:

docker-compose logs -f

Mise en place du reverse proxy

Si la partie précédente s'est bien passée, votre instance est accessible sur le port 3000 de votre serveur. Cependant, ce n'est pas très pratique pour un usage quotidien, donc nous allons mettre utiliser un reverse proxy, qui recevra les connexions sur les ports 80 et 443 (si vous utilisez https) et redirigera en interne les connexions vers votre instance Mastodon.

Notez qu'il est possible de faire la même chose avec un autre serveur web, comme Apache.

Si vous n'avez pas Nginx d'installé, sous Debian et Ubuntu, vous pouvez faire:

apt-get install nginx

Le dépôt Git de Mastodon fournit ensuite le fichier virtualhost à utiliser pour faire fonctionner le reverse proxy. Il vous suffit d'éditer /etc/nginx/conf.d/mastodon.conf et d'y placer ceci:

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

server {
    # on redirige les requêtes en clair vers le HTTPS
    listen         80;
    server_name    mastodon.mondomaine.com;
    return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;

    # à remplacer
    server_name mastodon.mondomain.com;

    # à remplacer par votre propre certificat ssl
    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;
    gzip off;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    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;
        # si vous avez éditez les ports dans le docker compose, il faut reflêter ce changement ici
        proxy_pass http://localhost: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;
        # si vous avez éditez les ports dans le docker compose, il faut reflêter ce changement ici
        proxy_pass http://localhost: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;
}

Vérifiez que la configuration est bien valide avec nginx -t, puis redémarrez votre serveur nginx avec service nginx restart. Normalement, votre instance Mastodon devrait être accessible via https://mastodon.mondomaine.com (il faudra bien entendu rajouter les entrées DNS correspondante).

0 comments

publish