Dateien nach "scripts" hochladen

This commit is contained in:
2026-04-20 15:26:26 +02:00
parent 34e8692a71
commit d8aff0f817
2 changed files with 818 additions and 0 deletions
+279
View File
@@ -0,0 +1,279 @@
#!/usr/bin/env bash
# =============================================================================
# Freqtrade NordVPN Addon (Gluetun)
# Ergänzt eine bestehende Freqtrade-Installation um NordVPN-Routing.
# Läuft im FREQTRADE LXC (nicht auf dem Proxmox Host).
#
# Quelle: https://git.obraasch.de/olli1986/freqtrade-proxmox-deploy
# =============================================================================
set -euo pipefail
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
BLUE='\033[0;34m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m'
info() { echo -e "${CYAN}[INFO]${NC} $*"; }
success() { echo -e "${GREEN}[ OK ]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
error() { echo -e "${RED}[FAIL]${NC} $*"; exit 1; }
step() { echo -e "\n${BOLD}${BLUE}$*${NC}"; }
ask() {
local prompt="$1" default="${2:-}"
if [[ -n "$default" ]]; then
echo -ne "${YELLOW}${NC}${prompt} [${CYAN}${default}${NC}]: "
else
echo -ne "${YELLOW}${NC}${prompt}: "
fi
read -r REPLY; REPLY="${REPLY:-$default}"
}
ask_secret() {
echo -ne "${YELLOW}${NC}${1}: "
read -rs REPLY; echo
}
confirm() {
echo -ne "${YELLOW}${NC}${1} [${CYAN}j${NC}/N]: "
read -r ans; [[ "$ans" =~ ^[jJyY]$ ]]
}
print_banner() {
clear
echo -e "${BOLD}${BLUE}"
echo " _ _ _ ___ ___ _ _"
echo " | \| |___ _ _ __ | \ \ \ / / | \| |"
echo " | .\` / _ \ '_/ _\` \ V /\ V /| | .\` |"
echo " |_|\_\___/_| \__,_|\_/ \_/ |_|_|\_|"
echo " Freqtrade + NordVPN Addon (Gluetun)"
echo -e "${NC}"
echo -e " ${CYAN}Ergänzt Freqtrade um NordVPN-Routing via Gluetun${NC}"
echo -e " ${YELLOW}Läuft im Freqtrade LXC nicht auf dem Proxmox Host!${NC}\n"
}
check_requirements() {
step "Voraussetzungen prüfen"
[[ $EUID -ne 0 ]] && error "Bitte als root ausführen!"
command -v docker &>/dev/null || error "Docker nicht gefunden."
docker compose version &>/dev/null || error "Docker Compose Plugin nicht gefunden."
success "Docker + Compose vorhanden"
FT_DIR=""
for candidate in /opt/docker-projekte/freqtrade /opt/freqtrade; do
if [[ -f "$candidate/docker-compose.yml" ]] && [[ -d "$candidate/user_data" ]]; then
FT_DIR="$candidate"; break
fi
done
[[ -z "$FT_DIR" ]] && error "Keine Freqtrade-Installation gefunden in /opt/docker-projekte/freqtrade/"
success "Freqtrade gefunden: $FT_DIR"
if [[ ! -e /dev/net/tun ]]; then
warn "/dev/net/tun fehlt lege an..."
mkdir -p /dev/net
mknod /dev/net/tun c 10 200 2>/dev/null || true
chmod 600 /dev/net/tun 2>/dev/null || true
[[ ! -e /dev/net/tun ]] && error "/dev/net/tun konnte nicht erstellt werden.\nBitte im Proxmox Host prüfen ob in /etc/pve/lxc/<ID>.conf diese Zeilen stehen:\n lxc.cgroup2.devices.allow: c 10:200 rwm\n lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file\n\nHinweis: proxmox-install.sh richtet das automatisch ein."
fi
success "/dev/net/tun vorhanden"
}
collect_config() {
step "NordVPN Konfiguration"
echo -e "\n ${BOLD}Service-Credentials${NC} findest du unter:"
echo -e " ${CYAN}https://my.nordaccount.com → NordVPN → 'Set up NordVPN manually'${NC}"
echo -e " ${RED} Nicht deine E-Mail/Passwort die Service-Credentials!${NC}\n"
ask "NordVPN Service-Username"
NORD_USER="$REPLY"
[[ -z "$NORD_USER" ]] && error "Username darf nicht leer sein!"
ask_secret "NordVPN Service-Passwort"
NORD_PASS="$REPLY"
[[ -z "$NORD_PASS" ]] && error "Passwort darf nicht leer sein!"
echo
echo -e " ${BOLD}VPN-Server Modus:${NC}"
echo -e " ${CYAN}1)${NC} Serverland normaler Server (IP kann wechseln)"
echo -e " ${CYAN}2)${NC} Hostname spezifischen Server/Dedicated-IP pinnen"
ask "Auswahl [1/2]" "1"
VPN_MODE="$REPLY"
if [[ "$VPN_MODE" == "2" ]]; then
ask "Hostname (z.B. de123.nordvpn.com)"
VPN_HOSTNAME="$REPLY"; VPN_COUNTRY=""
else
ask "Serverland" "Germany"
VPN_COUNTRY="$REPLY"; VPN_HOSTNAME=""
fi
CURRENT_PORT=$(grep -oP '"0\.0\.0\.0:\K\d+(?=:\d+")' "$FT_DIR/docker-compose.yml" 2>/dev/null | head -1 || echo "8080")
ask "FreqUI Port" "$CURRENT_PORT"
FT_PORT="$REPLY"
echo -e "\n${BOLD}${BLUE}══════════ Zusammenfassung ══════════${NC}"
echo -e " Freqtrade: ${CYAN}$FT_DIR${NC}"
echo -e " NordVPN User: ${CYAN}$NORD_USER${NC}"
if [[ -n "$VPN_HOSTNAME" ]]; then
echo -e " VPN Server: ${CYAN}$VPN_HOSTNAME${NC}"
else
echo -e " VPN Land: ${CYAN}$VPN_COUNTRY${NC}"
fi
echo -e " FreqUI Port: ${CYAN}$FT_PORT${NC}"
echo -e "${BOLD}${BLUE}=====================================\n${NC}"
confirm "Einrichten?" || { info "Abgebrochen."; exit 0; }
}
backup_and_stop() {
step "Backup & Stack stoppen"
local BAK="$FT_DIR/docker-compose.yml.bak-$(date +%Y%m%d_%H%M%S)"
cp "$FT_DIR/docker-compose.yml" "$BAK"
success "Backup: $BAK"
cd "$FT_DIR"
if docker compose ps --quiet 2>/dev/null | grep -q .; then
docker compose down; success "Stack gestoppt"
else
info "Kein laufender Stack"
fi
}
write_env() {
step ".env schreiben"
[[ -f "$FT_DIR/.env" ]] && cp "$FT_DIR/.env" "$FT_DIR/.env.bak-$(date +%Y%m%d_%H%M%S)"
cat > "$FT_DIR/.env" << ENVEOF
# NordVPN Service-Credentials
# Quelle: https://my.nordaccount.com → NordVPN → Set up NordVPN manually
OPENVPN_USER=${NORD_USER}
OPENVPN_PASSWORD=${NORD_PASS}
ENVEOF
chmod 600 "$FT_DIR/.env"
success ".env gespeichert (chmod 600)"
}
write_compose() {
step "docker-compose.yml erstellen"
local VPN_SERVER_LINE=""
if [[ -n "$VPN_HOSTNAME" ]]; then
VPN_SERVER_LINE=" - SERVER_HOSTNAMES=${VPN_HOSTNAME}"
else
VPN_SERVER_LINE=" - SERVER_COUNTRIES=${VPN_COUNTRY}"
fi
cat > "$FT_DIR/docker-compose.yml" << COMPOSEEOF
# Freqtrade + NordVPN/Gluetun | $(date '+%Y-%m-%d %H:%M:%S')
# Netzwerk: [Freqtrade] → [Gluetun] → NordVPN → Internet
# WebUI: http://LXC-IP:${FT_PORT} (Port liegt bei Gluetun!)
services:
# VPN-Gateway exponiert alle Ports
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
restart: unless-stopped
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
environment:
- VPN_SERVICE_PROVIDER=nordvpn
- VPN_TYPE=openvpn
- OPENVPN_USER=\${OPENVPN_USER}
- OPENVPN_PASSWORD=\${OPENVPN_PASSWORD}
${VPN_SERVER_LINE}
ports:
- "0.0.0.0:${FT_PORT}:8080"
volumes:
- gluetun_data:/gluetun
healthcheck:
test: ["CMD-SHELL", "wget -qO- https://ipinfo.io/ip || exit 1"]
interval: 30s
timeout: 15s
retries: 5
start_period: 45s
# Freqtrade KEIN ports: hier, läuft über Gluetun-Netzwerk
freqtrade:
image: freqtradeorg/freqtrade:stable
restart: unless-stopped
container_name: freqtrade
network_mode: "container:gluetun"
depends_on:
gluetun:
condition: service_healthy
volumes:
- "./user_data:/freqtrade/user_data"
command: >
trade
--logfile /freqtrade/user_data/logs/freqtrade.log
--db-url sqlite:////freqtrade/user_data/tradesv3.sqlite
--config /freqtrade/user_data/config.json
--strategy SampleStrategy
volumes:
gluetun_data:
COMPOSEEOF
success "docker-compose.yml geschrieben"
}
start_and_verify() {
step "Stack starten & VPN prüfen"
cd "$FT_DIR"
docker compose up -d
echo
info "Warte auf VPN-Verbindung (bis zu 90s)..."
local tries=0 vpn_ok=false
while [[ $tries -lt 18 ]]; do
sleep 5; echo -n "."
docker exec gluetun wget -qO- https://ipinfo.io/ip &>/dev/null && { vpn_ok=true; break; }
((tries++))
done
echo
if [[ "$vpn_ok" == "true" ]]; then
VPN_IP=$(docker exec gluetun wget -qO- https://ipinfo.io/ip 2>/dev/null)
success "VPN verbunden! Ausgehende IP: ${BOLD}${VPN_IP}${NC}"
else
warn "VPN-Verbindung Timeout. Prüfe: docker logs gluetun"
VPN_IP="unbekannt prüfe: docker exec gluetun wget -qO- https://ipinfo.io/ip"
fi
sleep 5
docker ps | grep -q "freqtrade" && success "Freqtrade läuft" || warn "Freqtrade prüfen: docker logs freqtrade"
}
show_result() {
local LXC_IP; LXC_IP=$(hostname -I | awk '{print $1}')
echo
echo -e "${BOLD}${GREEN}╔═══════════════════════════════════════╗${NC}"
echo -e "${BOLD}${GREEN}║ ✅ NordVPN Addon eingerichtet! ║${NC}"
echo -e "${BOLD}${GREEN}╚═══════════════════════════════════════╝${NC}"
echo
echo -e " ${BOLD}FreqUI:${NC} ${CYAN}http://${LXC_IP}:${FT_PORT}${NC}"
echo -e " ${BOLD}NordVPN IP:${NC} ${CYAN}${VPN_IP}${NC}"
echo
echo -e " ${BOLD}${YELLOW}⚠ Binance API-Key anpassen:${NC}"
echo -e " ${YELLOW}In Binance → API Management → IP-Beschränkung${NC}"
echo -e " ${YELLOW}Die NordVPN-IP eintragen (nicht mehr die Home-IP)!${NC}"
echo
echo -e " ${BOLD}Befehle:${NC}"
echo -e " ${CYAN}docker exec gluetun wget -qO- https://ipinfo.io/ip${NC} # VPN-IP prüfen"
echo -e " ${CYAN}docker logs gluetun${NC} # VPN-Logs"
echo -e " ${CYAN}cd $FT_DIR && docker compose restart${NC} # Neustart"
echo
}
main() {
print_banner
check_requirements
collect_config
backup_and_stop
write_env
write_compose
start_and_verify
show_result
}
main "$@"