From 48c472fe6f01520b26a498af790882e4d38e5fcc Mon Sep 17 00:00:00 2001 From: "Ezequiel C." Date: Fri, 11 Sep 2026 00:29:53 +0200 Subject: [PATCH] Add cloudflare-ddns service Co-Authored-By: Claude Code --- README.md | 2 + services/catalog.json | 7 +++- services/cloudflare-ddns/metadata.json | 54 ++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 services/cloudflare-ddns/metadata.json diff --git a/README.md b/README.md index d8021f6..ea02916 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ homelab/ │ ├── catalog.json # generated index used by the installer (CDN listing) │ ├── nginx-proxy-manager/ # reverse proxy dashboard (NPM) │ │ └── metadata.json +│ ├── cloudflare-ddns/ # keeps ezequielcf.dev + *.ezequielcf.dev on the public IP +│ │ └── metadata.json │ ├── authelia/ # SSO / IdP (login portal, OIDC, forward-auth) │ │ ├── metadata.json │ │ ├── configuration.yml diff --git a/services/catalog.json b/services/catalog.json index a59b6ab..2edd3bb 100644 --- a/services/catalog.json +++ b/services/catalog.json @@ -1,11 +1,16 @@ { - "generatedAt": "2026-09-10T22:09:23.859Z", + "generatedAt": "2026-09-10T22:29:53.437Z", "services": [ { "id": "authelia", "version": "3.0.1", "path": "services/authelia/metadata.json" }, + { + "id": "cloudflare-ddns", + "version": "1.17.0", + "path": "services/cloudflare-ddns/metadata.json" + }, { "id": "forgejo", "version": "11.0.0", diff --git a/services/cloudflare-ddns/metadata.json b/services/cloudflare-ddns/metadata.json new file mode 100644 index 0000000..a30a4bf --- /dev/null +++ b/services/cloudflare-ddns/metadata.json @@ -0,0 +1,54 @@ +{ + "id": "cloudflare-ddns", + "name": "Cloudflare DDNS", + "description": "Keeps the homelab's public DNS records (ezequielcf.dev + wildcard subdomains) pointed at the current public IP via the Cloudflare API.", + "version": "1.17.0", + "category": "network", + "tags": ["ddns", "cloudflare", "dns", "dynamic-dns"], + "author": "favonia", + "license": "Apache-2.0", + "homepage": "https://github.com/favonia/cloudflare-ddns", + "documentation": "https://github.com/favonia/cloudflare-ddns/blob/main/docs/README.md", + "compose": { + "image": "favonia/cloudflare-ddns:1.17.0", + "container_name": "cloudflare-ddns", + "restart": "unless-stopped", + "environment": [ + "CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}", + "DOMAINS=${DOMAINS}", + "PROXIED=${PROXIED}", + "IP6_PROVIDER=${IP6_PROVIDER}", + "TZ=${TZ}" + ], + "networks": ["homelab"] + }, + "networks": { "homelab": { "external": true } }, + "env": [ + { + "name": "CLOUDFLARE_API_TOKEN", + "label": "Cloudflare API token", + "description": "Scoped token: Zone > DNS > Edit on ezequielcf.dev", + "required": true, + "secret": true + }, + { + "name": "DOMAINS", + "label": "Domains to update", + "default": "ezequielcf.dev,*.ezequielcf.dev" + }, + { + "name": "PROXIED", + "label": "Proxied through Cloudflare", + "description": "false = DNS-only (direct to origin, needed for direct LE HTTP-01); true = orange-cloud", + "default": "false" + }, + { + "name": "IP6_PROVIDER", + "label": "IPv6 provider", + "description": "none = IPv4-only updates", + "default": "none" + }, + { "name": "TZ", "label": "Timezone", "default": "UTC" } + ], + "notes": "Updates `ezequielcf.dev` (@) and the wildcard `*.ezequielcf.dev` A record whenever the public IP changes. Records are DNS-only (gray cloud) so the router DMZ -> 10.0.0.10:80/443 path serves origin traffic directly; flip PROXIED=true in the .env to route through Cloudflare instead. The API token lives only in ~/.homelab/services/cloudflare-ddns/.env." +}