#!/usr/bin/env bash # ProxDeploy in einem Debian-13-LXC einrichten – auf dem Proxmox-Host als root ausführen. # # ./install-lxc.sh --paket proxdeploy-0.6.0.tar.gz [Optionen] # ./install-lxc.sh --aktualisieren --paket proxdeploy-0.6.1.tar.gz # # Optionen (alle optional außer --paket): # --ctid N Container-ID (Standard: nächste freie) # --hostname NAME Hostname (Standard: proxdeploy) # --storage NAME Storage für die Disk (Standard: local-lvm) # --disk GB Disk in GB (Standard: 8) # --cores N CPU-Kerne (Standard: 2) # --memory MB RAM (Standard: 2048) # --bridge NAME Bridge (Standard: vmbr0) # --vlan TAG VLAN-Tag # --ip CIDR feste Adresse, z. B. 10.0.10.50/24 (Standard: DHCP); dazu --gw # --gw ADRESSE Gateway bei fester Adresse # --url URL öffentliche Adresse (APP_URL), z. B. https://proxdeploy.example # (Standard: http://:3000) # --tags LISTE zusätzliche Proxmox-Tags, z. B. proxdeploy-test # # Das Paket baut `scripts/paket-bauen.sh --tar` im Repository. set -euo pipefail fehler() { echo "✗ $*" >&2; exit 1; } schritt() { echo "◐ $*"; } fertig() { echo "✓ $*"; } [ "$(id -u)" = 0 ] || fehler "Bitte als root auf dem Proxmox-Host ausführen." command -v pct >/dev/null || fehler "pct fehlt – läuft das auf einem Proxmox-VE-Host?" ctid="" hostname="proxdeploy" storage="local-lvm" disk=8 cores=2 memory=2048 bridge="vmbr0" vlan="" ip="dhcp" gw="" url="" paket="" aktualisieren="" tags="" while [ $# -gt 0 ]; do case "$1" in --ctid) ctid="$2"; shift 2 ;; --hostname) hostname="$2"; shift 2 ;; --storage) storage="$2"; shift 2 ;; --disk) disk="$2"; shift 2 ;; --cores) cores="$2"; shift 2 ;; --memory) memory="$2"; shift 2 ;; --bridge) bridge="$2"; shift 2 ;; --vlan) vlan="$2"; shift 2 ;; --ip) ip="$2"; shift 2 ;; --gw) gw="$2"; shift 2 ;; --url) url="$2"; shift 2 ;; --tags) tags="$2"; shift 2 ;; --paket) paket="$2"; shift 2 ;; --aktualisieren) aktualisieren="$2"; shift 2 ;; -h|--help) sed -n '2,25p' "$0"; exit 0 ;; *) fehler "Unbekannte Option $1 (siehe --help)" ;; esac done [ -n "$paket" ] || fehler "--paket fehlt (proxdeploy-.tar.gz)." [ -f "$paket" ] || fehler "$paket gibt es nicht." tar -tzf "$paket" ./VERSION >/dev/null 2>&1 || fehler "$paket ist kein ProxDeploy-Paket (VERSION fehlt)." version="$(tar -xzOf "$paket" ./VERSION)" innen="$(dirname "$0")/im-container.sh" [ -f "$innen" ] || fehler "im-container.sh fehlt neben diesem Skript." pushen() { pct push "$1" "$paket" /root/proxdeploy-paket.tar.gz pct push "$1" "$innen" /root/proxdeploy-im-container.sh --perms 0700 } # ── Aktualisieren ─────────────────────────────────────────────────────────────────────────────── if [ -n "$aktualisieren" ]; then pct status "$aktualisieren" | grep -q running || fehler "Container $aktualisieren läuft nicht." schritt "Aktualisiere Container $aktualisieren auf $version" pushen "$aktualisieren" pct exec "$aktualisieren" -- bash /root/proxdeploy-im-container.sh aktualisieren exit 0 fi # ── Neu einrichten ────────────────────────────────────────────────────────────────────────────── [ -n "$ctid" ] || ctid="$(pvesh get /cluster/nextid)" pct status "$ctid" >/dev/null 2>&1 && fehler "Container $ctid gibt es schon." if [ "$ip" != dhcp ]; then [[ "$ip" =~ ^[0-9.]+/[0-9]+$ ]] || fehler "--ip: Format 10.0.10.50/24" [ -n "$gw" ] || fehler "Bei fester Adresse fehlt --gw." fi schritt "LXC-Template Debian 13" pveam update >/dev/null vorlage="$(pveam available --section system | awk '/debian-13-standard_.*_amd64\.tar\.zst/ {print $2}' | sort -V | tail -1)" [ -n "$vorlage" ] || fehler "Kein Debian-13-Template in pveam gefunden." template_storage="$(pvesm status --content vztmpl | awk 'NR>1 {print $1; exit}')" [ -n "$template_storage" ] || fehler "Kein Storage für Container-Templates (Inhalt vztmpl)." if ! pveam list "$template_storage" | grep -q "$vorlage"; then pveam download "$template_storage" "$vorlage" >/dev/null fi fertig "$vorlage auf $template_storage" netz="name=eth0,bridge=$bridge,firewall=1" [ -n "$vlan" ] && netz="$netz,tag=$vlan" if [ "$ip" = dhcp ]; then netz="$netz,ip=dhcp"; else netz="$netz,ip=$ip,gw=$gw"; fi schritt "Container $ctid anlegen" pct create "$ctid" "$template_storage:vztmpl/$vorlage" \ --hostname "$hostname" --cores "$cores" --memory "$memory" --swap 512 \ --rootfs "$storage:$disk" --net0 "$netz" \ --unprivileged 1 --features nesting=1 --onboot 1 \ --tags "proxdeploy${tags:+;$tags}" \ --description "ProxDeploy $version – eingerichtet mit install-lxc.sh" >/dev/null pct start "$ctid" fertig "Container $ctid ($hostname) läuft" schritt "Netzwerk" adresse="" for _ in $(seq 1 60); do adresse="$(pct exec "$ctid" -- ip -4 -o addr show dev eth0 2>/dev/null | awk '{print $4}' | cut -d/ -f1 | head -1)" [ -n "$adresse" ] && pct exec "$ctid" -- getent hosts deb.debian.org >/dev/null 2>&1 && break adresse="" sleep 2 done [ -n "$adresse" ] || fehler "Container $ctid bekommt keine Adresse oder kein DNS." fertig "IP $adresse" [ -n "$url" ] || url="http://$adresse:3000" pushen "$ctid" pct exec "$ctid" -- bash /root/proxdeploy-im-container.sh installieren --url "$url"