ADD: added nextcloud

This commit is contained in:
2026-02-27 20:54:54 +01:00
parent 95eb12797d
commit f0c47beaad
15 changed files with 575 additions and 1 deletions

View File

@@ -0,0 +1,156 @@
#!/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 "$@"