Here's a quick Github Action a prompt blurted to periodically backup a Cloudflare DNS settings for all my domains and commit them into the repository. Zero maintenance required once set up:
name: Cloudflare DNS Backup
on:
workflow_dispatch:
schedule:
- cron: "40 0 * * 0"
jobs:
backup:
runs-on: ubuntu-22.04
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
- run: |
# Create backup directory
mkdir -p dns-backups
# Get list of zones (domains)
zones=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" | jq -r '.result[].id')
# Loop through zones and backup DNS records
for zone in $zones; do
# Get zone name
zone_name=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" | jq -r '.result.name')
echo "Backing up DNS records for $zone_name"
# Get DNS records and save to file
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone/dns_records" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" | jq > "dns-backups/$zone_name.json"
done
- uses: stefanzweifel/git-auto-commit-action@v5
More details available in the repository. Enjoy!