{"id":17793403,"url":"https://github.com/clayoster/ddns-cloudflare","last_synced_at":"2025-07-25T01:16:25.637Z","repository":{"id":258415564,"uuid":"860672724","full_name":"clayoster/ddns-cloudflare","owner":"clayoster","description":"Self-hosted DDNS service for updating CloudFlare","archived":false,"fork":false,"pushed_at":"2025-05-16T02:38:42.000Z","size":35,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-07T23:16:54.191Z","etag":null,"topics":["cloudflare","cloudflare-ddns","ddns","ddns-cloudflare","ddns-selfhosted","ddns-server","dyndns","dyndns-cloudflare","dyndns-selfhosted","dyndns-server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/clayoster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-20T22:36:46.000Z","updated_at":"2025-05-16T02:37:39.000Z","dependencies_parsed_at":"2024-12-20T05:26:48.205Z","dependency_job_id":"6a36f1f8-fd79-4af5-b12d-e69de037acfb","html_url":"https://github.com/clayoster/ddns-cloudflare","commit_stats":null,"previous_names":["clayoster/ddns-cloudflare"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/clayoster/ddns-cloudflare","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clayoster%2Fddns-cloudflare","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clayoster%2Fddns-cloudflare/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clayoster%2Fddns-cloudflare/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clayoster%2Fddns-cloudflare/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clayoster","download_url":"https://codeload.github.com/clayoster/ddns-cloudflare/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clayoster%2Fddns-cloudflare/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259827647,"owners_count":22917711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare","cloudflare-ddns","ddns","ddns-cloudflare","ddns-selfhosted","ddns-server","dyndns","dyndns-cloudflare","dyndns-selfhosted","dyndns-server"],"created_at":"2024-10-27T11:08:26.855Z","updated_at":"2025-07-25T01:16:25.608Z","avatar_url":"https://github.com/clayoster.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ddns-cloudflare\n\nThis is a self-hosted DDNS service for receiving public IP updates from a router or other local source and updating a DNS record in Cloudflare.\n\nContainer images are based on Alpine Linux and are available for these platforms:\n  - linux/amd64\n  - linux/arm64\n  - linux/arm/v6\n  - linux/arm/v7\n\n---\n\nThe primary reasons for building *yet another* DDNS tool for updating Cloudflare records:\n- Many other solutions depend upon using a ***Global*** API token which is unacceptable for this singular purpose. This solution allows the use of a API token scoped with privileges to edit a single DNS zone.\n  - Unfortunately Cloudflare does not allow limiting the edit privileges to a single DNS record in a zone at this point.\n- Self-hosted option for receiving DDNS updates from a router or other local source rather than depending on an external service for detecting public IP address changes\n\n---\n\nValid response codes were gathered from here:\\\n  https://help.dyn.com/remote-access-api \\\n  https://github.com/troglobit/inadyn/blob/master/plugins/common.c\n\n## How to send DDNS Updates to this Application\n\nExample information that will be used below:\n- Cloudflare Record to Update: `home.example.com`\n- Cloudflare API token (scoped to a single DNS Zone!): `supersecretapitoken`\n- Username for the ddns-cloudflare service: `ddns-user`\n- Password for the ddns-cloudflare service: `ddns-password`\n- Server running the ddns-cloudflare service: `ddns.example.com:8080`\n  - Port 8080 can be dropped by running the application behind a reverse proxy\n\n### Sending updates from a router (Using a Unifi Dream Machine as an example)\n- Service: `dyndns`\n- Hostname: `home.example.com`\n- Username: `ddns-user`\n- Password: `ddns-password`\n- Server: `ddns.example.com:8080/nic/update?hostname=%h\u0026myip=%i`\n\n### Manual updates can be sent to this service with a GET request in the following format:\n\n```\ncurl \"http://ddns-user:ddns-password@ddns.example.com:8080/nic/update?hostname=home.example.com\u0026myip=0.0.0.0\"\n```\n\n## Deployment with Docker Compose (Recommended)\n\n*Note: The application requires authentication to be configure via the AUTH_USER and AUTH_PASS environment variables. Without those set, the app will fail to start successfully which is intentional.*\n\n#### Example docker-compose.yml file\n\n```yaml\nservices:\n  ddns-cloudflare:\n    container_name: ddns-cloudflare\n    # Using 'latest' as an example. specifying a specific version is preferred\n    image: ghcr.io/clayoster/ddns-cloudflare:latest\n    restart: always\n    environment:\n      # Username for authenticating to the ddns service\n      - AUTH_USER=ddns-user\n      # Password for authenticating to the ddns service\n      - AUTH_PASS=ddns-password\n      # Your CloudFlare API token with access to the necessary DNS Zone\n      - API_TOKEN=supersecretapitoken\n    ports:\n        - \"8080:8080\"\n```\n\nAdditional recommendations:\n- Only run this container on an internal network and not exposed to the internet\n- Run this behind a reverse proxy with HTTPS configured to keep requests encrypted\n\n## To-Dos\n- Make \"hostname\" compatible with accepting up to 20 comma-delimited domain names\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclayoster%2Fddns-cloudflare","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclayoster%2Fddns-cloudflare","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclayoster%2Fddns-cloudflare/lists"}