
🌐 Aussi en: English · Deutsch · Español
Dans quelques-uns de mes articles récents, j’expliquais que je cherchais un moyen de publier le code d’automatisation de mon homelab *sans rendre open source toute mon infrastructure par la même occasion* 😅
C’est un problème étonnamment épineux quand votre inventaire Ansible ressemble à un coffre au trésor cyberpunk rempli de vaults, de secrets et de variables propres à chaque hôte. 🔐🐉
Après pas mal d’essais, d’erreurs, de caféine et de choix de vie discutables… j’ai enfin trouvé une configuration qui fonctionne à merveille :
👉 deux remotes git distincts.
Une **instance Gitea privée et auto-hébergée** conserve le *vrai* dépôt — secrets chiffrés, fichiers vault et tous les détails internes un peu épicés compris.
De son côté, un **dépôt GitHub public** ne reçoit que le code d’automatisation propre ; les fichiers sensibles sont exclus via `.gitignore` et remplacés par de sympathiques modèles `.example`. 🧼✨
Tout ce qui est secret est de toute façon chiffré avec **Ansible Vault (AES-256)** — donc même si quelque chose passait entre les mailles du filet, un attaquant ne récupérerait que du charabia chiffré. 🧠💾
📦 Dépôt :
👉 github.com/aptupgrademe/www_k3s
Le projet installe au choix **Nextcloud** ou **WordPress** sur un **cluster K3s à nœud unique** tout neuf, sous **AlmaLinux 9**.
Une seule commande.
Zéro clic.
Énergie geek maximale. ⚡🤓
🧠 L’idée
Lancez :
ansible-playbook blog.yml --limit <host> --ask-vault-pass…sur un VPS tout neuf et regardez-le se transformer en serveur WordPress ou Nextcloud entièrement durci, avec TLS et supervision, comme une sorte d’évolution de Pokémon version infrastructure. 🐛➡️🐉
Pas de bricolage manuel en SSH.
Pas d’étapes d’installation mystérieuses.
Pas de cimetière de « TODO : documenter plus tard ». 💀
Tout est idempotent — vous pouvez le relancer à tout moment sans pulvériser vos données ni invoquer les démons de la dérive de configuration.
⚙️ La stack en un coup d’œil
- 🏗️ K3s — Kubernetes sans les traumatismes de l’entreprise
- 🔀 F5 nginx-ingress — tourne en DaemonSet avec
hostNetwork: true - 🔒 cert-manager — certificats Let’s Encrypt automatiques, parce que les navigateurs rêvent de cadenas verts
- 📝 WordPress 6.9-fpm + sidecar nginx + MariaDB 10.11
- ☁️ Nextcloud 33-fpm + Redis + Collabora CODE pour une bureautique auto-hébergée de qualité geek
- 📊 Prometheus + Grafana — car si on ne peut pas en faire un graphe, est-ce que ça existe vraiment ?
- 🛡️ iptables — DROP par défaut, détection de scans de ports, limitation du débit ICMP, petites douves numériques 🏰
- 🔐 Fail2Ban, auditd, rkhunter, dnf-automatic — la paranoïa as code™
🚀 Ce que fait réellement une seule exécution du playbook
- 🔑 Durcit SSH — port personnalisé, authentification par clé uniquement, configuration plus stricte
- 🔥 Crée des règles de pare-feu IPv4 + IPv6 avec détection de scans de ports via
xt_recent - 🧱 Active SELinux en mode enforcing avec les bons contextes pour les conteneurs
- ☸️ Installe K3s, Helm, cert-manager et nginx-ingress
- 📦 Déploie automatiquement toute la stack de workloads Kubernetes
- 📝 Configure WordPress via WP-CLI tel un gobelin de l’automatisation civilisé
- ☁️ Configure Nextcloud via
occ, Redis, SMTP et domaines de confiance compris - 📈 Met en place les exporters de supervision, la collecte Prometheus et les tableaux de bord Grafana
- 🛡️ Déploie Fail2Ban, auditd, les scans rkhunter et les mises à jour de sécurité automatiques
- ☕ Consomme sans doute moins de café que moi pendant le débogage
🔐 Secrets & sécurité
Tous les identifiants sont chiffrés avec Ansible Vault (AES-256).
Les fichiers sensibles comme :
vault.ymlvars.ymlhosts.yml
…ne touchent jamais le dépôt public. 🚫🌍
Le dépôt GitHub ne contient que du code d’automatisation réutilisable et des modèles `.example` :
vars.yml.example
vault.yml.example
hosts.yml.exampleCloner → renseigner les valeurs → chiffrer → déployer. ✨
🙃 Ce qui a été bien plus difficile que prévu
- Le challenge HTTP-01 de Let’s Encrypt renvoie un 301
Il se trouve que rediriger tout vers HTTPS redirige aussi le challenge ACME. Qui l’eût cru ? 🙃
Corrigé avec les Mergeable Ingresses de F5 (modèle master/minion) pour que/.well-known/échappe aux redirections.
- Le challenge HTTP-01 de Let’s Encrypt renvoie un 301
« `
- Boucle de redirection HTTPS infinie
Ma première logique nginx s’est pour ainsi dire auto-DDoSée sur le plan philosophique.
Corrigé avec un modèle de redirection plus propre à trois variables.
« `
- Boucle de redirection HTTPS infinie
« `
- mysqld_exporter v0.19.0 a supprimé
DATA_SOURCE_NAME
Les identifiants exigent désormais un fichier.my.cnfmonté.
J’ai aussi découvert que des permissions0600ne servent à rien si le conteneur tourne en tant quenobody. 🤡
« `
- mysqld_exporter v0.19.0 a supprimé
« `
- iptables OUTPUT DROP a cassé les rouages internes de K3s
Car visiblement Kubernetes adore se parler à lui-même en permanence.
Corrigé avec des règles ACCEPT explicites pour les CIDR des pods et des services.
« `
- iptables OUTPUT DROP a cassé les rouages internes de K3s
« `
- Le tableau de bord Grafana 1860 affichait « No data »
Les tableaux de bord Grafana modernes ne contiennent plus de__inputs.
Solution : un minuscule script Python de patch qui discute avec l’API Grafana comme un petit gobelin de l’automatisation.
« `
🧪 Essayez vous-même
git clone https://github.com/aptupgrademe/www_k3s.git
cd www_k3s
cp inventory/hosts.yml.example inventory/hosts.yml
cp inventory/host_vars/test/vars.yml.example inventory/host_vars/myhost/vars.yml
# fill in your values, then:
ansible-vault encrypt inventory/host_vars/myhost/vault.yml
ansible-playbook blog.yml --limit myhost --ask-vault-passLe quickstart complet, la vue d’ensemble des rôles et la documentation des variables se trouvent dans le README sur GitHub.
PR, retours et autres geeks de l’infrastructure bienvenus. 🚀🐧☸️




