#!/usr/bin/env bash
# n8n sicher aktualisieren: vollständig sichern -> feste Version eintragen -> laden -> starten -> prüfen
#
#   ./n8n-update.sh 2.40.5
#
# Erwartet den Aufbau aus der Schulung: Ordner /opt/n8n mit compose.yml und .env,
# Container "n8n", Volume "n8n_n8n_data", Version als N8N_VERSION in der .env.
# Bricht ab, sobald ein Schritt der Sicherung scheitert, und ändert dann nichts.
set -euo pipefail
cd "$(dirname "$0")"

NEU="${1:?Aufruf: $0 <neue Version, z. B. 2.40.5>}"
ALT="$(grep -E '^N8N_VERSION=' .env | cut -d= -f2)"
VOLUME="$(docker volume ls -q | grep -E '_n8n_data$' | head -1)"
B="backups/vor-${NEU}-$(date +%F-%H%M)"

[ "$ALT" = "$NEU" ] && { echo "Läuft schon: $ALT"; exit 0; }
echo "==> Update $ALT -> $NEU, Sicherung nach $B"
mkdir -p "$B"

echo "==> 1/5 Workflows und Zugänge exportieren"
docker exec n8n n8n export:workflow --backup --output=/home/node/.n8n/sicherung/workflows/
docker exec n8n n8n export:credentials --backup --output=/home/node/.n8n/sicherung/zugaenge/
docker cp n8n:/home/node/.n8n/sicherung "$B/"

echo "==> 2/5 Datenvolume sichern (n8n kurz angehalten)"
docker compose stop
docker run --rm -v "$VOLUME":/daten:ro -v "$PWD/$B":/ziel alpine tar czf /ziel/n8n_data.tar.gz -C /daten .
cp .env "$B/env.sicherung" && chmod 600 "$B/env.sicherung"
ls -lh "$B"

echo "==> 3/5 Version $NEU eintragen"
sed -i "s/^N8N_VERSION=.*/N8N_VERSION=${NEU}/" .env

echo "==> 4/5 Laden und starten"
docker compose pull
docker compose up -d

echo "==> 5/5 Prüfen"
for i in $(seq 1 60); do curl -sf http://127.0.0.1:5678/healthz >/dev/null && break; sleep 2; done
docker exec n8n n8n --version
docker compose logs n8n | grep -E 'version change|Version:' | tail -2 || true
curl -s http://127.0.0.1:5678/healthz; echo

cat <<HINWEIS

Fertig. Jetzt im Browser prüfen: About n8n, Workflows veröffentlicht, ein Testformular.
Rückweg, nur falls nötig:
  docker compose down
  docker run --rm -v $VOLUME:/daten -v \$PWD/$B:/quelle:ro alpine \
    sh -c "rm -rf /daten/* /daten/.[!.]* 2>/dev/null; tar xzf /quelle/n8n_data.tar.gz -C /daten"
  sed -i 's/^N8N_VERSION=.*/N8N_VERSION=${ALT}/' .env
  docker compose up -d
HINWEIS
