blog-static/feed.xml
2024-09-18 07:07:09 +00:00

604 lines
No EOL
86 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://chapoline.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://chapoline.me/" rel="alternate" type="text/html" /><updated>2024-09-18T07:07:09+00:00</updated><id>https://chapoline.me/feed.xml</id><title type="html">Blog de Chapoline</title><subtitle>Blog, articles, et pensées non ordonnées
</subtitle><author><name>Caroline Canebier</name></author><entry><title type="html">Infrastructure, 3ème itération</title><link href="https://chapoline.me/2024/09/18/infra-3.html" rel="alternate" type="text/html" title="Infrastructure, 3ème itération" /><published>2024-09-18T00:00:00+00:00</published><updated>2024-09-18T00:00:00+00:00</updated><id>https://chapoline.me/2024/09/18/infra-3</id><content type="html" xml:base="https://chapoline.me/2024/09/18/infra-3.html">&lt;p&gt;Je viens de mettre en production la 3ème itération de mon infrastructure personnelle, et jen profite pour présenter ici un résumé des itérations précédentes, ainsi que de décrire son état actuel.&lt;/p&gt;
&lt;h2 id=&quot;première-itération--2020-2023&quot;&gt;Première itération : 2020-2023&lt;/h2&gt;
&lt;p&gt;Jai commencé à héberger mes propres services en avril 2020, pendant le premier confinement. Javais à lépoque décidé dacheter un nom de domaine et dhéberger une stack mail, en suivant le célèbre tutoriel de &lt;a href=&quot;https://workaround.org/ispmail-bookworm/&quot;&gt;workaround.org&lt;/a&gt;, le tout sur le VPS OVH le moins cher possible (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Didi&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Jai ajouté en mars 2022 un deuxième VPS, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Zii&lt;/code&gt;, celui-là chez Infomaniak, afin davoir un débit nettement plus élevé pour pouvoir men servir de serveur VPN, et davoir une ip de meilleure réputation (javais eu des problèmes avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Didi&lt;/code&gt;). Enfin, en octobre 2022, jai ajouté un troisième VPS, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Izz&lt;/code&gt;, chez Contabo, avec pour intention de remplacer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Zii&lt;/code&gt;. En effet, Infomaniak ne propose pas de contrôler le reverse DNS de lip de ses VPS, ce qui baissait la réputation des mails que jenvoyais. Elle me permettait également davoir beaucoup plus de stockage, pour un prix deux fois moins élevé. Elle na cependant jamais remplacé &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Zii&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Au fur et à mesure, jai ajouté plusieurs services sur ces serveurs : &lt;a href=&quot;https://dashy.to/&quot;&gt;Dashy&lt;/a&gt;, &lt;a href=&quot;https://git.chapoline.me/chapeau/chapolibot&quot;&gt;bot Telegram&lt;/a&gt;, &lt;a href=&quot;https://icinga.com/&quot;&gt;Icinga&lt;/a&gt;, &lt;a href=&quot;https://www.keycloak.org/&quot;&gt;Keycloak&lt;/a&gt;, et dautres que joublie. Les 3 étaient reliées entre elles par un &lt;a href=&quot;https://www.wireguard.com/&quot;&gt;Wireguard&lt;/a&gt;, qui me servait également à faire sortir mon trafic par &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Zii&lt;/code&gt; en Suisse.&lt;/p&gt;
&lt;p&gt;Jai essayé au départ de gérer mon infrastructure avec &lt;a href=&quot;https://www.ansible.com/&quot;&gt;Ansible&lt;/a&gt;, mais ce fut globalement un échec. Je narrivais pas à maintenir correctement les playbooks pour quils continuent de correspondre à létat réel des serveurs, et javais une tendance beaucoup trop grande à aller bidouiller dessus à la main pour résoudre les soucis. De plus, les 3 serveurs avaient des configurations assez hétérogènes, avec notamment &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Izz&lt;/code&gt; qui utilisait &lt;a href=&quot;https://traefik.io/traefik/&quot;&gt;Traefik&lt;/a&gt; (dont je nai jamais vraiment été convaincue, mais que jai continué à utiliser dessus jusquau bout). Enfin, lenvie de jouer avec un serveur physique, et de pouvoir créer des VM ou des LXC à la demande sur un &lt;a href=&quot;https://www.proxmox.com/&quot;&gt;Proxmox&lt;/a&gt;, me faisait très envie.&lt;/p&gt;
&lt;h2 id=&quot;deuxième-itération--2023-2024&quot;&gt;Deuxième itération : 2023-2024&lt;/h2&gt;
&lt;p&gt;En février 2023, jai sauté le pas et jai acheté sur Leboncoin un Dell PowerEdge R710 (72Go de RAM, 2 CPU), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Montreal&lt;/code&gt;, dans lequel jai mis 2 disques de 2To en RAID, et jai commencé à migrer mon infrastructure dessus. Jai également pris un 4ème VPS, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Amber&lt;/code&gt;, également chez Contabo, pour me servir dip externe, en la reliant avec un pont Wireguard vers mon infra.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; +-----------+
| |
| Freebox |
| |
+-----+-----+ +------------+
| | |
+------------------+ Montreal |
| | |
| +------------+
| 192.168.1.0/24
| +------------+
| | |
+------------------+ Laptops |
| | |
+---------+ +-----+-----+ +------------+
| | VPN | |
| Amber +------------------+ Gateway |
| | 172.31.0.0/24 | |
+---------+ +-----+-----+
|
| 10.255.0.0/24
|
+-----+-----+
| |
| Servers |
| |
+-----------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Le serveur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gateway&lt;/code&gt; me servait de routeur, de DNS et de DHCP grace à &lt;a href=&quot;https://thekelleys.org.uk/dnsmasq/doc.html&quot;&gt;dnsmasq&lt;/a&gt;. Afin déviter de faire du routage asymétrique, et de ne pas trop faire fuiter lip publique de ma Freebox, jai routé tout le trafic sortant des serveurs à travers le pont VPN. Mais parce que je ne voulais pas membêter à faire du source-based routing, jai simplement défini deux passerelles différentes pour mes deux réseaux : le réseau “client” utilisait la Freebox comme passerelle, et le réseau “serveur” le serveur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gateway&lt;/code&gt;. Afin que les clients puisse quand même accéder aux serveurs, je poussais dessus une route statique en utilisant loption 131 du protocol DHCP ; cependant, &lt;a href=&quot;https://issuetracker.google.com/issues/263721377&quot;&gt;cette option nest pas supportée par Android…&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En terme dautomatisation dinfra, javais décidé dutiliser une nouvelle approche, pour pallier aux soucis que javais eu avec Ansible sur litération précédente. Je suis partie dun template LXC custom, généré grace à &lt;a href=&quot;https://pve.proxmox.com/wiki/Debian_Appliance_Builder&quot;&gt;DAB&lt;/a&gt;, qui pré-installait et pré-configurait ce que jaurais déployé par Ansible en tant que configuration initiale (paquets standard, mon compte et ma clé ssh…). Ensuite, je centralisais toutes mes configurations avec &lt;a href=&quot;https://www.gnu.org/software/stow/&quot;&gt;Stow&lt;/a&gt; dans un monorepo.&lt;/p&gt;
&lt;p&gt;Sur chaque nouvelle machine, je commençais par cloner le monorepo à &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/stow-files&lt;/code&gt;, puis créer dedans un dossier pour ma machine. Ensuite, je mettais tous les fichiers de configuration modifiés pour cette machine dans ce dossier, en respectant larborescence par rapport à /etc, pour pouvoir utiliser &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stow&lt;/code&gt; pour les déployer (ou plutôt, pour créer des liens symboliques aux bons endroits qui pointent vers ces fichiers). Lintérêt principal de cette approche était de pouvoir travailler sur les fichiers du serveur sans me poser de question au quotidien ; si javais besoin de rajouter une machine dans la configuration du DHCP, je modifiais directement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/dnsmasqs.d/leases.conf&lt;/code&gt;, qui était réellement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/usr/local/stow-files/gateway/dnsmasq/dnsmasq.d/leases.conf&lt;/code&gt;. Linconvénient était de navoir aucune visibilité sur si javais bien push toutes les machines…&lt;/p&gt;
&lt;p&gt;Lors de cette itération, jai également commencé à mintéresser à &lt;a href=&quot;https://nixos.org/&quot;&gt;NixOS&lt;/a&gt;, que jai également utilisé sur mon PC principal pendant quelques mois. Jai envisagé de me faire une infrastructure principalement basée dessus, pour au final rester sur une majorité de Debian. Jai tout de même conservé quelques LXC sous NixOS, principalement pour gérer le reverse-proxy de mon infrastructure avec Nginx.&lt;/p&gt;
&lt;p&gt;Enfin, linfrastructure était monitorée grâce à une stack &lt;a href=&quot;https://grafana.com/&quot;&gt;Grafana&lt;/a&gt; + &lt;a href=&quot;https://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt; + &lt;a href=&quot;https://www.netdata.cloud/&quot;&gt;Netdata&lt;/a&gt;, installé sur tous mes serveurs et LXC.&lt;/p&gt;
&lt;p&gt;Malgré le but initial de ce serveur, qui était de remplacer tous mes VPS (sauf &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Amber&lt;/code&gt;), je ne les ai résiliées quen mai 2024, plus dun an après la mise en production de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Montreal&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;troisième-itération--2024-&quot;&gt;Troisième itération : 2024-?&lt;/h2&gt;
&lt;p&gt;Le problème principal de ce serveur était très prévisible : il consomme beaucoup, et chauffe pas mal aussi (ou plutôt, devient très bruyant pour ne pas chauffer…). Pour réduire très fortement son bruit au repos, jai retiré dès le départ le contrôle automatique de la vitesse des ventilos, pour les mettre à 10% de leur vitesse maximale (contre 30% au minimum en automatique), ce qui suffisait largement à mes besoins. Mais en ayant retiré tout contrôle automatique de leur vitesse, je gardais un stress quil se mette à trop chauffer et à sabimer, voire à abimer mon appartement… Et sa consommation était très loin dêtre négligeable : 120W dans le BIOS, 150W avec mon infrastructure au repos (et facilement 180W avec une CI qui tournait), soit environ 35€/mois délectricité… Soit le prix combiné de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Zii&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Didi&lt;/code&gt; et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Izz&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jai donc décidé en août 2024 de le remplacer par un serveur monté moi-même, avec des composants de PC (plus de détails &lt;a href=&quot;/infra.html&quot;&gt;ici&lt;/a&gt;), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gandalf&lt;/code&gt;. Jen ai également profité pour acheter un routeur physique (un EdgeRouter X), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cirdan&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; +-----------+
| |
| Freebox |
| |
+-----+-----+
|
|
|
|
| 192.168.1.0/24
| gw.chapo.li
|
|
|
+---------+ +-----+-----+
| | VPN | |
| Amber +------------------+ Cirdan |
| | 172.31.0.0/24 | |
+---------+ wg.chapo.li +--+--+--+--+
| | |
| | |
| | |
| | |
| | |
+---------------+ | +---------------+
| | |
| | |
+-----+-----+ +-----+-----+ +-----+-----+
| | | | | |
| Clients | | Hardware | | Servers |
| | | | | |
+-----------+ +-----------+ +-----------+
10.255.1.0/24 10.255.2.0/24 10.255.3.0/24
client.chapo.li hw.chapo.li vm.chapo.li
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Plutôt que dutiliser un nom de domaine unique pour toutes mes ip (en &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.home&lt;/code&gt;), jai décidé dutiliser un sous-domaine dun domaine public par sous-réseau, ce qui me permet également &lt;a href=&quot;https://faercol.me/fr/posts/dns-challenge/&quot;&gt;de générer des certificats TLS valides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;EdgeOS me permet également denfin faire &lt;a href=&quot;https://help.ui.com/hc/en-us/articles/204952274-EdgeRouter-Policy-Based-Routing&quot;&gt;du source-based routing sans effort&lt;/a&gt;, ce qui me permet enfin davoir proprement uniquement les serveurs qui sortent par le VPN, tout en pouvant facilement définir des exceptions (par exemple, mon runner Forgejo nutilise pas le VPN, à cause dun soucis que je nai jamais réussi à comprendre avec le pull de dépendences Ruby…).&lt;/p&gt;
&lt;p&gt;En terme de gestion de la configuration des serveurs, je suis revenue sur Ansible, avec des playbooks plus simples et plus standards quà lépoque de la première itération. Au lieu de chercher à ansibliser tous mes services, je nansiblise que les structures récurrentes (déploiement des utilisateurs, installation de docker, configuration de cerbot avec challenge DNS…), ainsi que quelques services plus complexes (comme la stack mail). Pour les autres services, qui sont généralement un &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt; et un éventuel fichier de configuration, ainsi que pour le routeur, jutilise un simple script bash qui &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scp&lt;/code&gt; les fichiers pertinents, puis je git le résultat. Peu élégant, mais efficace.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[cirdan.hw.chapo.li]&quot;&lt;/span&gt;
scp ubnt@cirdan.hw.chapo.li:/config/config.boot cirdan.hw.chapo.li/config.boot
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Oui, ce repo contient beaucoup de secrets en clair. Oui, il est privé et protégé. Oui, ce nest pas très propre…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Afin de gérer laccès à mes services depuis lextérieur, jutilise deux serveurs : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Amber&lt;/code&gt;, mon VPS externe, qui utilise un &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firewalld&lt;/code&gt; pour gérer un NAT Masquerade et le port-forward vers les machines pertinentes à travers un pont Wireguard vers &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cirdan&lt;/code&gt;, et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dillon&lt;/code&gt;, mon reverse-proxy Nginx sous NixOS. Cest lui qui soccupe de distribuer les requêtes vers les services pertinents, et de faire la terminaison TLS pour mes services externes.&lt;/p&gt;
&lt;p&gt;Enfin, pour gérer les mises à jour des machines, jutilise, en plus de &lt;a href=&quot;https://wiki.debian.org/UnattendedUpgrades&quot;&gt;unattended-upgrades&lt;/a&gt;, &lt;a href=&quot;https://github.com/DE-IBH/apt-dater&quot;&gt;apt-dater&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Apt-dater est très peu disponible sur dautres plateformes que Debian et ses dérivés, et nest plus vraiment maintenu par dautres personnes que les mainteneurs de Debian… Pro tip si vous voulez lutiliser depuis un Arch par exemple, il tourne très bien dans un Docker !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je suis pour linstant très satisfaite de cette nouvelle itération, qui me parait beaucoup plus robuste et facile à maintenir que les précédentes. À voir sur la longueur !&lt;/p&gt;</content><author><name>Caroline Canebier</name></author><category term="sysadmin" /><category term="mainpage" /><category term="history" /><summary type="html">Je viens de mettre en production la 3ème itération de mon infrastructure personnelle, et jen profite pour présenter ici un résumé des itérations précédentes, ainsi que de décrire son état actuel.</summary></entry><entry><title type="html">Workflow de déploiement de mon blog avec Forgejo Actions</title><link href="https://chapoline.me/2024/09/08/blog-workflow.html" rel="alternate" type="text/html" title="Workflow de déploiement de mon blog avec Forgejo Actions" /><published>2024-09-08T00:00:00+00:00</published><updated>2024-09-08T00:00:00+00:00</updated><id>https://chapoline.me/2024/09/08/blog-workflow</id><content type="html" xml:base="https://chapoline.me/2024/09/08/blog-workflow.html">&lt;p&gt;Ce blog est un blog statique, construit à partir de &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;. Il peut donc être construit à lavance, afin de générer des fichiers entièrement statiques, qui seront déployés sur un serveur web qui les servira sur internet. Cest donc une excellente occasion pour mettre en place une CI avec &lt;a href=&quot;https://forgejo.org/docs/latest/user/actions/&quot;&gt;Forgejo Actions&lt;/a&gt;, afin dautomatiser le build de ce blog.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je ne fais ici que de la CI, pas de CD (je ne déploie pas automatiquement sur mon serveur web), car jutilise NixOS pour mon serveur web, et je préfère donc définir manuellement le commit exact du blog que je déploie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je travaille avec deux dépots de code : &lt;a href=&quot;https://git.chapoline.me/chapeau/blog&quot;&gt;blog&lt;/a&gt;, qui contient les sources du blog, et &lt;a href=&quot;https://git.chapoline.me/chapeau/blog-static&quot;&gt;blog-static&lt;/a&gt;, qui contient le résultat du build du blog (et qui est concrètement ce qui est servi par mon serveur web). La CI a donc pour but de récupérer les sources, compiler le blog, et push le résultat sur le deuxième dépot.&lt;/p&gt;
&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# .forgejo/workflows/main.yml&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# We execute this workflow on each commit pushed&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;jobs&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;runs-on&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;docker&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# the Checkout Action needs node to run&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;node:bookworm&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# First, clone the source repo&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Clone repo&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v4&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Then, clone the static repo on the build output path&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Clone static repo&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;uses&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;actions/checkout@v4&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;chapeau/blog-static&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;_site&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# This repo needs a token because we will push on it later&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${{ secrets.GH_PAT }}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;ref&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;main&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Setup&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;MAIL&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;${{ secrets.MAIL }}&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;# Install some dependencies for the blog&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;apt update&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;apt install -y bundler git apt-utils&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;# This configuration is mandatory to make commits&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;git config --global user.email &quot;$MAIL&quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;git config --global user.name &quot;CI Builder&quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;# Install ruby dependencies&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;bundle install&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;# Build the blog&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;bundle exec jekyll build&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;# Commit and push&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;cd _site&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;git add --all&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;git commit -m &quot;Build&quot;&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;git push -u origin main &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Pour utiliser ce workflow, deux choses sont nécessaires : un runner Forgejo bien sur, et quelques secrets.&lt;/p&gt;
&lt;p&gt;Jutilise un simple runner docker, installé en suivant la &lt;a href=&quot;https://forgejo.org/docs/latest/admin/actions/#forgejo-runner&quot;&gt;documentation officielle&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les secrets se définissent dans linterface web de Forgejo, pour le projet, dans &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Paramètres -&amp;gt; Actions -&amp;gt; Secrets&lt;/code&gt;. Deux sont nécessaires pour ce workflow : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAIL&lt;/code&gt;, qui contient simplement ladresse mail utilisée pour les commits, et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GH_PAT&lt;/code&gt;, qui contient un token dauthentification associé à votre compte, avec des droits daccès en écriture sur les dépots. Pour le générer, allez dans &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Configuration -&amp;gt; Applications&lt;/code&gt;.&lt;/p&gt;</content><author><name>Caroline Canebier</name></author><category term="sysadmin" /><category term="mainpage" /><summary type="html">Ce blog est un blog statique, construit à partir de Jekyll. Il peut donc être construit à lavance, afin de générer des fichiers entièrement statiques, qui seront déployés sur un serveur web qui les servira sur internet. Cest donc une excellente occasion pour mettre en place une CI avec Forgejo Actions, afin dautomatiser le build de ce blog.</summary></entry><entry><title type="html">Remplacer la conversation Whatsapp familiale par un serveur XMPP</title><link href="https://chapoline.me/2024/08/28/xmpp-server.html" rel="alternate" type="text/html" title="Remplacer la conversation Whatsapp familiale par un serveur XMPP" /><published>2024-08-28T00:00:00+00:00</published><updated>2024-08-28T00:00:00+00:00</updated><id>https://chapoline.me/2024/08/28/xmpp-server</id><content type="html" xml:base="https://chapoline.me/2024/08/28/xmpp-server.html">&lt;p&gt;Tout le monde aujourdhui a, dans sa famille, une conversation Whatsapp/Telegram/Messenger/autre, en remplacement des SMS de la décennie précédente. Mais avec lenshitification ambiante dInternet, il devient de plus en plus essentiel davoir des options pour rester en contact avec ses proches sans passer par des applications propriétaires peu respectueuses de la vie privée. XMPP est une excellente solution à ça, et en installer un serveur est un projet sympathique et assez facile.&lt;/p&gt;
&lt;p&gt;XMPP est un protocol décentralisé déchange de données en temps réel. Plus simplement, cest un très bon protocol pour construire des systèmes fédérés de discussion instantannée, ce qui est exactement ce que lon va faire. Le protocol est défini via quelques RFC, et définit également des extensions à travers des &lt;a href=&quot;https://xmpp.org/extensions/&quot;&gt;XEP&lt;/a&gt;. Plusieurs de ces XEP sont aujourdhui très standard et sont installées et activées par défaut (comme la &lt;a href=&quot;https://xmpp.org/extensions/xep-0012.html&quot;&gt;XEP-0012&lt;/a&gt;). Enfin, XMPP propose aujourdhui du chiffrement bout-en-bout mature et automatique (&lt;a href=&quot;https://xmpp.org/extensions/xep-0384.html&quot;&gt;XEP-0384&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Les différentes étapes de cet article sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#env&quot;&gt;Une description de lenvironnement dans lequel le serveur XMPP va être déployé&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#install&quot;&gt;Linstallation et la configuration du serveur XMPP en lui-même&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#file&quot;&gt;La configuration de quelques fonctionnalités supplémentaires (partage de fichier et rooms)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#config&quot;&gt;La configuration finale du serveur&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;env&quot;&gt;Environnement&lt;/h2&gt;
&lt;p&gt;Pour monter un serveur XMPP, il est nécessaire davoir au moins un nom de domaine public, et si possible plusieurs sous-domaines dédiés au projet. Il est également nécessaire davoir une ip publique, avec a minima les ports tcp 5222 et 5269 accessibles.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dans cet article, je prends comme noms de domaines &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;example.org&lt;/code&gt; et ses sous-domaines, et comme ip publique &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;198.51.100.5&lt;/code&gt;. Le serveur lui-même est sur lip &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.1.200/24&lt;/code&gt;, derrière un NAT. Jutilise également un reverse-proxy dédié (puisque je nai quune ip publique), dont lip privée est &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;192.168.1.100&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://prosody.im&quot;&gt;Prosody&lt;/a&gt; et &lt;a href=&quot;https://www.ejabberd.im&quot;&gt;edjabberd&lt;/a&gt; sont deux implémentations modernes de serveur XMPP, et les deux sont des choix très pertinents. Pour ma part, jai choisi Prosody.&lt;/p&gt;
&lt;p&gt;Pour installer Prosody, jutilise un serveur Debian 11, avec 2 vCPU, 2Go de ram et 32Go de disque (à titre purement indicatif, je nai pas fait de benchmark pour vérifier la pertinence de ces ressources).&lt;/p&gt;
&lt;h2 id=&quot;install&quot;&gt;Installation et configuration initiale&lt;/h2&gt;
&lt;p&gt;Linstallation sous debian se fait via le repo officiel de Prosody :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;deb http://packages.prosody.im/debian &lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;lsb_release &lt;span class=&quot;nt&quot;&gt;-sc&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt; main | &lt;span class=&quot;nb&quot;&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/prosody.list
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;wget https://prosody.im/files/prosody-debian-packages.key &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; /etc/apt/trusted.gpg.d/prosody.gpg
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt update
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;prosody
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Toute la configuration se fait ensuite dans &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/prosody/prosody.cfg.lua&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le fichier de configuration complet est disponible à la fin du guide. Jai enlevé les commentaires du fichier par défaut par soucis de clareté, mais je vous conseille de les laisser !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La configuration commence par charger une liste de modules. La liste par défaut est un bon point de départ ; jai simplement décommenté le module &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mam&lt;/code&gt;, qui permet de conserver un historique des messages sur le serveur.&lt;/p&gt;
&lt;p&gt;On peut ensuite indiquer à Prosody quelle ip publique est utilisée pour accéder au service, ce qui lui permet de vérifier lui même si la configuration DNS est correcte :&lt;/p&gt;
&lt;div class=&quot;language-lua highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;external_addresses&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;198.51.100.5&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Enfin, il faut créer un VirtualHost, ce qui correspond à un domaine sur lequel Prosody va écouter (en gros, un serveur XMPP séparé). Attention, toutes les options de configuration définies après ne sappliqueront quau VirtualHost !&lt;/p&gt;
&lt;div class=&quot;language-lua highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;VirtualHost&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;chat.example.org&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Et voilà, juste avec ça, on a un serveur XMPP fonctionnel ! Mais avant de lutiliser, nous allons au moins mettre en place un certificat TLS pour sécuriser les connexions entre les clients et le serveur, et entre notre serveur et les autres. Pour cela, un peu de DNS et de reverse proxy simpose. Faisons donc pointer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chat.example.org&lt;/code&gt; sur notre ip publique, puis ajoutons juste ce quil faut de reverse proxy :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jutilise NixOS pour gérer mon reverse proxy. Je vous laisse adapter cette configuration pour nginx si ce nest pas votre cas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;language-nix highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;nginx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;chat.example.org&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;locations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;proxyPass&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http://192.168.1.200:80&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Cette configuration de nginx nécoute que sur le port 80, et reverse-proxyfie les requêtes sur le port 80 de la VM Prosody. Elle ne sert quà faire fonctionner le challenge Lets Encrypt qui va venir :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;certbot certonly &lt;span class=&quot;nt&quot;&gt;--standalone&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; chat.example.org
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;prosodyctl &lt;span class=&quot;nt&quot;&gt;--root&lt;/span&gt; cert import /etc/letsencrypt/live
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Pour vérifier que tout fonctionne, on peut utiliser &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;prosodyctl&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ prosodyctl check certs
Checking certificates...
Checking certificate for chat.example.org
Certificate: /etc/prosody/certs/chat.example.org.crt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Et voilà ! Noubliez pas de forward les ports tcp 5222 et 5269 sur votre firewall, et votre serveur XMPP devrait être fonctionnel. Pour ajouter des utilisateurs, utilisez la cli :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;prosodyctl adduser user@chat.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;file&quot;&gt;File sharing et MUC&lt;/h2&gt;
&lt;p&gt;Afin de rajouter quelques fonctionnalités à notre serveur, nous allons rajouter un vrai service de partage de fichier (actuellement, le partage de fichiers fonctionne, mais uniquement en peer-to-peer), ainsi que la possibilité de créer des rooms de discussion.&lt;/p&gt;
&lt;p&gt;Ces deux fonctionnalités sajoutent via des &lt;em&gt;Components&lt;/em&gt;, qui se configurent à la suite du VirtualHost :&lt;/p&gt;
&lt;div class=&quot;language-lua highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;disco_items&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;file.example.org&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;file sharing service&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_paths&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;file_share&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;file.example.org&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http_file_share&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_file_share_global_quota&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- 16 Go&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_external_url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://file.example.org/&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;trusted_proxies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;192.168.1.100&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rooms.chat.example.org&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;muc&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;modules_enabled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;muc_mam&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Chatrooms&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;restrict_room_creation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;local&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;muc_room_default_public&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Le service de partage de fichier, qui va être configuré derrière le reverse proxy, a besoin de connaitre son url daccès pour générer correctement les liens. On lui configure également son quota global, et ladresse ip du serveur proxy afin de lautoriser.&lt;/p&gt;
&lt;p&gt;Pour éviter que les liens générés soient préfixés par &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;file_share/&lt;/code&gt;, on redéfinit son &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http_path&lt;/code&gt;. Enfin, pour que les clients puisse découvrir le service et parce quil nest pas sur un sous-domaine de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chat.example.org&lt;/code&gt;, on le définit dans la liste des services à découvrir.&lt;/p&gt;
&lt;p&gt;Côté MUC, on active également le stockage des messages récents sur le serveur, on autorise uniquement les comptes locaux à créer de nouvelles rooms (même si nimporte qui peut ensuite les rejoindre), et on crée les rooms comme étant privées par défaut.&lt;/p&gt;
&lt;p&gt;Afin que le reverse proxy fonctionne, il faut également faire écouter le port HTTP de Prosody sur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.0.0.0&lt;/code&gt; au lieu de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;localhost&lt;/code&gt; par défaut :&lt;/p&gt;
&lt;div class=&quot;language-lua highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;http_interfaces&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;::&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;On peut à présent configurer notre reverse proxy, cette fois avec HTTPS :&lt;/p&gt;
&lt;div class=&quot;language-nix highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;nginx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;file.example.org&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;enableACME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;forceSSL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;locations&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;proxyPass&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http://192.168.1.200:5280&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id=&quot;config&quot;&gt;Fichier de configuration final&lt;/h2&gt;
&lt;div class=&quot;language-lua highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;external_addresses&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;198.51.100.5&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;modules_enabled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;disco&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Service discovery&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;roster&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allow users to have a roster. Recommended ;)&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;saslauth&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Authentication for clients and servers. Recommended if you want to log in.&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;tls&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Add support for secure TLS on c2s/s2s connections&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;blocklist&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allow users to block communications with other users&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;bookmarks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Synchronise the list of open rooms between clients&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;carbons&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Keep multiple online clients in sync&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;dialback&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Support for verifying remote servers using DNS&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Enable bandwidth limiting for XMPP connections&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;pep&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allow users to store public and private data in their account&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;private&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Legacy account storage mechanism (XEP-0049)&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;smacks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Stream management and resumption (XEP-0198)&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;vcard4&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- User profiles (stored in PEP)&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;vcard_legacy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Conversion between legacy vCard and PEP Avatar, vcard&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;csi_simple&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Simple but effective traffic optimizations for mobile devices&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;invites&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Create and manage invites&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;invites_adhoc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allow admins/users to create invitations via their client&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;invites_register&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allows invited users to create accounts&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;ping&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Replies to XMPP pings with pongs&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;register&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allow users to register on this server using a client and change passwords&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;time&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Let others know the time here on this server&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;uptime&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Report how long server has been running&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Replies to server version requests&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;mam&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Store recent messages to allow multi-device synchronization&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;admin_adhoc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allows administration via an XMPP client that supports ad-hoc commands&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;&quot;admin_shell&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- Allow secure administration via &apos;prosodyctl shell&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;s2s_secure_auth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;limits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;c2s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;10kb/s&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;s2sin&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;rate&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;30kb/s&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;pidfile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/var/run/prosody/prosody.pid&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;authentication&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;internal_hashed&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;archive_expires_after&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;1w&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;log&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/var/log/prosody/prosody.log&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/var/log/prosody/prosody.err&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;certificates&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;certs&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_interfaces&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;::&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;VirtualHost&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;chat.example.org&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;disco_items&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;file.example.org&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;file sharing service&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_paths&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;file_share&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;file.example.org&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http_file_share&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_file_share_global_quota&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;-- 16 Go&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;http_external_url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://file.example.org/&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;trusted_proxies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;192.168.1.100&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;rooms.chat.example.org&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;muc&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;modules_enabled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;muc_mam&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Chatrooms&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;restrict_room_creation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;local&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;muc_room_default_public&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>Caroline Canebier</name></author><category term="sysadmin" /><category term="mainpage" /><summary type="html">Tout le monde aujourdhui a, dans sa famille, une conversation Whatsapp/Telegram/Messenger/autre, en remplacement des SMS de la décennie précédente. Mais avec lenshitification ambiante dInternet, il devient de plus en plus essentiel davoir des options pour rester en contact avec ses proches sans passer par des applications propriétaires peu respectueuses de la vie privée. XMPP est une excellente solution à ça, et en installer un serveur est un projet sympathique et assez facile.</summary></entry><entry><title type="html">Utiliser Firefox comme lecteur minimaliste</title><link href="https://chapoline.me/2024/07/27/firefox-minimal.html" rel="alternate" type="text/html" title="Utiliser Firefox comme lecteur minimaliste" /><published>2024-07-27T00:00:00+00:00</published><updated>2024-07-27T00:00:00+00:00</updated><id>https://chapoline.me/2024/07/27/firefox-minimal</id><content type="html" xml:base="https://chapoline.me/2024/07/27/firefox-minimal.html">&lt;p&gt;Je cherchais un moyen minimaliste pour pouvoir lire un pdf ou un manga dans Firefox, en épurant au maximum ma fenêtre. Deux options sont courantes : mettre la fenêtre en plein écran, ou utiliser une extension de navigateur dédiée. Mais ça ne doit pas être si difficile à faire à la main ? Voyons comment faire cela.&lt;/p&gt;
&lt;h2 id=&quot;création-dun-profil-dédié&quot;&gt;Création dun profil dédié&lt;/h2&gt;
&lt;p&gt;Afin de pouvoir continuer à utiliser Firefox normalement, nous allons créer un &lt;a href=&quot;https://support.mozilla.org/fr/kb/profils-la-ou-firefox-conserve-donnees-utilisateur&quot;&gt;profil Firefox&lt;/a&gt; dédié. Les profils Firefox permettent disoler entièrement tous les marques-page, configurations, extensions, etc. Pour cela, rien de plus simple : allez sur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;about:profiles&lt;/code&gt;, puis créez en un (dans mon exemple, je lai appelé &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pdf&lt;/code&gt;). Remettez le profil &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default&lt;/code&gt; comme profil par défaut (puisquil restera notre profil principal), et notez bien le chemin de “Root Directory” du nouveau profil. Vous pouvez enuite ouvrir une fenêtre avec ce profil en cliquant sur le bouton “Launch profile in new browser” de cette page.&lt;/p&gt;
&lt;p&gt;Vous pouvez dès à présent configurer ce nouveau profil à votre goût : installation dextension, paramètres de vie privée, thème… Une fois cela fait, nous allons épurer très fortement linterface, en supprimant complètement les barres donglets et dURL. Pour pouvoir modifier linterface de Firefox elle même, nous allons devoir activer loption &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;toolkit.legacyUserProfileCustomizations.stylesheets&lt;/code&gt;, qui se trouve sur la page &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;about:config&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;modification-de-linterface-de-firefox&quot;&gt;Modification de linterface de Firefox&lt;/h2&gt;
&lt;p&gt;A présent, allons dans le dossier de configuration du profile (chez moi, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;~/.mozilla/firefox/yrafg6j1.pdf/&lt;/code&gt;). La configuration de linterface va se faire en utilisant &lt;a href=&quot;https://www.userchrome.org/&quot;&gt;userChrome&lt;/a&gt;. Pour cela, créez le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;chrome/userChrome.css&lt;/code&gt;, en créant le dossier si besoin. Mettez le contenu suivant dans le fichier :&lt;/p&gt;
&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;/* Cache la barre des onglets */&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;#TabsToolbar&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nl&quot;&gt;visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;collapse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;/* Cache la barre de l&apos;URL*/&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;#navigator-toolbox&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nl&quot;&gt;visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;collapse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Les changements seront effectifs au prochain démarrage du profil.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/assets/firefox-minimal-1.png&quot;&gt;&lt;img src=&quot;/assets/firefox-minimal-1.png&quot; alt=&quot;Screenshot du rendu de firefox, sans barres en haut&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;astuces&quot;&gt;Astuces&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pour lancer Firefox directement sur le profil &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pdf&lt;/code&gt;, lancez le avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firefox -P pdf [file.pdf]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sans interface, la navigation au clavier est très utile : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctrl+tab&lt;/code&gt; pour cycler les onglets ouverts, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctrl+t&lt;/code&gt; pour ouvrir un nouvel onglet, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctrl+o&lt;/code&gt; pour ouvrir un fichier, ou &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;alt+left&lt;/code&gt; pour revenir à la page précédente par exemple.&lt;/li&gt;
&lt;li&gt;Attention, la barre dURL est totalement inaccessible dans ce mode, y compris avec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;F6&lt;/code&gt;. Pensez à utiliser des marques-page (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ctrl+shift+o&lt;/code&gt; pour ouvrir le menu), ou à épingler des pages sur la page de nouvel onglet.&lt;/li&gt;
&lt;/ul&gt;</content><author><name>Caroline Canebier</name></author><category term="linux" /><category term="mainpage" /><summary type="html">Je cherchais un moyen minimaliste pour pouvoir lire un pdf ou un manga dans Firefox, en épurant au maximum ma fenêtre. Deux options sont courantes : mettre la fenêtre en plein écran, ou utiliser une extension de navigateur dédiée. Mais ça ne doit pas être si difficile à faire à la main ? Voyons comment faire cela.</summary></entry><entry><title type="html">Faire du Backup-as-a-Service avec Restic et Minio</title><link href="https://chapoline.me/2024/06/11/backup-minio.html" rel="alternate" type="text/html" title="Faire du Backup-as-a-Service avec Restic et Minio" /><published>2024-06-11T00:00:00+00:00</published><updated>2024-06-11T00:00:00+00:00</updated><id>https://chapoline.me/2024/06/11/backup-minio</id><content type="html" xml:base="https://chapoline.me/2024/06/11/backup-minio.html">&lt;p&gt;Pour mon infrastructure de backups, jutilise depuis plusieurs années &lt;a href=&quot;https://www.borgbackup.org/&quot;&gt;BorgBackup&lt;/a&gt;, un excellent outil pour chiffrer et dédupliquer ses sauvegardes, puis les stocker via SSH. Pour les sauvegardes de mes serveurs, il moffre une complète satisfaction. Mais je voulais explorer un nouvel outil dont on mavait dit beaucoup de bien, et je voulais essayer de faire du Backup-as-a-Service.&lt;/p&gt;
&lt;p&gt;Les besoins sont simple : les utilisateurs ayant un compte sur mon service de SSO devraient pouvoir se connecter sur un service, créer une clé dédiée à une application, puis utiliser cette clé pour backup une machine, serveur ou PC, et envoyer les données sur mon serveur central. Les backups créés devraient être chiffrés, dédupliqués, et avec une gestion des droits pour ne pas permettre à un utilisateur décraser ou de modifier les backups des autres (tout étant chiffré, laccès en lecture est moins critique). Si possible, le service devrait pouvoir définir des quotas par utilisateur ; malheureusement, la solution que jai trouvée ne le permet pas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Les différentes étapes de larticle sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#restic&quot;&gt;Installer restic et écrire un script pour le lancer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#minio&quot;&gt;Installer MinIO, et tester que restic fonctionne avec MinIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sso&quot;&gt;Configurer restic pour fonctionner avec MinIO en SSO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;restic&quot;&gt;Faire ses backups simplement&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://restic.net/&quot;&gt;Restic&lt;/a&gt; est une excellente alternative à BorgBackup, implémentée en Go. Il permet lutilisation de plusieurs types de backend de stockage, dont du SFTP, une API REST, ou divers protocols cloud comme AWS S3 et léquivalent chez la concurrence, au prix dune compression moindre et dun plus gros usage en ressources, notamment en RAM, que BorgBackup.&lt;/p&gt;
&lt;p&gt;Sur chaque machine, nous allons installer Restic, puis écrire un petit script &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;backup.sh&lt;/code&gt; autour du binaire pour backup facilement la machine. Je suis repartie de mes scripts existants, eux-même basés sur celui proposé &lt;a href=&quot;https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups&quot;&gt;dans la doc de BorgBackup&lt;/a&gt; :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;restic
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;
info&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;%s %s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;trap&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;echo $( date ) Backup interrupted &amp;gt;&amp;amp;2; exit 2&apos;&lt;/span&gt; INT TERM
info &lt;span class=&quot;s2&quot;&gt;&quot;Starting backup&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; .env
&lt;span class=&quot;c&quot;&gt;# Prehook start&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# You can write here some commands to run before the backup&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# For example, a database dump, or a service stop&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Prehook end&lt;/span&gt;
restic backup /path/to/folder1 /path/to/folder2
&lt;span class=&quot;nv&quot;&gt;backup_exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$?&lt;/span&gt;
restic forget &lt;span class=&quot;nt&quot;&gt;--prune&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--keep-daily&lt;/span&gt; 7 &lt;span class=&quot;nt&quot;&gt;--keep-weekly&lt;/span&gt; 4 &lt;span class=&quot;nt&quot;&gt;--keep-monthly&lt;/span&gt; 12
&lt;span class=&quot;nv&quot;&gt;prune_exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$?&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Posthook start&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# You can write cleanup commands here, or you can restart your services&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Posthook end&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# use highest exit code as global exit code&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;global_exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt; backup_exit &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; prune_exit ? backup_exit : prune_exit &lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;global_exit&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-eq&lt;/span&gt; 0 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Backup and Prune finished successfully&quot;&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 10 &lt;span class=&quot;nt&quot;&gt;--retry&lt;/span&gt; 5 https://health.chapoline.me/ping/&amp;lt;UUID&amp;gt;
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;global_exit&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-eq&lt;/span&gt; 1 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Backup and/or Prune finished with warnings&quot;&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 10 &lt;span class=&quot;nt&quot;&gt;--retry&lt;/span&gt; 5 https://health.chapoline.me/ping/&amp;lt;UUID&amp;gt;/1
&lt;span class=&quot;k&quot;&gt;else
&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Backup and/or Prune finished with errors&quot;&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 10 &lt;span class=&quot;nt&quot;&gt;--retry&lt;/span&gt; 5 https://health.chapoline.me/ping/&amp;lt;UUID&amp;gt;/2
&lt;span class=&quot;k&quot;&gt;fi
&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;global_exit&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +x backup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Jutilise une instance de &lt;a href=&quot;https://healthchecks.io/&quot;&gt;healthchecks&lt;/a&gt; pour monitorer mes backups. Je vous encourage à y jeter un coup doeil, cest très pratique pour monitorer les tâches ponctuelles.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt;, qui contient les informations de connexion au backend de stockage, sera créé par la suite. Il est justement temps de choisir ce backend.&lt;/p&gt;
&lt;h2 id=&quot;minio&quot;&gt;Stocker ses backups quelque part&lt;/h2&gt;
&lt;p&gt;Parmi les différents backends possible, jai fait le choix dutiliser &lt;a href=&quot;https://min.io/&quot;&gt;MinIO&lt;/a&gt;. Ce nest pas un outil que jaime beaucoup utiliser, mais sa compatibilité à lAPI S3 le rend très pratique, et je voulais construire une solution entièrement auto-hébergée.&lt;/p&gt;
&lt;p&gt;Son installation nest pas très simple sous Debian, mais une installation par Docker est possible (et beaucoup plus facile). Pour ma part, je lai installé sur un serveur sous NixOS :&lt;/p&gt;
&lt;div class=&quot;language-nix highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;pkgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}:&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;minio&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;networking&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;firewall&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;allowedTCPPorts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;22&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9000&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9001&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Dans un premier temps, nous allons utiliser les identifiants du compte &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;minioadmin&lt;/code&gt;, pour vérifier que tout fonctionne. &lt;strong&gt;Attention, ne faites pas cela en production&lt;/strong&gt;. On peut revenir sur lautre machine, et créer le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;RESTIC_PASSWORD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;mot de passe de chiffrement des backups&amp;gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;RESTIC_REPOSITORY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;s3:http://&amp;lt;url de minio&amp;gt;:9000/&amp;lt;bucket&amp;gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;minioadmin
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;Mot de passe &lt;span class=&quot;nb&quot;&gt;du &lt;/span&gt;compte minioadmin&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Enfin, on peut tester ces informations de connexion :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; .env
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;restic init
created restic repository f1c6108821 at &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;url]
Please note that knowledge of your password is required to access the repository.
Losing your password means that your data is irrecoverably lost.
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;./backup.sh
Tue Jun 11 08:55:41 UTC 2024 Starting backup
repository f1c6108821 opened successfully, password is correct
...
Tue Jun 11 08:55:45 UTC 2024 Backup and Prune finished successfully
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Le &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;source .env&lt;/code&gt; est nécessaire pour lancer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;restic init&lt;/code&gt; la première fois, ou pour faire des opérations manuelles sur les backups, mais pas pour lancer &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./backup.sh&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois que tout fonctionne, on peut créer un cron pour lancer automatiquement le backup :&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0 4 * * * /path/to/backup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Techniquement, un Timer Systemd est mieux et a plus de fonctionnalités, mais la force de lhabitude est forte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;sso&quot;&gt;Et ma SSO dans tout ça ?&lt;/h2&gt;
&lt;p&gt;Une fois un service de SSO configuré sur MinIO (laissé à titre dexercice au lecteur),&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Modification au 20/06/2024 :&lt;/strong&gt;&lt;br /&gt;
La configuration du SSO sur MinIO est moins simple que je le pensais et mériterait sa propre section. Il est en effet nécessaire de rédiger une Policy, associée à la configuration OpenID, pour définir les droits daccès des utilisateurs connectés via SSO. Par exemple, pour reprendre la méthode utilisée ici et autoriser chaque utilisateur à créer un bucket en son nom, vous pouvez donner les droits &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3:*&lt;/code&gt; sur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arn:aws:s3:::${aws:username}&lt;/code&gt;, et &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;s3:List*&lt;/code&gt; sur &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arn:aws:s3:::*&lt;/code&gt;.&lt;br /&gt;
A noter cependant, que &lt;a href=&quot;https://gitlab.com/gitlab-org/gitlab/-/issues/351725&quot;&gt;Gitlab a un bug qui lempêche dêtre utilisé pour cet usage&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;la solution précédente, en plus de ne pas être sécurisée, nest plus possible : MinIO ne manipule plus de mot de passe pour le compte utilisateur. Il faut donc utiliser une Access Key. Malheureusement, utiliser directement lAccess Key dans la configuration précédente à la place des identifiants du compte ne fonctionne pas. Il va falloir rajouter un outil : &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-cli&lt;/code&gt;. Rassurez vous, bien que développé par AWS pour ses API, cet outil fonctionne parfaitement avec les autres solutions compatibles S3 et nenvoie aucune information à AWS.&lt;/p&gt;
&lt;p&gt;Commençons par nous connecter avec notre compte SSO à MinIO, puis par y générer une Access Key. Installons ensuite &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws-cli&lt;/code&gt; sur la machine à backup, et configurons le :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cette section est basée sur &lt;a href=&quot;https://min.io/docs/minio/linux/integrations/aws-cli-with-minio.html&quot;&gt;https://min.io/docs/minio/linux/integrations/aws-cli-with-minio.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;awscli
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;aws configure
AWS Access Key ID &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;None]: Q3AM3UQ867SPQQA43P2F
AWS Secret Access Key &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;None]: zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG
Default region name &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;None]: ENTER
Default output format &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;None]: ENTER
&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;aws configure &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;default.s3.signature_version s3v4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Enfin, éditez le fichier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.env&lt;/code&gt;, pour remplacer les informations de connexion par le profile AWS que lon vient de créer :&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;RESTIC_PASSWORD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&amp;lt;mot de passe de chiffrement des backups&amp;gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;RESTIC_REPOSITORY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;s3:http://&amp;lt;url de minio&amp;gt;:9000/&amp;lt;bucket&amp;gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AWS_PROFILE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;default
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Vous pouvez retester que tout fonctionne comme précédemment. Il faudra probablement utiliser un autre bucket, ou supprimer le bucket du test précédent.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Concernant les quotas, &lt;a href=&quot;https://github.com/minio/minio/discussions/12361&quot;&gt;MinIO ne propose pas de quota par utilisateur&lt;/a&gt;, uniquement des quotas par bucket, et ne permet pas de définir des quotas par défaut pour tout nouveau bucket créé. Cette solution nest donc possible quavec des utilisateurs de confiance, et nécessite un monitoring de lespace de stockage du serveur MinIO.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Pour des backups encore plus sûrs, vous pouvez mettre en place &lt;a href=&quot;https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html&quot;&gt;un cluster MinIO&lt;/a&gt;, et/ou répliquer les buckets vers un autre serveur de stockage (auto-hébergé ou dans le Cloud) avec &lt;a href=&quot;https://rclone.org/&quot;&gt;rclone&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content><author><name>Caroline Canebier</name></author><category term="sysadmin" /><category term="mainpage" /><summary type="html">Pour mon infrastructure de backups, jutilise depuis plusieurs années BorgBackup, un excellent outil pour chiffrer et dédupliquer ses sauvegardes, puis les stocker via SSH. Pour les sauvegardes de mes serveurs, il moffre une complète satisfaction. Mais je voulais explorer un nouvel outil dont on mavait dit beaucoup de bien, et je voulais essayer de faire du Backup-as-a-Service.</summary></entry></feed>