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
+154
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env bash
|
||||
# 05-import.sh — Bestaande NC-database + data importeren in AIO.
|
||||
#
|
||||
# Vereiste: AIO-wizard afgerond, alle containers groen (via https://<doel>:8080).
|
||||
# Draait op de doelserver zelf (gesourcet via SSH).
|
||||
#
|
||||
# Wat het doet:
|
||||
# 1. Dump van de staging-postgres (NC-versie gelijk aan AIO-doelversie)
|
||||
# 2. NC + notify-push stoppen (DB-verbindingen verbreken)
|
||||
# 3. AIO-database vervangen door de staging-dump
|
||||
# 4. NC starten + instanceid/passwordsalt/secret overnemen van staging
|
||||
# 5. maintenance:repair + maintenance:mode --off
|
||||
# 6. groupfolders herinstalleren (AIO start kaal)
|
||||
#
|
||||
# AIO v13+ containernamen (wijken af van oudere docs):
|
||||
# DB-container : nextcloud-aio-database
|
||||
# Database : nextcloud_database
|
||||
# NC-user : oc_nextcloud
|
||||
# Superuser : nextcloud
|
||||
#
|
||||
# Log: /var/log/aio-import.log op de doelserver
|
||||
|
||||
set -euo pipefail
|
||||
source "$(dirname "$0")/config.sh"
|
||||
log() { echo "[$(date '+%H:%M:%S')] $*"; }
|
||||
|
||||
log "05-import.sh starten op ${TARGET_SSH}..."
|
||||
|
||||
ssh "${TARGET_SSH}" bash -s << REMOTE
|
||||
set -euo pipefail
|
||||
log() { echo "[\$(date '+%H:%M:%S')] \$*"; }
|
||||
|
||||
STAGING_DB="${STAGING_DB}"
|
||||
STAGING_DB_USER="${STAGING_DB_USER}"
|
||||
STAGING_DB_PASS="${STAGING_DB_PASS}"
|
||||
TARGET_DATA="${TARGET_DATA_PATH}"
|
||||
|
||||
NC_CONTAINER=nextcloud-aio-nextcloud
|
||||
DB_CONTAINER=nextcloud-aio-database
|
||||
AIO_DB=nextcloud_database
|
||||
AIO_SUPER=nextcloud
|
||||
AIO_NCUSER=oc_nextcloud
|
||||
DUMP=/tmp/nc_aio_import.sql
|
||||
|
||||
{
|
||||
log "═══ AIO import start ═══"
|
||||
|
||||
# ── Sanity checks ────────────────────────────────────────────────────────────
|
||||
for c in "\$NC_CONTAINER" "\$DB_CONTAINER"; do
|
||||
docker ps --format '{{.Names}}' | grep -q "^\${c}$" || {
|
||||
log "FOUT: container \${c} niet actief."
|
||||
log "Zorg dat alle AIO-containers groen zijn in de wizard (https://<doel>:8080)."
|
||||
exit 1
|
||||
}
|
||||
done
|
||||
|
||||
# ── Staging-waarden uitlezen ─────────────────────────────────────────────────
|
||||
# Deze drie waarden koppelen de NC-sessies aan de database.
|
||||
# Ze MOETEN overeenkomen met de waarden in de te importeren DB.
|
||||
OCC_STAGING="sudo -u www-data php8.3 /var/www/nextcloud/occ"
|
||||
if command -v php8.3 &>/dev/null && [ -f /var/www/nextcloud/occ ]; then
|
||||
INSTANCEID=\$(\$OCC_STAGING config:system:get instanceid 2>/dev/null)
|
||||
PASSWORDSALT=\$(\$OCC_STAGING config:system:get passwordsalt 2>/dev/null)
|
||||
SECRET=\$(\$OCC_STAGING config:system:get secret 2>/dev/null)
|
||||
log "instanceid/passwordsalt/secret uitgelezen uit staging-stack."
|
||||
else
|
||||
log "FOUT: staging-stack (php8.3 / occ) niet beschikbaar."
|
||||
log "Zet INSTANCEID, PASSWORDSALT en SECRET handmatig bovenaan dit script,"
|
||||
log "of herstart 02-build-staging.sh zodat de staging-stack aanwezig is."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# AIO DB-wachtwoord voor oc_nextcloud (staat in AIO's config.php)
|
||||
NCPASS=\$(docker exec "\$NC_CONTAINER" \
|
||||
php /var/www/html/occ config:system:get dbpassword 2>/dev/null || true)
|
||||
[ -z "\$NCPASS" ] && { log "FOUT: kon dbpassword niet uitlezen uit AIO-container."; exit 1; }
|
||||
log "AIO dbpassword aanwezig."
|
||||
|
||||
# ── 1. Staging-postgres dumpen ───────────────────────────────────────────────
|
||||
log "1/6 Staging-postgres dumpen (--no-owner --no-acl)..."
|
||||
sudo -u postgres pg_dump --no-owner --no-acl -Fp "\$STAGING_DB" > "\$DUMP"
|
||||
log "Dump klaar: \$(du -sh \$DUMP | cut -f1)"
|
||||
|
||||
# ── 2. NC + notify-push stoppen ──────────────────────────────────────────────
|
||||
log "2/6 NC + notify-push stoppen..."
|
||||
docker stop "\$NC_CONTAINER" nextcloud-aio-notify-push 2>/dev/null || true
|
||||
docker exec "\$DB_CONTAINER" psql -U "\$AIO_SUPER" -d postgres \
|
||||
-c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity
|
||||
WHERE datname = '\$AIO_DB';" 2>/dev/null || true
|
||||
log "Containers gestopt."
|
||||
|
||||
# ── 3. AIO-database vervangen ────────────────────────────────────────────────
|
||||
log "3/6 AIO DB droppen en opnieuw aanmaken..."
|
||||
docker exec "\$DB_CONTAINER" psql -U "\$AIO_SUPER" -d postgres \
|
||||
-c "DROP DATABASE IF EXISTS \${AIO_DB};"
|
||||
docker exec "\$DB_CONTAINER" psql -U "\$AIO_SUPER" -d postgres \
|
||||
-c "CREATE DATABASE \${AIO_DB} OWNER \${AIO_NCUSER}
|
||||
ENCODING 'UTF8'
|
||||
LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8'
|
||||
TEMPLATE template0;"
|
||||
|
||||
log "4/6 Dump restoren als \$AIO_NCUSER..."
|
||||
docker exec -e PGPASSWORD="\$NCPASS" -i "\$DB_CONTAINER" \
|
||||
psql -U "\$AIO_NCUSER" "\$AIO_DB" < "\$DUMP"
|
||||
|
||||
# Verifieer eigenaarschap — alle tabellen moeten van oc_nextcloud zijn
|
||||
OWNERS=\$(docker exec "\$DB_CONTAINER" psql -U "\$AIO_SUPER" "\$AIO_DB" \
|
||||
-tAc "SELECT tableowner, count(*) FROM pg_tables
|
||||
WHERE schemaname='public' GROUP BY tableowner;")
|
||||
log "Tabeleigenaarschap na restore: \$OWNERS"
|
||||
|
||||
# ── 5. NC starten + config bijwerken ────────────────────────────────────────
|
||||
log "5/6 NC starten + instanceid/passwordsalt/secret bijwerken..."
|
||||
docker start "\$NC_CONTAINER"
|
||||
for i in \$(seq 1 30); do
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ status &>/dev/null && break || true
|
||||
sleep 3
|
||||
done
|
||||
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ \
|
||||
config:system:set instanceid --value="\$INSTANCEID"
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ \
|
||||
config:system:set passwordsalt --value="\$PASSWORDSALT"
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ \
|
||||
config:system:set secret --value="\$SECRET"
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ \
|
||||
config:system:set datadirectory --value="/mnt/ncdata"
|
||||
log "config.php bijgewerkt."
|
||||
|
||||
# ── 6. Repair + maintenance uit ─────────────────────────────────────────────
|
||||
log "6/6 maintenance:repair + maintenance:mode --off..."
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ \
|
||||
maintenance:repair --include-expensive 2>&1 | tail -20
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ maintenance:mode --off
|
||||
|
||||
# groupfolders herinstalleren (AIO start kaal, app zit in de DB maar niet in de container)
|
||||
log "groupfolders installeren..."
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ app:install groupfolders 2>&1 | tail -2 || \
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ app:enable groupfolders 2>&1 | tail -2
|
||||
|
||||
docker exec "\$NC_CONTAINER" php /var/www/html/occ status
|
||||
|
||||
log "═══ AIO import klaar ═══"
|
||||
log ""
|
||||
log "Controleer NC via: https://${NC_DOMAIN}"
|
||||
log ""
|
||||
log "Volgende stappen:"
|
||||
log " • Snapshot aanmaken: ssh <pve> 'qm snapshot <vmid> aio-import-ok'"
|
||||
log " • Apps herinstalleren (zie output van 03-upgrade.sh / 04-install-aio.sh)"
|
||||
log " • DNS-cutover naar productie-IP (als dat nog niet gebeurd is)"
|
||||
log " • Contabo / bron uit maintenance halen na verificatie"
|
||||
|
||||
} 2>&1 | tee /var/log/aio-import.log
|
||||
REMOTE
|
||||
Reference in New Issue
Block a user