#!/usr/bin/env bash # # OPENBUREAU-Suite — der Dialog-Installer für das Selbsthosting-Set auf Proxmox. # # Fragt im Dialog, welche Dienste man will, und installiert dann einen LXC nach # dem anderen — jeder über sein eigenes, eigenständiges Skript (proxmox/*-lxc.sh). # Fortgeschrittene können diese Einzelskripte auch direkt curlen, ohne die Suite. # # AUF DEM PROXMOX-HOST (nicht im Container), als root: # bash <(curl -fsSL https://git.kgva.ch/karim/OPENBUREAU/raw/branch/main/proxmox/install.sh) # # Direkt, ohne Dialog: # … install.sh openbureau # … install.sh nextcloud [disk_gb] [ram_mb] # … install.sh empty [name] [disk_gb] [ram_mb] # … install.sh git [name] [disk_gb] [ram_mb] # set -euo pipefail RAW="https://git.kgva.ch/karim/OPENBUREAU/raw/branch/main" say() { echo -e "\n\033[1;36m▸ $*\033[0m"; } 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?" # Jeder Dienst = ein eigenständiges Skript. Die Suite ruft sie nur auf. run_service() { local svc="$1"; shift || true case "$svc" in openbureau) say "OPENBUREAU — Website + CMS…"; bash <(curl -fsSL "$RAW/cms/proxmox/create-openbureau-lxc.sh") ;; nextcloud) say "Nextcloud…"; bash <(curl -fsSL "$RAW/proxmox/nextcloud-lxc.sh") "$@" ;; empty) say "Leerer Docker-LXC…"; bash <(curl -fsSL "$RAW/proxmox/empty-lxc.sh") "$@" ;; git) say "Git-Compose-Dienst…"; bash <(curl -fsSL "$RAW/proxmox/git-compose-lxc.sh") "$@" ;; *) die "Unbekannter Dienst: $svc" ;; esac } # --------------------------------------------------------------------------- # Stufe 1: Vorhaben. schlüssel | Beschreibung | Liste der Dienste # (Sonderfall "custom" → Einzelauswahl, siehe service_checklist.) PROFILES=( "buero|Komplettes Büro einrichten — Website/CMS + Nextcloud|openbureau nextcloud" "cloud|Office 365 + Synology ersetzen — nur Nextcloud|nextcloud" "web|Nur die öffentliche Website + CMS|openbureau" "custom|Einzeln auswählen … (für Fortgeschrittene)|custom" ) # Stufe 2 (custom): einzelne Dienste. schlüssel | Beschreibung SERVICES=( "openbureau|OPENBUREAU — Website + CMS (Hugo + Supabase)" "nextcloud|Nextcloud — Dateien, Kalender, Kontakte, Office (ersetzt 365/Synology)" "empty|Leerer Docker-LXC — Gerüst für eigene Dienste" "git|Git-Compose-Dienst — eigenes Repo (z. B. RAPPORT / DOSSIER)" ) # Holt für die interaktive Auswahl die Zusatzangaben (Repo-URL, Name) nach. run_from_menu() { case "$1" in git) local repo name read -rp " Repo-URL (z. B. git.kgva.ch/karim/RAPPORT-SERVER.git): " repo [ -n "$repo" ] || { echo " übersprungen (keine URL)."; return 0; } read -rp " Name [auto]: " name run_service git "$repo" "$name" ;; empty) local name read -rp " Name des Containers [docker]: " name run_service empty "${name:-docker}" ;; *) run_service "$1" ;; esac } # Stufe 2: Einzelauswahl der Dienste (Checkliste). service_checklist() { local choices=() if command -v whiptail >/dev/null && [ -t 0 ]; then local items=() for s in "${SERVICES[@]}"; do items+=("${s%%|*}" "${s#*|}" OFF); done local sel sel="$(whiptail --title "OPENBUREAU — Dienste auswählen" \ --checklist "Mit der Leertaste auswählen, Enter bestätigt:" 20 78 ${#SERVICES[@]} \ "${items[@]}" 3>&1 1>&2 2>&3)" || { echo "Abgebrochen."; exit 0; } eval "choices=($sel)" # whiptail liefert die Tags in Anführungszeichen else echo "Welche Dienste installieren? (Nummern mit Komma/Leerzeichen, Enter = nichts)" local i=1 for s in "${SERVICES[@]}"; do printf " %d) %s\n" "$i" "${s#*|}"; i=$((i+1)); done read -rp "Auswahl: " line for n in ${line//,/ }; do [ "$n" -ge 1 ] 2>/dev/null && [ "$n" -le "${#SERVICES[@]}" ] && choices+=("${SERVICES[$((n-1))]%%|*}") done fi [ "${#choices[@]}" -gt 0 ] || { echo "Nichts ausgewählt."; exit 0; } for c in "${choices[@]}"; do run_from_menu "$c"; done } # Stufe 1: Vorhaben wählen, dann das passende Bündel installieren. choose_profile() { local key="" if command -v whiptail >/dev/null && [ -t 0 ]; then local items=() first=ON for p in "${PROFILES[@]}"; do items+=("${p%%|*}" "$(echo "$p" | cut -d'|' -f2)" "$first"); first=OFF; done key="$(whiptail --title "OPENBUREAU — Was hast du vor?" \ --radiolist "Vorhaben wählen (Leertaste markiert, Enter bestätigt):" 20 78 ${#PROFILES[@]} \ "${items[@]}" 3>&1 1>&2 2>&3)" || { echo "Abgebrochen."; exit 0; } else echo "Was hast du vor? (eine Nummer)" local i=1 for p in "${PROFILES[@]}"; do printf " %d) %s\n" "$i" "$(echo "$p" | cut -d'|' -f2)"; i=$((i+1)); done read -rp "Auswahl [1]: " n; n="${n:-1}" [ "$n" -ge 1 ] 2>/dev/null && [ "$n" -le "${#PROFILES[@]}" ] || die "Ungültige Auswahl." key="${PROFILES[$((n-1))]%%|*}" fi if [ "$key" = "custom" ]; then service_checklist else local svcs="" for p in "${PROFILES[@]}"; do [ "${p%%|*}" = "$key" ] && svcs="${p##*|}"; done say "Vorhaben '$key': installiere -> $svcs" for s in $svcs; do run_service "$s"; done fi } ################################# Einstieg ################################# if [ "$#" -gt 0 ]; then run_service "$@" # direkt, ohne Dialog else choose_profile # geführter Dialog: erst Vorhaben, dann Dienste fi say "Fertig. Alle ausgewählten Dienste sind durch."