From 4ac941f193b0ae775c02344cdce0f51029b034eb Mon Sep 17 00:00:00 2001 From: Oliver Braasch Date: Mon, 20 Apr 2026 23:14:35 +0200 Subject: [PATCH] Dateien nach "scripts" hochladen --- scripts/proxmox-vpn-install-dev.sh | 122 ++++++++++++++++------------- 1 file changed, 69 insertions(+), 53 deletions(-) diff --git a/scripts/proxmox-vpn-install-dev.sh b/scripts/proxmox-vpn-install-dev.sh index f409dd1..035efb0 100644 --- a/scripts/proxmox-vpn-install-dev.sh +++ b/scripts/proxmox-vpn-install-dev.sh @@ -230,6 +230,8 @@ collect_vpn_config() { # ── Konfiguration in Container schreiben ────────────────────────────────────── write_vpn_config() { step "VPN-Konfiguration in Container schreiben" + # Image: custom build bei Dedicated-IP, sonst offizielles Image + GLUETUN_IMAGE="${GLUETUN_IMAGE:-qmcgaw/gluetun:latest}" local FT_DIR="/opt/docker-projekte/freqtrade" local NORD_USER_B64 NORD_PASS_B64 @@ -284,7 +286,7 @@ services: # Gluetun läuft als HTTP-Proxy auf Port 8888. # Freqtrade schickt nur den Exchange-Traffic darüber. gluetun: - image: qmcgaw/gluetun:latest + image: ${GLUETUN_IMAGE:-qmcgaw/gluetun:latest} container_name: gluetun restart: unless-stopped cap_add: @@ -354,72 +356,86 @@ start_and_verify() { local vpn_ok=false VPN_IP="" - # Bei Hostname-Modus: Dedicated-IP via OPENVPN_CUSTOM_CONFIG - # Gluetun validiert Hostnamen gegen eine hardcodierte interne Liste. - # Dedicated-IP-Server (wie de1370) sind dort nie enthalten. - # Lösung: Custom OpenVPN Config direkt mit der aufgelösten IP → bypasses Validierung komplett. + # Bei Hostname-Modus: Gluetun aus GitHub klonen, Server eintragen, neu kompilieren + # → Löst das Problem dauerhaft: de1370 wird in die Binary eingebaut if [[ -n "${VPN_HOSTNAME:-}" ]]; then - info "Dedicated-IP Modus: generiere Custom OpenVPN Config für ${VPN_HOSTNAME}..." + step "Gluetun Custom Build für ${VPN_HOSTNAME}" # IP per DNS auflösen local server_ip="" server_ip=$(pct exec "$SEL_ID" -- bash -c "getent hosts ${VPN_HOSTNAME} 2>/dev/null | awk '{print \$1}' | head -1" 2>/dev/null || echo "") [[ -z "$server_ip" ]] && server_ip=$(pct exec "$SEL_ID" -- bash -c "nslookup ${VPN_HOSTNAME} 2>/dev/null | awk '/Address:/ && !/#/{print \$2}' | head -1" 2>/dev/null || echo "") - - [[ -z "$server_ip" ]] && error "IP für ${VPN_HOSTNAME} nicht auflösbar. Hostname prüfen!" + [[ -z "$server_ip" ]] && error "IP für ${VPN_HOSTNAME} nicht auflösbar!" info "DNS: ${VPN_HOSTNAME} → ${server_ip}" - # Gluetun Volume-Verzeichnis anlegen - pct exec "$SEL_ID" -- bash -c "mkdir -p /var/lib/docker/volumes/freqtrade_gluetun_data/_data" 2>/dev/null || true + # Prüfen ob Image bereits existiert (kein Rebuild nötig) + local img_exists + img_exists=$(pct exec "$SEL_ID" -- bash -c "docker image inspect gluetun-custom:latest 2>/dev/null | grep -c 'Id' || echo 0" 2>/dev/null || echo "0") - # NordVPN Standard-CA herunterladen - local CA_CONTENT - CA_CONTENT=$(curl -fsSL "https://downloads.nordcdn.com/configs/archives/certificates/servers.zip" 2>/dev/null | python3 -c " -import sys, zipfile, io -data = sys.stdin.buffer.read() -try: - with zipfile.ZipFile(io.BytesIO(data)) as z: - for name in z.namelist(): - if name.endswith('.ca') or 'ca' in name.lower(): - print(z.read(name).decode()); break -except: pass -" 2>/dev/null || echo "") + if [[ "$img_exists" -gt 0 ]]; then + # Prüfen ob der Hostname schon drin ist + local host_in_img + host_in_img=$(pct exec "$SEL_ID" -- bash -c "docker run --rm --entrypoint sh gluetun-custom:latest -c 'cat /gluetun/servers.json 2>/dev/null | grep -c ${VPN_HOSTNAME} || echo 0'" 2>/dev/null || echo "0") + if [[ "$host_in_img" -gt 0 ]]; then + success "gluetun-custom:latest bereits vorhanden und enthält ${VPN_HOSTNAME}" + GLUETUN_IMAGE="gluetun-custom:latest" + return 0 2>/dev/null || true + fi + info "Image vorhanden, aber ${VPN_HOSTNAME} fehlt – baue neu..." + fi - # Custom OpenVPN Config generieren - local CONFIG_PATH="/var/lib/docker/volumes/freqtrade_gluetun_data/_data/nordvpn-custom.conf" - pct exec "$SEL_ID" -- bash -c " -cat > ${CONFIG_PATH} << 'OVPNEOF' -client -dev tun -proto ${VPN_PROTO:-udp} -remote ${server_ip} 1194 -resolv-retry infinite -nobind -persist-key -persist-tun -ping 15 -ping-restart 0 -reneg-sec 0 -comp-lzo no -auth SHA512 -cipher AES-256-CBC -pull -fast-io -auth-user-pass /gluetun/credentials.txt -OVPNEOF" + # git installieren falls nötig + pct exec "$SEL_ID" -- bash -c "command -v git &>/dev/null || apt-get install -y -qq git" 2>/dev/null - # Credentials-Datei für OpenVPN schreiben - pct exec "$SEL_ID" -- bash -c " - source ${FT_DIR}/.env 2>/dev/null - printf '%s -%s -' "\$OPENVPN_USER" "\$OPENVPN_PASSWORD" > /var/lib/docker/volumes/freqtrade_gluetun_data/_data/credentials.txt - chmod 600 /var/lib/docker/volumes/freqtrade_gluetun_data/_data/credentials.txt" + info "Klone Gluetun von GitHub (einmalig, ~3-5 Min zum Kompilieren)..." + pct exec "$SEL_ID" -- bash -c "rm -rf /tmp/gluetun-build && git clone --depth 1 https://github.com/qdm12/gluetun.git /tmp/gluetun-build 2>&1 | tail -3" - success "Custom Config erstellt: ${VPN_HOSTNAME} → ${server_ip}" - CUSTOM_CONFIG_ENABLED=true + info "Füge ${VPN_HOSTNAME} (${server_ip}) in servers.json ein..." + pct exec "$SEL_ID" -- bash -c "python3 << PYEOF +import json, copy, sys + +path = '/tmp/gluetun-build/internal/storage/servers.json' +hostname = '${VPN_HOSTNAME}' +ip = '${server_ip}' + +with open(path) as f: + db = json.load(f) + +servers = db.get('nordvpn', {}).get('servers', []) + +if any(s.get('hostname') == hostname for s in servers): + print(f'Bereits vorhanden: {hostname}') + sys.exit(0) + +# Deutschen OpenVPN-Eintrag als Template klonen +template = next( + (s for s in servers if s.get('country','').lower() == 'germany' and s.get('vpn') == 'openvpn'), + servers[0] +) +entry = copy.deepcopy(template) +entry['hostname'] = hostname +entry['ips'] = [ip] + +servers.append(entry) +db['nordvpn']['servers'] = servers + +with open(path, 'w') as f: + json.dump(db, f, indent=2) +print(f'Eingetragen: {hostname} ({ip}) – Gesamt NordVPN-Server: {len(servers)}') +PYEOF" + + info "Kompiliere Gluetun Docker Image (dauert ~3-5 Minuten)..." + echo -e " ${YELLOW}Bitte warten – Go Multi-Stage Build...${NC}" + pct exec "$SEL_ID" -- bash -c "cd /tmp/gluetun-build && docker build -t gluetun-custom:latest . 2>&1 | grep -E '^Step|Successfully|error|Error|=>|RUN|COPY' | tail -30" && success "gluetun-custom:latest erfolgreich gebaut!" || error "Docker Build fehlgeschlagen. Prüfe: pct exec ${SEL_ID} -- docker build /tmp/gluetun-build" + + GLUETUN_IMAGE="gluetun-custom:latest" + info "Aufräumen..." + pct exec "$SEL_ID" -- bash -c "rm -rf /tmp/gluetun-build" 2>/dev/null || true + else + GLUETUN_IMAGE="qmcgaw/gluetun:latest" fi + # Protokoll-Reihenfolge: UDP zuerst, dann automatisch TCP for proto in udp tcp; do [[ "$proto" == "tcp" ]] && info "UDP fehlgeschlagen – versuche TCP automatisch..."