156 lines
5.1 KiB
Bash
Executable File
156 lines
5.1 KiB
Bash
Executable File
#!/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 "$@" |