Dynamic DNS updater for Non Static IP's using https://freedns.afraid.org
2.7K
Production-ready container that keeps your FreeDNS subdomains synced with your dynamic public IP.
FREEDNS_UPDATE_URL) (recommended)FREEDNS_TOKEN)services:
ddns:
image: dhimanparas20/ddns:latest
container_name: ddns
restart: unless-stopped
environment:
TZ: Asia/Calcutta
FREEDNS_UPDATE_URL: ${FREEDNS_UPDATE_URL}
# Optional alternative to FREEDNS_UPDATE_URL:
# FREEDNS_TOKEN: ${FREEDNS_TOKEN}
UPDATE_INTERVAL: 1
FREEDNS_REQUEST_TIMEOUT_SECONDS: 15
FREEDNS_CONNECT_TIMEOUT_SECONDS: 8
FREEDNS_RETRY_COUNT: 1
FREEDNS_FORCE_IPV4: 1
FREEDNS_ALLOW_HTTP_FALLBACK: 1
FORCE_UPDATE_EACH_CYCLE: 0
volumes:
- dns-logs:/var/log/freedns
- dns-config:/etc/freedns
volumes:
dns-logs:
dns-config:
Run:
docker compose up -d
docker run -d \
--name ddns \
--restart unless-stopped \
-e TZ=Asia/Calcutta \
-e FREEDNS_TOKEN=your_token \
-e UPDATE_INTERVAL=1 \
-v dns-logs:/var/log/freedns \
-v dns-config:/etc/freedns \
dhimanparas20/ddns:latest
| Variable | Description | Default |
|---|---|---|
FREEDNS_UPDATE_URL | Full direct URL from FreeDNS Dynamic DNS page | empty |
FREEDNS_TOKEN | Raw token from direct URL (used if FREEDNS_UPDATE_URL is not set) | empty |
UPDATE_INTERVAL | Check interval in hours | 1 |
TZ | Log timezone | UTC (image), Asia/Calcutta in compose default |
FREEDNS_REQUEST_TIMEOUT_SECONDS | Max time per request attempt | 15 |
FREEDNS_CONNECT_TIMEOUT_SECONDS | TCP connect timeout | 8 |
FREEDNS_RETRY_COUNT | Curl retries per URL | 1 |
FREEDNS_FORCE_IPV4 | Use IPv4 for FreeDNS calls (1/0) | 1 |
FREEDNS_ALLOW_HTTP_FALLBACK | Try HTTP if HTTPS fails (1/0) | 1 |
FORCE_UPDATE_EACH_CYCLE | Always call FreeDNS, skip local IP cache compare (1/0) | 0 |
HEALTHCHECK_GRACE_SECONDS | Extra health grace window | 600 |
At least one of FREEDNS_UPDATE_URL or FREEDNS_TOKEN must be provided.
This image includes a built-in Docker healthcheck. It marks healthy when:
Check status:
docker inspect --format='{{.State.Health.Status}}' ddns
Follow logs:
docker logs -f ddns
Typical successful update log:
FreeDNS update acknowledged: Updated 5 host(s) ... to <IP>
Update cycle completed successfully.
Typical no-change log (healthy behavior):
No update required. Current IP matches cached IP (...)
Update cycle completed successfully.
Dynamic DNShttps://freedns.afraid.org/dynamic/update.php?YOUR_TOKENFREEDNS_UPDATE_URLFREEDNS_TOKENFreeDNS request failed with timeout:
freedns.afraid.orgFREEDNS_FORCE_IPV4=1FREEDNS_ALLOW_HTTP_FALLBACK=1FreeDNS returned an error response:
FREEDNS_UPDATE_URL or FREEDNS_TOKEN is setlatest: newest stable imageMIT License. See LICENSE.md.
Content type
Image
Digest
sha256:9ec43d49c…
Size
7.4 MB
Last updated
7 months ago
docker pull dhimanparas20/ddns