Add Cloudflare DDNS for devopshomelab.com (IPv4 A records)
timothyjmiller/cloudflare-ddns with host networking; render env from secrets (apex + subdomains mc/minecraft/vpn/www/forgejo/jellyfin).
This commit is contained in:
parent
60f8a89c87
commit
c130080c52
5 changed files with 129 additions and 0 deletions
69
scripts/render-cloudflare-ddns-env.sh
Executable file
69
scripts/render-cloudflare-ddns-env.sh
Executable file
|
|
@ -0,0 +1,69 @@
|
|||
#!/usr/bin/env bash
|
||||
# Build config/cloudflare-ddns.env for timothyjmiller/cloudflare-ddns from secrets/.env
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
STACK_DIR="${STACK_DIR:-$(cd "$SCRIPT_DIR/.." && pwd)}"
|
||||
SECRETS="${SECRETS_FILE:-$STACK_DIR/secrets/.env}"
|
||||
OUT_DIR="${CONFIG_DIR:-$STACK_DIR/config}/cloudflare-ddns"
|
||||
OUT="$OUT_DIR/ddns.env"
|
||||
|
||||
[[ -f "$SECRETS" ]] || { echo "missing $SECRETS"; exit 1; }
|
||||
|
||||
set -a
|
||||
# shellcheck disable=SC1090
|
||||
source "$SECRETS"
|
||||
set +a
|
||||
|
||||
TOKEN="${CLOUDFLARE_API_TOKEN:-${CLOUDFLAREAPIKEY:-}}"
|
||||
ZONE="${CLOUDFLARE_ZONE_ID:-${CLOUDFLAREZONEID:-}}"
|
||||
DOMAIN="${CLOUDFLARE_DOMAIN:-${CLOUDFLAREDOMAIN:-devopshomelab.com}}"
|
||||
SUBS="${CLOUDFLARE_SUBDOMAINS:-${CLOUDFLARESUBDOMAINS:-}}"
|
||||
PROXIED="${CLOUDFLARE_PROXIED:-${CLOUDFLAREPROXIED:-false}}"
|
||||
CRON="${CLOUDFLARE_UPDATE_CRON:-@every 5m}"
|
||||
|
||||
[[ -n "$TOKEN" ]] || { echo "CLOUDFLAREAPIKEY / CLOUDFLARE_API_TOKEN missing"; exit 1; }
|
||||
[[ -n "$DOMAIN" ]] || { echo "CLOUDFLAREDOMAIN missing"; exit 1; }
|
||||
|
||||
# apex + each subdomain → full FQDNs
|
||||
DOMAINS=("$DOMAIN")
|
||||
IFS=',' read -ra parts <<<"$SUBS"
|
||||
for s in "${parts[@]}"; do
|
||||
s="$(echo "$s" | tr -d '[:space:]')"
|
||||
[[ -z "$s" ]] && continue
|
||||
if [[ "$s" == "$DOMAIN" || "$s" == "@" || "$s" == "." ]]; then
|
||||
continue
|
||||
elif [[ "$s" == *.* ]]; then
|
||||
DOMAINS+=("$s")
|
||||
else
|
||||
DOMAINS+=("${s}.${DOMAIN}")
|
||||
fi
|
||||
done
|
||||
|
||||
# unique join
|
||||
IP4_LIST="$(printf '%s\n' "${DOMAINS[@]}" | awk 'NF && !seen[$0]++' | paste -sd, -)"
|
||||
|
||||
mkdir -p "$OUT_DIR"
|
||||
umask 077
|
||||
cat >"$OUT" <<EOF
|
||||
# Generated by scripts/render-cloudflare-ddns-env.sh — do not commit
|
||||
CLOUDFLARE_API_TOKEN=${TOKEN}
|
||||
IP4_DOMAINS=${IP4_LIST}
|
||||
IP4_PROVIDER=cloudflare.trace
|
||||
IP6_PROVIDER=none
|
||||
PROXIED=${PROXIED}
|
||||
UPDATE_CRON=${CRON}
|
||||
UPDATE_ON_START=true
|
||||
TTL=1
|
||||
RECORD_COMMENT=arr-stack cloudflare-ddns
|
||||
TZ=${TZ:-UTC}
|
||||
EOF
|
||||
|
||||
# optional zone id is not required by current image (token + domains)
|
||||
if [[ -n "$ZONE" ]]; then
|
||||
echo "# CLOUDFLARE_ZONE_ID=${ZONE} (informational; env-mode uses token scopes)" >>"$OUT"
|
||||
fi
|
||||
|
||||
chmod 600 "$OUT"
|
||||
echo "Wrote $OUT"
|
||||
echo "IP4_DOMAINS=${IP4_LIST}"
|
||||
Loading…
Add table
Add a link
Reference in a new issue