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>
This commit is contained in:
Executable
+183
@@ -0,0 +1,183 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user