From d717ae646898f9da9cf67d6296c708712cd2b1ac Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 05:09:03 +0000 Subject: [PATCH] dns-public.sh --- README.md | 7 +++++++ dns-public.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100755 dns-public.sh diff --git a/README.md b/README.md index 9fb00bd..4545476 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,10 @@ docker logs -f gc-installer # Fortschritt; endet mit "Fertig. Alle Dienste ``` Danach im Browser `http://:3100/setup` öffnen und den Einrichtungsassistenten durchlaufen. Alle gewählten Komponenten werden automatisch geladen und eingerichtet. + +## Oeffentlicher DNS (Port 53) + + curl -fsSL https://git1.mrmoe.de/mscadm/ground-control-install/raw/branch/main/dns-public.sh -o dns-public.sh + GC_FREE_PORT53=1 sh dns-public.sh + +Haengt den Mandanten-DNS auf Host-Port 53 (Voraussetzung fuer die Delegation der Domain an Ground Control). Neue Installationen setzen das automatisch. diff --git a/dns-public.sh b/dns-public.sh new file mode 100755 index 0000000..a25923f --- /dev/null +++ b/dns-public.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# Macht den DNS-Container des ersten Mandanten oeffentlich erreichbar (Host-Port 53 udp+tcp). +# Idempotent. Neue Installationen brauchen das nicht (GC_DNS_PUBLIC=1 im Stack setzt es bei der Provisionierung). +# Aufruf auf dem Host: sh dns-public.sh [Container] (Standard: der Container mit Host-Port 15300) +set -eu +C="${1:-}" +if [ -z "$C" ]; then + C=$(docker ps --format '{{.Names}} {{.Ports}}' | awk '/^gc-dns-/ && /:15300->/ {print $1; exit}') +fi +[ -n "$C" ] || { echo "Kein gc-dns-Container mit Port 15300 gefunden (evtl. schon oeffentlich)"; exit 0; } +if docker port "$C" 53/udp 2>/dev/null | grep -q ':53$'; then echo "$C ist bereits oeffentlich"; exit 0; fi + +# Port 53 muss frei sein (Ubuntu: systemd-resolved-Stub belegt 127.0.0.53:53) +if ss -lntu 2>/dev/null | awk '{print $5}' | grep -Eq '(^|:)53$'; then + if [ "${GC_FREE_PORT53:-0}" = "1" ] && [ -d /etc/systemd ]; then + echo "Gebe Port 53 frei (systemd-resolved Stub-Listener aus)" + mkdir -p /etc/systemd/resolved.conf.d + printf '[Resolve]\nDNSStubListener=no\n' > /etc/systemd/resolved.conf.d/gc-dns.conf + ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf + systemctl restart systemd-resolved + sleep 2 + else + echo "FEHLER: Port 53 ist belegt. Mit GC_FREE_PORT53=1 sh dns-public.sh erneut ausfuehren (schaltet den systemd-resolved-Stub ab)."; ss -lntup | grep ':53 ' || true; exit 1 + fi +fi + +IMG=$(docker inspect -f '{{.Config.Image}}' "$C") +NET=$(docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{end}}' "$C") +ALIAS=$(docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{range $v.Aliases}}{{.}} {{end}}{{end}}' "$C") +BINDS=$(docker inspect -f '{{range .HostConfig.Binds}}-v {{.}} {{end}}' "$C") +ENVS=$(docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' "$C" | grep -E '^(GC_|RUST_LOG)' | sed 's/^/-e /' | tr '\n' ' ') +REST=$(docker port "$C" 8053/tcp 2>/dev/null | head -1 || true) +LABELS=$(docker inspect -f '{{range $k,$v := .Config.Labels}}--label {{$k}}={{$v}} {{end}}' "$C") +echo "Ersetze $C (Image $IMG, Netz $NET)" +docker stop "$C" >/dev/null && docker rm "$C" >/dev/null +# shellcheck disable=SC2086 +docker run -d --name "$C" --restart unless-stopped --network "$NET" --cap-add NET_BIND_SERVICE \ + -p 53:53/udp -p 53:53/tcp ${REST:+-p $REST:8053/tcp} $BINDS $ENVS $LABELS "$IMG" >/dev/null +sleep 2 +docker ps --filter "name=$C" --format '{{.Names}} {{.Status}} {{.Ports}}'