# Service TOOT Service courriel de l'association Libre en communs. Responsables : @echolib, @neox Déployé sur la machine `toot` (voir la [documentation spécifique](https://git.a-lec.org/a-lec/commissions/infrastructure/doc-infra/-/blob/master/Machines%20virtuelles/toot.md)). ## Installation du service ### Installation des dépendances Créer l'utilisateur `mastodon` ``` adduser --disabled-login mastodon ``` En tant que superutilisateur, installer les logiciels de base : ``` apt install -y curl wget gnupg apt-transport-https lsb-release ca-certificates ``` Installer NodeJS version 16, depuis les dépots nodesource.com ``` curl -sL https://deb.nodesource.com/setup_16.x | bash - ``` Mettre à jour les dépôts ``` apt update ``` Installer les paquets systèmes : ``` apt install -y 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 libgdbm-dev nginx redis-server redis-tools postgresql postgresql-contrib certbot python3-certbot-nginx libidn11-dev libicu-dev libjemalloc-dev ``` Configurer `yarn` ``` corepack enable yarn set version classic ``` Se connecter en tant que `mastodon` (les commandes suivantes se feront via le compte `mastodon`) ``` su - mastodon ``` Se placer dans le répertoire `/home/mastodon` ``` cd /home/mastodon ``` Installer `rbenv` (outil de gestion de version pour Ruby) ``` git clone https://github.com/rbenv/rbenv.git ~/.rbenv cd ~/.rbenv && src/configure && make -C src echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc exec bash git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build ``` Installer Ruby 3.2.2 avec `rbenv` ``` RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.2.2 rbenv global 3.2.2 ``` Installer `bundler` ``` gem install bundler --no-document ``` ### Configurer la base de données Postgresql En tant que superutilisateur, on crée la base de données ``` sudo -u postgres psql CREATE USER mastodon CREATEDB; \q ``` ### Installer Mastodon En tant que `mastodon`, on récupère le code et on se place sur le dernier tag : ``` su - mastodon git clone https://github.com/mastodon/mastodon.git live && cd live git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1) ``` Installer les dépendances dans le dépôt avec `bundle` et `yarn` ``` bundle config deployment 'true' bundle config without 'development test' bundle install -j$(getconf _NPROCESSORS_ONLN) yarn install --pure-lockfile ``` ### Configurer Mastodon En tant que `mastodon`, dans le dossier de déploiement, exécuter la commande de première configuration, et suivre la configuration interactive (avec le nom de domaine qui va bien) : ``` su - mastodon cd /home/mastodon/live RAILS_ENV=production bundle exec rake mastodon:setup ``` ### Configurer nginx En tant que superutilisateur, copier le fichier par défaut dans la configuration nginx : ``` cp /home/mastodon/live/dist/nginx.conf /etc/nginx/sites-available/mastodon ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon ``` Éditer le fichier pour effectuer les ajustements nécessaires dans les sections server (proxy_protocol et nom de domaine) : ``` set_real_ip_from 192.168.0.1; real_ip_header proxy_protocol; listen [::]:443 ssl; listen 444 ssl proxy_protocol; ssi on; ssi_last_modified on; server_name toot.a-lec.org; ``` Recharger nginx ``` systemctl reload nginx ``` ### Déployer un certificat SSL Utiliser certbot avec le nom de domaine de l'instance ``` certbot --nginx -d toot.a-lec.org ``` ### Déployer les services systemd ``` cp /home/mastodon/live/dist/mastodon-*.service /etc/systemd/system/ systemctl daemon-reload systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming ``` ## Mise à jour du service Le logiciel Mastodon utilise de nombreuses dépendances et ses mises à jour peuvent nécessiter des migrations de base de données. La mise à jour de Mastodon est toujours manuelle et très peu automatisée et n'est donc jamais générique. **Il est fortement déconseillé de mettre à jour en sautant des versions** Aussi, pour mettre à jour mastodon, on utilisera git pour récupérer le code en tant que `mastodon`: ``` su - mastodon cd /home/mastodon/live git fetch && git checkout ``` Dans certains cas, la mise à jour de Ruby devra être effectuée en se plaçant dans le dossier de `rbenv` : ``` cd /home/mastodon/.rbenv RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install rbenv global ``` Il est ensuite **important** de suivre les instructions de déploiement spécifiques de la version, disponible sur la page github de la version (release). Généralement cela consistera en l'exécution dans le dossier `live` de `bundle install` et/ou `yarn install`, suivi ou non d'une migration de base de données (`rails exec db:migrate`) et/ou d'une précompilation d'assets (`rails exec assets:precompile`). À chaque fois qu'il sera demandé dans les instructions de redémarrer les services, la commande suivante sera utilisée (pour éviter au maximum les interruptions) : ``` systemctl restart mastodon-sidekiq && systemctl reload mastodon-web && systemctl restart mastodon-streaming ```