#!/usr/bin/env bash # 03-upgrade.sh — NC upgrade-keten op de doelserver. # # Draait sequentieel door NC_UPGRADE_VERSIONS uit config.sh. # NC vereist één major per stap: v30 → v31 → v32 → v33. # Na elke major: optioneel een Proxmox-snapshot als terugkeerput. # # Bij MySQL-bron: voeg NA de laatste upgrade-stap het commando toe: # occ db:convert-type --all-apps pgsql # zodat de DB PostgreSQL is voor AIO-import (05-import.sh). # # Terugzetten naar snapshot: ssh 'qm rollback ' (VM offline) # Log: elke stap print naar stdout; draai met 'tee upgrade.log' om op te slaan. set -euo pipefail source "$(dirname "$0")/config.sh" log() { echo "[$(date '+%H:%M:%S')] $*"; } OCC="sudo -u www-data php8.3 /var/www/nextcloud/occ" # ── Apps uitschakelen die niet draaien op staging ──────────────────────────── # AIO vervangt deze later; staging heeft geen Docker/HPB. log "Apps uitschakelen die afhankelijk zijn van Docker/HPB..." ssh "${TARGET_SSH}" " for app in fulltextsearch fulltextsearch_elasticsearch recognize spreed \ whiteboard talk_matterbridge notify_push app_api; do ${OCC} app:disable \"\$app\" 2>/dev/null && echo \" disabled: \$app\" || true done " # ── Upgrade-functie ─────────────────────────────────────────────────────────── upgrade_to() { local VERSION="$1" local MAJOR="${VERSION%%.*}" local ARCHIVE="nextcloud-${VERSION}.tar.bz2" local URL="https://download.nextcloud.com/server/releases/${ARCHIVE}" local SNAPSHOT="upgrade-v${MAJOR}-done" log "══ NC ${VERSION} ══════════════════════════════════════" ssh "${TARGET_SSH}" "${OCC} maintenance:mode --on" # Download + bestanden vervangen op de doelserver ssh "${TARGET_SSH}" bash -s << VMEOF set -euo pipefail log() { echo "[\$(date '+%H:%M:%S')] \$*"; } cd /tmp if [ ! -f "${ARCHIVE}" ]; then log "Downloaden ${ARCHIVE}..." wget -q --show-progress -O "${ARCHIVE}" "${URL}" 2>&1 | tail -3 else log "Archief al aanwezig, overgeslagen." fi log "Bestanden vervangen..." rm -rf /tmp/nc-new && mkdir /tmp/nc-new tar -xjf "${ARCHIVE}" -C /tmp/nc-new cp -a /var/www/nextcloud/config /tmp/nc-config-bak # --exclude='/config/' geankerd op root van de bron: raakt geen config/-mappen in apps. # Zonder leading slash zou rsync ook app/*/config/ verwijderen (bug). rsync -a --delete \ --exclude='/config/' \ --exclude='/data' \ /tmp/nc-new/nextcloud/ /var/www/nextcloud/ || true # config/ herstellen als rsync die geraakt heeft [ -f /var/www/nextcloud/config/config.php ] || \ cp -a /tmp/nc-config-bak/. /var/www/nextcloud/config/ # Apps zonder appinfo/info.xml crashen occ upgrade — verwijder ze for dir in /var/www/nextcloud/apps/*/; do app=\$(basename "\$dir") [ -f "\$dir/appinfo/info.xml" ] || { rm -rf "\$dir"; echo " opgeruimd (geen info.xml): \$app"; } done chown -R www-data:www-data /var/www/nextcloud rm -rf /tmp/nc-new /tmp/nc-config-bak log "Bestanden klaar." VMEOF log "occ upgrade..." ssh "${TARGET_SSH}" "${OCC} upgrade 2>&1" log "App-updates..." ssh "${TARGET_SSH}" "${OCC} app:update --all 2>&1 || true" ssh "${TARGET_SSH}" "${OCC} status" ssh "${TARGET_SSH}" "${OCC} maintenance:mode --off" if [[ "${USE_PROXMOX}" == "true" ]]; then log "Snapshot '${SNAPSHOT}' aanmaken..." ssh "${PROXMOX_HOST}" \ "qm snapshot ${PROXMOX_VMID} '${SNAPSHOT}' \ --description 'NC ${VERSION} upgrade klaar' 2>&1" log "✓ Snapshot klaar." fi log "✓ NC ${VERSION} klaar." } # ── Upgrade-keten ───────────────────────────────────────────────────────────── log "Start versie:" ssh "${TARGET_SSH}" "${OCC} status | grep versionstring" # App-inventarisatie vóór de keten log "App-inventarisatie opslaan (voor vergelijking achteraf)..." ssh "${TARGET_SSH}" " ${OCC} app:list --output=json 2>/dev/null | python3 -c \" import json, sys d = json.load(sys.stdin) for app in sorted(d.get('enabled', {}).keys()): print(app) \" > /tmp/nc-apps-before.txt echo \" \$(wc -l < /tmp/nc-apps-before.txt) apps enabled voor upgrade\" " for VERSION in "${NC_UPGRADE_VERSIONS[@]}"; do upgrade_to "${VERSION}" done # ── App-rapport na de keten ─────────────────────────────────────────────────── log "══════════════════════════════════════════" log "Upgrade-keten klaar. Eindversie:" ssh "${TARGET_SSH}" "${OCC} status" log "" log "App-rapport (vergelijking voor/na upgrade-keten):" ssh "${TARGET_SSH}" " ${OCC} app:list --output=json 2>/dev/null | python3 -c \" import json, sys d = json.load(sys.stdin) for app in sorted(d.get('enabled', {}).keys()): print(app) \" > /tmp/nc-apps-after.txt # Apps die verdwenen of uitgeschakeld zijn na de keten LOST=\$(comm -23 \ <(sort /tmp/nc-apps-before.txt) \ <(sort /tmp/nc-apps-after.txt)) # Apps die door AIO vervangen worden (geen actie nodig) AIO_REPLACES='fulltextsearch fulltextsearch_elasticsearch notify_push spreed whiteboard recognize files_antivirus' echo '' echo '── Nog steeds enabled ────────────────────────────' comm -12 <(sort /tmp/nc-apps-before.txt) <(sort /tmp/nc-apps-after.txt) echo '' echo '── Uitgeschakeld/verdwenen na upgrade ────────────' if [ -z \"\$LOST\" ]; then echo ' (geen)' else for app in \$LOST; do if echo \"\$AIO_REPLACES\" | grep -qw \"\$app\"; then echo \" [AIO-native] \$app ← vervangen door AIO-container\" else echo \" [ACTIE NODIG] \$app ← handmatig herinstalleren na AIO-import\" fi done fi echo '' echo '── Nieuw disabled in NC app store (incompatibel) ─' ${OCC} app:list --output=json 2>/dev/null | python3 -c \" import json, sys d = json.load(sys.stdin) for app in sorted(d.get('disabled', {}).keys()): print(' ' + app) \" " if [[ "${SOURCE_DB_TYPE}" == "mysql" ]]; then log "VOLGENDE STAP (MySQL-bron): converteer de DB naar PostgreSQL vóór 05-import.sh:" log " ssh 'sudo -u www-data php8.3 /var/www/nextcloud/occ \\" log " db:convert-type --all-apps pgsql ${STAGING_DB_USER} ${STAGING_DB_PASS} ${STAGING_DB}'" log " Daarna een verse pg_dump maken en opslaan als /tmp/nc_v33_aio.sql" else log "VOLGENDE STAP: 04-install-aio.sh production" fi