n8n: dar permisos de reinicio al auto-restart de Uptime Kuma

El workflow "Uptime Kuma -> K8s Auto-Restart" lleva desde siempre sin poder
reiniciar nada: hacia el PATCH con el token de la ServiceAccount "default" del
namespace, que no tiene ni un permiso, y el API contestaba 403. Se iba entonces
por la rama de "reinicio fallido" y mandaba el aviso por Telegram -- que se
enviaba bien, y por eso los 23 "exitos" de workflow_statistics. La integracion
parecia viva y no lo estaba.

SA propia (n8n-restarter) en vez de la default, y un RoleBinding por namespace
en lugar de un ClusterRoleBinding: el webhook que dispara esto es publico y sin
autenticar, asi que el alcance se limita al SERVICE_MAP del workflow.

El ClusterRole incluye get ademas de patch porque el workflow relee el objeto a
los 60 s para comprobar readyReplicas (sin get: "Cannot read properties of
undefined"), y statefulsets ademas de deployments porque Gitea es lo primero.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-30 19:58:29 +00:00
co-authored by Claude Opus 5
parent 3112f92fea
commit 440eb5b6a1
2 changed files with 149 additions and 0 deletions
+145
View File
@@ -0,0 +1,145 @@
# Permisos para el workflow "Uptime Kuma -> K8s Auto-Restart" (2026-07-30).
#
# El nodo Code lee el token proyectado de la ServiceAccount y hace un PATCH
# contra kubernetes.default.svc. Nunca habia existido ningun Role ni RoleBinding
# para n8n: el API devolvia 403 y el workflow se iba por la rama de "reinicio
# fallido". Los 23 "exitos" de workflow_statistics eran eso -- el aviso de fallo
# enviandose bien. La integracion jamas reinicio nada.
#
# SA propia y no la "default" del namespace: cualquier pod que se despliegue en
# n8n sin pedir SA hereda la default, y estos permisos cruzan namespaces.
apiVersion: v1
kind: ServiceAccount
metadata:
name: n8n-restarter
namespace: n8n
---
# get ademas de patch: tras el PATCH el workflow espera 60 s y RELEE el
# deployment para comprobar readyReplicas -- sin get, ese chequeo posterior
# devolvia "Cannot read properties of undefined (reading 'replicas')".
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: n8n-restarter
rules:
- apiGroups: ["apps"]
# statefulsets porque Gitea lo es (no un Deployment) y esta en el mapa.
resources: ["deployments", "statefulsets"]
verbs: ["get", "patch"]
---
# Un RoleBinding por namespace y no un ClusterRoleBinding: el webhook que
# dispara esto es PUBLICO y sin autenticar, asi que el alcance de lo que
# puede reiniciar un desconocido debe ser exactamente el SERVICE_MAP.
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: n8n
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: monitoring
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: homarr
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: gitea
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: authentik
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: vaultwarden
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: ollama
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n
---
# argocd el ultimo a proposito: reiniciar argocd-server o argocd-repo-server
# es lo mas agresivo del mapa (deja el cluster sin reconciliar un rato).
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: n8n-restarter
namespace: argocd
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: n8n-restarter
subjects:
- kind: ServiceAccount
name: n8n-restarter
namespace: n8n