# Cloudflare DNS and Caddy Configuration Script ## 1. Installation and Setup - Ensure you have Anaconda or Miniconda installed on your system. - Clone the repository: ```bash git clone https://sij.ai/sij/cf.git cd cf ``` - Run the setup script to create the conda environment and install dependencies: ```bash chmod +x setup.sh ./setup.sh ``` - Create `.env` file with your Cloudflare API token: ```bash echo "CLOUDFLARE_API_TOKEN=your_token_here" > .env ``` - Set up `cf_domains.yaml` with your domains and zone IDs: ```bash 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: ```yaml 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: ```bash sudo ln -sf "$(pwd)/cf" /usr/local/bin/cf ``` - Ensure Caddy is installed and `/etc/caddy/Caddyfile` is writable (Ubuntu/Debian example): ```bash 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 [--ip ] --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 - `Caddyfile`: Caddy server configuration - `cf_domains.yaml`: Stores domain info and DNS record IDs - `.env`: Contains `CLOUDFLARE_API_TOKEN` and `CURRENT_IP` - `cf_script.log`: Logs script actions - `environment.yaml`: Conda environment specification - `cf`: Wrapper script to activate conda environment and run the Python script - `cf.py`: Main Python script ## 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 API token in `.env` file - Permission issues: Run with sudo for Caddyfile changes - Domain not found: Ensure domain is in `cf_domains.yaml` Logs are in `cf_script.log` for troubleshooting. ## 5. Updating To update the script and its dependencies: 1. Pull the latest changes: ```bash git pull ``` 2. Update the conda environment: ```bash conda env update -f environment.yaml -p ./cf-env ```