#!/usr/bin/env bash # Domain-Migration auf dem Homelab (DuckDNS + Nginx + Certbot) # Usage: sudo bash deploy/fix-domain.sh [neue-domain] set -euo pipefail NEW_DOMAIN="${1:-trilogyhub.de}" OLD_DOMAIN="${2:-halmc.duckdns.org}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" APP_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" if [[ "${EUID}" -ne 0 ]]; then echo "Bitte als root: sudo bash deploy/fix-domain.sh" >&2 exit 1 fi ENV_FILE="${APP_DIR}/deploy/env.homelab" if [[ ! -f "${ENV_FILE}" ]]; then echo "deploy/env.homelab fehlt" >&2 exit 1 fi echo "==> Domain: ${OLD_DOMAIN} -> ${NEW_DOMAIN}" # env.homelab aktualisieren (Token behalten, CRLF entfernen) sed -i 's/\r$//' "${ENV_FILE}" if grep -q '^APP_DOMAIN=' "${ENV_FILE}"; then sed -i "s|^APP_DOMAIN=.*|APP_DOMAIN=${NEW_DOMAIN}|" "${ENV_FILE}" else echo "APP_DOMAIN=${NEW_DOMAIN}" >> "${ENV_FILE}" fi if grep -q '^DUCKDNS_DOMAIN=' "${ENV_FILE}"; then sed -i "s|^DUCKDNS_DOMAIN=.*|DUCKDNS_DOMAIN=${NEW_DOMAIN}|" "${ENV_FILE}" else echo "DUCKDNS_DOMAIN=${NEW_DOMAIN}" >> "${ENV_FILE}" fi chmod 600 "${ENV_FILE}" # DuckDNS IP aktualisieren if grep -q '^DUCKDNS_TOKEN=.\+' "${ENV_FILE}" 2>/dev/null; then echo "==> DuckDNS Update" bash "${APP_DIR}/deploy/duckdns-update.sh" || echo " DuckDNS-Update fehlgeschlagen (manuell pruefen)" else echo " DuckDNS-Token leer — Update uebersprungen" fi # Nginx LAN echo "==> Nginx LAN" sed -i 's/\r$//' "${APP_DIR}/deploy/nginx/bestewebsite-lan.conf" "${APP_DIR}/deploy/nginx/bestewebsite.conf" 2>/dev/null || true cp "${APP_DIR}/deploy/nginx/bestewebsite-lan.conf" /etc/nginx/sites-available/bestewebsite-lan ln -sf /etc/nginx/sites-available/bestewebsite-lan /etc/nginx/sites-enabled/00-bestewebsite-lan # Nginx öffentlich — zuerst HTTP-only für Certbot echo "==> Nginx HTTP (Certbot-Vorbereitung)" cat > /etc/nginx/sites-available/bestewebsite < Certbot fuer ${NEW_DOMAIN}" CERTBOT_EMAIL="admin@${NEW_DOMAIN}" if certbot certificates 2>/dev/null | grep -q "${NEW_DOMAIN}"; then certbot renew --nginx --quiet || true else certbot --nginx -d "${NEW_DOMAIN}" --non-interactive --agree-tos --redirect -m "${CERTBOT_EMAIL}" || { echo "Certbot fehlgeschlagen — pruefe ob ${NEW_DOMAIN} auf diese Maschine zeigt (Port 80)." >&2 exit 1 } fi # Finales Nginx-Template — Certbot-Zertifikat einbinden (kein erneutes certbot install) echo "==> Nginx HTTPS finalisieren" cp "${APP_DIR}/deploy/nginx/bestewebsite.conf" /etc/nginx/sites-available/bestewebsite if [[ ! -f "/etc/letsencrypt/live/${NEW_DOMAIN}/fullchain.pem" ]]; then echo "Zertifikat fehlt fuer ${NEW_DOMAIN}" >&2 exit 1 fi ln -sf /etc/nginx/sites-available/bestewebsite /etc/nginx/sites-enabled/bestewebsite nginx -t systemctl reload nginx # Alte Domain optional auf neue weiterleiten (falls noch DNS zeigt) if [[ "${OLD_DOMAIN}" != "${NEW_DOMAIN}" ]]; then cat > /etc/nginx/sites-available/bestewebsite-legacy < ${NEW_DOMAIN} aktiv" else rm -f /etc/nginx/sites-enabled/bestewebsite-legacy fi fi systemctl restart playbull || true echo "" echo "=== Fertig ===" echo "HTTPS: https://${NEW_DOMAIN}" echo "LAN: http://192.168.178.49" echo "Test: curl -sfI https://${NEW_DOMAIN}/ | head -3"