#!/usr/bin/env bash # 05-import.sh — Bestaande NC-database + data importeren in AIO. # # Vereiste: AIO-wizard afgerond, alle containers groen (via https://: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://: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 'qm snapshot 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