dyndns
![golangci-lint-workflow](https://github.com/soerenschneider/dyndns/actions/workflows/golangci-lint.yaml/badge.svg)
Automatically updates DNS records for hosts that don't have a static IP
Features
π£ Dynamically updates a DNS record to match your public IP address
π Continuously checks for your public IP address
π Checks your network interface's IP address directly or calls HTTP APIs to detect your public IP
π Runs in client / server mode and communicates via MQTT to limit blast-radius
π Messages are cryptographically signed, therefore public MQTT brokers can be used
π° Built-in resiliency for different failure scenarios
π Can use either dynamic credentials using Hashicorp Vault or static credentials
π Observability through Prometheus metrics
Why would I need it?
π You don't have a static public IP address
π€Ή Ideally, you have multiple endpoints you want to assign DNS records to
Installation
Docker / Podman
$ docker pull ghcr.io/soerenschneider/dyndns-server:main
$ docker pull ghcr.io/soerenschneider/dyndns-client:main
Binaries
Head over to the prebuilt binaries and download the correct binary for your system.
From Source
As a prerequesite, you need to have Golang SDK installed. After that, you can install dyndns from source by invoking:
$ go install github.com/soerenschneider/dyndns@latest
Configuration
Head over to the configuration section to see more details.
Getting Started
First, you need to build a keypair. This is easily done
$ docker run ghcr.io/soerenschneider/dyndns-client -gen-keypair
{"public_key":"IyXH8z/+vRsIUEAldlGgKKFcVHoll8w2tzC6o9717m8=","private_key":"h7jrhYupN0LVPnVWqFun6sN+bWNr0B0mh7/mgRaKnhsjJcfzP/69GwhQQCV2UaAooVxUeiWXzDa3MLqj3vXubw=="}
Architecture
Data sent over the wire is expected to have the following format, encoded as a JSON message.
Field Name |
Description |
JSON Key |
Data Type |
Optional |
PublicIp |
The resolved IP address. |
"public_ip" |
Object |
No |
Signature |
The signature associated with the envelope. |
"signature" |
String |
No |
Field Name |
Description |
JSON Key |
Data Type |
Optional |
IpV4 |
The IPv4 address (optional). |
"ipv4" |
String |
Yes |
IpV6 |
The IPv6 address (optional). |
"ipv6" |
String |
Yes |
Host |
The hostname associated with the resolved IP address. |
"host" |
String |
No |
Timestamp |
The timestamp when the resolution occurred. |
"timestamp" |
Time |
No |
Observability
Head over to the metrics to see more details.
Changelog
The changelog can be found here