#!/usr/bin/env bash # 01-transfer.sh — Rsync bestanden + database-dump van bronserver naar doelserver. # # Wat het doet: # 1. Genereert SSH-key op doel en voegt die toe aan bron (authorized_keys) # 2. Rsynct NC-app, configs, crontabs → /root/staging/ # 3. Maakt een database-dump op de bron (PostgreSQL of MySQL/MariaDB) # 4. Rsynct ncdata → TARGET_DATA_PATH (herstart-veilig via --partial) # # Herstart-veilig: rsync --partial; dit script is idempotent (delta op re-run). # Voortgang volgen: ssh 'tail -f /var/log/pull-source.log' set -euo pipefail source "$(dirname "$0")/config.sh" log() { echo "[$(date '+%H:%M:%S')] $*"; } # ── STAP 1: SSH-key op doel → bron ─────────────────────────────────────────── log "SSH-key genereren op doel (indien nodig)..." ssh "${TARGET_SSH}" "test -f /root/.ssh/id_ed25519 || \ ssh-keygen -t ed25519 -N '' -f /root/.ssh/id_ed25519 -C nc-migration-pull" TARGETKEY=$(ssh "${TARGET_SSH}" "cat /root/.ssh/id_ed25519.pub") log "Key toevoegen aan bron authorized_keys (indien nodig)..." ssh "${SOURCE_USER}@${SOURCE_HOST}" \ "grep -qF '${TARGETKEY}' /root/.ssh/authorized_keys 2>/dev/null || \ echo '${TARGETKEY}' >> /root/.ssh/authorized_keys" log "Hostkey accepteren + verbinding testen van doel naar bron..." ssh "${TARGET_SSH}" " ssh-keyscan -H ${SOURCE_HOST} >> /root/.ssh/known_hosts 2>/dev/null ssh -o ConnectTimeout=10 ${SOURCE_USER}@${SOURCE_HOST} hostname " # ── DB-dump commando samenstellen ──────────────────────────────────────────── # AIO gebruikt PostgreSQL; als de bron MySQL/MariaDB is, wordt de DB later # geconverteerd via 'occ db:convert-type pgsql' (na de upgrade-keten, voor AIO-import). if [[ "${SOURCE_DB_TYPE}" == "mysql" ]]; then # Wachtwoord op de command line is niet ideaal maar werkt voor eenmalige migratie. # Alternatief: zet een .my.cnf op de bronserver met [mysqldump] credentials. DUMP_CMD="mysqldump -u '${SOURCE_DB_USER}' -p'${SOURCE_DB_PASS}' '${SOURCE_DB}' | gzip" else DUMP_CMD="sudo -u postgres pg_dump '${SOURCE_DB}' | gzip" fi # ── STAP 2: Pull-script op doel plaatsen en starten ────────────────────────── log "pull-source.sh plaatsen op doel..." ssh "${TARGET_SSH}" "cat > /root/pull-source.sh" << EOF #!/bin/bash # Draait op doel. Log: /var/log/pull-source.log set -uo pipefail SRC="${SOURCE_USER}@${SOURCE_HOST}" { echo "===== START \$(date) =====" mkdir -p /root/staging/etc echo "== 1/4 NC-app ==" rsync -aHAX --numeric-ids --partial \ \${SRC}:${SOURCE_NC_PATH}/ /root/staging/nextcloud-app/ echo "== 2/4 configs ==" rsync -aH --numeric-ids \${SRC}:/etc/apache2/ /root/staging/etc/apache2/ 2>/dev/null || true rsync -aH --numeric-ids \${SRC}:/etc/php/ /root/staging/etc/php/ 2>/dev/null || true rsync -aH --numeric-ids \${SRC}:/etc/letsencrypt/ /root/staging/etc/letsencrypt/ 2>/dev/null || true rsync -aH --numeric-ids \${SRC}:/var/scripts/ /root/staging/var-scripts/ 2>/dev/null || true ssh \${SRC} 'crontab -l' > /root/staging/crontab-root.txt 2>/dev/null || true ssh \${SRC} 'crontab -u www-data -l' > /root/staging/crontab-www-data.txt 2>/dev/null || true echo "== 3/4 database dump (${SOURCE_DB_TYPE}: ${SOURCE_DB}) ==" ssh \${SRC} '${DUMP_CMD}' > /root/staging/${SOURCE_DB}-\$(date +%F).sql.gz ls -lh /root/staging/${SOURCE_DB}-*.sql.gz | tail -1 echo "== 4/4 ncdata ==" rsync -aHAX --numeric-ids --partial --info=stats1 \ \${SRC}:${SOURCE_DATA_PATH}/ ${TARGET_DATA_PATH}/ echo "===== KLAAR \$(date) =====" df -h ${TARGET_DATA_PATH} } >> /var/log/pull-source.log 2>&1 EOF ssh "${TARGET_SSH}" "chmod +x /root/pull-source.sh" # ── STAP 3: Starten met nohup ──────────────────────────────────────────────── log "Transfer starten (nohup, herstart-veilig)..." ssh "${TARGET_SSH}" "nohup /root/pull-source.sh > /dev/null 2>&1 & echo PID: \$!" log "✓ Transfer draait op de achtergrond." log " Voortgang: ssh 'tail -f /var/log/pull-source.log'" log " Schijfruimte: ssh 'df -h ${TARGET_DATA_PATH}'"