Mastodon

On a pas mal parlé de fédiverse ces derniers temps et de mastodon en particulier.
J’avais ouvert un compte sur une instance en 2017 (https://oc.todon.fr/web/@huy) mais je n’avais jamais vraiment exploré mais avec l’afflux de gens intéressants que je lisais ailleurs, je me suis dis pourquoi ne pas héberger une instance mastodon sur une zone smartos.
Par chance, Jonathan Perkin a eu la même idée et m’a pas mal mâché le travail sur la liste de diffusion :

https://smartos.topicbox.com/groups/smartos-discuss/T039f2e74b8897c3f-M1d8b8246552234e8fb2d6883/mastodon-server

Les instructions concernent l’installation de la version 3.5.5 à partir des sources et la 4.0.2 est sortie peu de temps après mais ça ne change pas fondamentalement. J’ai quand même rencontré un problème avec le fichier yarn.lock résolu en le supprimant et en relançant yarn install --pure-lockfile. Je l’ai récupéré ensuite avec git restore yarn.lock.

Pour afficher les images et les vidéos, il faudra également installer les paquets ImageMagick-7.1.0.51nb1 et ffmpeg5-5.1.2nb2 comme indiqué dans la documentation :

https://docs.joinmastodon.org/admin/install/

Pour que l’instance soit joignable depuis le reste du monde, j’ai utilisé relayd sur la passerelle OpenBSD qui récupère également les certificats letsencrypt avec acme-client :

domain toot.huynguyen.org {
        domain key "/etc/ssl/private/toot.huynguyen.org.key"
        domain full chain certificate "/etc/ssl/toot.huynguyen.org.fullchain.pem"
        sign with letsencrypt
}

Le fichier de configuration de relayd :

ext_addr = 192.168.1.11
table <toot> { 192.168.111.165 }

# TLS proxy all home services
http protocol "httpsproxy" {
    tcp {nodelay, sack, backlog 128}

    match header set "X-Forwarded-For" \
        value "$REMOTE_ADDR"
    match header set "X-Forwarded-By" \
        value "$SERVER_ADDR:$SERVER_PORT"
    match header set "Keep-Alive" value "$TIMEOUT"

    match response header remove "Server"
    match response header set "X-Frame-Options" \
        value "SAMEORIGIN"
    match response header set "X-XSS-Protection" \
        value "1; mode=block"
    match response header set "X-Content-Type-Options" \
        value "nosniff"
    match response header set "Referrer-Policy" \
        value "strict-origin"
    match response header set "Strict-Transport-Security" \
        value "max-age=31536000; includeSubDomains"
    match response header set "Permissions-Policy" \
        value "accelerometer=(none), camera=(none), \
        geolocation=(none), gyroscope=(none), \
        magnetometer=(none), microphone=(none), \
        payment=(none), usb=(none), \
        ambient-light-sensor=(none), autoplay=(none)"

    pass request quick header "Host" value "toot.huynguyen.org" \
        forward to <toot>
    block
    tls keypair "toot.huynguyen.org"
}

relay "reverseproxy" {
    listen on $ext_addr port 443 tls
    protocol httpsproxy
    forward with tls to <toot> port 443 check https "/@huy" code 200
}