toot/README.md

199 lines
5.3 KiB
Markdown

# 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.0.6 avec `rbenv`
```
RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.0.6
rbenv global 3.0.6
```
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 <version>
```
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 <version-ruby>
rbenv global <version-ruby>
```
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
```