2626036a21
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>
184 lines
6.8 KiB
Bash
Executable File
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
|