The lightweight IPv4/IPv6 dynamic DNS updater for Cloudflare.
d2c.sh is a simple Bash script that automatically updates A and AAAA DNS records on Cloudflare for your machine’s public IP.
Warning
d2c.sh updates existing records. Make sure to create them in the Cloudflare dashboard before running d2c.sh.
By default, configuration files are read from /etc/d2c/. You can override the configuration directory using the -c/ --config option.
It processes all files in the configuration directory that end with .toml, e.g., /etc/d2c/d2c.toml, /etc/d2c/zone1.toml or /etc/d2c/zone2.toml.
Warning
Make sure to create the correct type of record (A or AAAA) according to IPv4 or IPv6, as d2c.sh will ignore misconfigured records.
[api]
zone-id = "aaa" # your DNS zone ID
api-key = "bbb" # your API key with DNS records permissions
[[dns]]
name = "dns1.example.com" # DNS name
proxy = true # Proxied by Cloudflare?
[[dns]]
name = "dns2.example.com"
proxy = false
[[dns]]
name = "dns6.example.com"
proxy = false
ipv6 = true # set this entry as ipv6Clone the repository:
$ git clone https://github.com/ddries/d2c.sh.git
$ cd d2c.shInstall the script:
$ sudo chmod +x d2c.sh
$ sudo cp d2c.sh /usr/local/binNow, you can run d2c.sh from the command-line. If the configuration directoy does not exist, the script will create it for you.
$ d2c.sh
Created /etc/d2c/. Please, fill the configuration files.Fill the configuration file(s) with your zone id, API key and the desired DNS':
$ sudo nano /etc/d2c/d2c.toml
[api]
zone-id = "aaa"
api-key = "bbb"
...Finally, you can run manually d2c.sh or set up a cronjob to update periodically:
$ d2c.sh # manually
[d2c.sh] Processing /etc/d2c/d2c.toml...
[d2c.sh] dns1.example-1.com did not change
[d2c.sh] Processing /etc/d2c/d2c-1.toml...
[d2c.sh] OK dns2.example-2.com
$ crontab -e # set cronjob to run d2c.sh periodically
$ d2c.sh -c /path/to/files # use another config pathYou can also execute d2c.sh avoiding the installation. Note that you must still have valid configuration file(s), e.g. /etc/d2c/d2c.toml.
Execute from URL:
$ bash <(curl -s https://raw.githubusercontent.com/ddries/d2c.sh/master/d2c.sh)
[d2c.sh] Processing /etc/d2c/d2c.toml...
[d2c.sh] dns1.example-1.com did not change
[d2c.sh] Processing /etc/d2c/d2c-1.toml...
[d2c.sh] OK dns2.example-2.comTo run periodically without installing, you can write your own script:
$ nano run_d2c.sh
#!/bin/bash
bash <(curl -s https://raw.githubusercontent.com/ddries/d2c.sh/master/d2c.sh)
$ crontab -e # set cronjob to run periodicallyYou can use the provided Dockerfile to build a Docker image of d2c.sh:
$ git clone https://github.com/ddries/d2c.sh.git
$ cd d2c.sh
$ docker build . -t ddries/d2c.sh:latestThen, you can run it using your own Docker workflow. For instance, using plain Docker:
$ docker run --rm --network host -v /etc/d2c/:/etc/d2c ddries/d2c.sh:latestWarning
Make sure to set the network driver to host, since the container must have the host's IPv4/6 address.
d2c.sh by default does not use any notification service, but the following are supported and can be enabled:
When DNS records are updated, d2c.sh will send a notification to enabled services. Feel free to submit a pull request to add more notification services.
To enable Gotify support, add the following configuration to your toml file:
[gotify]
enabled = true
endpoint = "http://gotify.example.com"
token = "ccc"To enable notifications via Telegram bot, add the following configuration to your toml file:
[telegram]
enabled = true
token = "aaabbb" # from BotFather
chat_id = "111234"You can get your chat ID by sending a message to the bot and going to this URL to view the chat_id: https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates