This commit is contained in:
chapeau 2024-09-08 12:43:55 +00:00
parent 1f70a332ff
commit 8c3833a9d2
6 changed files with 290 additions and 30 deletions

View file

@ -98,13 +98,13 @@
<blockquote>
<p>Les différentes étapes de larticle sont :</p>
<ul>
<li><a href="#faire-ses-backups-simplement">Installer restic et écrire un script pour le lancer</a></li>
<li><a href="#stocker-ses-backups-quelque-part">Installer MinIO, et tester que restic fonctionne avec MinIO</a></li>
<li><a href="#et-ma-sso-dans-tout-ça-">Configurer restic pour fonctionner avec MinIO en SSO</a></li>
<li><a href="#restic">Installer restic et écrire un script pour le lancer</a></li>
<li><a href="#minio">Installer MinIO, et tester que restic fonctionne avec MinIO</a></li>
<li><a href="#sso">Configurer restic pour fonctionner avec MinIO en SSO</a></li>
</ul>
</blockquote>
<h2 id="faire-ses-backups-simplement">Faire ses backups simplement</h2>
<h2 id="restic">Faire ses backups simplement</h2>
<p><a href="https://restic.net/">Restic</a> 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.</p>
@ -159,7 +159,7 @@ restic forget <span class="nt">--prune</span> <span class="nt">--keep-daily</spa
<p>Le fichier <code class="language-plaintext highlighter-rouge">.env</code>, qui contient les informations de connexion au backend de stockage, sera créé par la suite. Il est justement temps de choisir ce backend.</p>
<h2 id="stocker-ses-backups-quelque-part">Stocker ses backups quelque part</h2>
<h2 id="minio">Stocker ses backups quelque part</h2>
<p>Parmi les différents backends possible, jai fait le choix dutiliser <a href="https://min.io/">MinIO</a>. 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.</p>
@ -217,7 +217,7 @@ Tue Jun 11 08:55:45 UTC 2024 Backup and Prune finished successfully
<p>Techniquement, un Timer Systemd est mieux et a plus de fonctionnalités, mais la force de lhabitude est forte.</p>
</blockquote>
<h2 id="et-ma-sso-dans-tout-ça-">Et ma SSO dans tout ça ?</h2>
<h2 id="sso">Et ma SSO dans tout ça ?</h2>
<p>Une fois un service de SSO configuré sur MinIO (laissé à titre dexercice au lecteur),</p>

View file

@ -98,14 +98,14 @@
<blockquote>
<p>Les différentes étapes de cet article sont :</p>
<ul>
<li><a href="#environnement">Une description de lenvironnement dans lequel le serveur XMPP va être déployé</a></li>
<li><a href="#installation-et-configuration-initiale">Linstallation et la configuration du serveur XMPP en lui-même</a></li>
<li><a href="#file-sharing-et-muc">La configuration de quelques fonctionnalités supplémentaires (partage de fichier et rooms)</a></li>
<li><a href="#fichier-de-configuration-final">La configuration finale du serveur</a></li>
<li><a href="#env">Une description de lenvironnement dans lequel le serveur XMPP va être déployé</a></li>
<li><a href="#install">Linstallation et la configuration du serveur XMPP en lui-même</a></li>
<li><a href="#file">La configuration de quelques fonctionnalités supplémentaires (partage de fichier et rooms)</a></li>
<li><a href="#config">La configuration finale du serveur</a></li>
</ul>
</blockquote>
<h2 id="environnement">Environnement</h2>
<h2 id="env">Environnement</h2>
<p>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.</p>
@ -117,7 +117,7 @@
<p>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).</p>
<h2 id="installation-et-configuration-initiale">Installation et configuration initiale</h2>
<h2 id="install">Installation et configuration initiale</h2>
<p>Linstallation sous debian se fait via le repo officiel de Prosody :</p>
@ -177,7 +177,7 @@ Checking certificate for chat.example.org
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>prosodyctl adduser user@chat.example.org
</code></pre></div></div>
<h2 id="file-sharing-et-muc">File sharing et MUC</h2>
<h2 id="file">File sharing et MUC</h2>
<p>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.</p>
@ -225,7 +225,7 @@ Checking certificate for chat.example.org
<span class="p">};</span>
</code></pre></div></div>
<h2 id="fichier-de-configuration-final">Fichier de configuration final</h2>
<h2 id="config">Fichier de configuration final</h2>
<div class="language-lua highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">external_addresses</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"198.51.100.5"</span> <span class="p">}</span>

View file

@ -0,0 +1,180 @@
<!DOCTYPE html>
<html lang="en" class="html" data-theme="light"><head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>
Workflow de déploiement de mon blog avec Forgejo Actions
</title>
<link rel="stylesheet" href="/assets/css/main.css" />
<script type="text/javascript">
window.addEventListener('load', themeChange);
const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null;
if (currentTheme)
document.documentElement.setAttribute('data-theme', currentTheme);
function themeChange() {
let button = document.querySelector('.theme-toggle');
button.addEventListener('click', function (e) {
let currentTheme = document.documentElement.getAttribute('data-theme');
if (currentTheme === 'dark') {
transition();
document.documentElement.setAttribute('data-theme', 'light');
localStorage.setItem('theme', 'light');
} else {
transition();
document.documentElement.setAttribute('data-theme', 'dark');
localStorage.setItem('theme', 'dark');
}
});
let transition = () => {
document.documentElement.classList.add('transition');
window.setTimeout(() => {
document.documentElement.classList.remove('transition');
}, 1000);
}
}
</script>
</head>
<body>
<main class="page-content" aria-label="Content">
<div class="w">
<header>
<ul class="horizontal-list">
<li>
<a href="/">
accueil
</a>
&nbsp;&nbsp;
</li>
<li>
<a href="/blog.html">
blog
</a>
&nbsp;&nbsp;
</li>
<li>
<a href="/about.html">
à propos
</a>
&nbsp;&nbsp;
</li>
<li>
<a href="https://cv.caroline.canebier.fr">
cv
</a>
&nbsp;&nbsp;
</li>
<li>
<a href="https://git.chapoline.me/chapeau/blog">
git
</a>
&nbsp;&nbsp;
</li>
</ul>
<div class="dashed"></div>
<h1>Workflow de déploiement de mon blog avec Forgejo Actions</h1>
</header>
<p>Ce blog est un blog statique, construit à partir de <a href="https://jekyllrb.com/">Jekyll</a>. 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 <a href="https://forgejo.org/docs/latest/user/actions/">Forgejo Actions</a>, afin dautomatiser le build de ce blog.</p>
<blockquote>
<p>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.</p>
</blockquote>
<p>Je travaille avec deux dépots de code : <a href="https://git.chapoline.me/chapeau/blog">blog</a>, qui contient les sources du blog, et <a href="https://git.chapoline.me/chapeau/blog-static">blog-static</a>, 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.</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># .forgejo/workflows/main.yml</span>
<span class="c1"># We execute this workflow on each commit pushed</span>
<span class="na">on</span><span class="pi">:</span>
<span class="na">push</span><span class="pi">:</span>
<span class="na">jobs</span><span class="pi">:</span>
<span class="na">build</span><span class="pi">:</span>
<span class="na">runs-on</span><span class="pi">:</span> <span class="s">docker</span>
<span class="na">container</span><span class="pi">:</span>
<span class="c1"># the Checkout Action needs node to run</span>
<span class="na">image</span><span class="pi">:</span> <span class="s">node:bookworm</span>
<span class="na">steps</span><span class="pi">:</span>
<span class="c1"># First, clone the source repo</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Clone repo</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
<span class="c1"># Then, clone the static repo on the build output path</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Clone static repo</span>
<span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
<span class="na">with</span><span class="pi">:</span>
<span class="na">repository</span><span class="pi">:</span> <span class="s">chapeau/blog-static</span>
<span class="na">path</span><span class="pi">:</span> <span class="s">_site</span>
<span class="c1"># This repo needs a token because we will push on it later</span>
<span class="na">token</span><span class="pi">:</span> <span class="s">${{ secrets.GH_PAT }}</span>
<span class="na">ref</span><span class="pi">:</span> <span class="s">main</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Setup</span>
<span class="na">env</span><span class="pi">:</span>
<span class="na">MAIL</span><span class="pi">:</span> <span class="s">${{ secrets.MAIL }}</span>
<span class="na">shell</span><span class="pi">:</span> <span class="s">bash</span>
<span class="na">run</span><span class="pi">:</span> <span class="pi">|</span>
<span class="s"># Install some dependencies for the blog</span>
<span class="s">apt update</span>
<span class="s">apt install -y bundler git apt-utils</span>
<span class="s"># This configuration is mandatory to make commits</span>
<span class="s">git config --global user.email "$MAIL"</span>
<span class="s">git config --global user.name "CI Builder"</span>
<span class="s"># Install ruby dependencies</span>
<span class="s">bundle install</span>
<span class="s"># Build the blog</span>
<span class="s">bundle exec jekyll build</span>
<span class="s"># Commit and push</span>
<span class="s">cd _site</span>
<span class="s">git add --all</span>
<span class="s">git commit -m "Build"</span>
<span class="s">git push -u origin main </span>
</code></pre></div></div>
<p>Pour utiliser ce workflow, deux choses sont nécessaires : un runner Forgejo bien sur, et quelques secrets.</p>
<p>Jutilise un simple runner docker, installé en suivant la <a href="https://forgejo.org/docs/latest/admin/actions/#forgejo-runner">documentation officielle</a>.</p>
<p>Les secrets se définissent dans linterface web de Forgejo, pour le projet, dans <code class="language-plaintext highlighter-rouge">Paramètres -&gt; Actions -&gt; Secrets</code>. Deux sont nécessaires pour ce workflow : <code class="language-plaintext highlighter-rouge">MAIL</code>, qui contient simplement ladresse mail utilisée pour les commits, et <code class="language-plaintext highlighter-rouge">GH_PAT</code>, 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 <code class="language-plaintext highlighter-rouge">Configuration -&gt; Applications</code>.</p>
<button title="Toggle Theme" class="theme-toggle">
<svg viewBox="0 0 32 32" width="24" height="24" fill="currentcolor">
<circle cx="16" cy="16" r="14" fill="none" stroke="currentcolor" stroke-width="4"></circle>
<path d="
M 16 0
A 16 16 0 0 0 16 32
z">
</path>
</svg>
</button>
<div class="credits">
Theme forked from <a href="https://github.com/abhinavs/moonwalk" target="_blank" rel="noreferrer">Moonwalk</a>, mixed with <a href="https://github.com/catppuccin/catppuccin" target="_blank" rel="noreferrer">Catppuccin</a>
</div>
</div>
</main>
</body>
</html>

View file

@ -94,6 +94,13 @@
<ul>
<li class="post-list-item">
<span class="home-date">
08-09-2024»
</span>
<a href="/2024/09/08/blog-workflow.html">Workflow de déploiement de mon blog avec Forgejo Actions</a>
</li>
<li class="post-list-item">
<span class="home-date">
28-08-2024»

View file

@ -1,19 +1,85 @@
<?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-08T08:18:06+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">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;
<?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-08T12:43:55+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">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;#environnement&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;#installation-et-configuration-initiale&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-sharing-et-muc&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;#fichier-de-configuration-final&quot;&gt;La configuration finale du serveur&lt;/a&gt;&lt;/li&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;environnement&quot;&gt;Environnement&lt;/h2&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;
@ -25,7 +91,7 @@
&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;installation-et-configuration-initiale&quot;&gt;Installation et configuration initiale&lt;/h2&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;
@ -85,7 +151,7 @@ Checking certificate for chat.example.org
&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-sharing-et-muc&quot;&gt;File sharing et MUC&lt;/h2&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;
@ -133,7 +199,7 @@ Checking certificate for chat.example.org
&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;fichier-de-configuration-final&quot;&gt;Fichier de configuration final&lt;/h2&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;
@ -251,13 +317,13 @@ Checking certificate for chat.example.org
&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;#faire-ses-backups-simplement&quot;&gt;Installer restic et écrire un script pour le lancer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#stocker-ses-backups-quelque-part&quot;&gt;Installer MinIO, et tester que restic fonctionne avec MinIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#et-ma-sso-dans-tout-ça-&quot;&gt;Configurer restic pour fonctionner avec MinIO en SSO&lt;/a&gt;&lt;/li&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;faire-ses-backups-simplement&quot;&gt;Faire ses backups simplement&lt;/h2&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;
@ -312,7 +378,7 @@ restic forget &lt;span class=&quot;nt&quot;&gt;--prune&lt;/span&gt; &lt;span cla
&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;stocker-ses-backups-quelque-part&quot;&gt;Stocker ses backups quelque part&lt;/h2&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;
@ -370,7 +436,7 @@ Tue Jun 11 08:55:45 UTC 2024 Backup and Prune finished successfully
&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;et-ma-sso-dans-tout-ça-&quot;&gt;Et ma SSO dans tout ça ?&lt;/h2&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;

View file

@ -101,6 +101,13 @@
<ul>
<li class="post-list-item">
<span class="home-date">
08-09-2024»
</span>
<a href="/2024/09/08/blog-workflow.html">Workflow de déploiement de mon blog avec Forgejo Actions</a>
</li>
<li class="post-list-item">
<span class="home-date">
28-08-2024»