
🌐 Aussi en: English · Deutsch · Español
Dans tout parcours de homelab arrive un moment où l’on contemple son tas de
scripts bash, de fichiers de config faits main et de post-it qui disent des choses comme
« penser à faire un chown sur /data avant de démarrer » — et où l’on décide :
ça suffit. 😅
Cet article, c’est ce moment-là. Aujourd’hui, je publie les playbooks Ansible que j’utilise pour déployer
et exploiter Nextcloud ☁️ et WordPress 📝 sur un
cluster K3s à nœud unique tournant sous AlmaLinux 9.
Tout est en infrastructure-as-code, entièrement idempotent,
et livré avec un guide d’exploitation complet.
Mais d’abord, une page de pub — ou plutôt :
un moment d’introspection involontaire. 🙂
🎉 Aparté : attendez, ce blog fête son anniversaire ?
Hier, cela faisait exactement un an que le tout premier article était en ligne sur ce blog.
Il contenait exactement deux mots : Hallo Welt.
Ce qui veut dire Hello World en allemand,
ce qui veut dire en langage de programmeur :« Je n’ai encore absolument aucune idée de ce que je fais, mais j’ai un domaine, un VPS,
et pargit push, je compte bien me servir des deux. » 🚀Franchement, je ne m’attendais pas à ce que ce blog existe encore un an plus tard.
La plupart de mes projets perso suivent un cycle de vie très prévisible :
git init→ poussée d’enthousiasme → trois commits →
git stash→ oublié à jamais 💀Et pourtant, nous voilà à un an d’uptime, ce qui, à l’échelle d’un projet perso,
équivaut à peu près au centenaire d’une entreprise du Fortune 500.Les métriques sont à la hauteur :
- 📚 plusieurs articles
- 👀 au moins deux lecteurs (dont moi, quand je vérifie l’affichage mobile)
- 📈 un tableau de bord Grafana que personne à part moi n’a jamais regardé
Succès débloqué. 🏆
Nous reprenons maintenant le véritable sujet de cet article.
🚀 Ce que fait ce dépôt
Le code que je publie aujourd’hui est une boîte à outils d’infrastructure basée sur Ansible
qui provisionne et gère des charges de travail sur un
cluster K3s à nœud unique tournant sous AlmaLinux 9 :
- ☁️ Nextcloud — synchronisation de fichiers et collaboration auto-hébergées,
avec Collabora CODE pour l’édition bureautique en ligne - 📝 WordPress — pour exactement le genre de blog que vous êtes en train de lire
Les deux stacks partagent un ensemble commun de rôles Ansible couvrant :
le durcissement SSH 🔐,
les règles de pare-feu 🛡️,
la supervision 📊,
le relais mail,
les mises à jour de sécurité automatiques,
la détection de rootkits
et la journalisation d’audit.
Les playbooks sont conçus pour être idempotents :
vous pouvez les relancer autant de fois que vous voulez sur un système en production, ils ne modifient que
ce qui doit réellement l’être. ✨
Toute l’infrastructure est décrite dans du code.
Aucune étape manuelle cachée, enfouie dans un carnet quelque part.
Si le serveur part en fumée (au sens figuré — c’est un VPS 😄),
un nouveau peut être provisionné de zéro avec une seule
commande ansible-playbook et une restauration depuis la sauvegarde.
☸️ Architecture : Nextcloud sur K3s
Le choix de conception central est un cluster Kubernetes à nœud unique sous K3s.
Pas de haute disponibilité. Pas de multi-master. Pas de cluster etcd.
Juste un serveur, un nœud, un point de défaillance unique — volontairement.
Pour ce type de charge, la simplicité d’exploitation vaut bien plus que de jouer
à l’hyperscaler dans un homelab. 🙂
K3s offre malgré tout toutes les bonnes fonctionnalités de Kubernetes :
- ⚙️ manifestes déclaratifs
- 🔄 déploiements progressifs (rolling)
- 🔐 cert-manager
- 🌍 contrôleurs ingress
…sans la lourdeur opérationnelle.
🛡️ Sécurité : défense en profondeur
Le modèle de sécurité est en couches. Aucun mécanisme n’a, à lui seul, toute notre confiance.
La stack combine plutôt plusieurs contrôles indépendants :
- 🔥 iptables avec des politiques DROP par défaut
- 🔐 configuration SSH durcie
- 🚫 Fail2Ban contre la force brute
- ⚡ limitation de débit dans nginx
- 🧩 SELinux en mode enforcing
- 🔑 secrets chiffrés avec Ansible Vault
- 🕵️ surveillance par auditd + rkhunter
- 📦 mises à jour de sécurité automatiques
Autrement dit :
la défense en profondeur, pas
« j’espère que personne ne scanne ce VPS. » 😄
📊 Supervision : Prometheus + Grafana
La supervision est entièrement automatisée avec :
Prometheus 📈,
Grafana 📊,
Node Exporter,
mysqld_exporter
et les métriques PHP-FPM.
Les tableaux de bord sont importés et configurés automatiquement par le playbook,
notamment :
- 📈 Node Exporter Full
- 🗄️ MySQL Overview
- ⚡ métriques PHP-FPM
Parce que, quitte à sur-concevoir un homelab,
autant avoir de jolis graphiques qui montrent précisément à quel point il est sur-conçu. 🙂
💾 Sauvegarde et restauration
Le dépôt contient de vrais scripts de sauvegarde et de restauration —
pas seulement de l’optimisme et un dossier nommé
backup_final_v2_REAL. 😅
Les sauvegardes couvrent :
- 🗄️ les dumps MariaDB
- 📂 les fichiers applicatifs de Nextcloud
- ☁️ les données utilisateur
- 🔄 l’automatisation de la restauration
Après une restauration, relancer le playbook remet automatiquement toute la configuration et
tous les paramètres applicatifs dans l’état attendu.
🚀 Pour commencer
Le dépôt cible une installation fraîche d’AlmaLinux 9.
La mise en place est volontairement simple :
- ⚙️ Configurez votre inventaire et vos variables d’hôte
- 🔐 Chiffrez votre vault avec Ansible Vault
- 📦 Installez les collections Ansible nécessaires
- 🚀 Lancez le playbook
Le déploiement est entièrement idempotent : les changements futurs —
mises à jour d’images, ajustements du pare-feu ou applications supplémentaires —
se déploient simplement en relançant le playbook.
📥 Téléchargement
Le dépôt complet est disponible sous forme d’archive ZIP.
Décompressez-la, remplissez vos host_vars,
chiffrez votre vault, et vous êtes prêt à déployer :
unzip www_k3s.zip
cd www_k3s
ansible-galaxy collection install -r requirements.yml
ansible-vault encrypt inventory/host_vars/<host>/vault.yml
ansible-playbook nextcloud-k3s.yml --limit <host> --ask-vault-passDes questions, des problèmes ou des suggestions ? 💬
Laissez-les dans les commentaires ci-dessous.
Petite remarque : je n’ai pas encore vraiment décidé comment publier et maintenir
proprement le code via GitLab, donc pour l’instant l’état actuel est fourni sous forme de simple
archive ZIP 📦. À terme, je migrerai peut-être tout vers GitHub ou un autre dépôt public,
mais c’est encore un débat d’infrastructure ouvert entre moi, mon temps libre et plusieurs
listes de TODO inachevées. 😄




