| .. | ||
| logs | ||
| zones | ||
| README.md | ||
| update_cloudflare_ip.sh | ||
🔁 Dynamic DNS Updater for Cloudflare with Mullvad IP
This script updates A records in Cloudflare with your current public IP as reported by Mullvad's IP check service. It supports:
- Multiple domains/zones via
.envfiles - Secure API access using Cloudflare API Tokens
- Smart updates: only changes DNS if your IP has changed
- Daily logging to
./logs/
🚀 Features
- ✅ Fetches current public IP from Mullvad API (
https://ipv4.am.i.mullvad.net/json) - ✅ Uses
.envfiles to manage multiple Cloudflare DNS records - ✅ Supports API Tokens (safer than global keys)
- ✅ Skips unnecessary updates if IP hasn't changed
- ✅ Logs every run to
logs/update_YYYY-MM-DD.log
📁 Project Structure
.
├── update_cloudflare_ip.sh # Main script
├── zones/ # Folder for per-domain config files
│ ├── example_com.env
│ └── another_domain.env
└── logs/ # Auto-created daily log files
└── update_2025-10-05.log
⚙️ Configuration
- Create a
zones/folder (already included in repo). - Add one
.envfile per domain/zone, named descriptively. Example:
zones/subdomain.domain.com.env
ZONE_ID="your_cloudflare_zone_id"
DNS_RECORD_ID="your_dns_record_id"
CLOUDFLARE_API_TOKEN="your_cloudflare_api_token"
DNS_NAME="subdomain.domain.com"
✅ Use Cloudflare API Tokens with permission:
Zone → DNS → Edit for the required zone.
🧪 Usage
Make the script executable:
chmod +x update_cloudflare_ip.sh
Run it manually:
./update_cloudflare_ip.sh
Check logs:
cat logs/update_$(date +%F).log
🕒 Automation (Cron Example)
To run the script every 10 minutes, edit your crontab:
crontab -e
Add this line:
*/10 * * * * /path/to/update_cloudflare_ip.sh >> /dev/null 2>&1
Or, if you want to keep logs automatically:
*/10 * * * * /path/to/update_cloudflare_ip.sh >> /path/to/logs/cron.log 2>&1
✅ Requirements
- bash (scripted for Linux/macOS)
- curl
- jq (lightweight and flexible command-line JSON processor): https://github.com/jqlang/jq
Install jq if missing:
# Debian/Ubuntu
sudo apt install jq
# macOS (Homebrew)
brew install jq
🔐 Security Tip
Never share your .env files or commit them to public repositories. They contain sensitive credentials.
Use .gitignore to ignore your secrets:
.gitignore
zones/*.env
logs/
🙋 FAQ
Q: What happens if the IP hasn't changed? A: The script detects it and skips the update.
Q: What if one domain fails? A: The script continues to process the remaining .env files.
Q: Can I use IPv6? A: Not currently. This script uses Mullvad's IPv4 API. IPv6 support can be added if needed.