Dateien nach "scripts" hochladen

This commit is contained in:
2026-04-20 23:14:35 +02:00
parent a0132a2f4e
commit 4ac941f193
+72 -56
View File
@@ -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,71 +356,85 @@ 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 "")
# 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"
# 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"
success "Custom Config erstellt: ${VPN_HOSTNAME}${server_ip}"
CUSTOM_CONFIG_ENABLED=true
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
# 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
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"
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