El chart era un release Helm gestionado a mano (helm upgrade) desde abril. Ahora lo gestiona su propia Application con source Helm, version clavada a 83.2.0 (la que ya corria: esto es una adopcion, no una actualizacion). Los valores se mudan de values-kube-prometheus-stack.yaml al valuesObject de la Application, con sus comentarios: ahi esta el historial de los retoques a mano que se recuperaron en julio (alerting, SSO de Authentik, token de Telegram), y perderlo seria perder el mapa. Inline y no multi-source $values porque ese montaje se auto-podo la Application de infisical el 2026-06-18, y tener los valores en dos sitios es la deriva que veniamos a matar. La adopcion se verifico ANTES de activar el auto-sync: aplicada sin syncPolicy, ArgoCD daba 96/97 Synced sin haber sincronizado nunca. El que faltaba era el Deployment de Grafana, y no por deriva: el render del subchart no declara managed-by: Helm ni el restartedAt del podTemplate, asi que el merge a 3 bandas del cliente los habria BORRADO (reinicio de Grafana + Helm perdiendo la propiedad del objeto). Con ServerSideApply/ServerSideDiff ArgoCD solo toca lo que declara: 97/97 Synced, cero operaciones de sync, cero pods reiniciados. selfHeal probado con replicas 1->2 en kube-state-metrics, revertido en 11s. skipCrds: true a proposito: ArgoCD pasa --include-crds por defecto y los 10 CRD de monitoring.coreos.com no los gestiona nadie hoy. Contrapartida documentada en el fichero: al subir de chart hay que aplicarlos a mano. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
k8s-manifests
Manifests de Kubernetes gestionados por ArgoCD para el cluster chemavx.
Ojo: no todo lo de aquí lo aplica ArgoCD. Unos 11 directorios (monitoring, argocd, authentik, gitea, homarr, vaultwarden, cloudflare-ddns, cluster-wide…) se gestionan a mano: ahí un commit no despliega nada, hay que editar el fichero y hacer kubectl apply. Para comprobar que esos ficheros siguen describiendo lo desplegado: python3 tools/audita-exports.py (ver tools/README.md).
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