diff --git a/scripts/proxmox-vpn-install-dev.sh b/scripts/proxmox-vpn-install-dev.sh index e5c460c..66a8e5d 100644 --- a/scripts/proxmox-vpn-install-dev.sh +++ b/scripts/proxmox-vpn-install-dev.sh @@ -348,69 +348,81 @@ start_and_verify() { local vpn_ok=false VPN_IP="" - # Bei Hostname-Modus: Gluetun Server-Datenbank aktualisieren + fehlende Server eintragen + # Bei Hostname-Modus: Server in Gluetun-DB eintragen (Dedicated-IP Support) if [[ -n "${VPN_HOSTNAME:-}" ]]; then - info "Aktualisiere Gluetun Server-Datenbank..." - pct exec "$SEL_ID" -- bash -c "docker run --rm -v freqtrade_gluetun_data:/gluetun qmcgaw/gluetun update -enduser-pprof -providers nordvpn 2>&1 | tail -3" 2>/dev/null && success "Server-Datenbank aktualisiert" || warn "Update fehlgeschlagen – fahre trotzdem fort" + info "Lade aktuelle Gluetun Server-Datenbank von GitHub..." - # Prüfen ob der Hostname in der DB ist – falls nicht: manuell eintragen - local host_in_db - host_in_db=$(pct exec "$SEL_ID" -- bash -c "docker run --rm -v freqtrade_gluetun_data:/gluetun alpine grep -c '${VPN_HOSTNAME}' /gluetun/servers.json 2>/dev/null || echo 0" 2>/dev/null || echo "0") + local DB_PATH="/var/lib/docker/volumes/freqtrade_gluetun_data/_data/servers.json" + local SERVERS_URL="https://raw.githubusercontent.com/qdm12/gluetun/refs/heads/master/internal/storage/servers.json" - if [[ "$host_in_db" == "0" ]]; then - warn "${VPN_HOSTNAME} nicht in Gluetun-DB – trage Server manuell ein..." + # Volume-Verzeichnis anlegen falls noch nicht vorhanden + pct exec "$SEL_ID" -- bash -c "mkdir -p /var/lib/docker/volumes/freqtrade_gluetun_data/_data" 2>/dev/null || true - # IP per DNS auflösen - local server_ip - server_ip=$(pct exec "$SEL_ID" -- bash -c "getent hosts ${VPN_HOSTNAME} | awk '{print \$1}' | head -1" 2>/dev/null || echo "") + # Aktuelle servers.json von GitHub laden (immer aktuell, richtiges Format) + if pct exec "$SEL_ID" -- bash -c \ + "curl -fsSL '${SERVERS_URL}' -o ${DB_PATH} 2>/dev/null"; then + local srv_count + srv_count=$(pct exec "$SEL_ID" -- bash -c \ + "python3 -c \"import json; d=json.load(open('${DB_PATH}')); print(len(d.get('nordvpn',{}).get('servers',[])))\" 2>/dev/null" || echo "?") + success "Server-Datenbank geladen (${srv_count} NordVPN-Server)" + else + warn "GitHub-Download fehlgeschlagen – fahre trotzdem fort" + fi - if [[ -z "$server_ip" ]]; then - # Fallback: nslookup - server_ip=$(pct exec "$SEL_ID" -- bash -c "nslookup ${VPN_HOSTNAME} 2>/dev/null | grep -oP '(?<=Address: )[0-9.]+' | tail -1" 2>/dev/null || echo "") - fi + # 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 "") - if [[ -n "$server_ip" ]]; then - info "IP aufgelöst: ${VPN_HOSTNAME} → ${server_ip}" - # Eintrag in servers.json via Python3 - pct exec "$SEL_ID" -- bash -c "python3 - << 'PYEOF' -import json, sys + if [[ -z "$server_ip" ]]; then + warn "DNS-Auflösung für ${VPN_HOSTNAME} fehlgeschlagen – Hostname trotzdem versuchen" + else + info "DNS: ${VPN_HOSTNAME} → ${server_ip}" + + # Eintrag mit korrektem Gluetun-Format hinzufügen + # Format: {"vpn":"openvpn","country":"Germany","region":"Europe","city":"Frankfurt", + # "hostname":"de1370.nordvpn.com","tcp":true,"udp":true,"ips":["1.2.3.4"]} + pct exec "$SEL_ID" -- bash -c "python3 << PYEOF +import json, sys, copy + +path = '${DB_PATH}' +hostname = '${VPN_HOSTNAME}' +ip = '${server_ip}' -path = '/var/lib/docker/volumes/freqtrade_gluetun_data/_data/servers.json' try: with open(path) as f: db = json.load(f) except Exception as e: - print(f'Fehler beim Lesen: {e}', file=sys.stderr) - sys.exit(1) + print(f'Lesefehler: {e}'); sys.exit(1) -new_entry = { - 'vpn_sp': 'nordvpn', - 'country': 'Germany', - 'region': '', - 'city': '', - 'hostname': '${VPN_HOSTNAME}', - 'ip': '${server_ip}', - 'tcp': True, - 'udp': True -} - -# Doppelten Eintrag vermeiden servers = db.get('nordvpn', {}).get('servers', []) -if not any(s.get('hostname') == '${VPN_HOSTNAME}' for s in servers): - servers.append(new_entry) - db.setdefault('nordvpn', {})['servers'] = servers - with open(path, 'w') as f: - json.dump(db, f) - print('Eintrag hinzugefügt: ${VPN_HOSTNAME} (${server_ip})') -else: - print('Eintrag bereits vorhanden: ${VPN_HOSTNAME}') -PYEOF" 2>&1 && success "Server ${VPN_HOSTNAME} (${server_ip}) in DB eingetragen" || warn "DB-Eintrag fehlgeschlagen – versuche trotzdem" - else - warn "IP für ${VPN_HOSTNAME} konnte nicht aufgelöst werden" - warn "Stelle sicher dass der Hostname korrekt ist" - fi - else - success "${VPN_HOSTNAME} bereits in Gluetun-DB vorhanden" + +# Bereits vorhanden? +if any(s.get('hostname') == hostname for s in servers): + print(f'Bereits vorhanden: {hostname}') + sys.exit(0) + +# Vorhandenen deutschen OpenVPN-Eintrag als Template klonen (garantiert richtiges Format) +template = next( + (s for s in servers if s.get('country','').lower() == 'germany' + and s.get('vpn') == 'openvpn'), + None +) +if template is None: + template = next((s for s in servers if s.get('vpn') == 'openvpn'), None) +if template is None: + print('Kein Template gefunden'); sys.exit(1) + +entry = copy.deepcopy(template) +entry['hostname'] = hostname +entry['ips'] = [ip] # Format ist immer ips:[] laut GitHub-Quelle + +servers.append(entry) +db['nordvpn']['servers'] = servers +with open(path, 'w') as f: + json.dump(db, f, indent=2) +print(f'Eingetragen: {hostname} ({ip})') +PYEOF" 2>&1 && success "${VPN_HOSTNAME} (${server_ip}) in Gluetun-DB eingetragen" || { warn "DB-Eintrag fehlgeschlagen"; } fi fi