Dateien nach "scripts" hochladen
This commit is contained in:
@@ -230,6 +230,8 @@ collect_vpn_config() {
|
|||||||
# ── Konfiguration in Container schreiben ──────────────────────────────────────
|
# ── Konfiguration in Container schreiben ──────────────────────────────────────
|
||||||
write_vpn_config() {
|
write_vpn_config() {
|
||||||
step "VPN-Konfiguration in Container schreiben"
|
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 FT_DIR="/opt/docker-projekte/freqtrade"
|
||||||
local NORD_USER_B64 NORD_PASS_B64
|
local NORD_USER_B64 NORD_PASS_B64
|
||||||
@@ -284,7 +286,7 @@ services:
|
|||||||
# Gluetun läuft als HTTP-Proxy auf Port 8888.
|
# Gluetun läuft als HTTP-Proxy auf Port 8888.
|
||||||
# Freqtrade schickt nur den Exchange-Traffic darüber.
|
# Freqtrade schickt nur den Exchange-Traffic darüber.
|
||||||
gluetun:
|
gluetun:
|
||||||
image: qmcgaw/gluetun:latest
|
image: ${GLUETUN_IMAGE:-qmcgaw/gluetun:latest}
|
||||||
container_name: gluetun
|
container_name: gluetun
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
cap_add:
|
cap_add:
|
||||||
@@ -354,72 +356,86 @@ start_and_verify() {
|
|||||||
local vpn_ok=false
|
local vpn_ok=false
|
||||||
VPN_IP=""
|
VPN_IP=""
|
||||||
|
|
||||||
# Bei Hostname-Modus: Dedicated-IP via OPENVPN_CUSTOM_CONFIG
|
# Bei Hostname-Modus: Gluetun aus GitHub klonen, Server eintragen, neu kompilieren
|
||||||
# Gluetun validiert Hostnamen gegen eine hardcodierte interne Liste.
|
# → Löst das Problem dauerhaft: de1370 wird in die Binary eingebaut
|
||||||
# Dedicated-IP-Server (wie de1370) sind dort nie enthalten.
|
|
||||||
# Lösung: Custom OpenVPN Config direkt mit der aufgelösten IP → bypasses Validierung komplett.
|
|
||||||
if [[ -n "${VPN_HOSTNAME:-}" ]]; then
|
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
|
# IP per DNS auflösen
|
||||||
local server_ip=""
|
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 "")
|
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" ]] && 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!"
|
||||||
[[ -z "$server_ip" ]] && error "IP für ${VPN_HOSTNAME} nicht auflösbar. Hostname prüfen!"
|
|
||||||
info "DNS: ${VPN_HOSTNAME} → ${server_ip}"
|
info "DNS: ${VPN_HOSTNAME} → ${server_ip}"
|
||||||
|
|
||||||
# Gluetun Volume-Verzeichnis anlegen
|
# Prüfen ob Image bereits existiert (kein Rebuild nötig)
|
||||||
pct exec "$SEL_ID" -- bash -c "mkdir -p /var/lib/docker/volumes/freqtrade_gluetun_data/_data" 2>/dev/null || true
|
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
|
if [[ "$img_exists" -gt 0 ]]; then
|
||||||
local CA_CONTENT
|
# Prüfen ob der Hostname schon drin ist
|
||||||
CA_CONTENT=$(curl -fsSL "https://downloads.nordcdn.com/configs/archives/certificates/servers.zip" 2>/dev/null | python3 -c "
|
local host_in_img
|
||||||
import sys, zipfile, io
|
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")
|
||||||
data = sys.stdin.buffer.read()
|
if [[ "$host_in_img" -gt 0 ]]; then
|
||||||
try:
|
success "gluetun-custom:latest bereits vorhanden und enthält ${VPN_HOSTNAME}"
|
||||||
with zipfile.ZipFile(io.BytesIO(data)) as z:
|
GLUETUN_IMAGE="gluetun-custom:latest"
|
||||||
for name in z.namelist():
|
return 0 2>/dev/null || true
|
||||||
if name.endswith('.ca') or 'ca' in name.lower():
|
fi
|
||||||
print(z.read(name).decode()); break
|
info "Image vorhanden, aber ${VPN_HOSTNAME} fehlt – baue neu..."
|
||||||
except: pass
|
fi
|
||||||
" 2>/dev/null || echo "")
|
|
||||||
|
|
||||||
# Custom OpenVPN Config generieren
|
# git installieren falls nötig
|
||||||
local CONFIG_PATH="/var/lib/docker/volumes/freqtrade_gluetun_data/_data/nordvpn-custom.conf"
|
pct exec "$SEL_ID" -- bash -c "command -v git &>/dev/null || apt-get install -y -qq git" 2>/dev/null
|
||||||
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
|
info "Klone Gluetun von GitHub (einmalig, ~3-5 Min zum Kompilieren)..."
|
||||||
pct exec "$SEL_ID" -- bash -c "
|
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"
|
||||||
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}"
|
info "Füge ${VPN_HOSTNAME} (${server_ip}) in servers.json ein..."
|
||||||
CUSTOM_CONFIG_ENABLED=true
|
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
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Protokoll-Reihenfolge: UDP zuerst, dann automatisch TCP
|
# Protokoll-Reihenfolge: UDP zuerst, dann automatisch TCP
|
||||||
for proto in udp tcp; do
|
for proto in udp tcp; do
|
||||||
[[ "$proto" == "tcp" ]] && info "UDP fehlgeschlagen – versuche TCP automatisch..."
|
[[ "$proto" == "tcp" ]] && info "UDP fehlgeschlagen – versuche TCP automatisch..."
|
||||||
|
|||||||
Reference in New Issue
Block a user