Some of us use dynamic IPs at home and want to serve a web server, a security cam or a VPN server at home. IP addresses keep changing on connection resets or power cuts. This is a big problem and we should update DNS records according to the changes.

I personally use CloudFlare DNS services for almost anything related to my servers and I want the CF to keep protecting my home servers as well. I thought I could write a tool which checks current machine’s IP address and the IP address defined at CloudFlare, then updates CloudFlare DNS’s A record if both addresses do not match.

What you need?

  • A Linux distro running a SystemD as init system(I am using Ubuntu 16.04)
  • A CloudFlare account
  • Ruby or Docker installed on your server

I prefer the Docker way to run applications on my Linux servers because, neither I want to pollute my servers with different versions of software nor mutate the current states of the servers. Anyway, you can install latest Ruby version and run the application as you wish.

I wrote a small CloudFlare API Client in order to purge caches programmatically for a while ago, I used it as a base for my project. I admit that, it is a bit dirty code, but it works like a charm.


For the code you can visit.

git clone`
cd cloudflare-client
docker build -t cloudflare .

And create a file at /etc/systemd/system/docker-dns and paste the content below. (Do not forget to change and sections.)

Description=Docker Application Service

ExecStart=/usr/bin/docker run --rm -e "CLOUD_FLARE_API_KEY=<API KEY>" -e "CLOUD_FLARE_EMAIL=<EMAIL>" --name cloudflare cloudflare:latest bin/update_dns test
ExecStop=/usr/bin/docker stop -t 2 cloudflare
ExecStopPost=/usr/bin/docker rm -f cloudflare

sudo systemctl daemon-reload
sudo systemctl enable docker-dns
sudo service start docker-dns

Thus you created a system service that is running in the background.

When we check the Docker processes with docker ps, we should see that our service is running. By default, it should check IP addresses every minute. If you wish to change the default interval value, i.e. you can add -e INTERVAL=120 variable in ExecStart section for 120 seconds.

You can easily create an upstart script for upstart using distros.

I hope this helps you.