diff --git a/create_pve-mgnt-lxc.sh b/create_pve-mgnt-lxc.sh index 08d91bb..1fc4511 100644 --- a/create_pve-mgnt-lxc.sh +++ b/create_pve-mgnt-lxc.sh @@ -1,85 +1,140 @@ #!/bin/bash +# ===================================================== +# Proxmox VE: Debian 13 LXC automatisch erstellen +# Hostname: -MGNT +# Unprivilegiert +# Automatisches Debian 13 Template +# WebUI-Konsole funktioniert +# Autostart aktiviert +# ===================================================== -### === Konfiguration === -CTID=301 -HOSTNAME="debian-lxc" - -TEMPLATE_STORAGE="local" -TEMPLATE_NAME="debian-13-standard_13.1-2_amd64.tar.zst" - -ROOTFS_STORAGE="local-lvm" -ROOTFS_SIZE="4G" - -BRIDGE="xx_vmbrmgt" -IP_ADDR="10.60.10.2/24" +# ---- Konfiguration ---- +IP="10.60.10.2/24" GATEWAY="10.60.10.1" - CORES=1 MEMORY=512 SWAP=0 +ROOTFS_SIZE=8 +BRIDGE="xx_vmbrmgt" +MIN_VMID=300 -### === Checks === -command -v pct >/dev/null || { - echo "❌ pct nicht gefunden" - exit 1 -} +# ---- Farben / Layout ---- +BOLD="\033[1m" +GREEN="\033[32m" +CYAN="\033[36m" +RED="\033[31m" +RESET="\033[0m" +INDENT=" " -### === Template prüfen === -if [ ! -f "/var/lib/vz/template/cache/${TEMPLATE_NAME}" ]; then - echo "❌ Template fehlt: ${TEMPLATE_NAME}" - echo "👉 pveam download ${TEMPLATE_STORAGE} ${TEMPLATE_NAME}" +# ---- Root Check ---- +if [[ $EUID -ne 0 ]]; then + echo -e "${BOLD}${INDENT}Bitte als Root ausführen!${RESET}" exit 1 fi -### === LXC erstellen === -echo "🚀 Erstelle unprivilegierten LXC ${CTID}..." +# ---- Root-Passwort abfragen ---- +read -s -p "Root-Passwort für LXC: " ROOTPASS +echo -pct create ${CTID} \ - ${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE_NAME} \ - --hostname ${HOSTNAME} \ - --cores ${CORES} \ - --memory ${MEMORY} \ - --swap ${SWAP} \ - --rootfs ${ROOTFS_STORAGE}:${ROOTFS_SIZE} \ - --net0 name=eth0,bridge=${BRIDGE},ip=${IP_ADDR},gw=${GATEWAY} \ - --unprivileged 1 \ - --features nesting=1 \ - --onboot 1 \ - --ostype debian \ - --start 0 +# ---- Dynamischer Hostname ---- +HOSTNAME="$(hostname)-MGNT" +echo -e "${INDENT}LXC-Hostname wird: ${CYAN}$HOSTNAME${RESET}" -[ $? -ne 0 ] && { - echo "❌ Fehler beim Erstellen" +# ---- Nächste freie VMID ab 300 ---- +VMID=$MIN_VMID +while pct status $VMID &>/dev/null; do + ((VMID++)) +done +echo -e "${INDENT}Nächste freie VMID: ${CYAN}$VMID${RESET}" + +# ---- Storage-Auswahl (rootdir-fähig) ---- +echo +echo -e "${BOLD}${INDENT}Verfügbare Storages für LXC RootFS:${RESET}" + +mapfile -t STORAGES < <( + pvesm status --content rootdir | awk 'NR>1 {print $1}' +) + +if [[ ${#STORAGES[@]} -eq 0 ]]; then + echo -e "${RED}${INDENT}Kein geeigneter Storage gefunden!${RESET}" exit 1 -} +fi -### === Console / TTY korrekt setzen (GUI-Style) === -echo "🖥️ Setze Console / TTY Optionen..." -pct set ${CTID} \ - -lxc.tty.max 2 \ - -lxc.pty.max 1 \ - --console 1 +for i in "${!STORAGES[@]}"; do + printf "${INDENT}[%d] %s\n" "$i" "${STORAGES[$i]}" +done -### === LXC starten === -echo "▶️ Starte LXC..." -pct start ${CTID} +while true; do + read -p "${INDENT}Storage auswählen (Nummer): " STORAGE_INDEX + if [[ "$STORAGE_INDEX" =~ ^[0-9]+$ ]] && [[ -n "${STORAGES[$STORAGE_INDEX]}" ]]; then + STORAGE="${STORAGES[$STORAGE_INDEX]}" + break + fi + echo -e "${RED}${INDENT}Ungültige Auswahl!${RESET}" +done -sleep 5 +echo -e "${INDENT}Gewählter Storage: ${CYAN}$STORAGE${RESET}" -### === Pakete im LXC === -echo "📦 Installiere Basis-Pakete..." -pct exec ${CTID} -- bash -c " +# ---- Template automatisch wählen ---- +echo -e "${INDENT}Suche aktuelles Debian 13 Template..." +pveam update +TEMPLATE_NAME=$(pveam available | awk '/debian-13-standard_.*_amd64\.tar\.zst/ {print $2}' | tail -n1) + +if [[ -z "$TEMPLATE_NAME" ]]; then + echo -e "${RED}${INDENT}Kein Debian 13 Template gefunden!${RESET}" + exit 1 +fi +echo -e "${INDENT}Gefundenes Template: $TEMPLATE_NAME" + +# ---- Template prüfen / herunterladen ---- +TEMPLATE_PATH="/var/lib/vz/template/cache/$TEMPLATE_NAME" +if [[ ! -f "$TEMPLATE_PATH" ]]; then + echo -e "${INDENT}Template nicht vorhanden, lade herunter..." + pveam download local $TEMPLATE_NAME +else + echo -e "${INDENT}Template bereits vorhanden" +fi + +# ---- LXC erstellen ---- +echo -e "${INDENT}Erstelle unprivilegierten LXC $HOSTNAME (VMID: $VMID)..." + +CREATE_CMD="pct create $VMID local:vztmpl/$TEMPLATE_NAME \ + --hostname $HOSTNAME \ + --cores $CORES \ + --memory $MEMORY \ + --swap $SWAP \ + --rootfs $STORAGE:$ROOTFS_SIZE \ + --net0 name=eth0,bridge=$BRIDGE,ip=$IP,gw=$GATEWAY,type=veth \ + --unprivileged 1" + +if [[ -n "$ROOTPASS" ]]; then + CREATE_CMD=\"$CREATE_CMD --password $ROOTPASS\" +fi + +eval $CREATE_CMD || exit 1 + +# ---- WebUI-Konsole aktivieren (modern) ---- +CONF_FILE="/etc/pve/lxc/$VMID.conf" +echo -e "${INDENT}Aktiviere WebUI-Konsole..." +echo "lxc.tty.max = 2" >> "$CONF_FILE" +echo "lxc.pty.max = 2" >> "$CONF_FILE" +echo "features: nesting=1,keyctl=1" >> "$CONF_FILE" + +# ---- Autostart aktivieren ---- +echo -e "${INDENT}Aktiviere Autostart..." +pct set $VMID --onboot 1 + +# ---- Container starten ---- +echo -e "${INDENT}Starte LXC..." +pct start $VMID + +# ---- Software im LXC installieren ---- +echo -e "${INDENT}Installiere Newt-PVE-Mgnt..." +pct exec $VMID -- bash -c " apt update && -apt upgrade -y && -apt install -y curl sudo -" - -### === NEWT installieren === -echo "🧩 Installiere NEWT Client..." -pct exec ${CTID} -- bash -c " +apt install -y curl sudo && curl -fsSL https://gitea.vmd55888.de/manuel.maier/update-install-newt/raw/branch/main/install_newt_v2.sh -o install_newt_v2.sh && -chmod +x install_newt_v2.sh && bash ./install_newt_v2.sh --install " -echo "✅ Fertig! WebUI-Console funktioniert & Autostart aktiv 🎉" +echo -e "${GREEN}${INDENT}✔ Unprivilegierter LXC $HOSTNAME (VMID $VMID) erstellt, gestartet und Autostart aktiviert!${RESET}"