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:
2026-07-07 01:18:01 +02:00
commit 2626036a21
9 changed files with 1311 additions and 0 deletions
+215
View File
@@ -0,0 +1,215 @@
#!/usr/bin/env bash
# 02-build-staging.sh — Bouwt de staging NC-stack op de doelserver.
#
# Doel: exact genoeg om 'occ upgrade' te kunnen draaien richting AIO-doelversie.
# Apache luistert alleen op :80 intern; geen SSL.
# Na geslaagde AIO-import: apt purge apache2 php8.3* postgresql mariadb-server
#
# Ondersteunt PostgreSQL en MySQL/MariaDB als brontype (SOURCE_DB_TYPE in config.sh).
# AIO gebruikt altijd PostgreSQL. Bij MySQL-bron: na de upgrade-keten converteren
# met 'occ db:convert-type pgsql' vóór 05-import.sh.
#
# Log op doel: /var/log/build-staging.log
set -euo pipefail
source "$(dirname "$0")/config.sh"
log() { echo "[$(date '+%H:%M:%S')] $*"; }
log "Staging stack bouwen op ${TARGET_SSH}..."
ssh "${TARGET_SSH}" bash -s << REMOTE
set -euo pipefail
log() { echo "[\$(date '+%H:%M:%S')] \$*"; }
# Config-variabelen (expanded door lokale shell)
STAGING_DB="${STAGING_DB}"
STAGING_DB_USER="${STAGING_DB_USER}"
STAGING_DB_PASS="${STAGING_DB_PASS}"
DB_TYPE="${SOURCE_DB_TYPE}"
TARGET_DATA="${TARGET_DATA_PATH}"
SOURCE_DB_NAME="${SOURCE_DB}"
{
# ── 1. PHP 8.3 repo + pakketten ───────────────────────────────────────────────
log "1/7 Pakketten installeren..."
# Debian 13 levert PHP 8.4; NC v30 vereist max PHP 8.3 → sury.org repo.
# Pas dit aan als je start vanaf NC v32+ (dan werkt PHP 8.4 wel).
apt-get update -qq
apt-get install -y curl ca-certificates lsb-release gnupg2 2>&1 | tail -1
curl -fsSL https://packages.sury.org/php/apt.gpg \
-o /etc/apt/keyrings/sury-php.gpg
echo "deb [signed-by=/etc/apt/keyrings/sury-php.gpg] https://packages.sury.org/php/ \$(lsb_release -sc) main" \
> /etc/apt/sources.list.d/sury-php.list
apt-get update -qq
# PHP-extensies gemeenschappelijk
PHP_COMMON="php8.3-fpm php8.3-cli php8.3-gd php8.3-curl php8.3-xml php8.3-zip
php8.3-mbstring php8.3-intl php8.3-bcmath php8.3-gmp
php8.3-imagick php8.3-redis php8.3-apcu php8.3-ldap php8.3-bz2"
if [[ "\$DB_TYPE" == "mysql" ]]; then
apt-get install -y apache2 libapache2-mod-fcgid \
mariadb-server \
php8.3-mysql \
\$PHP_COMMON redis-server 2>&1 | tail -3
else
apt-get install -y apache2 libapache2-mod-fcgid \
postgresql \
php8.3-pgsql \
\$PHP_COMMON redis-server 2>&1 | tail -3
fi
# ── 2. NC-app op zijn plek ────────────────────────────────────────────────────
log "2/7 NC-app kopiëren naar /var/www/nextcloud..."
rsync -a --delete /root/staging/nextcloud-app/ /var/www/nextcloud/
chown -R www-data:www-data /var/www/nextcloud
chmod -R 750 /var/www/nextcloud
chown -R www-data:www-data "\$TARGET_DATA"
# ── 3. Database: aanmaken + dump restoren ────────────────────────────────────
log "3/7 Database inrichten (\$DB_TYPE)..."
DUMP_FILE=\$(ls -t /root/staging/\${SOURCE_DB_NAME}-*.sql.gz 2>/dev/null | head -1)
[ -z "\$DUMP_FILE" ] && { echo "FOUT: geen dump gevonden in /root/staging/"; exit 1; }
log "Dump: \$DUMP_FILE (\$(du -sh "\$DUMP_FILE" | cut -f1))"
if [[ "\$DB_TYPE" == "mysql" ]]; then
systemctl enable --now mariadb
mysql -e "CREATE USER IF NOT EXISTS '\${STAGING_DB_USER}'@'localhost' IDENTIFIED BY '\${STAGING_DB_PASS}';" 2>/dev/null || true
mysql -e "CREATE DATABASE IF NOT EXISTS \${STAGING_DB} CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" 2>/dev/null || true
mysql -e "GRANT ALL PRIVILEGES ON \${STAGING_DB}.* TO '\${STAGING_DB_USER}'@'localhost'; FLUSH PRIVILEGES;"
log "Dump restoren naar MariaDB..."
zcat "\$DUMP_FILE" | mysql -u "\$STAGING_DB_USER" -p"\$STAGING_DB_PASS" "\$STAGING_DB"
else
systemctl enable --now postgresql
sudo -u postgres psql -tc "SELECT 1 FROM pg_roles WHERE rolname='\$STAGING_DB_USER'" | grep -q 1 || \
sudo -u postgres psql -c "CREATE USER \${STAGING_DB_USER} WITH PASSWORD '\${STAGING_DB_PASS}';"
sudo -u postgres psql -tc "SELECT 1 FROM pg_database WHERE datname='\$STAGING_DB'" | grep -q 1 || \
sudo -u postgres createdb -O "\$STAGING_DB_USER" "\$STAGING_DB"
log "Dump restoren naar PostgreSQL..."
# Restore als de DB-user zodat tabeleigenaarschap direct klopt
PGPASSWORD="\$STAGING_DB_PASS" zcat "\$DUMP_FILE" | \
sudo -u postgres psql -U "\$STAGING_DB_USER" "\$STAGING_DB"
fi
# ── 4. PHP-FPM pool ──────────────────────────────────────────────────────────
log "4/7 PHP-FPM pool configureren..."
cat > /etc/php/8.3/fpm/pool.d/nextcloud.conf << 'EOF'
[nextcloud]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.nextcloud.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 20
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 10
php_admin_value[memory_limit] = 512M
php_admin_value[upload_max_filesize] = 10G
php_admin_value[post_max_size] = 10G
php_admin_value[max_execution_time] = 3600
EOF
rm -f /etc/php/8.3/fpm/pool.d/www.conf
sed -i 's/^memory_limit.*/memory_limit = 512M/' /etc/php/8.3/cli/php.ini
# apc.enable_cli=1 is vereist voor occ; zonder dit falen APCu-afhankelijke commando's stil
grep -q "apc.enable_cli" /etc/php/8.3/cli/php.ini || echo "apc.enable_cli=1" >> /etc/php/8.3/cli/php.ini
systemctl enable --now php8.3-fpm
# ── 5. Apache vhost (HTTP-only, intern) ──────────────────────────────────────
log "5/7 Apache vhost configureren..."
a2enmod proxy_fcgi setenvif rewrite headers env dir mime authz_core 2>/dev/null || true
a2enconf php8.3-fpm 2>/dev/null || true
cat > /etc/apache2/sites-available/nextcloud.conf << 'EOF'
<VirtualHost *:80>
ServerName _default_
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud>
Options +FollowSymlinks
AllowOverride All
Require all granted
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.nextcloud.sock|fcgi://localhost"
</FilesMatch>
ErrorLog \${APACHE_LOG_DIR}/nextcloud-error.log
CustomLog \${APACHE_LOG_DIR}/nextcloud-access.log combined
</VirtualHost>
EOF
a2dissite 000-default 2>/dev/null || true
a2ensite nextcloud
systemctl enable --now apache2
apache2ctl configtest
# ── 6. config.php patchen voor staging ───────────────────────────────────────
log "6/7 config.php patchen voor staging (geen SSL, intern)..."
# config.php definieert \$CONFIG maar returnt het niet; gebruik require (niet include).
if [[ "\$DB_TYPE" == "mysql" ]]; then
DB_HOST="localhost"
DB_PORT="3306"
else
DB_HOST="localhost"
DB_PORT="5432"
fi
TARGET_IP=\$(hostname -I | awk '{print \$1}')
php8.3 -r "
require '/var/www/nextcloud/config/config.php';
\\\$CONFIG['trusted_domains'] = ['\$TARGET_IP', 'localhost'];
\\\$CONFIG['overwrite.cli.url'] = 'http://\$TARGET_IP';
\\\$CONFIG['overwriteprotocol'] = 'http';
\\\$CONFIG['maintenance'] = false;
\\\$CONFIG['dbhost'] = '\$DB_HOST';
\\\$CONFIG['dbport'] = '\$DB_PORT';
\\\$CONFIG['dbpassword'] = '\$STAGING_DB_PASS';
\\\$CONFIG['datadirectory'] = '\$TARGET_DATA';
\\\$CONFIG['redis'] = ['host' => '127.0.0.1', 'port' => 6379];
\\\$CONFIG['memcache.local'] = '\\\\OC\\\\Memcache\\\\APCu';
\\\$CONFIG['memcache.locking'] = '\\\\OC\\\\Memcache\\\\Redis';
\\\$out = \"<?php\n\\\\\\\$CONFIG = \" . var_export(\\\$CONFIG, true) . \";\n\";
file_put_contents('/var/www/nextcloud/config/config.php', \\\$out);
echo 'config.php geschreven' . PHP_EOL;
"
chown www-data:www-data /var/www/nextcloud/config/config.php
# ── 7. Cron + verificatie ─────────────────────────────────────────────────────
log "7/7 Cron instellen + occ status controleren..."
cat > /etc/systemd/system/nextcloud-cron.service << 'EOF'
[Unit]
Description=Nextcloud cron
[Service]
User=www-data
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
EOF
cat > /etc/systemd/system/nextcloud-cron.timer << 'EOF'
[Unit]
Description=Nextcloud cron timer
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
EOF
systemctl enable --now nextcloud-cron.timer
sudo -u www-data php8.3 /var/www/nextcloud/occ status
log "✓ Staging stack klaar."
log " occ: sudo -u www-data php8.3 /var/www/nextcloud/occ <commando>"
log " Logs: /var/log/apache2/nextcloud-error.log"
} 2>&1 | tee /var/log/build-staging.log
REMOTE
log "✓ Script klaar. Voortgang: ssh <doel> 'tail -f /var/log/build-staging.log'"