Build
This commit is contained in:
parent
22de005eb2
commit
2b7d97bf9a
4 changed files with 383 additions and 2 deletions
244
2024/09/18/infra-3.html
Normal file
244
2024/09/18/infra-3.html
Normal 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>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="/blog.html">
|
||||||
|
blog
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="/infra.html">
|
||||||
|
infra
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="/about.html">
|
||||||
|
à propos
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="https://cv.caroline.canebier.fr">
|
||||||
|
cv
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="https://git.chapoline.me/chapeau/blog">
|
||||||
|
git
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</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 j’en 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>J’ai commencé à héberger mes propres services en avril 2020, pendant le premier confinement. J’avais à l’époque décidé d’acheter un nom de domaine et d’hé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>J’ai ajouté en mars 2022 un deuxième VPS, <code class="language-plaintext highlighter-rouge">Zii</code>, celui-là chez Infomaniak, afin d’avoir un débit nettement plus élevé pour pouvoir m’en servir de serveur VPN, et d’avoir une ip de meilleure réputation (j’avais eu des problèmes avec <code class="language-plaintext highlighter-rouge">Didi</code>). Enfin, en octobre 2022, j’ai 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 l’ip de ses VPS, ce qui baissait la réputation des mails que j’envoyais. Elle me permettait également d’avoir beaucoup plus de stockage, pour un prix deux fois moins élevé. Elle n’a cependant jamais remplacé <code class="language-plaintext highlighter-rouge">Zii</code>.</p>
|
||||||
|
|
||||||
|
<p>Au fur et à mesure, j’ai 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 d’autres que j’oublie. 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>J’ai 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 n’arrivais pas à maintenir correctement les playbooks pour qu’ils continuent de correspondre à l’état réel des serveurs, et j’avais 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 n’ai jamais vraiment été convaincue, mais que j’ai continué à utiliser dessus jusqu’au bout). Enfin, l’envie 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, j’ai sauté le pas et j’ai acheté sur Leboncoin un Dell PowerEdge R710 (72Go de RAM, 2 CPU), <code class="language-plaintext highlighter-rouge">Montreal</code>, dans lequel j’ai mis 2 disques de 2To en RAID, et j’ai commencé à migrer mon infrastructure dessus. J’ai également pris un 4ème VPS, <code class="language-plaintext highlighter-rouge">Amber</code>, également chez Contabo, pour me servir d’ip 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 l’ip publique de ma Freebox, j’ai routé tout le trafic sortant des serveurs à travers le pont VPN. Mais parce que je ne voulais pas m’embêter à faire du source-based routing, j’ai 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 l’option 131 du protocol DHCP ; cependant, <a href="https://issuetracker.google.com/issues/263721377">cette option n’est pas supportée par Android…</a></p>
|
||||||
|
|
||||||
|
<p>En terme d’automatisation d’infra, j’avais décidé d’utiliser une nouvelle approche, pour pallier aux soucis que j’avais eu avec Ansible sur l’itération précédente. Je suis partie d’un 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 j’aurais 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 l’arborescence 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). L’intérêt principal de cette approche était de pouvoir travailler sur les fichiers du serveur sans me poser de question au quotidien ; si j’avais 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>. L’inconvénient était de n’avoir aucune visibilité sur si j’avais bien push toutes les machines…</p>
|
||||||
|
|
||||||
|
<p>Lors de cette itération, j’ai également commencé à m’intéresser à <a href="https://nixos.org/">NixOS</a>, que j’ai également utilisé sur mon PC principal pendant quelques mois. J’ai envisagé de me faire une infrastructure principalement basée dessus, pour au final rester sur une majorité de Debian. J’ai tout de même conservé quelques LXC sous NixOS, principalement pour gérer le reverse-proxy de mon infrastructure avec Nginx.</p>
|
||||||
|
|
||||||
|
<p>Enfin, l’infrastructure é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 qu’en mai 2024, plus d’un 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, j’ai 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 qu’il se mette à trop chauffer et à s’abimer, 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>J’ai 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>. J’en 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 d’utiliser un nom de domaine unique pour toutes mes ip (en <code class="language-plaintext highlighter-rouge">.home</code>), j’ai décidé d’utiliser un sous-domaine d’un 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 d’enfin 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 d’avoir proprement uniquement les serveurs qui sortent par le VPN, tout en pouvant facilement définir des exceptions (par exemple, mon runner Forgejo n’utilise pas le VPN, à cause d’un soucis que je n’ai 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 n’ansiblise 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, j’utilise 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 n’est pas très propre…</p>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Afin de gérer l’accès à mes services depuis l’extérieur, j’utilise 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. C’est lui qui s’occupe 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, j’utilise, 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 d’autres plateformes que Debian et ses dérivés, et n’est plus vraiment maintenu par d’autres personnes que les mainteneurs de Debian… Pro tip si vous voulez l’utiliser depuis un Arch par exemple, il tourne très bien dans un Docker !</p>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Je suis pour l’instant 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>
|
|
@ -101,6 +101,13 @@
|
||||||
|
|
||||||
<ul>
|
<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">
|
<li class="post-list-item">
|
||||||
<span class="home-date">
|
<span class="home-date">
|
||||||
08-09-2024»
|
08-09-2024»
|
||||||
|
|
127
feed.xml
127
feed.xml
|
@ -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
|
<?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">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"><p>Ce blog est un blog statique, construit à partir de <a href="https://jekyllrb.com/">Jekyll</a>. Il peut donc être construit à l’avance, afin de générer des fichiers entièrement statiques, qui seront déployés sur un serveur web qui les servira sur internet. C’est donc une excellente occasion pour mettre en place une CI avec <a href="https://forgejo.org/docs/latest/user/actions/">Forgejo Actions</a>, afin d’automatiser le build de ce blog.</p>
|
</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"><p>Je viens de mettre en production la 3ème itération de mon infrastructure personnelle, et j’en 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>J’ai commencé à héberger mes propres services en avril 2020, pendant le premier confinement. J’avais à l’époque décidé d’acheter un nom de domaine et d’hé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>J’ai ajouté en mars 2022 un deuxième VPS, <code class="language-plaintext highlighter-rouge">Zii</code>, celui-là chez Infomaniak, afin d’avoir un débit nettement plus élevé pour pouvoir m’en servir de serveur VPN, et d’avoir une ip de meilleure réputation (j’avais eu des problèmes avec <code class="language-plaintext highlighter-rouge">Didi</code>). Enfin, en octobre 2022, j’ai 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 l’ip de ses VPS, ce qui baissait la réputation des mails que j’envoyais. Elle me permettait également d’avoir beaucoup plus de stockage, pour un prix deux fois moins élevé. Elle n’a cependant jamais remplacé <code class="language-plaintext highlighter-rouge">Zii</code>.</p>
|
||||||
|
|
||||||
|
<p>Au fur et à mesure, j’ai 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 d’autres que j’oublie. 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>J’ai 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 n’arrivais pas à maintenir correctement les playbooks pour qu’ils continuent de correspondre à l’état réel des serveurs, et j’avais 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 n’ai jamais vraiment été convaincue, mais que j’ai continué à utiliser dessus jusqu’au bout). Enfin, l’envie 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, j’ai sauté le pas et j’ai acheté sur Leboncoin un Dell PowerEdge R710 (72Go de RAM, 2 CPU), <code class="language-plaintext highlighter-rouge">Montreal</code>, dans lequel j’ai mis 2 disques de 2To en RAID, et j’ai commencé à migrer mon infrastructure dessus. J’ai également pris un 4ème VPS, <code class="language-plaintext highlighter-rouge">Amber</code>, également chez Contabo, pour me servir d’ip 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 l’ip publique de ma Freebox, j’ai routé tout le trafic sortant des serveurs à travers le pont VPN. Mais parce que je ne voulais pas m’embêter à faire du source-based routing, j’ai 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 l’option 131 du protocol DHCP ; cependant, <a href="https://issuetracker.google.com/issues/263721377">cette option n’est pas supportée par Android…</a></p>
|
||||||
|
|
||||||
|
<p>En terme d’automatisation d’infra, j’avais décidé d’utiliser une nouvelle approche, pour pallier aux soucis que j’avais eu avec Ansible sur l’itération précédente. Je suis partie d’un 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 j’aurais 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 l’arborescence 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). L’intérêt principal de cette approche était de pouvoir travailler sur les fichiers du serveur sans me poser de question au quotidien ; si j’avais 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>. L’inconvénient était de n’avoir aucune visibilité sur si j’avais bien push toutes les machines…</p>
|
||||||
|
|
||||||
|
<p>Lors de cette itération, j’ai également commencé à m’intéresser à <a href="https://nixos.org/">NixOS</a>, que j’ai également utilisé sur mon PC principal pendant quelques mois. J’ai envisagé de me faire une infrastructure principalement basée dessus, pour au final rester sur une majorité de Debian. J’ai tout de même conservé quelques LXC sous NixOS, principalement pour gérer le reverse-proxy de mon infrastructure avec Nginx.</p>
|
||||||
|
|
||||||
|
<p>Enfin, l’infrastructure é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 qu’en mai 2024, plus d’un 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, j’ai 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 qu’il se mette à trop chauffer et à s’abimer, 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>J’ai 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>. J’en 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 d’utiliser un nom de domaine unique pour toutes mes ip (en <code class="language-plaintext highlighter-rouge">.home</code>), j’ai décidé d’utiliser un sous-domaine d’un 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 d’enfin 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 d’avoir proprement uniquement les serveurs qui sortent par le VPN, tout en pouvant facilement définir des exceptions (par exemple, mon runner Forgejo n’utilise pas le VPN, à cause d’un soucis que je n’ai 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 n’ansiblise 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, j’utilise 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 n’est pas très propre…</p>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Afin de gérer l’accès à mes services depuis l’extérieur, j’utilise 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. C’est lui qui s’occupe 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, j’utilise, 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 d’autres plateformes que Debian et ses dérivés, et n’est plus vraiment maintenu par d’autres personnes que les mainteneurs de Debian… Pro tip si vous voulez l’utiliser depuis un Arch par exemple, il tourne très bien dans un Docker !</p>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<p>Je suis pour l’instant 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></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 j’en 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"><p>Ce blog est un blog statique, construit à partir de <a href="https://jekyllrb.com/">Jekyll</a>. Il peut donc être construit à l’avance, afin de générer des fichiers entièrement statiques, qui seront déployés sur un serveur web qui les servira sur internet. C’est donc une excellente occasion pour mettre en place une CI avec <a href="https://forgejo.org/docs/latest/user/actions/">Forgejo Actions</a>, afin d’automatiser le build de ce blog.</p>
|
||||||
|
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>Je ne fais ici que de la CI, pas de CD (je ne déploie pas automatiquement sur mon serveur web), car j’utilise NixOS pour mon serveur web, et je préfère donc définir manuellement le commit exact du blog que je déploie.</p>
|
<p>Je ne fais ici que de la CI, pas de CD (je ne déploie pas automatiquement sur mon serveur web), car j’utilise NixOS pour mon serveur web, et je préfère donc définir manuellement le commit exact du blog que je déploie.</p>
|
||||||
|
|
|
@ -108,6 +108,13 @@
|
||||||
<ul>
|
<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">
|
<li class="post-list-item">
|
||||||
<span class="home-date">
|
<span class="home-date">
|
||||||
08-09-2024»
|
08-09-2024»
|
||||||
|
|
Loading…
Add table
Reference in a new issue