This commit is contained in:
chapeau 2024-09-18 07:07:09 +00:00
parent 22de005eb2
commit 2b7d97bf9a
4 changed files with 383 additions and 2 deletions

244
2024/09/18/infra-3.html Normal file
View file

@ -0,0 +1,244 @@
<!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>
Infrastructure, 3ème itération
</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="/infra.html">
infra
</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>Infrastructure, 3ème itération</h1>
</header>
<p>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.</p>
<h2 id="première-itération--2020-2023">Première itération : 2020-2023</h2>
<p>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 <a href="https://workaround.org/ispmail-bookworm/">workaround.org</a>, le tout sur le VPS OVH le moins cher possible (<code class="language-plaintext highlighter-rouge">Didi</code>).</p>
<p>Jai ajouté en mars 2022 un deuxième VPS, <code class="language-plaintext highlighter-rouge">Zii</code>, 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 <code class="language-plaintext highlighter-rouge">Didi</code>). Enfin, en octobre 2022, jai ajouté un troisième VPS, <code class="language-plaintext highlighter-rouge">Izz</code>, chez Contabo, avec pour intention de remplacer <code class="language-plaintext highlighter-rouge">Zii</code>. 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é <code class="language-plaintext highlighter-rouge">Zii</code>.</p>
<p>Au fur et à mesure, jai ajouté plusieurs services sur ces serveurs : <a href="https://dashy.to/">Dashy</a>, <a href="https://git.chapoline.me/chapeau/chapolibot">bot Telegram</a>, <a href="https://icinga.com/">Icinga</a>, <a href="https://www.keycloak.org/">Keycloak</a>, et dautres que joublie. Les 3 étaient reliées entre elles par un <a href="https://www.wireguard.com/">Wireguard</a>, qui me servait également à faire sortir mon trafic par <code class="language-plaintext highlighter-rouge">Zii</code> en Suisse.</p>
<p>Jai essayé au départ de gérer mon infrastructure avec <a href="https://www.ansible.com/">Ansible</a>, 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 <code class="language-plaintext highlighter-rouge">Izz</code> qui utilisait <a href="https://traefik.io/traefik/">Traefik</a> (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 <a href="https://www.proxmox.com/">Proxmox</a>, me faisait très envie.</p>
<h2 id="deuxième-itération--2023-2024">Deuxième itération : 2023-2024</h2>
<p>En février 2023, jai sauté le pas et jai acheté sur Leboncoin un Dell PowerEdge R710 (72Go de RAM, 2 CPU), <code class="language-plaintext highlighter-rouge">Montreal</code>, dans lequel jai mis 2 disques de 2To en RAID, et jai commencé à migrer mon infrastructure dessus. Jai également pris un 4ème VPS, <code class="language-plaintext highlighter-rouge">Amber</code>, également chez Contabo, pour me servir dip externe, en la reliant avec un pont Wireguard vers mon infra.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> +-----------+
| |
| Freebox |
| |
+-----+-----+ +------------+
| | |
+------------------+ Montreal |
| | |
| +------------+
| 192.168.1.0/24
| +------------+
| | |
+------------------+ Laptops |
| | |
+---------+ +-----+-----+ +------------+
| | VPN | |
| Amber +------------------+ Gateway |
| | 172.31.0.0/24 | |
+---------+ +-----+-----+
|
| 10.255.0.0/24
|
+-----+-----+
| |
| Servers |
| |
+-----------+
</code></pre></div></div>
<p>Le serveur <code class="language-plaintext highlighter-rouge">gateway</code> me servait de routeur, de DNS et de DHCP grace à <a href="https://thekelleys.org.uk/dnsmasq/doc.html">dnsmasq</a>. 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 <code class="language-plaintext highlighter-rouge">gateway</code>. 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, <a href="https://issuetracker.google.com/issues/263721377">cette option nest pas supportée par Android…</a></p>
<p>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 à <a href="https://pve.proxmox.com/wiki/Debian_Appliance_Builder">DAB</a>, 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 <a href="https://www.gnu.org/software/stow/">Stow</a> dans un monorepo.</p>
<p>Sur chaque nouvelle machine, je commençais par cloner le monorepo à <code class="language-plaintext highlighter-rouge">/usr/local/stow-files</code>, 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 <code class="language-plaintext highlighter-rouge">stow</code> 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 <code class="language-plaintext highlighter-rouge">/etc/dnsmasqs.d/leases.conf</code>, qui était réellement <code class="language-plaintext highlighter-rouge">/usr/local/stow-files/gateway/dnsmasq/dnsmasq.d/leases.conf</code>. Linconvénient était de navoir aucune visibilité sur si javais bien push toutes les machines…</p>
<p>Lors de cette itération, jai également commencé à mintéresser à <a href="https://nixos.org/">NixOS</a>, 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.</p>
<p>Enfin, linfrastructure était monitorée grâce à une stack <a href="https://grafana.com/">Grafana</a> + <a href="https://prometheus.io/">Prometheus</a> + <a href="https://www.netdata.cloud/">Netdata</a>, installé sur tous mes serveurs et LXC.</p>
<p>Malgré le but initial de ce serveur, qui était de remplacer tous mes VPS (sauf <code class="language-plaintext highlighter-rouge">Amber</code>), je ne les ai résiliées quen mai 2024, plus dun an après la mise en production de <code class="language-plaintext highlighter-rouge">Montreal</code>.</p>
<h2 id="troisième-itération--2024-">Troisième itération : 2024-?</h2>
<p>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 <code class="language-plaintext highlighter-rouge">Zii</code>, <code class="language-plaintext highlighter-rouge">Didi</code> et <code class="language-plaintext highlighter-rouge">Izz</code>.</p>
<p>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 <a href="/infra.html">ici</a>), <code class="language-plaintext highlighter-rouge">Gandalf</code>. Jen ai également profité pour acheter un routeur physique (un EdgeRouter X), <code class="language-plaintext highlighter-rouge">Cirdan</code>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> +-----------+
| |
| 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
</code></pre></div></div>
<p>Plutôt que dutiliser un nom de domaine unique pour toutes mes ip (en <code class="language-plaintext highlighter-rouge">.home</code>), jai décidé dutiliser un sous-domaine dun domaine public par sous-réseau, ce qui me permet également <a href="https://faercol.me/fr/posts/dns-challenge/">de générer des certificats TLS valides</a>.</p>
<p>EdgeOS me permet également denfin faire <a href="https://help.ui.com/hc/en-us/articles/204952274-EdgeRouter-Policy-Based-Routing">du source-based routing sans effort</a>, 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…).</p>
<p>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 <code class="language-plaintext highlighter-rouge">docker-compose.yml</code> et un éventuel fichier de configuration, ainsi que pour le routeur, jutilise un simple script bash qui <code class="language-plaintext highlighter-rouge">scp</code> les fichiers pertinents, puis je git le résultat. Peu élégant, mais efficace.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nb">echo</span> <span class="nt">-e</span> <span class="s2">"[cirdan.hw.chapo.li]"</span>
scp ubnt@cirdan.hw.chapo.li:/config/config.boot cirdan.hw.chapo.li/config.boot
...
</code></pre></div></div>
<blockquote>
<p>Oui, ce repo contient beaucoup de secrets en clair. Oui, il est privé et protégé. Oui, ce nest pas très propre…</p>
</blockquote>
<p>Afin de gérer laccès à mes services depuis lextérieur, jutilise deux serveurs : <code class="language-plaintext highlighter-rouge">Amber</code>, mon VPS externe, qui utilise un <code class="language-plaintext highlighter-rouge">firewalld</code> pour gérer un NAT Masquerade et le port-forward vers les machines pertinentes à travers un pont Wireguard vers <code class="language-plaintext highlighter-rouge">Cirdan</code>, et <code class="language-plaintext highlighter-rouge">Dillon</code>, 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.</p>
<p>Enfin, pour gérer les mises à jour des machines, jutilise, en plus de <a href="https://wiki.debian.org/UnattendedUpgrades">unattended-upgrades</a>, <a href="https://github.com/DE-IBH/apt-dater">apt-dater</a>.</p>
<blockquote>
<p>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 !</p>
</blockquote>
<p>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 !</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

@ -101,6 +101,13 @@
<ul>
<li class="post-list-item">
<span class="home-date">
18-09-2024»
</span>
<a href="/2024/09/18/infra-3.html">Infrastructure, 3ème itération</a>
</li>
<li class="post-list-item">
<span class="home-date">
08-09-2024»

127
feed.xml
View file

@ -1,5 +1,128 @@
<?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-09T17:36:54+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;
<?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;

View file

@ -108,6 +108,13 @@
<ul>
<li class="post-list-item">
<span class="home-date">
18-09-2024»
</span>
<a href="/2024/09/18/infra-3.html">Infrastructure, 3ème itération</a>
</li>
<li class="post-list-item">
<span class="home-date">
08-09-2024»