Dateien nach "scripts" hochladen

This commit is contained in:
2026-04-20 20:29:08 +02:00
parent 2308196097
commit fad6991aa9
+111 -84
View File
@@ -76,124 +76,151 @@ detect_resources() {
DEFAULT_BRIDGE=$(ip link show 2>/dev/null | grep -oP '(?<=: )vmbr\d+' | head -1 || echo "vmbr0") DEFAULT_BRIDGE=$(ip link show 2>/dev/null | grep -oP '(?<=: )vmbr\d+' | head -1 || echo "vmbr0")
} }
# ── Template auswählen ──────────────────────────────────────────────────────── # ── Debian 12 Template ────────────────────────────────────────────────────────
prepare_template() { prepare_template() {
step "LXC Template auswählen" step "Debian 12 Template prüfen"
TEMPLATE_FILE=$(pveam list local 2>/dev/null | grep -oP 'debian-12-standard_\S+' | sort -V | tail -1 || true)
# Lokal vorhandene Templates auflisten if [[ -z "$TEMPLATE_FILE" ]]; then
local available_local info "Nicht lokal vorhanden lade herunter..."
available_local=$(pveam list local 2>/dev/null | awk 'NR>1{print $1}' | grep -oP '[^/]+\.tar\.(gz|zst|xz)' | sort || true)
# Default: neuestes Debian 12
local default_tpl
default_tpl=$(echo "$available_local" | grep -oP 'debian-12-standard_\S+' | sort -V | tail -1 || true)
if [[ -z "$default_tpl" ]]; then
# Noch nicht heruntergeladen aus verfügbaren holen
pveam update &>/dev/null || warn "pveam update fehlgeschlagen" pveam update &>/dev/null || warn "pveam update fehlgeschlagen"
default_tpl=$(pveam available --section system 2>/dev/null | grep -oP 'debian-12-standard_\S+' | sort -V | tail -1 || echo "debian-12-standard_12.7-1_amd64.tar.zst") TEMPLATE_FILE=$(pveam available --section system 2>/dev/null \
fi | grep -oP 'debian-12-standard_\S+' | sort -V | tail -1 \
|| echo "debian-12-standard_12.7-1_amd64.tar.zst")
if [[ -n "$available_local" ]]; then info "Lade: $TEMPLATE_FILE"
echo -e " ${CYAN}Lokal verfügbare Templates:${NC}"
local i=1
while IFS= read -r tpl; do
[[ -z "$tpl" ]] && continue
local marker=""
[[ "$tpl" == "$default_tpl" ]] && marker=" ${GREEN}← Standard${NC}"
printf " ${CYAN}%-3s${NC} %s%b
" "$i" "$tpl" "$marker"
((i++))
done <<< "$available_local"
echo
echo -ne "${YELLOW}${NC}Template (Enter = Standard ${CYAN}${default_tpl}${NC}): "
read -r sel_tpl
if [[ -z "$sel_tpl" ]]; then
TEMPLATE_FILE="$default_tpl"
elif [[ "$sel_tpl" =~ ^[0-9]+$ ]]; then
TEMPLATE_FILE=$(echo "$available_local" | sed -n "${sel_tpl}p")
[[ -z "$TEMPLATE_FILE" ]] && { warn "Ungültige Auswahl, nehme Standard."; TEMPLATE_FILE="$default_tpl"; }
else
TEMPLATE_FILE="$sel_tpl"
fi
else
TEMPLATE_FILE="$default_tpl"
fi
# Herunterladen falls nicht lokal vorhanden
if ! pveam list local 2>/dev/null | grep -q "$TEMPLATE_FILE"; then
info "Lade Template herunter: $TEMPLATE_FILE"
pveam download local "$TEMPLATE_FILE" || error "Template-Download fehlgeschlagen!" pveam download local "$TEMPLATE_FILE" || error "Template-Download fehlgeschlagen!"
fi fi
TEMPLATE_PATH="local:vztmpl/${TEMPLATE_FILE}" TEMPLATE_PATH="local:vztmpl/${TEMPLATE_FILE}"
success "Template: $TEMPLATE_FILE" success "Template bereit: $TEMPLATE_FILE"
} }
# ── Konfiguration abfragen ───────────────────────────────────────────────────── # ── Konfiguration abfragen ─────────────────────────────────────────────────────
collect_config() { collect_config() {
step "LXC Konfiguration" # ── Modus wählen ──
echo -e " ${CYAN}Storages (rootdir-fähig):${NC} ${BOLD}${STORAGES}${NC}" echo -e "
echo -e " ${YELLOW} ↑ 'local' reicht nicht braucht z.B. local-lvm${NC}" ${BOLD}${BLUE} Installationsmodus:${NC}"
echo -e " ${CYAN}Bridges:${NC} ${BRIDGES}\n" echo -e " ${CYAN}1)${NC} ${BOLD}Schnellinstallation${NC} Standardwerte, nur Passwörter eingeben"
echo -e " ${CYAN}2)${NC} ${BOLD}Erweitert${NC} alle Einstellungen manuell festlegen"
ask "LXC Container-ID" "$NEXT_ID" ask "Modus [1/2]" "1"
CT_ID="$REPLY" local mode="$REPLY"
[[ "$CT_ID" =~ ^[0-9]+$ ]] || error "Muss eine Zahl sein!"
pct status "$CT_ID" &>/dev/null && error "CT-ID $CT_ID existiert bereits!"
ask "Hostname" "freqtrade" ; CT_HOST="$REPLY"
ask "CPU Kerne" "2" ; CT_CORES="$REPLY"
ask "RAM in MB" "2048" ; CT_RAM="$REPLY"
ask "Swap in MB" "512" ; CT_SWAP="$REPLY"
ask "Disk in GB" "10" ; CT_DISK="$REPLY"
ask "Storage Pool" "$DEFAULT_STORAGE" ; CT_STORAGE="$REPLY"
ask "Bridge" "$DEFAULT_BRIDGE" ; CT_BRIDGE="$REPLY"
ask "Netzwerk (dhcp oder 192.168.1.100/24)" "dhcp" ; CT_IP="$REPLY"
# Defaults
CT_ID="$NEXT_ID"
CT_HOST="freqtrade"
CT_CORES="2"
CT_RAM="2048"
CT_SWAP="512"
CT_DISK="10"
CT_STORAGE="$DEFAULT_STORAGE"
CT_BRIDGE="$DEFAULT_BRIDGE"
CT_IP="dhcp"
CT_GW="" CT_GW=""
if [[ "$CT_IP" != "dhcp" ]]; then FT_PORT="8080"
ask "Gateway"; CT_GW="$REPLY" PT_PORT="9000"
FB_PORT="8081"
FT_EXCHANGE="binance"
FT_STAKE="USDC"
FT_MAX_TRADES="3"
FT_TIMEFRAME="5m"
FT_API_USER="freqtrader"
FT_TELEGRAM=false
TG_TOKEN=""
TG_CHATID=""
if [[ "$mode" == "2" ]]; then
# ── Erweitert: alle Fragen ──
step "LXC Konfiguration"
echo -e " ${CYAN}Storages (rootdir-fähig):${NC} ${BOLD}${STORAGES}${NC}"
echo -e " ${YELLOW} ↑ 'local' reicht nicht braucht z.B. local-lvm${NC}"
echo -e " ${CYAN}Bridges:${NC} ${BRIDGES}\n"
ask "LXC Container-ID" "$CT_ID" ; CT_ID="$REPLY"
ask "Hostname" "$CT_HOST" ; CT_HOST="$REPLY"
ask "CPU Kerne" "$CT_CORES" ; CT_CORES="$REPLY"
ask "RAM in MB" "$CT_RAM" ; CT_RAM="$REPLY"
ask "Swap in MB" "$CT_SWAP" ; CT_SWAP="$REPLY"
ask "Disk in GB" "$CT_DISK" ; CT_DISK="$REPLY"
ask "Storage Pool" "$CT_STORAGE" ; CT_STORAGE="$REPLY"
ask "Bridge" "$CT_BRIDGE" ; CT_BRIDGE="$REPLY"
ask "Netzwerk (dhcp oder 192.168.1.100/24)" "$CT_IP" ; CT_IP="$REPLY"
if [[ "$CT_IP" != "dhcp" ]]; then
ask "Gateway"; CT_GW="$REPLY"
fi
step "Freqtrade Konfiguration"
ask "FreqUI Port" "$FT_PORT" ; FT_PORT="$REPLY"
ask "Portainer Port" "$PT_PORT" ; PT_PORT="$REPLY"
ask "Filebrowser Port" "$FB_PORT" ; FB_PORT="$REPLY"
ask "Börse" "$FT_EXCHANGE" ; FT_EXCHANGE="$REPLY"
echo -e "
${CYAN}Stake-Währung:${NC} ${BOLD}1)${NC} USDC ${BOLD}2)${NC} USDT ${BOLD}3)${NC} EUR ${BOLD}4)${NC} Eigene"
ask "Auswahl [1-4]" "1"
case "$REPLY" in
2) FT_STAKE="USDT" ;;
3) FT_STAKE="EUR" ;;
4) ask "Stake-Währung eingeben"; FT_STAKE="$REPLY" ;;
*) FT_STAKE="USDC" ;;
esac
ask "Max. offene Trades" "$FT_MAX_TRADES" ; FT_MAX_TRADES="$REPLY"
ask "Timeframe" "$FT_TIMEFRAME" ; FT_TIMEFRAME="$REPLY"
ask "FreqUI Benutzername" "$FT_API_USER" ; FT_API_USER="$REPLY"
else
# ── Schnellinstallation: CT-ID prüfen ──
step "Schnellinstallation"
echo -e " Alle Standardwerte werden verwendet:\n"
echo -e " CT-ID: ${CYAN}${CT_ID}${NC} | Host: ${CYAN}${CT_HOST}${NC} | ${CYAN}${CT_CORES}${NC} CPU | ${CYAN}${CT_RAM}${NC}MB RAM | ${CYAN}${CT_DISK}${NC}GB"
echo -e " Storage: ${CYAN}${CT_STORAGE}${NC} | Bridge: ${CYAN}${CT_BRIDGE}${NC} | IP: ${CYAN}dhcp${NC}"
echo -e " FreqUI: ${CYAN}:${FT_PORT}${NC} | Stake: ${CYAN}${FT_STAKE}${NC} | Börse: ${CYAN}${FT_EXCHANGE}${NC}\n"
# Stake-Währung auch im Schnellmodus wählbar
echo -e " ${CYAN}Stake-Währung:${NC} ${BOLD}1)${NC} USDC (Standard) ${BOLD}2)${NC} USDT ${BOLD}3)${NC} EUR"
ask "Auswahl [1-3]" "1"
case "$REPLY" in
2) FT_STAKE="USDT" ;;
3) FT_STAKE="EUR" ;;
*) FT_STAKE="USDC" ;;
esac
echo
fi fi
ask_secret "Root-Passwort für den LXC" # Passwörter immer abfragen
step "Passwörter"
ask_secret "Root-Passwort für den LXC (mind. 8 Zeichen)"
CT_PASS="$REPLY" CT_PASS="$REPLY"
[[ ${#CT_PASS} -lt 8 ]] && error "Passwort mind. 8 Zeichen!" [[ ${#CT_PASS} -lt 8 ]] && error "Passwort mind. 8 Zeichen!"
step "Freqtrade Konfiguration"
ask "FreqUI Port" "8080" ; FT_PORT="$REPLY"
ask "Portainer Port" "9000" ; PT_PORT="$REPLY"
ask "Filebrowser Port" "8081" ; FB_PORT="$REPLY"
ask "Börse" "binance" ; FT_EXCHANGE="$REPLY"
ask "Stake-Währung" "USDC" ; FT_STAKE="$REPLY"
ask "Max. offene Trades" "3" ; FT_MAX_TRADES="$REPLY"
ask "Timeframe" "5m" ; FT_TIMEFRAME="$REPLY"
ask "FreqUI Benutzername" "freqtrader" ; FT_API_USER="$REPLY"
ask_secret "FreqUI Passwort (mind. 8 Zeichen)" ask_secret "FreqUI Passwort (mind. 8 Zeichen)"
FT_API_PASS="$REPLY" FT_API_PASS="$REPLY"
[[ ${#FT_API_PASS} -lt 8 ]] && error "Passwort mind. 8 Zeichen!" [[ ${#FT_API_PASS} -lt 8 ]] && error "Passwort mind. 8 Zeichen!"
FT_TELEGRAM=false; TG_TOKEN=""; TG_CHATID="" # Telegram nur im erweiterten Modus
if confirm "Telegram-Benachrichtigungen?"; then if [[ "$mode" == "2" ]]; then
FT_TELEGRAM=true if confirm "Telegram-Benachrichtigungen?"; then
ask "Telegram Bot-Token" ; TG_TOKEN="$REPLY" FT_TELEGRAM=true
ask "Telegram Chat-ID" ; TG_CHATID="$REPLY" ask "Telegram Bot-Token" ; TG_TOKEN="$REPLY"
ask "Telegram Chat-ID" ; TG_CHATID="$REPLY"
fi
fi fi
# Passwörter base64-kodiert weitergeben (sicher für Heredoc-Transport) # CT-ID validieren
[[ "$CT_ID" =~ ^[0-9]+$ ]] || error "CT-ID muss eine Zahl sein!"
pct status "$CT_ID" &>/dev/null && error "CT-ID $CT_ID existiert bereits!"
# Passwörter base64-kodiert weitergeben
CT_PASS_B64=$(printf '%s' "$CT_PASS" | base64 -w0) CT_PASS_B64=$(printf '%s' "$CT_PASS" | base64 -w0)
FT_API_PASS_B64=$(printf '%s' "$FT_API_PASS" | base64 -w0) FT_API_PASS_B64=$(printf '%s' "$FT_API_PASS" | base64 -w0)
TG_TOKEN_B64=$(printf '%s' "$TG_TOKEN" | base64 -w0) TG_TOKEN_B64=$(printf '%s' "$TG_TOKEN" | base64 -w0)
# Zufällige Secrets
JWT_SECRET=$(openssl rand -hex 32) JWT_SECRET=$(openssl rand -hex 32)
WS_TOKEN=$(openssl rand -hex 16) WS_TOKEN=$(openssl rand -hex 16)
echo -e "\n${BOLD}${BLUE}══════════════ Zusammenfassung ══════════════${NC}" echo -e "\n${BOLD}${BLUE}══════════════ Zusammenfassung ══════════════${NC}"
echo -e " CT ${CYAN}${CT_ID}${NC} | ${CYAN}${CT_HOST}${NC} | ${CYAN}${CT_CORES}${NC}x CPU | ${CYAN}${CT_RAM}${NC}MB RAM | ${CYAN}${CT_DISK}${NC}GB | ${CYAN}${CT_STORAGE}${NC}" echo -e " CT ${CYAN}${CT_ID}${NC} | ${CYAN}${CT_HOST}${NC} | ${CYAN}${CT_CORES}${NC}x CPU | ${CYAN}${CT_RAM}${NC}MB RAM | ${CYAN}${CT_DISK}${NC}GB | ${CYAN}${CT_STORAGE}${NC}"
echo -e " Netz: ${CYAN}${CT_IP}${NC} via ${CYAN}${CT_BRIDGE}${NC}" echo -e " Netz: ${CYAN}${CT_IP}${NC} via ${CYAN}${CT_BRIDGE}${NC}"
echo -e " FreqUI: ${CYAN}:${FT_PORT}${NC} | Portainer: ${CYAN}:${PT_PORT}${NC} | Filebrowser: ${CYAN}:${FB_PORT}${NC}" echo -e " FreqUI: ${CYAN}:${FT_PORT}${NC} | Portainer: ${CYAN}:${PT_PORT}${NC} | Filebrowser: ${CYAN}:${FB_PORT}${NC}"
echo -e " Börse: ${CYAN}${FT_EXCHANGE}${NC} | Stake: ${CYAN}${FT_STAKE}${NC} | Telegram: ${CYAN}${FT_TELEGRAM}${NC}" echo -e " Börse: ${CYAN}${FT_EXCHANGE}${NC} | Stake: ${CYAN}${FT_STAKE}${NC} | Telegram: ${CYAN}${FT_TELEGRAM}${NC}"
echo -e "${BOLD}${BLUE}════════════════════════════════════════════${NC}\n" echo -e "${BOLD}${BLUE}════════════════════════════════════════════${NC}\n"
confirm "Installation starten?" || { info "Abgebrochen."; exit 0; } confirm "Installation starten?" || { info "Abgebrochen."; exit 0; }