Cloudflare DDNS and Caddy Configuration Manager: A Python script for automating DNS updates and Caddy reverse proxy setup. Simplifies domain management with Cloudflare API integration and dynamic Caddyfile updates.
Find a file
2024-10-07 08:28:51 +02:00
.env-example Add .env-example 2024-10-07 07:54:13 +02:00
.gitignore Add .gitignore 2024-10-07 07:53:10 +02:00
cf Add cf 2024-10-07 08:04:14 +02:00
cf.py Update cf.py 2024-10-07 07:58:48 +02:00
cf_domains.yaml-example Add cf_domains.yaml-example 2024-10-07 07:49:10 +02:00
environment.yaml Add environment.yaml 2024-10-07 08:03:50 +02:00
README.md Update README.md 2024-10-07 08:28:51 +02:00
setup.sh Update setup.sh 2024-10-07 08:06:13 +02:00

Cloudflare DNS and Caddy Configuration Script

1. Installation and Setup

  • Ensure you have Anaconda or Miniconda installed on your system.

  • Clone the repository:

git clone https://sij.ai/sij/cf.git
cd cf
  • Run the setup script to create the conda environment and install dependencies:
chmod +x setup.sh
./setup.sh
  • Create .env file with your Cloudflare API token:
echo "CLOUDFLARE_API_TOKEN=your_token_here" > .env
  • Set up cf_domains.yaml with your domains and zone IDs:
cp cf_domains.yaml-example cf_domains.yaml
nano cf_domains.yaml

Edit the cf_domains.yaml file to include your domains, zone IDs, and DNS record IDs. The file structure should look like this:

domain1.com:
  '@': your_root_domain1.com_dns_record_id_here
  _id: your_domain1.com_zone_id_here
  sub1: your_sub1.domain1.com_dns_record_id_here
  sub2: your_sub2.domain1.com_dns_record_id_here
domain2.net:
  '@': your_root_domain2.net_dns_record_id_here
  _id: your_domain2.net_zone_id_here
  sub1: sub1.domain2.net_dns_record_id_here
  sub2: sub2.domain2.net_dns_record_id_here

Replace the example values with your actual Cloudflare zone IDs and DNS record IDs for each domain and subdomain you want to manage with this script.

  • (Optional) Create a symlink to use the script from anywhere:
sudo ln -sf "$(pwd)/cf" /usr/local/bin/cf
  • Ensure Caddy is installed and /etc/caddy/Caddyfile is writable (Ubuntu/Debian example):
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
sudo chown caddy:caddy /etc/caddy/Caddyfile
sudo chmod 644 /etc/caddy/Caddyfile

2. Usage

2.1 DDNS Update

./cf ddns [--force]

Updates all domains with current IP. Use --force to update regardless of IP change.

2.2 Adding/Updating Domain Configuration

./cf <full-domain> [--ip <ip address>] --port <port>

Adds or updates domain in Cloudflare and Caddyfile. Default IP is localhost.

2.3 Updating All Domains

./cf all [--force]

Updates all domains and Caddyfile configurations.

Note: If you created the symlink, you can use cf instead of ./cf from any directory.

3. File and Environment Structure

  • cf: Wrapper script to activate conda environment and run the Python script
  • cf.py: Main Python script
  • setup.sh: Shell script to set up your Conda environment
  • environment.yaml: Conda environment specification
  • cf_domains.yaml: Stores domain info and DNS record IDs
  • .env: Contains CLOUDFLARE_API_TOKEN and CURRENT_IP
  • cf_script.log: Logs script actions

4. Key Functions and Error Handling

  • ddns(): Handles DDNS updates
  • update_caddyfile(): Modifies Caddy configuration
  • update_or_create_record(): Manages Cloudflare DNS records

Common errors:

  • API authentication failures: Check Cloudflare API token in .env file
  • Permission issues: Run with sudo for Caddyfile changes
  • Domain not found: Ensure domain is in cf_domains.yaml
  • Caddy failing to obtain HTTPS certificates: Ensure the Caddy service environment contains your CLOUDFLARE_API_TOKEN, and your Caddyfile contains your email address; see Caddy documentation if you have further trouble

Logs are in cf_script.log for troubleshooting.

5. Updating

To update the script and its dependencies:

  1. Pull the latest changes:
    git pull
    
  2. Update the conda environment:
    conda env update -f environment.yaml -p ./cf-env