#!/usr/bin/env bash set -euo pipefail # Konfiguration (anpassen falls nötig) NAMESPACE="nextcloud" RELEASE="nextcloud" CHART="nextcloud/nextcloud" VALUES_FILE="values-nextcloud.yaml" SMB_SCRIPT_FILE="install-smb.sh" CONFIGMAP_NAME="smb-install-script" HELM_REPO_NAME="nextcloud" HELM_REPO_URL="https://nextcloud.github.io/helm/" WAIT_TIMEOUT="600s" # Timeout für Pod-Readiness (10m) # Hilfsfunktionen err() { echo "ERROR: $*" >&2; exit 1; } info() { echo "INFO: $*"; } confirm() { echo echo "!!! Achtung: Das Skript wird das Helm-Release '$RELEASE' im Namespace '$NAMESPACE' deinstallieren" echo " und alle zugehörigen PersistentVolumeClaims (PVCs) löschen. Daten gehen verloren!" echo read -p "Tippe DELETE um fortzufahren (oder STRG-C zum Abbrechen): " ans if [ "$ans" != "DELETE" ]; then echo "Abgebrochen." exit 0 fi } check_tools() { command -v kubectl >/dev/null 2>&1 || err "kubectl ist nicht installiert oder nicht in PATH" command -v helm >/dev/null 2>&1 || err "helm ist nicht installiert oder nicht in PATH" } create_namespace_if_missing() { if ! kubectl get namespace "$NAMESPACE" >/dev/null 2>&1; then info "Namespace $NAMESPACE existiert nicht — wird angelegt" kubectl create namespace "$NAMESPACE" else info "Namespace $NAMESPACE existiert" fi } uninstall_release() { if helm -n "$NAMESPACE" status "$RELEASE" >/dev/null 2>&1; then info "Helm-Release '$RELEASE' gefunden -> deinstalliere..." helm -n "$NAMESPACE" uninstall "$RELEASE" info "Warte bis alle Pods des Releases entfernt sind..." # Warte bis keine Pods mehr mit dem Release-Label vorhanden sind for i in $(seq 1 60); do sleep 2 COUNT=$(kubectl -n "$NAMESPACE" get pods -l app.kubernetes.io/instance="$RELEASE" --no-headers 2>/dev/null | wc -l || true) if [ "$COUNT" -eq 0 ]; then break fi echo -n "." done echo else info "Kein bestehendes Helm-Release '$RELEASE' gefunden" fi } delete_pvcs() { # Liste PVCs, die zum Release gehören (Label app.kubernetes.io/instance) PVCS=$(kubectl -n "$NAMESPACE" get pvc -l app.kubernetes.io/instance="$RELEASE" -o jsonpath='{.items[*].metadata.name}' || true) if [ -z "$PVCS" ]; then info "Keine PVCs mit Label app.kubernetes.io/instance=$RELEASE gefunden" return fi info "Folgende PVCs werden gelöscht: $PVCS" kubectl -n "$NAMESPACE" delete pvc $PVCS info "Warte auf Löschung der PVCs..." for pvc in $PVCS; do kubectl -n "$NAMESPACE" wait --for=delete pvc/"$pvc" --timeout=120s || true done } recreate_configmap() { if [ ! -f "$SMB_SCRIPT_FILE" ]; then err "SMB-Script '$SMB_SCRIPT_FILE' fehlt. Lege die Datei an oder passe \$SMB_SCRIPT_FILE an." fi info "Erstelle/aktualisiere ConfigMap $CONFIGMAP_NAME aus $SMB_SCRIPT_FILE" kubectl -n "$NAMESPACE" create configmap "$CONFIGMAP_NAME" --from-file="$SMB_SCRIPT_FILE" -o yaml --dry-run=client | kubectl apply -f - } add_helm_repo() { # Add repo if not exists if ! helm repo list | awk '{print $1}' | grep -xq "$HELM_REPO_NAME"; then info "Füge Helm-Repo $HELM_REPO_NAME hinzu" helm repo add "$HELM_REPO_NAME" "$HELM_REPO_URL" fi helm repo update } install_release() { if [ ! -f "$VALUES_FILE" ]; then err "Values-File '$VALUES_FILE' nicht gefunden. Abbruch." fi info "Installiere Helm-Release '$RELEASE' mit values '$VALUES_FILE'" helm upgrade --install "$RELEASE" "$CHART" -n "$NAMESPACE" -f "$VALUES_FILE" } wait_pods_ready() { info "Warte bis alle Pods des Releases ready sind (Timeout $WAIT_TIMEOUT)..." # Warte auf Ready-Bedingung für alle Pods mit dem instance-Label if ! kubectl -n "$NAMESPACE" wait --for=condition=Ready pod -l app.kubernetes.io/instance="$RELEASE" --all --timeout="$WAIT_TIMEOUT"; then echo "WARNUNG: Nicht alle Pods sind innerhalb des Timeouts ready. Aktuelle Pods:" kubectl -n "$NAMESPACE" get pods -o wide return 1 fi info "Alle Pods sind ready." } post_checks() { info "Prüfe smbclient im Nextcloud-Container (falls Pod läuft)..." POD=$(kubectl -n "$NAMESPACE" get pod -l app.kubernetes.io/instance="$RELEASE",app.kubernetes.io/component=app -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true) if [ -n "$POD" ]; then kubectl -n "$NAMESPACE" exec -it "$POD" -- sh -c 'command -v smbclient && smbclient -V || echo "smbclient nicht gefunden"' else info "Nextcloud-App-Pod nicht gefunden (noch nicht gestartet)." fi info "Führe 'occ files_external:backends' aus (falls Pod läuft)..." if [ -n "$POD" ]; then kubectl -n "$NAMESPACE" exec -it "$POD" -- sh -c 'php /var/www/html/occ files_external:backends || true' fi } main() { check_tools confirm create_namespace_if_missing uninstall_release delete_pvcs # recreate_configmap # add_helm_repo # install_release # # Warte auf Pods # if ! wait_pods_ready; then # info "Einige Pods sind möglicherweise nicht ready. Schaue in die Logs:" # kubectl -n "$NAMESPACE" get pods # kubectl -n "$NAMESPACE" logs -l app.kubernetes.io/instance="$RELEASE" --tail=100 || true # fi # post_checks echo echo "Fertig. Prüfe die Nextcloud-WebUI und gegebenenfalls die External Storage Einstellungen." } main "$@"