Déploiement complet d’une stack Kubernetes via OpenTofu/Helm
🌐 fullfrontend.be
Stack Kubernetes complète, gérée en Infrastructure-as-Code avec OpenTofu + Helm. Le repo est conçu pour rester simple à opérer et 100% auto-hébergé (pas de services managés, pas de Bitnami).
- Ingress: Traefik en prod, nginx en dev (minikube)
- WAF global: ModSecurity + OWASP CRS via Traefik (prod)
- TLS: cert-manager (prod)
- DNS: external-dns (prod)
- Backups: Velero (prod: DO Spaces, dev: MinIO)
- Data: Postgres + MariaDB (stateful en PVC)
- prod: DOKS, kubeconfig dans
./.kube/config, cert-manager & external-dns actifs - dev: cluster local (
~/.kube/config), cert-manager & external-dns désactivés
- Prod:
root_domain_prod(défautfullfrontend.be) - Dev:
root_domain_dev(défautfullfrontend.kube) - FQDN dérivés uniquement de
root_domain:- WordPress:
<root_domain> - n8n:
n8n.<root_domain>+webhook.<root_domain> - Analytics:
insights.<root_domain> - Sentry:
sentry.<root_domain> - Registry:
registry.<root_domain> - Nextcloud:
cloud.<root_domain>(WIP)
- WordPress:
ageetsopstofu,helm,kubectldoctl(prod)- Exports requis:
SOPS_AGE_KEY_FILE,SOPS_AGE_RECIPIENTS,APP_ENV=dev|prod
- Générer la clé age:
bin/age-init.shpuis exporter les variables. - Copier l’exemple:
cp secrets.tfvars.example secrets.tfvarset remplir. - Chiffrer:
bin/sops-encrypt.sh secrets.tfvars secrets.tfvars.enc. - Utiliser le wrapper tofu:
APP_ENV=... ./scripts/tofu-secrets.sh plan|apply.
export APP_ENV=dev(ouprod) etexport TF_VAR_app_env=$APP_ENVsi besoin.tofu init.- Prod (cluster absent):
APP_ENV=prod ./scripts/tofu-secrets.sh apply -target=module.doks-cluster. - Prod: récupérer le kubeconfig DO dans
./.kube/configviadoctl kubernetes cluster kubeconfig save .... - Déployer:
APP_ENV=... ./scripts/tofu-secrets.sh apply(ouplan). - Dev: minikube installe l’ingress nginx via la commande de launch.
Principaux toggles:
app_env:prod/devenable_tls: active TLS + redirect HTTPSenable_velero: backups Veleroenable_waf: WAF global Traefik
WAF (prod):
waf_plugin_modulewaf_plugin_versionwaf_modsecurity_imagewaf_max_body_sizewaf_timeout_ms
Docs utiles:
- Contexte infra: CONTEXT_INFRA.md
- Règles IA: docs/CONTEXT.md
- Blog post: INITIAL_BLOG_POST.md
- WordPress (MariaDB + PVC)
- n8n (Postgres + Redis optionnel)
- Twenty CRM (optionnel)
- Analytics (Vince)
- Sentry (optionnel)
- Nextcloud (WIP)
- Registry (Zot)
- Prometheus + Grafana (kube-prometheus-stack)
- Dashboards: grafana/dashboards/
- WAF global via Traefik (ModSecurity + OWASP CRS)
- TLS via cert-manager en prod
- Secrets chiffrés (SOPS/age)
Tout le dépôt est sous WTFPL (LICENSE). Aucune garantie ni support.
Pour signaler une vulnérabilité, suivre SECURITY.md. Pas de secrets ni données sensibles dans les issues/PR.