Files
k8s-apps/ddns/ddns.yaml
2025-08-25 17:48:15 +02:00

86 lines
2.2 KiB
YAML

apiVersion: v1
kind: Namespace
metadata:
name: ddns
---
apiVersion: v1
kind: Secret
metadata:
name: he-ddns-secrets
namespace: ddns
type: Opaque
stringData:
# FQDN,clé_DDNS (une ligne par host marqué "dynamic" sur dns.he.net)
hosts.csv: |
undercloud.dev,fIHrC4yqYmnlLFBG
firewall.undercloud.dev,JmcqpomJT6CZtbuP
---
apiVersion: v1
kind: ConfigMap
metadata:
name: he-ddns-script
namespace: ddns
data:
update.sh: |
#!/bin/sh
set -eu
# Get public IPv4 once
V4="$(curl -4 -fsS --max-time 5 https://ipv4.icanhazip.com || true)"
[ -n "${V4:-}" ] || { echo "no IPv4 detected"; exit 0; }
while IFS=, read -r HOST PASS; do
# trim spaces and skip blanks/comments
HOST="$(printf %s "$HOST" | tr -d ' \t\r')"
PASS="$(printf %s "$PASS" | tr -d ' \t\r')"
case "$HOST" in ''|\#*) continue;; esac
[ -n "$PASS" ] || { echo "skip $HOST: empty key" >&2; continue; }
RESP="$(curl -4 -fsS --connect-timeout 5 --retry 2 --retry-connrefused \
-A 'he-ddns/1.0' \
https://dyn.dns.he.net/nic/update \
-d "hostname=$HOST" -d "password=$PASS" -d "myip=$V4" || echo 'curlfail')"
echo "$HOST -> $RESP"
done < /secrets/hosts.csv
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: he-ddns
namespace: ddns
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 3
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: updater
image: curlimages/curl
env:
- name: IPV6_ONLY
value: "1" # mets "0" pour IPv4+IPv6
command: ["/bin/sh","-c","/scripts/update.sh"]
volumeMounts:
- name: secrets
mountPath: /secrets
readOnly: true
- name: script
mountPath: /scripts
readOnly: true
volumes:
- name: secrets
secret:
secretName: he-ddns-secrets
- name: script
configMap:
name: he-ddns-script
defaultMode: 0755