diff --git a/dynu-updater/cronjob.yaml b/dynu-updater/cronjob.yaml new file mode 100644 index 0000000..e3a3c19 --- /dev/null +++ b/dynu-updater/cronjob.yaml @@ -0,0 +1,18 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: dynu-updater + namespace: dynu-updater +spec: + schedule: "*/5 * * * *" + jobTemplate: + spec: + template: + spec: + imagePullSecrets: + - name: harbor-regcred + containers: + - name: dynu-updater + image: harbor.c2et.net/c3s/dynu-updater-c3s:1.0 + imagePullPolicy: Always + restartPolicy: OnFailure diff --git a/dynu-updater/kustomization.yaml b/dynu-updater/kustomization.yaml new file mode 100644 index 0000000..bd573aa --- /dev/null +++ b/dynu-updater/kustomization.yaml @@ -0,0 +1,3 @@ +resources: + - namespace.yaml + - cronjob.yaml diff --git a/dynu-updater/namespace.yaml b/dynu-updater/namespace.yaml new file mode 100644 index 0000000..98df55a --- /dev/null +++ b/dynu-updater/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: dynu-updater diff --git a/dynu-updater/readme.md b/dynu-updater/readme.md new file mode 100644 index 0000000..2baf851 --- /dev/null +++ b/dynu-updater/readme.md @@ -0,0 +1,119 @@ +# Dynu IP Updater en Kubernetes + +Este proyecto despliega un cliente de Dynu personalizado como `CronJob` y `Job` en un clúster K3s/Kubernetes. Su función es mantener actualizada la dirección IP pública de un grupo de dominios gestionados en Dynu usando su API. + +--- + +## 🚀 Características + +* Imagen Docker ligera basada en Alpine. +* Actualiza la IP pública mediante peticiones HTTP a la API de Dynu. +* Guarda la IP anterior para evitar actualizaciones innecesarias. +* Ejecutado periódicamente mediante `CronJob` (cada 5 minutos). +* Puede ejecutarse manualmente mediante un `Job`. +* Los logs de ejecución se almacenan y pueden consultarse con `kubectl logs`. + +--- + +## 🚜 Estructura de archivos + +``` +. +k8s-dynu-updater/ +├── cronjob.yaml # CronJob de Kubernetes +├── job-manual.yaml # Job manual para pruebas +├── kustomization.yaml # Kustomize para despliegue +├── namespace.yaml # Namespace aislado para el updater +``` + +La imagen Docker utilizada se crea con el script `update.sh` incrustado, que: + +1. Detecta la IP pública actual. +2. Comprueba si ha cambiado desde la última ejecución. +3. Llama a la API de Dynu con usuario, grupo y contraseña hash MD5. + +--- + +## 📂 Despliegue + +1. Aplicar los manifiestos: + +```bash +cd k8s-dynu-updater +kubectl apply -k . +``` + +2. Comprobar el estado: + +```bash +kubectl get pods -n dynu-updater +``` + +--- + +## ✅ Ejecución manual + +Para probar el script sin esperar al cron: + +```bash +kubectl apply -f job-manual.yaml +kubectl logs -n dynu-updater job/dynu-updater-manual +``` + +--- + +## ⚖️ Configuración del script + +El script embebido en la imagen Docker: + +```bash +USERNAME="xavor" +PASSWORD="M@nabo2025" +GROUP="Trabajo" +``` + +> La contraseña se convierte a hash MD5 antes de enviarla. + +--- + +## 🚨 Seguridad + +* La contraseña se envía como hash MD5. +* Se recomienda usar un "IP Update Password" diferente del de cuenta. +* Puedes montar `Secret` en Kubernetes para no incluir credenciales directamente en la imagen. + +--- + +## 🔍 Logs en Dynu + +Dynu registra las actualizaciones entrantes. Puedes ver líneas como: + +``` +/nic/update?username=xavor&group=manabovalencia&myip=62.15.155.254&myipv6=no&password=***** Good +``` + +Esto confirma que el pod ha funcionado correctamente. + +--- + +## 🔍 Referencias + +* Dynu IP Update Protocol: [https://www.dynu.com/DynamicDNS/IP-Update-Protocol](https://www.dynu.com/DynamicDNS/IP-Update-Protocol) +* API: `https://api.dynu.com/nic/update` +* Cliente basado en `curl` y `cron` en Alpine Linux + +--- + +## 📅 Mantenimiento + +* Se puede adaptar a otros grupos (por ejemplo: `ManaboTorrevieja`). +* Si se quiere logs persistentes, se puede montar un volumen. +* Si se quiere gestionar con ArgoCD, agregarlo como `Application`. + +--- + +## 📄 Autor + +Xavor (2025) + +Este cliente se ha probado en K3s y Dynu, actualizando correctamente el grupo `ManaboValencia`.