Grafana llevaba ~15 días sin SSO: ignoraba la cabecera X-authentik-username, de modo que Authentik te dejaba pasar y Grafana te pedía credenciales igual. El último acceso de akadmin (el usuario que crea auto_sign_up) es de hace 15 días. El bloque [auth.proxy] estaba en el ConfigMap vivo en abril — así consta en el export de git de aquel momento — pero el chart NUNCA lo ha generado en ninguna de sus 7 revisiones, así que era un retoque a mano que se perdió por el camino. Ahora va declarado en values y sobrevive a una reconstrucción. Aparecida al arreglarlo, otra pieza del mismo tipo: la anotación router.middlewares que engancha el forward-auth de Authentik al Ingress. Vivía sólo por el three-way merge de Helm, igual que el montaje de alerting (0501aab) y el token de Telegram (28f1631). Reconstruir el release habría dejado Grafana en internet SIN autenticación de Authentik, con sólo su formulario delante. NO se restaura disable_login_form, que sí traía la config de abril: el formulario local se queda como puerta de emergencia, con la contraseña del secret grafana-admin. Que el SSO fallara en silencio es justo lo que pasó aquí. Verificado: con la cabecera, autentica como akadmin; sin ella sigue dando 401; una petición externa a grafana.chemavx.xyz redirige (302) al authorize de Authentik; el formulario local responde 200 y la contraseña de emergencia entra; 0 errores en el arranque. Exports regenerados: el auditor deja monitoring en 2 hallazgos, ambos conocidos (una anotación del controlador y el tag de uptime-kuma, pendiente de decidir con el resto de tags flotantes). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
k8s-manifests
Manifests de Kubernetes gestionados por ArgoCD para el cluster chemavx.
Regla crítica: secrets en git
Los secrets con datos sensibles NO se guardan en este repo.
Los archivos de secret en este repo sólo contienen metadata (name, namespace, labels, annotations). Los campos data / stringData se gestionan manualmente fuera de git.
Por qué
Un valor placeholder como REDACTED es base64 válido que decodifica a bytes no-UTF-8. Si ArgoCD aplica ese manifest, corrompe el secret en el cluster, lo que puede:
- Romper certificados TLS (ERR_CERT_AUTHORITY_INVALID)
- Impedir que pods arranquen (
grpc: error while marshaling: string field contains invalid UTF-8) - Cifrar credenciales con una clave incorrecta
Secrets TLS (cert-manager)
Los secrets TLS los gestiona cert-manager automáticamente a partir del recurso Certificate. No crear archivos secret-*-tls.yaml con datos.
Secrets de aplicación — crear manualmente antes del primer deploy
| Namespace | Secret | Comando |
|---|---|---|
n8n |
n8n-secret |
kubectl create secret generic n8n-secret --from-literal=encryption-key='<valor-en-vaultwarden>' -n n8n |
authentik |
authentik-secret |
Ver Vaultwarden → "authentik" |
cloudflare-ddns |
cloudflare-ddns-secret |
Ver Vaultwarden → "cloudflare-ddns" |
vaultwarden |
vaultwarden-secret |
Ver Vaultwarden → "vaultwarden" |
ghost-en |
ghost-en-smtp |
kubectl create secret generic ghost-en-smtp --from-literal=SMTP_USER='<user-gmail>' --from-literal=SMTP_PASS='<app-password>' -n ghost-en |
argocd |
argocd-secret |
Gestionado por ArgoCD bootstrap |
argocd |
argocd-redis |
Gestionado por ArgoCD bootstrap |
monitoring |
kube-prometheus-stack-grafana |
Ver Vaultwarden → "grafana" |
monitoring |
kube-prometheus-stack-admission |
Generado por helm (webhook TLS) |
ArgoCD ignoreDifferences para secrets
Toda ArgoCD Application que gestione un namespace con secrets debe incluir ignoreDifferences para el campo /data:
spec:
ignoreDifferences:
- group: ""
kind: Secret
name: <nombre-del-secret>
namespace: <namespace>
jsonPointers:
- /data
syncPolicy:
syncOptions:
- RespectIgnoreDifferences=true
Ver n8n ArgoCD Application como referencia.
Pre-commit hook
Este repo incluye un pre-commit hook que rechaza commits con REDACTED en archivos .yaml.
Instalar con:
cp .githooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Renovate Bot
Secret renovate-token gestionado manualmente (no está en el repo).
Para recrearlo:
kubectl create secret generic renovate-token \
--from-literal=RENOVATE_TOKEN=<token-gitea> \
-n renovate
Token en https://git.chemavx.xyz/user/settings/applications con permisos:
issue: Read/Write, repository: Read/Write, user: Read
Imagen fijada a 38.0.0 — no actualizar a latest sin probar autenticación primero.
ArgoCD patches
Después de instalar ArgoCD aplicar:
kubectl apply -f argocd-patches/redis-patch.yaml