Dateien nach "scripts" hochladen
This commit is contained in:
@@ -76,117 +76,144 @@ 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() {
|
||||||
|
# ── Modus wählen ──
|
||||||
|
echo -e "
|
||||||
|
${BOLD}${BLUE} Installationsmodus:${NC}"
|
||||||
|
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 "Modus [1/2]" "1"
|
||||||
|
local mode="$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=""
|
||||||
|
FT_PORT="8080"
|
||||||
|
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"
|
step "LXC Konfiguration"
|
||||||
echo -e " ${CYAN}Storages (rootdir-fähig):${NC} ${BOLD}${STORAGES}${NC}"
|
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 " ${YELLOW} ↑ 'local' reicht nicht – braucht z.B. local-lvm${NC}"
|
||||||
echo -e " ${CYAN}Bridges:${NC} ${BRIDGES}\n"
|
echo -e " ${CYAN}Bridges:${NC} ${BRIDGES}\n"
|
||||||
|
|
||||||
ask "LXC Container-ID" "$NEXT_ID"
|
ask "LXC Container-ID" "$CT_ID" ; CT_ID="$REPLY"
|
||||||
CT_ID="$REPLY"
|
ask "Hostname" "$CT_HOST" ; CT_HOST="$REPLY"
|
||||||
[[ "$CT_ID" =~ ^[0-9]+$ ]] || error "Muss eine Zahl sein!"
|
ask "CPU Kerne" "$CT_CORES" ; CT_CORES="$REPLY"
|
||||||
pct status "$CT_ID" &>/dev/null && error "CT-ID $CT_ID existiert bereits!"
|
ask "RAM in MB" "$CT_RAM" ; CT_RAM="$REPLY"
|
||||||
|
ask "Swap in MB" "$CT_SWAP" ; CT_SWAP="$REPLY"
|
||||||
ask "Hostname" "freqtrade" ; CT_HOST="$REPLY"
|
ask "Disk in GB" "$CT_DISK" ; CT_DISK="$REPLY"
|
||||||
ask "CPU Kerne" "2" ; CT_CORES="$REPLY"
|
ask "Storage Pool" "$CT_STORAGE" ; CT_STORAGE="$REPLY"
|
||||||
ask "RAM in MB" "2048" ; CT_RAM="$REPLY"
|
ask "Bridge" "$CT_BRIDGE" ; CT_BRIDGE="$REPLY"
|
||||||
ask "Swap in MB" "512" ; CT_SWAP="$REPLY"
|
ask "Netzwerk (dhcp oder 192.168.1.100/24)" "$CT_IP" ; CT_IP="$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"
|
|
||||||
|
|
||||||
CT_GW=""
|
|
||||||
if [[ "$CT_IP" != "dhcp" ]]; then
|
if [[ "$CT_IP" != "dhcp" ]]; then
|
||||||
ask "Gateway"; CT_GW="$REPLY"
|
ask "Gateway"; CT_GW="$REPLY"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ask_secret "Root-Passwort für den LXC"
|
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
|
||||||
|
|
||||||
|
# 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 [[ "$mode" == "2" ]]; then
|
||||||
if confirm "Telegram-Benachrichtigungen?"; then
|
if confirm "Telegram-Benachrichtigungen?"; then
|
||||||
FT_TELEGRAM=true
|
FT_TELEGRAM=true
|
||||||
ask "Telegram Bot-Token" ; TG_TOKEN="$REPLY"
|
ask "Telegram Bot-Token" ; TG_TOKEN="$REPLY"
|
||||||
ask "Telegram Chat-ID" ; TG_CHATID="$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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user