#!/usr/bin/env bash # ACME-DNS Docker Setup Script set -euo pipefail IFS=$'\n\t' # ====================== # CONFIGURATION (EDIT THESE) # ====================== SETUP_DIR="/var/tmp/acme-dns-setup" MAIN_DOMAIN="example.com" # Base domain for certificates (e.g., yoursite.com) ACME_DNS_SUBDOMAIN="auth" # Subdomain for acme-dns (creates auth.yoursite.com) ACME_DNS_FQDN="${ACME_DNS_SUBDOMAIN}.${MAIN_DOMAIN}" PUBLIC_IP="1.2.3.4" # Public IP of THIS server ADMIN_EMAIL="admin@${MAIN_DOMAIN}" # For SOA record (converted to DNS format: admin.yoursite.com) LE_NOTIFICATION_EMAIL="admin@${MAIN_DOMAIN}" # Let's Encrypt notifications (if using LE modes) # API Configuration API_PORT="443" # Host port for API (443 recommended for TLS modes) API_TLS_MODE="letsencryptstaging" # Options: none, letsencrypt, letsencryptstaging, cert API_CORS_ORIGINS="[\"https://*.${MAIN_DOMAIN}\", \"https://${MAIN_DOMAIN}\"]" # SECURE DEFAULT CUSTOM_TLS_CERT_PRIVKEY="/etc/acme-dns/certs/privkey.pem" CUSTOM_TLS_CERT_FULLCHAIN="/etc/acme-dns/certs/fullchain.pem" # DNS & Logging DNS_PORT="53" # MUST be 53 for public DNS delegation LOG_LEVEL="info" # error, warning, info, debug # ====================== # SAFETY VALIDATIONS # ====================== if ! command -v docker &>/dev/null; then echo "❌ ERROR: Docker not found. Install Docker first." >&2 exit 1 fi # Critical placeholder check if [[ "${MAIN_DOMAIN}" == "example.com" || "${PUBLIC_IP}" == "1.2.3.4" ]]; then echo "⚠️ WARNING: Using default placeholder values!" >&2 echo " Edit CONFIGURATION section before proceeding." >&2 read -p "Continue anyway? (y/N): " -r || exit 1 [[ ! "$REPLY" =~ ^[Yy]$ ]] && exit 1 fi # Port conflict detection (HOST level) for port in "${DNS_PORT}" "${API_PORT}"; do if ss -tuln 2>/dev/null | grep -qE ":${port}[^0-9]"; then echo "⚠️ WARNING: Host port ${port} is already in use!" >&2 echo " acme-dns may fail to start. Resolve conflicts first." >&2 read -p "Continue? (y/N): " -r || exit 1 [[ ! "$REPLY" =~ ^[Yy]$ ]] && exit 1 fi done # ====================== # HELPER FUNCTIONS # ====================== cleanup() { [[ -d "${SETUP_DIR}" ]] && rm -rf "${SETUP_DIR}" && echo "🧹 Cleaned existing setup directory" } generate_config() { # Convert email to DNS SOA format (admin@domain.com → admin.domain.com) local nsadmin="${ADMIN_EMAIL//@/.}" cat </dev/null 2>&1 generate_config >"${SETUP_DIR}/config/config.cfg" generate_docker_compose >"${SETUP_DIR}/docker-compose.yml" # ====================== # ACTIONABLE NEXT STEPS (CRITICAL) # ====================== cat <