223 lines
12 KiB
HTML
223 lines
12 KiB
HTML
<!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>
|
||
|
||
</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</h1>
|
||
|
||
</header>
|
||
<blockquote>
|
||
<p>Mis à jour le 09/09/2024</p>
|
||
</blockquote>
|
||
|
||
<p>Mon infrastructure est entièrement hébergée chez moi, à l’exception 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 d’IP).</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 l’infrastructure, 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. C’est 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 n’est 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>J’utilise 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, j’utilise deux switchs Netgear GS608 comme switchs stupides.</p>
|
||
|
||
<h2 id="plan-dadressage">Plan d’adressage</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…). C’est 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 n’utilise actuellement que de l’ipv4.</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 l’impossibilité 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 l’Allemagne, allez savoir pourquoi). L’implé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>J’implé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>. J’ai donc un serveur DNS interne, <code class="language-plaintext highlighter-rouge">dns.vm.chapo.li</code>, qui contient tous les enregistrements que j’utilise en interne, et qui n’est pas accessible de l’exté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’à l’exécution de challenges DNS Let’s 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 sont 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>. J’hé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>J’ai un système de backup basé sur Restic et MinIO, afin de sauvegarder les données de tous mes services importants. J’ai é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>
|