-->

Vous êtes ici : accueil » article » Installer Mastodon sous FreeBSD (sans le port)

Installer Mastodon sous FreeBSD (sans le port)

Rédigé par Gérald Niel - - 3 commentaires

Si vous ne savez pas ce qu'est Mastodon, je vous invite à aller lire mon petit billet à ce sujet.

En novembre 2017, lorsque m'est venu l'idée de monter une instance Mastodon sur Freebsd, le premier réflexe a donc été de rechercher dans mes moteurs de recherche favori les mots clefs #Mastodon et #FreeBSD. Et je suis tombé sur ces pages :

Heureuse surprise de découvrir qu'il existait un port FreeBSD et qu'en un coup de pkg install mastodon il n'y avait pratiquement plus rien d'autre à faire. J'ai utilisé le port de la version 1.4.0 à la version 2.3.3 de Mastodon, sans problèmes ni bugs.
Au passage un grand merci à Joseph Mingrone pour le boulot. Nous allons d'ailleurs en réutiliser une partie.

Cependant le port n'est désormais plus maintenu, trop de complications visiblement à chaques mises à jour de l'arbre des ports FreeBSD ou de Mastodon. En l'occurence, le port est "cassé" si on suit la branche "latest" des paquets car Mastodon de fonctionne pas (encore ?) avec Node 10. Le port est donc resté figé à la version 2.3.3 de Mastodon.
Il faut donc trouver une autre solution… et se retrousser les manches…

Nous allons partir du principe dans ce qui suit que vous savez installer/configurer/administrer un système FreeBSD, que vous savez configurer/installer les prisons (jails) et que vous savez configurer redis et postgresql.
Et que donc vous avez un système ou une jail avec le réseau fonctionnel.

Pour ma part, l'instance Mastodon tourne dans une jail dédiée, avec son IP locale sur lo1, le réseau IPV4 des prisons étant 10.0.0.0/8. L'ip de la jail est 10.0.0.100, à vous d'adapter en fonction de votre configuration.
Le service dispose d'une IPV4 et une IPV6 publiques dédiées aussi.
Nous ferons tourner nginx, postgresql, redis sur la même "machine".

Installation des dépendances

En premier lieu, avant de commencer, il faut aller lire les documentations officielles, l'installation ou la mise à jour de Mastodon sous FreeBSD ne diffère pas tant que ça de l'installation et configuration sous Debian. Et en particulier :

  • Mastodon Production Guide
  • Migration Guide (si vous avez déjà une instance Mastodon installée avec le port, dans ce cas il est préférable de monter une nouvelle instance dans une jail toute neuve).
  • Updating Mastodon (pour les futures mises à jour, et si vous migrez de la 2.3.3 vers la dernière 2.4.1 à la date de rédaction de ce billet).

Sur la jail fraichement installée et démarée, on commence par installer le minimum (je suis habitué à bash) :

# pkg install bash sudo

Ceci fait on peut lancer bash, ou redémarer la prison. Et installer l'ensemble des dépendances nécéssaire.
Attention, comme vu plus haut, Mastodon ne fonctionne pas avec Node 10, il est donc impératif de rester en quarterly pour les paquets, surtout ne pas modifier /etc/pkg/FreeBSD.conf pour passer en latest.

# pkg install git imagemagick-nox11 ffmpeg libxml2 \
libxslt gcc protobuf pkgconf autoconf automake gmake bison python \
readline ncurses openssl libyaml icu libffi gdbm libidn redis \
postgresql95-server postgresql95-contrib postgresql95-client \
ruby ruby24-gems rubygem-bundler \
node yarn npm nginx dehydreated

Concernant Ruby, il est impératif de ne rien installer d'autre au risque de conflit entre les gem installés au niveau du système et ceux pour l'application.
Il est possible d'installer le paquet ruby25 (qui est la version de ruby officiellement supportée par Mastodon), cependant il faudra installer rybygem et le bundler depuis les sources. À vous de voir…
Installer Ruby via les sources pour l'utilisateur de l'application n'est pas une bonne idée, il y a alors un problème avec la librairie protobuf. Cf. l'issue #3057 sur le github de Mastodon ou celle-ci sur le github de cld3-ruby. Je n'ai pas trouvé de solution au problème avec une installation de ruby dans le répertoire de l'utilisateur mastodon en suivant la doc officielle.

Une foi les dépendances installées, créons l'utilisateur (j'ai gardé l'uid de l'utilisateur créé à l'installation du port) :

# pw useradd -n mastodon -u 144 -c "Mastodon User" -m -d /usr/local/www/mastodon -s /usr/local/bin/bash

Concernant le répertoire de l'utilisateur, libre à vous de modifier et d'utiliser /home/mastodon, ou /var/www/mastodon, tout dépend de l'organisation du système. Dans la logique de FreeBSD, j'ai choisi d'utiliser /usr/local/www comme racine.

Installation de Mastodon (Ruby & NodeJS)

On va désormais scrupuleusement suivre la documentation officielle :

# su - mastodon
$ git clone https://github.com/tootsuite/mastodon.git live
$ cd ~/live
$ git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
$ bundle install -j$(getconf NPROCESSORS_ONLN) --deployment --without development test
$ yarn install --pure-lockfile
$ exit

Pour l'instant rien d'autre, nous allons nous occuper de PostgreSQL, de la configuration de Nginx et des scripts de démarrage avant de configurer la suite.

PosgreSQL

On part du principe que vous avez initialisé la base de donnée post installtion du paquet (service postgresql initdb) et que vous avez éventuellement modifié la configuration pour autoriser les connexions depuis l'ip de la jail ou pour utiliser une socket unix.
Il faut aller éventuellement modifier (le chemin dépend de la version de postgresql installé) /var/db/postgres/data95/pg_hba.conf et /var/db/postgres/data95/postgresql.conf.

En tant que root :

# psql -d template1 -U pgsql -c "CREATE USER mastodon CREATEDB;"

ou

# sudo -u pqsql psql
pgsql=# CREATE USER mastodon CREATEDB;
pgsql=# \q

Attention, si vous avez installé les ports postgresql96-* l'utilisateur est postgres et non pgsql.
Et si la jail a ses IP publiques exposées et n'est pas uniquement avec les IP du réseau local sur lo1, il est nécéssaire de spécifier l'hôte. La connexion a localhost ne fonctionne alors pas.

Autre point important compte tenu de ce que j'indique ci-dessus, si vous comptez mettre à jour de la 2.3.3 vers la 2.4.1 en migrant dans une nouvelle jail, impératif d'installer la même version de postgresql, à savoir postgresql95-*.

Dans le cas où vous migrer de la version 2.3.3 installé via les port dans une autre jail, depuis l'hôte le répertoire contenant la bdd peut être copié de l'ancienne jail vers la nouvelle jail.
Ne pas oubler de modifier la configuration pour être en phase avec le réseau de la nouvelle jail.

Configuration de Nginx

Pour la configuration de Nginx nous allons nous inspirer de ce qui existait pour le port et placer la configuration de nginx dans le répertoire de l'utilisateur mastodon (/usr/local/www/mastdon pour ma configuration).
Ce n'est pas fondamentalement différent de la documentation officielle.

Mon instance (https://stoneartprod.xyz) tourne dans une jail dont l'ipv4 est 10.0.0.100, à adpater en fonction.
J'utilise Let's Encrypt et le port dehydrated pour gérer les certificats SSL.

# su - mastodon
$ ee nginx.conf

worker_processes 2;
error_log /var/log/httpd-error.log;
user www www;

events
{
    worker_connections 1024;
}

http
{
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/httpd-access.log;
    default_type application/octet-stream;
    include /usr/local/etc/nginx/mime.types;
    index index.html
    keepalive_timeout 65;
    gzip on;
    sendfile on;

    include /usr/local/www/mastodon/nginx-include.conf;

}
$ ee nginx-include.conf

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

server {
    listen 80;
    listen [::]:80;
    server_name stoneartprod.xyz www.stoneartprod.xyz mastodon.stoneartprod.xyz;
    root /usr/local/www/mastodon/live/public;

    # Redirect LetsEncrypt to dehydrated
        location ^~ /.well-known/acme-challenge {
            auth_basic "off";
            alias /usr/local/www/dehydrated;
        }

    location / {
        return 301 https://stoneartprod.xyz$request_uri;
    }    
}

server {
    listen 443 ssl http2;  
    listen [::]:443 ssl http2;

    server_name www.stoneartprod.xyz mastodon.stoneartprod.xyz;

    rewrite ^(.*) https://stoneartprod.xyz$1 permanent;
    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 /usr/local/etc/dehydrated/certs/stoneartprod.xyz/fullchain.pem;
    ssl_certificate_key /usr/local/etc/dehydrated/certs/stoneartprod.xyz/privkey.pem;
# generate with openssl dhparam 2048 > /path/to/dhparam.pem
    ssl_dhparam /usr/local/etc/dehydrated/certs/dhparam.pem;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name stoneartprod.xyz;
    
    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 /usr/local/etc/dehydrated/certs/stoneartprod.xyz/fullchain.pem;
    ssl_certificate_key /usr/local/etc/dehydrated/certs/stoneartprod.xyz/privkey.pem;
# generate with openssl dhparam 2048 > /path/to/dhparam.pem
    ssl_dhparam /usr/local/etc/dehydrated/certs/dhparam.pem;
    keepalive_timeout    70;
    sendfile             on;
    client_max_body_size 0;

    root /usr/local/www/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;

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

    location / {
        try_files $uri @proxy;
    }

    location /sw.js {
        add_header Cache-Control no-cache;
        add_header Pragma "no-cache";
    }

    location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
        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://10.0.0.100: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://10.0.0.100: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;
    }

    # Redirect LetsEncrypt to dehydrated
    location ^~ /.well-known/acme-challenge {
        auth_basic "off";
        alias /usr/local/www/dehydrated;
    }

    error_page 500 501 502 503 504 /500.html;
}

Dans /etc/rc.conf :

nginx_enable="YES"
nginx_profiles="mastodon"
nginx_mastodon_configfile="/usr/local/www/mastodon/nginx.conf"

Démarrage des services

Pour gérer le démarrage des services nous allons réutiliser et adapter les scripts de démarrage créés et utilisés pour le port FreeBSD.

$ ee /usr/local/etc/rc.d/mastodon_web

#!/bin/sh

# $FreeBSD: head/net-im/mastodon/files/mastodon_web.in 461097 2018-02-06 19:42:03Z jrm $

# PROVIDE: mastodon_web
# REQUIRE: LOGIN postgresql nginx redis
# KEYWORD: shutdown

#
# Add the following line to /etc/rc.conf to enable the Mastodon web server.
#
#  mastodon_web_enable="YES"
#
# mastodon_web_concurrency:    default: 2
# mastodon_web_loglevel:       debug or error, default: error
# mastodon_web_port:           default: 3000
# mastodon_web_threads:        default: 5
#
# The options below can be set in /etc/rc.conf.  If they are not set there, they
# will be read from .env.production.
#
# mastodon_db_name:           e.g., mastodon_production
# mastodon_db_host:           e.g., localhost
# mastodon_db_user:           e.g., mastodon
# mastodon_db_port:           e.g., 5432
# mastodon_local_domain:      e.g., mastodon.mydomain.org (once set, do not change)
# mastodon_smtp_from_address: e.g., mastodon@mydomain.org
# mastodon_redis_host:        e.g., localhost
# mastodon_redis_port:        e.g., 6397
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

. /etc/rc.subr

desc="Mastodon web workers server"
name=mastodon_web
rcvar=mastodon_web_enable

load_rc_config $name

: ${mastodon_web_enable:=NO}
: ${mastodon_web_concurrency:=2}
: ${mastodon_web_loglevel:=error}
: ${mastodon_web_port:=3000}
: ${mastodon_web_threads:=5}

mastodon_web_chdir="/usr/local/www/mastodon/live"
mastodon_web_env="HOME=/usr/local/www/mastodon \
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin \
MAX_THREADS=\"${mastodon_web_threads}\" \
PORT=\"${mastodon_web_port}\" \
RAILS_ENV=production \
RAILS_LOG_LEVEL=\"${mastodon_web_loglevel}\" \
WEB_CONCURRENCY=\"${mastodon_web_concurrency}\" \
${mastodon_db_url:+DATABASE_URL=\"${mastodon_db_url}\"} \
${mastodon_db_host:+DB_HOST=\"${mastodon_db_host}\"} \
${mastodon_db_name:+DB_NAME=\"${mastodon_db_name}\"} \
${mastodon_db_port:+DB_PORT=\"${mastodon_db_port}\"} \
${mastodon_db_user:+DB_USER=\"${mastodon_db_user}\"} \
${mastodon_db_password:+DB_PASS=\"${mastodon_db_password}\"} \
${mastodon_local_domain:+LOCAL_DOMAIN=\"${mastodon_local_domain}\"} \
${mastodon_smtp_from_address:+SMTP_FROM_ADDRESS=\"${mastodon_smtp_from_address}\"} \
${mastodon_redis_host:+REDIS_HOST=\"${mastodon_redis_host}\"} \
${mastodon_redis_port:+REDIS_PORT=\"${mastodon_redis_port}\"}"

mastodon_web_user=mastodon
pidfile="/var/run/mastodon/${name}.pid"
procname="ruby24:"

command="/usr/local/bin/bundle"
command_args="exec puma -C config/puma.rb \
>> /var/log/mastodon/${name##mastodon_}.log 2>&1 &"

run_rc_command "$1"
$ ee /usr/local/etc/rc.d/mastodon_workers

#!/bin/sh

# $FreeBSD: head/net-im/mastodon/files/mastodon_workers.in 461097 2018-02-06 19:42:03Z jrm $

# PROVIDE: mastodon_workers
# REQUIRE: LOGIN postgresql nginx redis
# KEYWORD: shutdown

# Add the following lines to /etc/rc.conf to enable the Mastodon background
# workers.
#
# mastodon_workers_enable="YES"
#
# mastodon_workers_dbpool:    default: 5
# mastodon_workers_loglevel:  debug or error, default: error
# mastodon_workers_threads:   default: 5
#
# The options below can be set in /etc/rc.conf.  If they are not set there, they
# will be read from .env.production.
#
# mastodon_db_name:           e.g., mastodon_production
# mastodon_db_host:           e.g., localhost
# mastodon_db_user:           e.g., mastodon
# mastodon_db_port:           e.g., 5432
# mastodon_local_domain:      e.g., mastodon.mydomain.org (once set, do not change)
# mastodon_smtp_from_address: e.g., mastodon@mydomain.org
# mastodon_redis_host:        e.g., localhost
# mastodon_redis_port:        e.g., 6397
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

. /etc/rc.subr

desc="Mastodon background workers server"
name=mastodon_workers
rcvar=mastodon_workers_enable

load_rc_config $name

: ${mastodon_workers_enable:=NO}
: ${mastodon_workers_loglevel:=error}
: ${mastodon_workers_dbpool:=5}
: ${mastodon_workers_threads:=5}

mastodon_workers_chdir="/usr/local/www/mastodon/live"
mastodon_workers_env="HOME=/usr/local/www/mastodon \
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin \
DB_POOL=\"${mastodon_workers_dbpool}\" \
RAILS_ENV=production \
RAILS_LOG_LEVEL=\"${mastodon_workers_loglevel}\" \
${mastodon_db_url:+DATABASE_URL=\"${mastodon_db_url}\"} \
${mastodon_db_host:+DB_HOST=\"${mastodon_db_host}\"} \
${mastodon_db_name:+DB_NAME=\"${mastodon_db_name}\"} \
${mastodon_db_port:+DB_PORT=\"${mastodon_db_port}\"} \
${mastodon_db_user:+DB_USER=\"${mastodon_db_user}\"} \
${mastodon_db_password:+DB_PASS=\"${mastodon_db_password}\"} \
${mastodon_local_domain:+LOCAL_DOMAIN=\"${mastodon_local_domain}\"} \
${mastodon_smtp_from_address:+SMTP_FROM_ADDRESS=\"${mastodon_smtp_from_address}\"} \
${mastodon_redis_host:+REDIS_HOST=\"${mastodon_redis_host}\"} \
${mastodon_redis_port:+REDIS_PORT=\"${mastodon_redis_port}\"}"

mastodon_workers_user=mastodon
pidfile="/var/run/mastodon/${name}.pid"
procname="ruby24:"

command="/usr/local/bin/bundle"
command_args="exec sidekiq -c ${mastodon_workers_threads} -q default -q mailers -q pull -q push \
>> /var/log/mastodon/${name##mastodon_}.log 2>&1 &"

run_rc_command "$1"
$ ee /usr/local/etc/rc.d/mastodon_stream

#!/bin/sh

# $FreeBSD: head/net-im/mastodon/files/mastodon_stream.in 452460 2017-10-19 18:31:56Z jrm $

# PROVIDE: mastodon_stream
# REQUIRE: LOGIN postgresql nginx redis
# KEYWORD: shutdown

# Add the following line to /etc/rc.conf to enable the Mastodon streaming
# service.
#
# mastodon_stream_enable="YES"
#
# mastodon_stream_port:       default 4000
#
# The options below can be set in /etc/rc.conf.  If they are not set there, they
# will be read from .env.production.
#
# mastodon_db_name:           e.g., mastodon_production
# mastodon_db_host:           e.g., localhost
# mastodon_db_user:           e.g., mastodon
# mastodon_db_port:           e.g., 5432
# mastodon_local_domain:      e.g., mastodon.mydomain.org (once set, do not change)
# mastodon_smtp_from_address: e.g., mastodon@mydomain.org
# mastodon_redis_host:        e.g., localhost
# mastodon_redis_port:        e.g., 6397
#

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

. /etc/rc.subr

desc="Mastodon streaming server"
name=mastodon_stream
rcvar=mastodon_stream_enable

load_rc_config $name

: ${mastodon_stream_enable:=NO}
: ${mastodon_stream_port=4000}

sig_stop=HUP
mastodon_stream_chdir="/usr/local/www/mastodon/live"
mastodon_stream_env="HOME=/usr/local/www/mastodon \
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin \
NODE_ENV=production \
PORT=\"${mastodon_stream_port}\" \
${mastodon_db_url:+DATABASE_URL=\"${mastodon_db_url}\"} \
${mastodon_db_host:+DB_HOST=\"${mastodon_db_host}\"} \
${mastodon_db_name:+DB_NAME=\"${mastodon_db_name}\"} \
${mastodon_db_port:+DB_PORT=\"${mastodon_db_port}\"} \
${mastodon_db_user:+DB_USER=\"${mastodon_db_user}\"} \
${mastodon_db_password:+DB_PASS=\"${mastodon_db_password}\"} \
${mastodon_local_domain:+LOCAL_DOMAIN=\"${mastodon_local_domain}\"} \
${mastodon_smtp_from_address:+SMTP_FROM_ADDRESS=\"${mastodon_smtp_from_address}\"} \
${mastodon_redis_host:+REDIS_HOST=\"${mastodon_redis_host}\"} \
${mastodon_redis_port:+REDIS_PORT=\"${mastodon_redis_port}\"} \
USER=mastodon"
mastodon_stream_user=mastodon

command="/usr/local/bin/node"
command_args="./streaming/index.js \
>> /var/log/mastodon/${name##mastodon_}.log 2>&1 &"

run_rc_command "$1"

On active les service dans rc.conf :

# chmod +x /usr/local/etc/rc.d/mastodon_*
# sysrc mastodon_web_enable="YES"
# sysrc mastodon_workers_enable="YES"
# sysrc mastodon_stream_enable="YES"

Configuration de Mastodon

Avant de poursuivre il faut modifier quelques fichiers pour pouvoir utiliser les scripts de démarrage et gérer les fichiers de pid.
J'ai pour cela regardé les fichier de patch du port original.

# su - mastodon
$ cd ~/live
$ ee config/puma.rb

Il faut insérer, à la ligne n°4 :

pidfile '/var/run/mastodon/mastodon_web.pid'

Pour sidekiq :

$ ee config/sidekiq.yml

Ajouter à la fin du fichier, après la dernière ligne :

:pidfile: /var/run/mastodon/mastodon_workers.pid

Et enfin, pour paperclip :

$ ee config/environments/production.rb

À la ligne n°103, insérez :

  # Paperclip config:
  Paperclip.options[:image_magick_path] = "/usr/local/bin"
  Paperclip.options[:command_path] = "/usr/local/bin"

Voilà… normalement je n'ai rien oublié… j'éspère ! 😉

Ah si ! J'oubliais justement, sans ça, ça va merder… :

# mkdir /var/run/mastodon
# chown mastodon /var/run/mastodon
# mkdir /var/log/mastodon
# chown mastodon /var/log/mastodon

Si vous démarrez l'installation alors vous pouvez maintenat suivre le guide de production pour Mastodon et lancer, sous l'utilisateur mastodon, dans le répertoire ~/live :

$ RAILS_ENV=production bundle exec rake mastodon:setup

Si vous mettez à jour depuis une version installé via les ports dans une autre jail vous pouvez suivre le guide de migration.
Pour PostgreSQL les deux options fonctionnent, soit copie de la base de donnée de l'ancienne jail vers la nouvelle, soit dump de la base sql et import du dump. J'ai testé les deux options.

Et dans le cas de la migration/mise à jour de la 2.3.3 vers une version supérieure (2.4.1 au moment de la rédaction) il faut suivre le guide de mise à jour, et en particulier ne pas oublier :

# su - mastodon
$ cd ~/live
$ RAILS_ENV=production bundle exec rails db:migrate
$ RAILS_ENV=production bundle exec rails assets:precompile

Si vous êtes joueur, vous pouvez toujour tenter la mise à jour depuis la jail où la machine où vous aviez installé Mastodon avec le port.
Cependant pour éviter les problème il faudra supprimer tous les gems installé via les ports.

# pkg delete rubygem-*

Cependant… il me semble plus sage de partir dans une jail toute neuve, ça permet de garder sous le coude la version 2.3.3 fonctionnelle sans rien casser dedans, au cas où…

Prudence est mère de sureté ! 😉

Un foi l'installation/configuration terminée, il est temps de lancer les services :

# service nginx start
# service mastodon_web start
# service mastodon_workers start
# service mastodon_stream start

Et comme d'habitude HTH !

Remerciement

Encore grand merci à Joseph Mingrone pour avoir maintenu le port FreeBSD et pour les scripts de démarrage et les patch que j'ai réutilisé.
Et un grand merci à l'ensemble des contributeurs au projet Mastodon.

Ce document est, comme l'ensemble du contenu de ce blog sous licence Creative Commons CC BY-SA 3.0.

Autres documents et liens en rapport

3 commentaires

#1 Kithop a dit :

Toutes mes excuses - je ne parle que mal le français, alors je dois continuer en anglais.
------
Thanks so much for this tutorial! I just wanted to share my experiences upgrading from the (now unmaintained) port to this semi-standalone installation, and one other fix I found regarding the 'uws' package.

If you get the following error when trying to start the Mastodon services, you can make a simple fix + recompile the Node module 'uws' by hand:

gmake: Entering directory '/usr/local/www/mastodon/node_modules/uws/build'
CXX(target) Release/obj.target/uws/src/Extensions.o
CXX(target) Release/obj.target/uws/src/Group.o
CXX(target) Release/obj.target/uws/src/Networking.o
CXX(target) Release/obj.target/uws/src/Hub.o
../src/Hub.cpp:175:13: error: cannot use 'try' with exceptions disabled
try {
^
1 error generated.
gmake: *** [uws.target.mk:107: Release/obj.target/uws/src/Hub.o] Error 1
gmake: Leaving directory '/usr/local/www/mastodon/node_modules/uws/build'

From the 'mastodon' install directory, as its user, first run:

npm rebuild uws

This will fail the first time, but it leaves behind a working Makefile that we need. Then:

cd node_modules/uws/build

Edit the file 'uws.target.mk' and delete both lines containing '-fno-exceptions'. Then, manually run:

gmake

It should compile successfully this time, at which point you can copy the resulting file to sit beside the other, precompiled versions:

cp Release/uws.node ..

Your node_modules/uws folder should now have a 'uws.node' that's been compiled without the offending flag, and the Mastodon services should now start and function without errors.

This all could be because of the packages I have on my particular system, of course, but I just wanted to share this in case anyone else ran into this same issue.

Thanks again!
-- Kithop (@kithop@social.kithop.ca)

#2 Gérald Niel a dit :

Another workaround is to edit node_modules/uws/binding.gyp and after the sources array, at line 16, add :

'cflags!': [ '-fno-exceptions' ],
'cflags_cc!': [ '-fno-exceptions' ],

So, uws package will build.

#3 Gérald Niel a dit :

Bon… après plusieurs péripéties, upgrade du système FreeBSD vers 11.4 avant upgrade à 12. Puis uprgade de Mastodon vers la dernière version stable (3.2.2) j'ai abandonné l'idée de maintenir et administrer ce logiciel sous FreeBSD, malheureusement.
En ce moment (comme souvent) c'est le système qui gère les websocket, plus précisément le module Node.JS @clusterws/cws qui ne fonctionne tout simplement pas sous FreeBSD.
Le script de démarrage pour sidekiq non plus.

Bref… j'ai déménagé l'instance sur un Raspberry Pi4 8GB RAM, 250GB SSD sous Raspberry Pi OS Buster hébergé "at home". Pour une instance mono-utilisateur, ça semble tenir.
Mastodon est cependant gourmand en RAM et SWAP.
Je n'ai pas dit mon dernier mot… Mais il serait souhaitable que les développeurs d'applications quelles qu'elles soient et plus particulièrement "web" considèrent les système autre que Linux et plus particulièrement Debian ou Ubuntu.

Mon instance Pleroma en revanche continue de fonctionner comme un charme sous FreeBSD 12.2.
Un billet à venir sur les différences entre les deux. Sans de vielles habitudes sous Masto, Pleroma aurait ma préférence.

Écrire un commentaire

Quelle est la deuxième lettre du mot qstth ? :