Files
nextcloud-to-aio/04-install-aio.sh
T
dillard 2626036a21 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>
2026-07-07 01:18:01 +02:00

146 lines
6.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# 04-install-aio.sh — AIO mastercontainer installeren op de doelserver.
#
# Gebruik:
# ./04-install-aio.sh test → NC_STAGING_DOMAIN, poort 11000, skip LE
# ./04-install-aio.sh production → NC_DOMAIN, poort 443, Let's Encrypt cert
#
# Na dit script: handmatige stappen in de AIO-wizard (zie output).
# Wacht tot alle containers groen zijn → dan 05-import.sh draaien.
#
# BELANGRIJK: de mastercontainer bindt poort 443/80/3478 NIET zelf.
# AIO's apache-subcontainer beheert die poorten. Als je die poorten wél aan de
# mastercontainer geeft, faalt de domeincheck omdat beide containers op 443 luisteren.
set -euo pipefail
source "$(dirname "$0")/config.sh"
MODE="${1:-test}"
log() { echo "[$(date '+%H:%M:%S')] $*"; }
if [[ "$MODE" == "production" ]]; then
DOMAIN="${NC_DOMAIN}"
APACHE_PORT=443
SKIP_VALIDATION=""
else
DOMAIN="${NC_STAGING_DOMAIN}"
APACHE_PORT=11000
SKIP_VALIDATION="-e SKIP_DOMAIN_VALIDATION=true"
fi
log "Modus: ${MODE} — domein: ${DOMAIN} — apache-poort: ${APACHE_PORT}"
# ── Snapshot vóór AIO ────────────────────────────────────────────────────────
if [[ "${USE_PROXMOX}" == "true" ]]; then
SNAPSHOT="pre-aio-import-${MODE}"
log "Snapshot '${SNAPSHOT}' aanmaken..."
ssh "${PROXMOX_HOST}" \
"qm snapshot ${PROXMOX_VMID} '${SNAPSHOT}' \
--description 'Voor AIO start (${MODE})' 2>&1"
log "✓ Snapshot klaar."
fi
# ── Staging NC stoppen ───────────────────────────────────────────────────────
log "Staging stack stoppen (indien actief)..."
ssh "${TARGET_SSH}" "
sudo -u www-data php8.3 /var/www/nextcloud/occ maintenance:mode --on 2>/dev/null || true
systemctl stop apache2 php8.3-fpm nextcloud-cron.timer 2>/dev/null || true
echo 'Staging gestopt.'
"
# ── Docker installeren ───────────────────────────────────────────────────────
log "Docker controleren / installeren..."
ssh "${TARGET_SSH}" bash -s << 'REMOTE'
if command -v docker &>/dev/null; then
echo "Docker al aanwezig: $(docker --version)"
exit 0
fi
apt-get update -qq
apt-get install -y ca-certificates curl gnupg lsb-release 2>&1 | tail -1
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg \
-o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
apt-get update -qq
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2>&1 | tail -3
systemctl enable --now docker
echo "Docker geïnstalleerd: $(docker --version)"
REMOTE
# ── AIO mastercontainer starten ──────────────────────────────────────────────
log "AIO mastercontainer starten..."
ssh "${TARGET_SSH}" bash -s << REMOTE
set -e
docker rm -f nextcloud-aio-mastercontainer 2>/dev/null || true
docker run -d \
--name nextcloud-aio-mastercontainer \
--restart always \
-p 8080:8080 \
-e APACHE_PORT=${APACHE_PORT} \
-e APACHE_IP_BINDING=0.0.0.0 \
-e NEXTCLOUD_DATADIR=${TARGET_DATA_PATH} \
${SKIP_VALIDATION} \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
nextcloud/all-in-one:latest
echo ""
echo "Wachten op AIO start (~15s)..."
sleep 15
echo ""
echo "══ AIO PASSPHRASE ══════════════════════════════"
docker logs nextcloud-aio-mastercontainer 2>&1 \
| grep -i "passphrase\|initial passphrase" | tail -3 \
|| docker logs nextcloud-aio-mastercontainer 2>&1 | tail -15
echo "════════════════════════════════════════════════"
REMOTE
# ── App-rapport uit stap 03 printen ─────────────────────────────────────────
log ""
log "Apps die na AIO-import handmatig herinstalleerd moeten worden:"
ssh "${TARGET_SSH}" "
if [ -f /tmp/nc-apps-before.txt ] && [ -f /tmp/nc-apps-after.txt ]; then
AIO_REPLACES='fulltextsearch fulltextsearch_elasticsearch notify_push
spreed whiteboard recognize files_antivirus'
comm -23 \
<(sort /tmp/nc-apps-before.txt) \
<(sort /tmp/nc-apps-after.txt) | while read app; do
echo \"\$AIO_REPLACES\" | grep -qw \"\$app\" || echo \" occ app:install \$app\"
done
else
echo ' (voer eerst 03-upgrade.sh uit voor een volledige lijst)'
fi
" 2>/dev/null || true
# ── Instructies ──────────────────────────────────────────────────────────────
TARGET_IP=$(ssh "${TARGET_SSH}" "hostname -I | awk '{print \$1}'" 2>/dev/null || echo "<doel-ip>")
echo ""
log "══════════════════════════════════════════════════════════════"
log "AIO mastercontainer draait. Handmatige stappen in de browser:"
log ""
log " 1. Open: https://${TARGET_IP}:8080"
log " (self-signed cert → klik door de waarschuwing)"
log " 2. Voer de passphrase in (zie output hierboven)"
log " 3. Stel domein in: ${DOMAIN}"
if [[ "$MODE" == "test" ]]; then
log " 4. 'Skip domain validation' is al geconfigureerd"
fi
log " 5. Selecteer optionele containers:"
log " Minimaal (test): Imaginary"
log " Volledig (prod): Talk, Imaginary, ClamAV, Fulltextsearch, Whiteboard"
log " Office-suite: kies één — Collabora, OnlyOffice, Euro-Office, of geen"
log " 6. Klik 'Save and start containers'"
log " 7. Wacht tot ALLE containers groen zijn (~5-15 min)"
log " Let op: eerste start na import geeft zware CPU-piek door"
log " Elasticsearch-indexering + ClamAV DB-update + Recognize."
log " Plan dit buiten kantooruren."
log ""
log " Daarna: ./05-import.sh"
log "══════════════════════════════════════════════════════════════"