# ๐Ÿ” Dynamic DNS Updater for Cloudflare with Mullvad IP This script updates A records in Cloudflare with your current public IP as reported by [Mullvad](https://mullvad.net)'s IP check service. It supports: - Multiple domains/zones via `.env` files - 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 `.env` files 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 1. Create a `zones/` folder (already included in repo). 2. Add one `.env` file 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.