#!/usr/bin/env bash # # Leerer, Docker-tauglicher LXC für Proxmox VE — das Gerüst für eigene Dienste. # # AUF DEM PROXMOX-HOST, als root: # bash <(curl -fsSL https://git.kgva.ch/karim/OPENBUREAU/raw/branch/main/proxmox/empty-lxc.sh) [name] [disk_gb] [ram_mb] # # Beispiel: … empty-lxc.sh dateien 200 8192 # set -euo pipefail ############################# gemeinsamer Kopf ############################# SSH_PUBKEY_FILE="${SSH_PUBKEY_FILE:-$HOME/.ssh/id_ed25519.pub}" ROOTFS_STORAGE="${ROOTFS_STORAGE:-local-lvm}" TEMPLATE_STORAGE="${TEMPLATE_STORAGE:-local}" BRIDGE="${BRIDGE:-vmbr0}" say() { echo -e "\n\033[1;36m▸ $*\033[0m"; } ok() { echo -e "\033[1;32m✓ $*\033[0m"; } warn() { echo -e "\033[1;33m! $*\033[0m" >&2; } die() { echo -e "\033[1;31m✗ $*\033[0m" >&2; exit 1; } [ "$(id -u)" -eq 0 ] || die "Bitte als root auf dem Proxmox-Host ausführen." command -v pct >/dev/null || die "pct nicht gefunden — läuft das wirklich auf Proxmox VE?" ensure_template() { [ -n "${TEMPLATE_REF:-}" ] && return 0 pveam update >/dev/null 2>&1 || true local tpl tpl="$(pveam available --section system | awk '/debian-12-standard/{print $2}' | sort -V | tail -1)" [ -n "$tpl" ] || die "Kein debian-12-Template verfügbar." pveam list "$TEMPLATE_STORAGE" | grep -q "$tpl" || { say "Lade Template $tpl…"; pveam download "$TEMPLATE_STORAGE" "$tpl" >/dev/null; } TEMPLATE_REF="${TEMPLATE_STORAGE}:vztmpl/${tpl}" } # create_lxc [cores] — setzt $CTID create_lxc() { local name="$1" disk="$2" ram="$3" cores="${4:-2}" ctid ensure_template ctid="$(pvesh get /cluster/nextid)" local args=( "$ctid" "$TEMPLATE_REF" --hostname "$name" --cores "$cores" --memory "$ram" --swap 1024 --rootfs "${ROOTFS_STORAGE}:${disk}" --net0 "name=eth0,bridge=${BRIDGE},ip=dhcp" --unprivileged 1 --features "nesting=1,keyctl=1" --onboot 1 ) [ -f "$SSH_PUBKEY_FILE" ] && args+=(--ssh-public-keys "$SSH_PUBKEY_FILE") say "Erstelle LXC $ctid ($name) — ${cores} Kerne, ${ram} MB RAM, ${disk} GB…" pct create "${args[@]}" >/dev/null pct start "$ctid"; sleep 5 CTID="$ctid" } install_docker() { say "Installiere Docker in $1…" pct exec "$1" -- bash -euo pipefail -c ' export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq ca-certificates curl git openssl >/dev/null curl -fsSL https://get.docker.com | sh >/dev/null systemctl enable --now docker ' } ip_of() { pct exec "$1" -- hostname -I 2>/dev/null | awk '{print $1}'; } ################################# Dienst ################################# NAME="${1:-docker}"; DISK="${2:-20}"; RAM="${3:-4096}" create_lxc "$NAME" "$DISK" "$RAM" install_docker "$CTID" ok "Leerer Docker-LXC $CTID ($NAME) läuft unter $(ip_of "$CTID")." echo " Hinein: pct enter $CTID"