Files
ddns-updater/README.md
Aaron Guise e1bb5adf36
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Refactor: Moved all under internal.
FEAT: Directadmin provider is now working
2024-03-18 09:55:01 +13:00

4.6 KiB
Raw Blame History

Code and security checks

What is Cloudflare Dynamic DNS?

DNS records are static, and it does not play well with dynamic IP addresses. Now, to solve that problem, youll need to set up dynamic DNS. Cloudflare provides an API that allows you to manage DNS records programmatically.

To set up a Cloudflare dynamic DNS, youll need to run a process on a client inside your network that does two main actions: get your networks current public IP address and automatically update the corresponding DNS record.

This simple updater do the job, and send notifications, if change happen.

How to run

Environment variables

Before run, you need configure this environment variables.

  • DNS_NAMES - (required) dns records that will be automatically checked and modified based on the current public IP address. Multiple entries are separated by commas. For example: domain.com,sub1.domain.com,sub2.domain.com
  • CLOUDFLARE_API_KEY - (required) your cloudflare api key, with access rights to edit selected domains. See: https://developers.cloudflare.com/fundamentals/api/get-started/create-token/
  • CLOUDFLARE_ZONE - (required) zone name with domain you want to check. See: https://developers.cloudflare.com/fundamentals/get-started/concepts/accounts-and-zones/#zones
  • ON_CHANGE_COMMENT - (optional) in the event that the ip address of the dns record changes, this comment will be added to the record
  • CHECK_INTERVAL_SECONDS - (optional) how often will the ip address of the records be checked (default: 300)
  • PUBLIC_IP_RESOLVER - (optional) public ip address resolver. (default: ifconfig.me) Available: ifconfig.me, v4.ident.me, 1.1.1.1
  • NOTIFIERS - (optional) setting the notifier in case of an update of the dns record. Multiple entries are separated by commas. (default none). Example: webhook@http://localhost/cloudflare-notification

Notifications

Currently, only webhook notification is available. Webhook sends a POST request to the specified endpoint in json format.

Request body example:

{
  "old_ip": "xxx.xxx.xxx.xxx",
  "new_ip": "xxx.xxx.xxx.xxx",
  "checked_at": "2023-05-04T17:39:42.942850354+02:00",
  "resolver_tag": "ifconfig.me",
  "domain": "my.domain.com",
  "token": "a-webhook-token"
}

Other notification methods will be implemented later (check future plans section).

Building from source

  go build -o /cloudflare-ddns-updater

Go install

Install via go install

go install github.com/mkelcik/cloudflare-ddns-update

Running

CLOUDFLARE_DNS_TO_CHECK="domain.com" CLOUDFLARE_API_KEY="my_key" CLOUDFLARE_ZONE="domain.com" cloudflare-ddns-update

Via docker-compose for Cloudflare

version: "3"
services:
  cf-dns-updater:
    image: hub.cybercinch.nz/cybercinch/ddns-update:latest
    restart: unless-stopped
    environment:
      - CLOUDFLARE_API_KEY=your_cloudflare_api_key
      - DNS_NAMES=my.testdomain.com,your.testdomain.com
      - NOTIFIERS=webhook@http://localhost/cloudflare-updated-notification
      - ON_CHANGE_COMMENT="automatically updated"
      - CHECK_INTERVAL_SECONDS=300
      # Optional if your webhook receiver requires a token for verification 
      # - WEBHOOK_TOKEN="SomeSup3rs3cureT0k3n"

Via docker-compose for DirectAdmin

version: "3"
services:
  cf-dns-updater:
    image: hub.cybercinch.nz/cybercinch/ddns-update:latest
    restart: unless-stopped
    environment:
      - DNS_PROVIDER=directadmin
      - DA_USER=some-directadmin-username
      - DA_KEY=your-directadmin-password-or-login-key
      - DA_URL=https://your.daserver.com:2222
      - DNS_NAMES=my.testdomain.com,your.testdomain.com
      - NOTIFIERS=webhook@http://localhost/cloudflare-updated-notification
      - CHECK_INTERVAL_SECONDS=300
      # Optional if your webhook receiver requires a token for verification 
      # - WEBHOOK_TOKEN="SomeSup3rs3cureT0k3n"

Via docker run

docker run -e CLOUDFLARE_DNS_TO_CHECK=my.testdomain.com,your.testdomain.com -e CLOUDFLARE_API_KEY=your_cloudflare_api_key -e CLOUDFLARE_ZONE=testdomain.com -e ON_CHANGE_COMMENT="automatically updated" -e CHECK_INTERVAL_SECONDS=300 mkelcik/cloudflare-ddns-update:latest 

Future plans

  • prometheus metrics
  • mqtt and rabbitmq notifiers
  • IPv6 support

Contributing

Feel free to contribute and pls report bugs. Thanks