Running 6 nœuds · 15+ services · ARM64 6 nodes · 15+ services · ARM64

Haute disponibilité Homelab sur Raspberry Pi Production-Grade Homelab on Raspberry Pi

Un cluster k3s haute disponibilité sur 6 Raspberry Pi, déployé en GitOps avec ArgoCD — documentation de chaque service, des défis rencontrés et des solutions apportées. A 6-node k3s cluster built for learning, experimentation, and real workloads — from GitOps and distributed storage to local AI and full observability.

6
NœudsNodes
3 ctrl · 3 worker
24
ServicesServices
apps ArgoCDArgoCD apps
48
ArticlesArticles
retours d'expérience field notes
~1 TB
StockageStorage
Longhorn distribué Longhorn distributed

articles

articles

monitoring Running

Mesurer son audience sans traceur : quand un import horodaté multiplie le trafic par 8 Counting Visitors Without a Tracker: How a Timestamped Import Multiplied My Traffic by Eight

Un collecteur rapatrie les agrégats horaires de l'API GraphQL de Cloudflare dans VictoriaMetrics. Pendant dix semaines, chaque compte par hôte valait environ huit fois la réalité : une fenêtre datée à sa fin, une base qui ne dédupliquait pas, et un commentaire qui promettait l'idempotence. Le diagnostic, le correctif, la reconstruction de l'historique, et pourquoi la règle « la plus grande valeur gagne » imposait de supprimer des séries. A collector pulls hourly aggregates from Cloudflare's GraphQL API into VictoriaMetrics. For ten weeks, every host-level count was about eight times too high: a window dated at its end, a database that did not deduplicate, and a docstring that promised idempotence. How the bug was found, fixed and the history rebuilt, and why the max-wins rule made deleting series the only way out.

monitoringvictoriametricscloudflare
17 oct. 2026 · 10m 17 Oct 2026 · 10m
monitoring Running

Relire ses propres tableaux Grafana : cinq angles morts qu'aucune alerte ne voyait Re-reading Your Own Grafana Dashboards: Five Blind Spots No Alert Could See

Une nuit à relire chaque tableau, panneau par panneau, a fait remonter une base de métriques coincée à côté d'etcd, un tmpfs rempli de bibliothèques orphelines, un binaire amd64 dans une image arm64 et des certificats K3s qu'un redémarrage complet du cluster n'avait pas renouvelés. Aucune alerte n'avait sonné, parce que rien ne les mesurait. One night spent reading every dashboard panel by panel turned up a metrics database squeezed next to etcd, a tmpfs full of orphaned libraries, an amd64 binary inside an arm64 image and K3s certificates that a full cluster restart had not renewed. None of it had triggered an alert, because nothing was measuring it.

monitoringgrafanavictoriametrics
16 oct. 2026 · 10m 16 Oct 2026 · 10m
ai Running

Un agent LangGraph qui trie une boîte Gmail sans laisser le LLM décider A LangGraph agent that sorts a Gmail inbox without letting the LLM decide

26 000 mails triés pour 30 centimes d'API : le modèle ne fait qu'étiqueter, une politique versionnée décide, les mails protégés n'atteignent jamais le modèle, et rien n'est supprimé avant la relecture d'un dry-run. Puis les pièges du réel : quotas par minute, un NAS noyé de PDF à minuit, et un déploiement sans image de conteneur. 26,000 mails sorted for 30 cents of API: the model only labels, a versioned policy decides, protected mails never reach the model, and nothing is deleted before a dry-run has been reviewed. Then the real-world traps: per-minute quotas, a NAS flooded with PDFs at midnight, and a deployment without a container image.

aillmagents
15 oct. 2026 · 10m 15 Oct 2026 · 10m
gitops Running

Rendre les manifests à leur application : Applications ArgoCD multi-source et digest épinglé dans le dépôt de l'app Giving manifests back to their app: multi-source ArgoCD Applications and a digest pinned in the app's own repo

Pendant des mois, chaque build de CI s'est terminé par un commit de robot dans le dépôt d'infrastructure : 141 de ses 487 commits. Le 2 octobre 2026, cinq apps ont rapatrié leurs manifests dans un dossier deploy/ de leur propre dépôt, lu par ArgoCD à côté du dépôt d'infra. Comment la bascule s'est faite sans redémarrer un pod, et les pièges rencontrés en route. For months, every CI build ended with a robot commit in the infrastructure repo: 141 of its 487 commits. On 2 October 2026, five apps moved their manifests into a deploy/ folder in their own repo, read by ArgoCD next to the infra repo. How the switch went without restarting a pod, and the traps found on the way.

gitopsargocdci
15 oct. 2026 · 9m 15 Oct 2026 · 9m
networking Running

Défense en profondeur : l'app vérifie elle-même le badge Cloudflare Access Defence in depth: the app checks the Cloudflare Access badge itself

Une console d'administration interne, derrière un tunnel Cloudflare et Access, répondait pourtant à n'importe qui dans le cluster. La parade : vérifier le JWT Cf-Access-Jwt-Assertion dans l'application, en mode journal puis strict — et les pièges de l'audience, des WebSocket, des journaux et du cache de clés rencontrés en route. An internal admin console sat behind a Cloudflare tunnel and Access, yet answered anyone inside the cluster. The fix: verify the Cf-Access-Jwt-Assertion JWT in the app, roll it out in log-only mode, then strict — and the audience, WebSocket, logging and key-cache traps found on the way.

k3s-clustersecuritycloudflare
13 oct. 2026 · 12m 13 Oct 2026 · 12m
apps Running

Le vrai Obsidian dans le navigateur, synchronisé par un sidecar git sans jamais perdre une frappe Real Obsidian in the Browser, Synced by a Git Sidecar That Never Drops a Keystroke

Un pod Kubernetes fait tourner l'application Obsidian de bureau, streamée dans le navigateur, pendant qu'un petit sidecar shell committe, rebase et pousse le coffre vers Gitea, le PC continuant de pousser sur le même dépôt. Deux écrivains, un dépôt : la boucle de synchro, la branche de conflit, et les quatre façons de perdre une frappe qu'une relecture finale a trouvées. A Kubernetes pod runs the Obsidian desktop app, streamed to the browser, while a small shell sidecar commits, rebases and pushes the vault to Gitea, with the PC still pushing to the same repository. Two writers, one repo: the sync loop, the conflict branch, and the four ways to lose a keystroke that a final review caught.

k3s-clustergitopsgit
13 oct. 2026 · 11m 13 Oct 2026 · 11m
storage Running

Un seul disque mécanique dictait la latence de tout Longhorn : cloner à froid le HDD d’un Pi 5 vers un SSD, sans reconstruire une seule réplique One spinning disk set the latency for all of Longhorn: cold-cloning a Pi 5’s HDD to an SSD without rebuilding a single replica

Un disque dur USB à 5400 tr/min sur un worker prenait en otage toutes les écritures synchrones de Longhorn. Le remplacer par un SSD en le clonant bit à bit depuis un PC sous WSL2 — avec des garde-fous contre l’inversion source/cible — a fait passer la latence disque médiane de 20,17 à 0,264 ms, et les 15 volumes sont revenus sains sans une seule reconstruction. A 5400 rpm USB hard drive on one worker held every synchronous Longhorn write hostage. Swapping it for an SSD by cloning it bit for bit from a PC under WSL2 — with guardrails against a reversed source and target — took the median disk latency from 20.17 to 0.264 ms, and all 15 volumes came back healthy without a single rebuild.

k3s-clusterlonghornstorage
12 oct. 2026 · 11m 12 Oct 2026 · 11m
monitoring Running

48 alertes pour 24 pods : quand un seul reboot sature le Telegram 48 Alerts for 24 Pods: Taming an Alerting Pipeline That Amplified a Single Reboot

Une migration rack planifiée redémarre tous les nœuds et le canal d'alertes explose : deux règles qui se chevauchent, un filtre de raison qui confond la perte d'un nœud avec un kill de probe, et un script d'investigation automatique qui raisonne par pod au lieu de par cause. Trois correctifs et un routage revu ramènent une tempête simulée de 48 alertes à 4 messages. A planned rack move rebooted every node and the alert channel exploded: two overlapping rules, a reason filter that mistook node loss for probe kills, and an auto-investigation script that worked per pod instead of per cause. Three fixes and a routing change brought a simulated 48-alert storm down to 4 messages.

monitoringvmalertalertmanager
11 oct. 2026 · 10m 11 Oct 2026 · 10m
infra Running

Éteindre et rallumer un cluster k3s GitOps entier pour déménager le rack Powering down a whole GitOps k3s cluster to move the rack — and bringing it back

Six nœuds, 15 volumes Longhorn et 32 Applications ArgoCD éteints puis rallumés volontairement : restaurations testées avant, contrôleur ArgoCD à zéro, ordre d’extinction strict — et les quatre surprises de la relance, 60 minutes la première fois, 10 la seconde. Six nodes, 15 Longhorn volumes and 32 ArgoCD Applications shut down and restarted on purpose: restores tested beforehand, the ArgoCD controller scaled to zero, a strict shutdown order — and the four surprises of the restart, which took 60 minutes the first time and 10 the second.

k3s-clusterargocdgitops
11 oct. 2026 · 11m 11 Oct 2026 · 11m
infra Running

Donner un vrai MemoryPressure à k3s : eviction-hard et réserves système en rolling sur 6 nœuds hétérogènes Giving k3s a Real MemoryPressure: Eviction Thresholds and System Reserves, Rolled Out Across Six Mismatched Nodes

Par défaut, K3s ne pose aucun seuil d'éviction mémoire et ne réserve rien au système : MemoryPressure ne peut jamais se déclencher et c'est l'OOM-killer du noyau qui arbitre. L'audit, les trois profils de nœuds, le rolling avec canari — et le chmod récursif qui a cassé le SSH de Gitea au passage. Out of the box, K3s sets no memory eviction threshold and reserves nothing for the system, so MemoryPressure can never fire and the kernel OOM killer has the final word. Here is the audit, the three node profiles, the canary-first rolling rollout — and the recursive chmod that quietly broke Gitea's SSH along the way.

k3s-clusterk8srpi
11 oct. 2026 · 10m 11 Oct 2026 · 10m
apps Running

La parité avant la bascule : passer un parcours Jinja à React sans régression Behavioural parity before the switch-over: moving a Jinja flow to React without regressions

Un formulaire serveur en sept étapes remplacé par une application React en trois jours : une couche de service, une façade JSON derrière un interrupteur, un harnais qui rejoue chaque geste sur les deux façades et compare ce que l'utilisateur constate — puis un seul commit qui retire l'ancienne. A seven-step server-rendered form replaced by a React app in three days: a service layer, a JSON facade behind a switch, a harness that replays every gesture on both facades and compares what the user observes — then a single commit that removes the old one.

migrationtddapps
10 oct. 2026 · 9m 10 Oct 2026 · 9m
infra Running

Sceller des secrets sans laisser de trace Sealing secrets without leaving a trace

Alimenter kubeseal depuis un coffre de mots de passe par la mémoire du processus et un tube SSH, sans qu'aucune valeur ne touche le disque ni une ligne de commande — et les cinq façons dont un secret s'est quand même corrompu ou échappé en chemin. Feeding kubeseal from a password vault through process memory and an SSH pipe, so no value ever lands on disk or in a command line — and the five ways a secret still got corrupted or leaked along the way.

k3s-clustersecuritysecrets
9 oct. 2026 · 9m 9 Oct 2026 · 9m
apps Running

Ingérer des flux temps réel peu fiables sur un cluster ARM : tempête de reconnexion, verrous SQLite et mémoire Taming Unreliable Real-Time Feeds on an ARM Cluster: Reconnect Storms, SQLite Locks and Memory

Un agrégateur de flux publics auto-hébergé a transformé un certificat expiré chez un fournisseur en 12,9 millions de lignes de logs en une journée, une table conntrack saturée et un pod tué par l'OOM killer. Le bug de boucles qui doublent, le correctif en trois couches (ordonnanceur single-flight, backoff, disjoncteur), puis les pannes plus discrètes trouvées ensuite : cascade de verrous SQLite, processus zombies et flux morts. A self-hosted aggregator of public feeds turned one expired upstream certificate into 12.9 million log lines in a day, a saturated conntrack table and an OOM-killed pod. Here is the doubling-loop bug behind it, the three-layer fix (single-flight scheduler, backoff, circuit breaker), and the quieter failures found next: a SQLite lock cascade, zombie processes and dead feeds.

k3s-clusterincidentdebugging
4 oct. 2026 · 10m 4 Oct 2026 · 10m
ai Running

Le wiki que mon IA devait tenir à jour : autopsie à J+4 The Wiki My AI Was Supposed to Keep Up to Date: a Four-Day Autopsy

Un LLM Wiki à la Karpathy, alimenté par un agent quotidien et surveillé par un lint hebdomadaire dans le cluster. Quatre jours après sa création, j'ai ouvert le capot et compté : une journée à 17 commits d'infra a laissé 2 commits dans le wiki, les captures n'étaient jamais commitées, et quatre pannes empilées fermaient la vanne. Ce qui a cassé, ce qu'a donné la réparation, et pourquoi le coût de maintenance n'a pas disparu : il a changé de nature. An LLM Wiki in Karpathy's style, fed by a daily agent and watched by a weekly lint in the cluster. Four days in, I opened the hood and counted: a 17-commit day left 2 commits in the wiki, captures were never committed, and four stacked failures kept the feed shut. Here is what broke, what the fix looked like, and why the maintenance cost did not disappear — it moved.

aillmgitops
3 oct. 2026 · 11m 3 Oct 2026 · 11m
gitops Running

Adopter 7 releases Helm dans ArgoCD sans redémarrer un seul pod Adopting 7 Helm Releases into ArgoCD Without Restarting a Single Pod

Sept composants étaient encore installés à la main avec Helm, hors GitOps — dont la couche de stockage et le controller de secrets. Voici la méthode d'adoption qui les a tous fait passer sous ArgoCD avec un diff de pré-adoption vide et zéro redémarrage de pod, et les pièges rencontrés en chemin. Seven components were still installed by hand with Helm, outside GitOps — including the storage layer and the secrets controller. Here is the adoption method that moved all of them under ArgoCD with an empty pre-adoption diff and zero pod restarts, and the traps found along the way.

k3s-clusterargocdgitops
8 sept. 2026 · 11m 8 Sept 2026 · 11m
ai Running

Laisser un LLM composer un site sans le laisser écrire du HTML Letting an LLM Compose a Website Without Letting It Write HTML

Un générateur transforme un brief en site statique. Le modèle n'écrit jamais de HTML, de CSS ni de couleur — il choisit une composition dans un catalogue fermé. Deux étages de schéma, quelques règles que le typage ne sait pas dire, et une seule nouvelle tentative. A generator turns a short brief into a static site. The model never emits HTML, CSS or a colour — it picks a composition inside a closed catalog. Two schema stages, a handful of rules the type system cannot express, and exactly one retry.

aillmpython
6 sept. 2026 · 10m 6 Sept 2026 · 10m
gitops Running

Quand le mirror de backup diverge en silence de la source de vérité When Your GitOps Backup Mirror Silently Diverges

Une vérification de routine après un push révèle un mirror de backup gelé depuis cinq jours par un credential expiré — et deux commits qui n'existaient que côté backup, écrits par une deploy key oubliée. Diagnostic, la règle « réconcilier avant de réparer », et pourquoi un mirror cassé a sauvé les données. A routine post-push check revealed a backup mirror frozen for five days by an expired credential — and two commits that existed only on the backup, written by a forgotten deploy key. Diagnosis, the reconcile-before-repair rule, and why a broken mirror accidentally saved the data.

gitopsgitgitea
25 août 2026 · 9m 25 Aug 2026 · 9m
meta Running

Auditer la sécurité de mon homelab avec un agent IA (Claude Fable 5) Auditing My Homelab's Security With an AI Agent (Claude Fable 5)

J'ai pointé Claude Fable 5 sur tout mon homelab — notes, dépôts et cluster en production — pour trouver ce qui pouvait menacer mes données, ma vie privée et mon matériel. Voici la méthode, les catégories de failles, le moment où l'IA s'est complètement trompée, et comment on a transformé l'audit en changements sûrs et vérifiés, jusqu'à un upgrade mineur de k3s en rolling. I pointed Claude Fable 5 at my whole homelab — notes, repos, and the live cluster — and asked it to find what could hurt my data, privacy, and hardware. Here's the method, the classes of findings, the time it was flat wrong, and how we turned the audit into safe, verified changes including a rolling k3s minor upgrade.

securityaiclaude-fable-5
10 juil. 2026 · 10m 10 Jul 2026 · 10m
apps Running

Du papier à l'archive indexée : un pipeline de scan recto-verso avec classification par LLM local From Paper to Searchable Archive: a Duplex Scanner Pipeline with Local LLM Classification

Construction d'un pipeline sans papier sur le NAS : un scanner eSCL qui alimente Paperless-ngx avec OCR en 3 langues, un algorithme d'entrelacement de pages écrit en TDD pour simuler le recto-verso sur un bac simplex, et un LLM local sur un PC séparé qui lit chaque document pour en déduire titre, expéditeur et tags — zéro cloud, zéro abonnement. Building a paperless pipeline on the NAS: an eSCL scanner feeding Paperless-ngx over OCR in 3 languages, a hand-written page-interleaving algorithm (built test-first) to fake duplex scanning on a simplex-only feeder, and a local LLM on a separate PC that reads each document and fills in title, sender and tags — no cloud, no subscription.

paperless-ngxocrscanservjs
8 juil. 2026 · 12m 8 Jul 2026 · 12m
monitoring Running

Un digest de santé quotidien qui a arrêté de crier au loup A Daily Health Digest That Stopped Crying Wolf

L'alerting temps réel dit quand quelque chose brûle maintenant. Il ne dit pas « tout allait bien aujourd'hui ». Construire un digest Telegram quotidien — lecture seule, moindre privilège, corrélant métriques et logs — a d'abord révélé ses propres bugs : un OOM obsolète qui réapparaissait sans cesse, et un pod Pending de cinq minutes signalé comme un incident. Real-time alerting tells you when something is on fire right now. It doesn't tell you 'everything looked fine today.' Building a daily Telegram digest — read-only, least-privilege, correlating metrics and logs — surfaced its own bugs first: a stale OOM kept reappearing, and a five-minute-old Pending pod was flagged as an incident.

monitoringtelegramrbac
4 juil. 2026 · 8m 4 Jul 2026 · 8m
infra Running

De zéro vraie sauvegarde à une stratégie 3-2-1 opérationnelle — cluster, NAS et PC compris Zero Real Backups to a Working 3-2-1 Strategy — Across a Cluster, a NAS, and 3 PCs

Un constat d'audit sans détour — « le RAID n'est pas une sauvegarde, et ma seule copie hors-site pouvait être effacée par le compte qui l'écrivait » — a déclenché une refonte complète de la sauvegarde en 3-2-1-1-0, sur le cluster, le NAS, 3 PC et 2 téléphones. Architecture, un quasi-incident de token qui a fuité, et l'upload Nextcloud passé de 1 Mbit/s à 150 Mbit/s avec un seul changement de config. A blunt audit finding — 'RAID is not a backup, and my only off-site copy could be deleted by the same account that wrote it' — triggered a full 3-2-1-1-0 backup redesign across the cluster, the NAS, 3 PCs and 2 phones. Covers the architecture, a leaked-credential near-miss, and the Nextcloud upload that went from 1 Mbit/s to 150 Mbit/s with one config change.

backupresticminio
2 juil. 2026 · 12m 2 Jul 2026 · 12m
apps Running

Retirer un second dashboard cassé pour un centre de contrôle statique fait main Retiring a Broken Second Dashboard for a Hand-Built Static Control Center

Le homelab avait deux dashboards qui faisaient le même travail, dont un chroniquement cassé. La solution n'était pas un meilleur outil d'auto-découverte — c'était de le supprimer et de construire à la main un dashboard statique sombre, servi par ConfigMap, sans pièce mobile, pensé pour un écran 4K. The homelab had two dashboards doing the same job, one of them chronically broken. The fix wasn't a better auto-discovery tool — it was deleting it and hand-rolling a static, ConfigMap-served dark dashboard with zero moving parts, sized for a 4K wall display.

dashboarduxconfigmap
28 juin 2026 · 7m 28 Jun 2026 · 7m
infra Running

Un NAS x86 à 6W rejoint le cluster Pi — partie 2 : la stack media déménage A 6W x86 NAS Joins the Pi Cluster — Part 2: The Media Stack Moves In

Migration de 12 conteneurs Docker — Jellyfin, la suite *arr, Nextcloud et compagnie — d'un vieil i5 à 84W vers le nouveau NAS N100 : rsync, une décision RAID1 pragmatique qui a battu le plan RAIDZ1, une bascule de routes Cloudflare Tunnel, et zéro interruption visible. Migrating 12 Docker containers — Jellyfin, the *arr suite, Nextcloud and friends — from an aging 84W i5 to the new N100 NAS: rsync, a pragmatic RAID1 decision that beat the RAIDZ1 plan, a Cloudflare Tunnel route flip, and zero user-visible downtime.

nasdockermigration
21 juin 2026 · 8m 21 Jun 2026 · 8m
gitops Running

CI self-hosted avec Gitea Actions sur un homelab Pi + NAS Self-hosted CI with Gitea Actions on a Pi + NAS homelab

Remplacer GitHub Actions par un runner Gitea Actions sur un NAS x86 — builder des images arm64 via QEMU pour un cluster Raspberry Pi, réutiliser le token GHCR existant, et le piège Cloudflare Access qui casse le gRPC du runner tant qu'on ne le bypasse pas en LAN. Replacing GitHub Actions with a Gitea Actions runner on an x86 NAS — building arm64 images via QEMU for a Raspberry Pi cluster, reusing the existing GHCR token, and the Cloudflare Access gotcha that breaks the runner's gRPC until you bypass it on the LAN.

k3s-clustergiteaci
18 juin 2026 · 6m 18 Jun 2026 · 6m
gitops Running

Migrer un homelab GitOps de GitHub vers Gitea self-hosted Migrating a GitOps homelab from GitHub to self-hosted Gitea

Basculer la source de vérité d'un app-of-apps ArgoCD de GitHub vers un Gitea interne — conversion des repos, repointage en cascade, un pull-mirror cassé qui masquait un état obsolète, la cred en SealedSecret, et garder une ancre de rollback propre. Flipping the source of truth of an ArgoCD app-of-apps from GitHub to an internal Gitea — repo conversion, a cascade repoint, a broken pull-mirror that hid stale state, the SealedSecret credential, and keeping a clean rollback anchor.

k3s-clustergiteagitops
18 juin 2026 · 6m 18 Jun 2026 · 6m
infra Running

Un NAS x86 à 6W rejoint le cluster Pi — partie 1 : build & monitoring unifié A 6W x86 NAS Joins the Pi Cluster — Part 1: Build & Unified Monitoring

Montage d'un NAS silencieux ASRock N100M dans un Jonsbo N4 — et intégration dans la stack d'observabilité du cluster : node_exporter, agent Portainer, et monitoring SMART des disques via smartctl_exporter (avec un piège d'image ARM64). Building a silent ASRock N100M NAS in a Jonsbo N4 — and wiring it into the cluster's observability stack: node_exporter, a Portainer agent, and SMART disk monitoring via smartctl_exporter (including an ARM64 image pitfall).

k3s-clusternashardware
12 juin 2026 · 9m 12 Jun 2026 · 9m
monitoring Running

Observabilité v2 — logs, alertes & annotations en une journée Observability v2 — Logs, Alerts & Annotations in One Day

Un pic de charge inexpliqué a révélé quatre angles morts dans mon monitoring. Un jour plus tard, le cluster avait des logs centralisés (VictoriaLogs + Vector), un vrai alerting (vmalert → Alertmanager → Telegram) et des annotations automatiques sur chaque graphe Grafana — plus une leçon sur les probes qui flappent sans jamais alerter. An unexplained load spike exposed four blind spots in my monitoring. One day later the cluster had centralized logs (VictoriaLogs + Vector), real alerting (vmalert → Alertmanager → Telegram) and auto-annotations on every Grafana graph — plus a hard lesson about why flapping probes never alert.

k3s-clustermonitoringvictoriametrics
12 juin 2026 · 7m 12 Jun 2026 · 7m
networking Running

Le connecteur fantôme — chasse aux 502 intermittents sur un tunnel Cloudflare The Phantom Connector — Hunting Intermittent 502s on a Cloudflare Tunnel

La moitié des requêtes du blog mouraient en 502 pendant que tous les autres services fonctionnaient. J'ai accusé QUIC, les timeouts NAT, les buffers UDP et ma propre app — le vrai coupable était un cloudflared oublié sur un PiKVM, enregistré sur le tunnel du cluster. Half my blog's requests were dying with 502s while every other service worked. I blamed QUIC, NAT timeouts, UDP buffers and my own app — the real culprit was a forgotten cloudflared on a PiKVM, registered on the cluster's tunnel.

k3s-clustercloudflaretunnel
12 juin 2026 · 5m 12 Jun 2026 · 5m
ai Running

Déployer un agent IA dans le cluster qu'il gère Deploying an AI Agent Inside the Cluster It Manages

Comment je fais tourner Claude Code en pod sur mon homelab k3s — OAuth, SSH vers le master, workspace persistant, et l'absurdité délicieuse d'un agent qui édite son propre déploiement. How I run Claude Code as a pod on my k3s homelab — OAuth, SSH to master, persistent workspace, and the delightful absurdity of an agent that edits its own deployment.

k3s-clusteraiclaude-code
18 mai 2026 · 9m 18 May 2026 · 9m
gitops Running

Les tags flottants, c'est du poison Floating tags considered harmful

Comment GitHub Actions épingle automatiquement un digest immuable dans le manifest Kubernetes après chaque build, et pourquoi c'est non-négociable pour la reproductibilité et la supply chain. How GitHub Actions automatically pins an immutable digest into the Kubernetes manifest after every build — and why this is non-negotiable for reproducibility and supply chain integrity.

k3s-clustergitopsgithub-actions
18 mai 2026 · 11m 18 May 2026 · 11m
monitoring Running

Métriques cluster en temps réel sur un blog statique — sans casser GitOps Live Cluster Metrics on a Static Blog — Without Breaking GitOps

Comment afficher des métriques Kubernetes en temps réel sur un blog Astro statique via un CronJob in-cluster et un mount ConfigMap, sans aucun commit git ni rebuild GHA. How to display real-time Kubernetes metrics on a static Astro blog using an in-cluster CronJob and a ConfigMap mount, with zero git commits and zero GHA rebuilds.

k3s-clustermonitoringgitops
18 mai 2026 · 9m 18 May 2026 · 9m
storage Running

Fuite mémoire Longhorn instance-manager : rapport d'incident et runbook Longhorn Instance-Manager RAM Leak: Incident Report & Runbook

Une régression Longhorn v1.11.0 faisait fuiter silencieusement plusieurs gigaoctets de RAM en quelques jours dans les pods instance-manager. Détection, investigation, contournement et fix upstream v1.11.2. A Longhorn v1.11.0 regression caused instance-manager pods to silently leak gigabytes of RAM over days. This post covers detection, investigation, the workaround, and the upstream fix in v1.11.2.

k3s-clusterlonghornstorage
18 mai 2026 · 10m 18 May 2026 · 10m
meta Running

Ce que j'ai appris en construisant un homelab de niveau production What I Learned Building a Production-Grade Homelab

Une rétrospective de 5 mois de gestion d'un cluster k3s sur Raspberry Pi — les vrais défis, les échecs, et les compétences acquises qui se traduisent directement dans un contexte cloud professionnel. A retrospective on 5 months of running a k3s cluster on Raspberry Pi — the real challenges, the failures, and the skills gained that directly translate to professional cloud infrastructure work.

k3s-clustermetalessons
12 mai 2026 · 8m 12 May 2026 · 8m
gitops Running

GitOps cross-repo — déployer une app dont la source vit ailleurs Cross-repo GitOps — deploying an app whose source lives elsewhere

Ajouter Tapaz (prsm-studio) au cluster a été la première app dont la source vit dans un repo séparé. Boucler le GitOps sans renoncer à l'immutabilité du digest a demandé un petit step de CI cross-repo qui patche les manifests homelab après chaque build — et au passage, sceller offline un SealedSecret docker-registry en n'utilisant que la clé publique committée dans le repo. Adding Tapaz (prsm-studio) to the cluster was the first app whose source lives in a separate repo. Closing the loop without losing digest immutability meant building a tiny cross-repo CI step that patches the homelab manifests after each build — and along the way, sealing a docker-registry SealedSecret offline using only the public cert committed in the repo.

k3s-clustergitopsargocd
11 mai 2026 · 9m 11 May 2026 · 9m
apps Running

Éditeur visuel no-code avec Silex (GrapesJS) No-Code Visual Editor with Silex (GrapesJS)

Déploiement de Silex sur le cluster k3s — l'image upstream est en amd64 uniquement, j'ai donc dû builder ma propre image ARM64 via GitHub Actions, débusquer un défaut qui bind sur localhost à l'intérieur du conteneur, et basculer un package GHCR en public. Une petite histoire de trois pièges enchaînés. Deploying Silex on the k3s cluster — the upstream image is amd64-only, so I had to build my own ARM64 image with GitHub Actions, fight a default that binds to localhost inside the container, and toggle a GHCR package public. A short story of three traps in a row.

k3s-clustersilexgrapesjs
8 mai 2026 · 9m 8 May 2026 · 9m
apps Running

Outillage CLI personnalisé pour la gestion du homelab Custom CLI Tooling for Homelab Management

Construction d'un CLI Node.js et d'un dashboard web pour automatiser les opérations courantes du homelab — mode maintenance des nœuds, health checks et rapports d'état du cluster. Building a custom Node.js CLI and web dashboard to automate common homelab operations — node maintenance mode, health checks, and cluster state reporting.

k3s-clustertoolingcli
9 mars 2026 · 6m 9 Mar 2026 · 6m
apps Running

Dashboard du cluster avec Homepage + Glances Cluster Dashboard with Homepage + Glances

Construction d'un dashboard homelab unifié avec Homepage pour les liens de services et Glances pour les métriques système en temps réel — déployé sur Kubernetes avec découverte automatique des services. Building a unified homelab dashboard with Homepage for service links and Glances for real-time system metrics — deployed on Kubernetes with auto-discovered services.

k3s-clusterdashboardux
2 mars 2026 · 5m 2 Mar 2026 · 5m
ai Running

IA locale avec Ollama + Open WebUI (décommissionné) Running Local AI with Ollama + Open WebUI (decommissioned)

Archive d'une stack IA auto-hébergée sur Kubernetes — Ollama pour l'inférence LLM sur ARM64, Open WebUI comme interface de chat. Décommissionnée le 2026-05-10. Historical record of a self-hosted AI stack on Kubernetes — Ollama for LLM inference on ARM64, Open WebUI as the chat interface. Decommissioned on 2026-05-10.

k3s-clusteraillm
25 févr. 2026 · 11m 25 Feb 2026 · 11m
apps Running

VS Code dans le navigateur avec code-server VS Code in the Browser with code-server

Un environnement VS Code complet accessible depuis n'importe quel navigateur — déploiement de code-server sur Kubernetes avec workspace persistant et accès sécurisé via Cloudflare. Running a full VS Code development environment accessible from any browser — deploying code-server on Kubernetes with persistent workspace and secure Cloudflare access.

k3s-clusterdevtoolside
23 févr. 2026 · 7m 23 Feb 2026 · 7m
apps Running

Forge Git auto-hébergée avec Gitea Self-Hosted Git Forge with Gitea

Déploiement de Gitea sur Kubernetes avec PostgreSQL — particularités de s6-overlay, mirroring bulk depuis GitHub, Cloudflare Access en réseau local, et les pièges bash qui coûtent des heures de débogage. Deploying Gitea on Kubernetes with a PostgreSQL backend — s6-overlay quirks, bulk GitHub mirroring, Cloudflare Access on LAN, and the bash traps that cost hours of debugging.

k3s-clustergiteaselfhost
16 févr. 2026 · 14m 16 Feb 2026 · 14m
apps Running

Automatisation de workflows avec n8n Workflow Automation with n8n

Déploiement de n8n sur Kubernetes pour l'automatisation de workflows auto-hébergée — connexion d'APIs, planification de tâches et déclenchement d'actions entre les services du homelab. Deploying n8n on Kubernetes for self-hosted workflow automation — connecting APIs, scheduling tasks, and triggering actions across homelab services.

k3s-clusterautomationn8n
9 févr. 2026 · 6m 9 Feb 2026 · 6m
monitoring Running

Observabilité avec VictoriaMetrics + Grafana Observability with VictoriaMetrics + Grafana

Construction d'une stack d'observabilité légère mais complète pour le cluster k3s — VictoriaMetrics pour le stockage des métriques, Grafana pour les dashboards, et alerting avec VMAlert. Building a lightweight but complete observability stack for the k3s cluster — VictoriaMetrics for metrics storage, Grafana for dashboards, and alerting with VMAlert.

k3s-clustermonitoringgrafana
2 févr. 2026 · 6m 2 Feb 2026 · 6m
storage Running

Stockage objet compatible S3 avec MinIO S3-Compatible Object Storage with MinIO

Déploiement de MinIO sur Kubernetes comme stockage objet compatible S3 auto-hébergé — utilisé pour les backups Longhorn et le stockage d'artefacts. Deploying MinIO on Kubernetes as a self-hosted S3-compatible object store — used for Longhorn backups and general artifact storage.

k3s-clusterstorageminio
26 janv. 2026 · 2m 26 Jan 2026 · 2m
infra Running

Zéro secret en clair dans Git avec Sealed Secrets Zero-Secret-in-Git with Sealed Secrets

Chiffrement des secrets Kubernetes pour un stockage GitOps sécurisé via Bitnami Sealed Secrets — fonctionnement, workflow kubeseal et considérations opérationnelles. Encrypting Kubernetes secrets for safe GitOps storage using Bitnami Sealed Secrets — how it works, the kubeseal workflow, and key operational considerations.

k3s-clustersecuritysecrets
19 janv. 2026 · 8m 19 Jan 2026 · 8m
networking Running

Traefik Ingress + Cloudflare Tunnel pour un accès zéro-trust Traefik Ingress + Cloudflare Tunnel for Zero-Trust Access

Exposer les services du homelab sur internet sans ouvrir un seul port — Cloudflare Tunnel comme reverse proxy sécurisé couplé à Traefik comme ingress controller Kubernetes. Exposing homelab services to the internet without opening a single port — using Cloudflare Tunnel as a secure reverse proxy paired with Traefik as the Kubernetes ingress controller.

k3s-clusternetworkingtraefik
12 janv. 2026 · 7m 12 Jan 2026 · 7m
storage Running

Stockage bloc distribué avec Longhorn Distributed Block Storage with Longhorn

Construction d'une stratégie de stockage deux niveaux avec Longhorn sur k3s — tagging de disques, gestion des répliques, migration de volumes et récupération après dégradation. Building a resilient, two-tier storage strategy with Longhorn on k3s — disk tagging, replica management, volume migration, and recovering from degraded state.

k3s-clusterlonghornstorage
5 janv. 2026 · 5m 5 Jan 2026 · 5m
gitops Running

GitOps avec ArgoCD — le pattern App-of-Apps GitOps with ArgoCD — App-of-Apps Pattern

Comment j'utilise ArgoCD pour gérer l'état complet du cluster depuis un seul dépôt Git, avec le pattern App-of-Apps pour un GitOps multi-services scalable. How I use ArgoCD to manage the entire cluster state from a single Git repository, with the App-of-Apps pattern for scalable multi-service GitOps.

k3s-clusterargocdgitops
22 déc. 2025 · 10m 22 Dec 2025 · 10m
infra Running

Construction d'un cluster k3s HA sur Raspberry Pi Building a 6-Node RPi k3s HA Cluster

Comment j'ai construit un cluster Kubernetes haute disponibilité sur six Raspberry Pi — choix matériels, bootstrap k3s, conception réseau et leçons apprises. How I built a production-grade, high-availability Kubernetes cluster on six Raspberry Pi boards — hardware choices, k3s bootstrapping, network design, and lessons learned.

k3s-clusterk8sinfra
15 déc. 2025 · 7m 15 Dec 2025 · 7m

topologie du cluster cluster topology

Plan de contrôle haute disponibilité avec 3 Raspberry Pi 4 (8 Go) hébergeant etcd et l'API server. Deux Raspberry Pi 5 (16 Go) comme workers principaux, et un RPi 4 (2 Go) comme worker auxiliaire. High-availability control plane with 3 Raspberry Pi 4 (8GB) acting as etcd + API server nodes. Two Raspberry Pi 5 (16GB) as primary workers, and one RPi 4 (2GB) as auxiliary worker.

live · cluster — vue cumulée cluster — aggregate view
mis à jour updated —
—
cpu
—
mem
—
pods actifs pods running
—
nœuds prêts nodes ready
—
vol. attachés pvc bound
—
uptime
master-1
control-plane
RPi 4 · 8GB
SSD 110 GB
· etcd
· kube-apiserver
cpu [----------] —
mem [----------] —
disk [----------] —
— pods uptime —
master-2
control-plane
RPi 4 · 8GB
SSD 110 GB
· etcd
· kube-controller
cpu [----------] —
mem [----------] —
disk [----------] —
— pods uptime —
master-3
control-plane
RPi 4 · 8GB
SSD 110 GB
· etcd
· kube-scheduler
cpu [----------] —
mem [----------] —
disk [----------] —
— pods uptime —
worker-1
worker
RPi 5 · 16GB
SSD 459 GB
· longhorn replicas
· workloads stateful
cpu [----------] —
mem [----------] —
disk [----------] —
— pods uptime —
worker-2
worker
RPi 5 · 16GB
SSD 459 GB
· longhorn replicas
· workloads stateful
cpu [----------] —
mem [----------] —
disk [----------] —
— pods uptime —
worker-3
worker
RPi 4 · 2GB
USB 28 GB
· workloads légers
cpu [----------] —
mem [----------] —
disk [----------] —
— pods uptime —

stack déployée deployed stack

k3s
Kubernetes léger Lightweight Kubernetes
infra
ArgoCD
Livraison continue GitOps GitOps continuous delivery
gitops
Longhorn
Stockage bloc distribué Distributed block storage
storage
Traefik
Contrôleur Ingress Ingress controller
networking
Cloudflare Tunnel
Accès réseau zéro-trust Zero-trust network access
networking
Sealed Secrets
Gestion chiffrée des secrets Encrypted secret management
infra
Gitea
Forge Git auto-hébergée Self-hosted Git forge
apps
code-server
VS Code dans le navigateur VS Code in the browser
apps
MinIO
Stockage objet compatible S3 S3-compatible object storage
storage
VictoriaMetrics
Métriques time-series Time-series metrics
monitoring
Grafana
Dashboards d'observabilité Observability dashboards
monitoring
n8n
Automatisation de workflows Workflow automation
apps
Homepage
Dashboard du cluster Cluster dashboard
apps
Silex
Éditeur visuel no-code No-code visual editor
apps
Claude WebUI
UI web pour Claude Code Web UI for Claude Code
apps
Portainer
Interface Kubernetes Kubernetes UI
apps
Isoflow
Diagrammes d'architecture Infra diagrams
apps

à propos about this project

Ce homelab est un projet d'infrastructure personnel conçu pour approfondir ma compréhension de Kubernetes, GitOps, des systèmes distribués et de l'outillage cloud-native — sur du matériel réel, avec de vraies contraintes et des pratiques de production.

Tout tourne sur des nœuds Raspberry Pi, est versionné dans Git et déployé automatiquement via ArgoCD. L'objectif : apprendre en faisant, documenter chaque défi, et construire quelque chose de vraiment utile.

This homelab is a personal infrastructure project built to deepen my understanding of Kubernetes, GitOps, distributed systems, and cloud-native tooling — using real hardware, real constraints, and production-grade practices.

Everything runs on Raspberry Pi nodes, is version-controlled in Git, and deployed automatically via ArgoCD. The goal: learn by doing, document every challenge, and build something genuinely useful.

✓
Infrastructure as Code Infrastructure as Code
Chaque ressource est un manifest YAML dans Git Every resource is a YAML manifest in Git
✓
GitOps avec ArgoCD GitOps with ArgoCD
Sync automatique, auto-réparation, App-of-Apps Automated sync, self-healing, App-of-Apps
✓
Plan de contrôle HA HA Control Plane
Quorum etcd à 3 nœuds, sans point de défaillance unique 3-node etcd quorum, no single point of failure
✓
Stockage distribué Distributed Storage
Longhorn avec stratégie de disques deux niveaux Longhorn with 2-tier disk strategy
✓
Accès zéro-trust Zero-Trust Access
Cloudflare Tunnel, aucun port ouvert sur le routeur Cloudflare Tunnel, no open ports on the router
✓
Observabilité complète Full Observability
VictoriaMetrics + Grafana + node-exporter sur les 6 nœuds VictoriaMetrics + Grafana + node-exporter across all 6 nodes