This commit is contained in:
chapeau 2024-09-09 17:21:37 +00:00
parent 8c3833a9d2
commit 3a2605471a
2 changed files with 217 additions and 1 deletions

View file

@ -1,4 +1,4 @@
<?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 <?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:21:37+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; </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;blockquote&gt;

216
infra.html Normal file
View file

@ -0,0 +1,216 @@
<!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
</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>Blog de Chapoline</h1>
</header>
<blockquote>
<p>Mis à jour le 09/09/2024</p>
</blockquote>
<p>Mon infrastructure est entièrement hébergée chez moi, à lexception d<code class="language-plaintext highlighter-rouge">Amber</code>, un VPS en location chez <a href="https://contabo.com/">Contabo</a>, en Allemagne. Elle ne contient pas de données et me sert uniquement de gateway externe (et dIP).</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>
<h2 id="machines-physiques">Machines physiques</h2>
<p><code class="language-plaintext highlighter-rouge">Cirdan</code> est un EdgeRouter X, acheté 35€ sur Leboncoin en août 2024. Il sert à la fois de routeur principal de linfrastructure, de terminaison Wireguard pour le tunnel avec <code class="language-plaintext highlighter-rouge">Amber</code>, et de DHCP pour les clients du réseau (tous les serveurs sont en ip statique).</p>
<p><code class="language-plaintext highlighter-rouge">Gandalf</code> est mon hyperviseur principal, sous Proxmox VE 8. Cest un serveur monté moi-même avec des composants PC.</p>
<ul>
<li>Boitier Fractal Design Node 804 (130€)</li>
<li>Processeur AMD Ryzen 5 7600 (240€)</li>
<li>Carte mère Gigabyte B650M D3HP AX (145€)</li>
<li>RAM Kingston Fury Beast 32Go 5200MHz (122€)</li>
<li>Alimentation Corsair RM650 (100€)</li>
<li>SSD Samsung 980 250Go (60€)</li>
<li>3 disques durs 2To de récup (0€)</li>
</ul>
<p>Soit un total de 800€.</p>
<p>Le SSD sert de disque OS pour Proxmox, et nest pas en RAID. Les 3 disques durs sont en RAIDZ1 et servent à héberger les disques des machines hébergées dessus. La très grande majorité, voire la totalité de mes machines sont des LXC, pour des raisons de simplicité et de performance.</p>
<p>Jutilise ma Freebox comme routeur et borne Wi-Fi, bien que la majorité du routage soit fait par <code class="language-plaintext highlighter-rouge">Cirdan</code>.</p>
<p>Enfin, jutilise deux switchs Netgear GS608 comme switchs stupides.</p>
<h2 id="plan-dadressage">Plan dadressage</h2>
<p>Mon réseau est séparé de manière thématique, et chaque sous-réseau est associé à un nom de domaine. Ces réseaux ne sont pas isolés par VLAN (car mes bornes Wi-Fi et mes switchs ne le supportent pas).</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">client.chapo.li</code> (<code class="language-plaintext highlighter-rouge">10.255.1.0/24</code>) : contient les appareils branchés en Wi-Fi ou filaire à mon réseau (ordinateurs, téléphones, télévision, consoles…). Cest le seul réseau avec DHCP.</li>
<li><code class="language-plaintext highlighter-rouge">hw.chapo.li</code> (<code class="language-plaintext highlighter-rouge">10.255.2.0/24</code>) : contient les machines physiques (actuellement, uniquement <code class="language-plaintext highlighter-rouge">Gandalf</code>).</li>
<li><code class="language-plaintext highlighter-rouge">vm.chapo.li</code> (<code class="language-plaintext highlighter-rouge">10.255.3.0/24</code>) : contient les machines virtuelles.</li>
<li><code class="language-plaintext highlighter-rouge">gw.chapo.li</code> (<code class="language-plaintext highlighter-rouge">192.168.1.0/24</code>) : contient uniquement le lien entre <code class="language-plaintext highlighter-rouge">Cirdan</code> et la Freebox.</li>
<li><code class="language-plaintext highlighter-rouge">wg.chapo.li</code> (<code class="language-plaintext highlighter-rouge">172.31.0.0/24</code>) : contient les terminaisons Wireguard (<code class="language-plaintext highlighter-rouge">Cirdan</code>, <code class="language-plaintext highlighter-rouge">Amber</code>, et autres).</li>
</ul>
<p>Je nutilise actuellement que de lipv4.</p>
<h2 id="routage">Routage</h2>
<p>Les clients utilisent la Freebox comme passerelle vers Internet, à travers <code class="language-plaintext highlighter-rouge">Cirdan</code>. À cause de limpossibilité de configurer des routes statiques sur la Freebox, <code class="language-plaintext highlighter-rouge">Cirdan</code> doit NATer les paquets à destination de la Freebox, qui doivent donc traverser 2 NAT.</p>
<p>Les serveurs ont accès à internet à travers le tunnel Wireguard et ressortent donc en Allemagne, sauf exception (par exemple le runner Forgejo, qui fonctionne mal depuis lAllemagne, allez savoir pourquoi). Limplémentation du routage est faite grace à du <a href="https://help.ui.com/hc/en-us/articles/204952274-EdgeRouter-Policy-Based-Routing">Policy-Based Routing</a>.</p>
<h2 id="dns">DNS</h2>
<p>Jimplémente un système de double DNS pour gérer mon infrastructure avec des noms de domaine publics, sans publier les enregistrements DNS sur internet, comme décrit dans <a href="https://faercol.me/fr/posts/dns-challenge/">ce blogpost</a>. Jai donc un serveur DNS interne, <code class="language-plaintext highlighter-rouge">dns.vm.chapo.li</code>, qui contient tous les enregistrements que jutilise en interne, et qui nest pas accessible de lextérieur, et un serveur DNS externe, <code class="language-plaintext highlighter-rouge">dns-ext.vm.chapo.li</code>, sans aucun enregistrement, qui ne sert quà lexécution de challenges DNS Lets Encrypt pour la génération de mes certificats TLS internes.</p>
<h2 id="machines-virtuelles">Machines virtuelles</h2>
<p>Toutes (ou presque) mes machines virtuelles sont des LXC. La majorité sont sous Debian 12, à quelques exceptions près, qui sont sout NixOS. Celles sous Debian sont managées par Ansible, et celles sous NixOS sont déployées avec <a href="https://github.com/serokell/deploy-rs">deploy-rs</a>. Jhéberge de nombreux services dont la liste est dynamique, et donc non-exhaustive : Forgejo, Cryptpad, Nextcloud, Sharkey, Vikunja, Prosody… Ils sont utilisés par moi et par mon entourage. La création de ces LXC est également gérée par Ansible.</p>
<p>Jai un système de backup basé sur Restic et MinIO, afin de sauvegarder les données de tous mes services importants. Jai également plusieurs monitorings en place :</p>
<ul>
<li>Grafana + Prometheus pour monitorer les métriques de mes serveurs, grace à <a href="https://github.com/prometheus-pve/prometheus-pve-exporter">Prometheus Proxmox VE Exporter</a></li>
<li>Uptime Kuma pour visualiser et alerter sur la disponibilité de mes services</li>
<li>Healthchecks pour le monitoring de mes backups</li>
</ul>
<p>Ayant une seule adresse ipv4 publique, tous mes services web externes sont derrière un reverse-proxy Nginx hébergé sur un LXC NixOS, <code class="language-plaintext highlighter-rouge">dillon.vm.chapo.li</code>.</p>
<p>Ce blog a ses sources hébergées sur <a href="https://git.chapoline.me">git.chapoline.me</a>, est construit sur le runner Forgejo <code class="language-plaintext highlighter-rouge">action.vm.chapo.li</code>, et est hébergé sur le serveur Nginx de <code class="language-plaintext highlighter-rouge">dillon.vm.chapo.li</code>, rendu accessible sur Internet via le tunnel avec <code class="language-plaintext highlighter-rouge">amber.wg.chapo.li</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>