b67b24a53c
Geführter Installer proxmox/install.sh: erst Vorhaben wählen (Komplettes Büro / 365+Synology ersetzen / nur Website / einzeln), dann werden die nötigen LXCs der Reihe nach gebaut. Jeder Dienst ist auch als eigenständiges, einzeln curlbares Skript verfügbar: - proxmox/nextcloud-lxc.sh Nextcloud AIO (ersetzt 365/Synology) - proxmox/empty-lxc.sh leerer Docker-LXC als Geruest - proxmox/git-compose-lxc.sh beliebiges Git-Repo (RAPPORT/DOSSIER) - (OPENBUREAU: bestehendes cms/proxmox/create-openbureau-lxc.sh) Gemeinsames Muster: unprivilegierter Debian-12-LXC mit nesting+keyctl, Docker via get.docker.com, Dienst als Container/Compose. proxmox/README.md dokumentiert beide Wege. Dazu zwei Bibliotheksbeitraege (Hochparterre-Ton): - server-im-eigenen-haus.md — das Warum/Ziel - proxmox-schritt-fuer-schritt.md — die Anleitung mit curl-Befehlen Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
75 lines
2.8 KiB
Bash
Executable File
75 lines
2.8 KiB
Bash
Executable File
#!/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 <name> <disk_gb> <ram_mb> [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"
|