Files
nextcloud-to-aio/03-upgrade.sh
T
dillard 2626036a21 Initial commit: Nextcloud bare/Hansson → AIO migration toolkit
Scripts 01-05 voor sequentiële migratie: transfer, staging, upgrade-keten,
AIO-install en DB-import. PostgreSQL + MySQL/MariaDB bronnen ondersteund.
Proxmox/OPNSense VM-builder optioneel in proxmox/. README met 12 gotchas.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-07 01:18:01 +02:00

184 lines
6.8 KiB
Bash
Executable File

#!/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 <user> <pass> <db>
# zodat de DB PostgreSQL is voor AIO-import (05-import.sh).
#
# Terugzetten naar snapshot: ssh <pve> 'qm rollback <vmid> <naam>' (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 <doel> '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