Nginx Proxy Manager


J’aurais pu utiliser Traefik avec cert-manager pour le HTTPS. Mais honnêtement, NPM c’est tellement plus simple.

C’est quoi NPM ?

Nginx Proxy Manager c’est un reverse proxy avec une interface web. Tu cliques, tu configures un domaine, t’actives HTTPS, et c’est fait. Pas de YAML à écrire.

Pourquoi pas Traefik + cert-manager ?

J’ai essayé. Ça marche. Mais :

  • Faut installer cert-manager
  • Faut créer des ClusterIssuers
  • Faut mettre les bonnes annotations sur chaque Ingress
  • Quand ça marche pas, debugger les certificats c’est pas fun

Avec NPM : clic, clic, certificat. Fini.

Installation sur Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: npm
  namespace: npm
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: npm
          image: jc21/nginx-proxy-manager:latest
          ports:
            - containerPort: 80
            - containerPort: 81   # Admin UI
            - containerPort: 443
          volumeMounts:
            - name: data
              mountPath: /data
            - name: letsencrypt
              mountPath: /etc/letsencrypt
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: npm-data
        - name: letsencrypt
          persistentVolumeClaim:
            claimName: npm-letsencrypt

Avec un Service LoadBalancer sur l’IP 192.168.1.202.

Premier accès

URL: http://192.168.1.202:81
Email: admin@example.com
Password: changeme

L’interface est propre. T’as des onglets pour les proxy hosts, les certificats, les access lists…

Ajouter un service

  1. Proxy Hosts → Add Proxy Host
  2. Domain Names : grafana.mondomaine.fr
  3. Scheme : http
  4. Forward Hostname : grafana.grafana-namespace.svc.cluster.local
  5. Forward Port : 3000
  6. SSL → Request a new SSL certificate → Force SSL

30 secondes plus tard, t’as HTTPS avec un certificat Let’s Encrypt valide.

Le DNS

J’ai un domaine chez Cloudflare. J’ai créé un wildcard :

*.sortium.fr  →  A  →  <mon IP publique>

Tous les sous-domaines pointent vers mon IP, et NPM route vers le bon service.

Port forwarding

Sur mon routeur :

Port 80  → 192.168.1.202:80   (pour le challenge HTTP-01)
Port 443 → 192.168.1.202:443  (pour le HTTPS)

C’est la seule config réseau à faire côté routeur.

Intégration avec l’Agent IA

Plus tard, j’ai ajouté un tool à mon agent IA pour configurer NPM automatiquement :

func toolConfigureNPMProxy(subdomain, service, port string) {
    // Login à l'API NPM
    // Créer le proxy host
    // Demander le certificat SSL
}

Maintenant quand l’agent déploie une app, il configure automatiquement le HTTPS. Mais ça c’est pour un autre article.

Les certificats

Let’s Encrypt c’est gratuit et automatique. Les certificats sont valides 90 jours, et NPM les renouvelle automatiquement.

Tu peux voir tous tes certificats dans l’onglet SSL Certificates.

Backup

Les données importantes sont dans deux volumes :

  • /data : la config NPM
  • /etc/letsencrypt : les certificats

Faut penser à les backup régulièrement.


Prochain article : Le stockage sur Talos - pourquoi Longhorn marche pas et comment j’ai résolu le problème.