diff --git a/deploy-yourpart-bluegreen.sh b/deploy-yourpart-bluegreen.sh new file mode 100755 index 0000000..d724565 --- /dev/null +++ b/deploy-yourpart-bluegreen.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Blue-Green: Deploy in einen Slot (TARGET), ohne /opt/yourpart als echtes Verzeichnis anzulegen. +# Live-Umschaltung: ln -sfn /opt/yourpart +# +# Aufruf (auf dem Server, im Repo-Root nach git pull): +# ./deploy-yourpart-bluegreen.sh /opt/yourpart-green +# +# Voraussetzung: /opt/yourpart ist ein Symlink auf den aktiven Slot. + +set -euo pipefail + +CURRENT_LINK="${CURRENT_LINK:-/opt/yourpart}" +TARGET="${1:?Ziel-Slot-Verzeichnis fehlt (z. B. /opt/yourpart-green)}" + +if [ ! -L "$CURRENT_LINK" ]; then + echo "❌ ERROR: $CURRENT_LINK ist kein Symlink! (Blue-Green erfordert Symlink auf den aktiven Slot.)" >&2 + exit 1 +fi + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +exec ./update.sh "$TARGET" diff --git a/update-backend.sh b/update-backend.sh index d1028bd..a8194dd 100755 --- a/update-backend.sh +++ b/update-backend.sh @@ -1,9 +1,13 @@ #!/bin/bash +set -euo pipefail -# Optionaler Parameter für STAGE (Standard: production) -STAGE=${1:-production} +TARGET_DIR="${1:?Zielverzeichnis fehlt: ./update-backend.sh [STAGE]}" +# Zweiter Parameter: STAGE für DB-Sync (früher erster Parameter) +STAGE="${2:-production}" +BACKEND_TARGET="$TARGET_DIR/backend" echo "Updating YourPart Backend..." +echo "Ziel: $BACKEND_TARGET" echo "Using STAGE: $STAGE" echo "NOTE: .env files will NOT be overwritten" @@ -20,45 +24,45 @@ rm -rf tmp/ echo "Installing dependencies..." npm ci --production -# Sichere .env-Dateien aus /opt/yourpart/backend temporär +# Sichere .env-Dateien aus dem Ziel-Backend temporär TEMP_ENV_DIR="/tmp/yourpart-env-backup-$$" -echo "Sichere .env-Dateien aus /opt/yourpart/backend..." +echo "Sichere .env-Dateien aus $BACKEND_TARGET..." sudo mkdir -p "$TEMP_ENV_DIR" -if [ -d /opt/yourpart/backend ]; then - sudo find /opt/yourpart/backend -maxdepth 1 -name '.env*' -type f -exec cp {} "$TEMP_ENV_DIR/" \; 2>/dev/null || true +if [ -d "$BACKEND_TARGET" ]; then + sudo find "$BACKEND_TARGET" -maxdepth 1 -name '.env*' -type f -exec cp {} "$TEMP_ENV_DIR/" \; 2>/dev/null || true if [ "$(ls -A $TEMP_ENV_DIR 2>/dev/null)" ]; then echo "✓ .env-Dateien gesichert: $(ls $TEMP_ENV_DIR)" else - echo "⚠ Keine .env-Dateien in /opt/yourpart/backend gefunden" + echo "⚠ Keine .env-Dateien in $BACKEND_TARGET gefunden" fi fi # Altes Backend löschen echo "Lösche altes Backend..." -sudo rm -rf /opt/yourpart/backend +sudo rm -rf "$BACKEND_TARGET" # Erstelle Backend-Verzeichnis echo "Erstelle Backend-Verzeichnis..." -sudo mkdir -p /opt/yourpart/backend +sudo mkdir -p "$BACKEND_TARGET" sudo mkdir -p /opt/yourpart-data/adult-verification # Kopiere neues Backend (ohne .env-Dateien aus dem Quellverzeichnis) echo "Kopiere neues Backend..." if command -v rsync &> /dev/null; then - sudo rsync -av --exclude='.env*' --exclude='node_modules' . /opt/yourpart/backend/ 2>/dev/null + sudo rsync -av --exclude='.env*' --exclude='node_modules' . "$BACKEND_TARGET/" 2>/dev/null if [ -d node_modules ]; then - sudo rsync -av --exclude='.env*' node_modules/ /opt/yourpart/backend/node_modules/ 2>/dev/null || \ - sudo cp -r node_modules /opt/yourpart/backend/ 2>/dev/null + sudo rsync -av --exclude='.env*' node_modules/ "$BACKEND_TARGET/node_modules/" 2>/dev/null || \ + sudo cp -r node_modules "$BACKEND_TARGET/" 2>/dev/null fi else # Fallback: Kopiere alles außer .env - sudo cp -r * /opt/yourpart/backend/ 2>/dev/null + sudo cp -r * "$BACKEND_TARGET/" 2>/dev/null fi # Stelle .env-Dateien wieder her echo "Stelle .env-Dateien wieder her..." if [ -d "$TEMP_ENV_DIR" ] && [ "$(ls -A $TEMP_ENV_DIR 2>/dev/null)" ]; then - sudo cp "$TEMP_ENV_DIR"/.env* /opt/yourpart/backend/ 2>/dev/null || true + sudo cp "$TEMP_ENV_DIR"/.env* "$BACKEND_TARGET/" 2>/dev/null || true echo "✓ .env-Dateien wiederhergestellt" else echo "⚠ Keine .env-Dateien zum Wiederherstellen vorhanden" @@ -66,22 +70,22 @@ fi sudo rm -rf "$TEMP_ENV_DIR" # Prüfe ob .env vorhanden ist -if [ -f /opt/yourpart/backend/.env ]; then +if [ -f "$BACKEND_TARGET/.env" ]; then echo "✓ .env-Datei ist vorhanden" else - echo "⚠ WARNUNG: Keine .env-Datei in /opt/yourpart/backend gefunden!" - echo " Bitte manuell erstellen: sudo nano /opt/yourpart/backend/.env" + echo "⚠ WARNUNG: Keine .env-Datei in $BACKEND_TARGET gefunden!" + echo " Bitte manuell erstellen: sudo nano $BACKEND_TARGET/.env" fi # Berechtigungen setzen echo "Setting permissions..." -sudo chown -R yourpart:yourpart /opt/yourpart/backend -sudo chmod -R 755 /opt/yourpart/backend +sudo chown -R yourpart:yourpart "$BACKEND_TARGET" +sudo chmod -R 755 "$BACKEND_TARGET" sudo chown -R yourpart:yourpart /opt/yourpart-data sudo chmod -R 755 /opt/yourpart-data # Stelle sicher, dass .env-Dateien die richtigen Berechtigungen haben -if [ -f /opt/yourpart/backend/.env ]; then - sudo chmod 600 /opt/yourpart/backend/.env +if [ -f "$BACKEND_TARGET/.env" ]; then + sudo chmod 600 "$BACKEND_TARGET/.env" fi # Systemd-Service aktualisieren und neu laden @@ -91,7 +95,7 @@ sudo systemctl daemon-reload # Datenbank-Synchronisation durchführen echo "Running database synchronization..." -cd /opt/yourpart/backend +cd "$BACKEND_TARGET" # STAGE für Schema-Updates verwenden echo "Running database sync with STAGE=$STAGE..." diff --git a/update-frontend.sh b/update-frontend.sh index 441de6e..752ebce 100755 --- a/update-frontend.sh +++ b/update-frontend.sh @@ -1,6 +1,11 @@ #!/bin/bash +set -euo pipefail + +TARGET_DIR="${1:?Zielverzeichnis fehlt: ./update-frontend.sh }" +FRONTEND_TARGET="$TARGET_DIR/frontend" echo "=== YourPart Frontend Update ===" +echo "Ziel: $FRONTEND_TARGET" echo "NOTE: .env files will NOT be overwritten" # 1. Zum Frontend-Verzeichnis wechseln @@ -21,9 +26,9 @@ rm -rf node_modules/.cache/ # 4. Verwende bestehende .env-Dateien im Zielverzeichnis für Build # Kopiere temporär die bestehende .env vom Ziel, falls vorhanden TEMP_ENV="/tmp/yourpart-frontend-env-$$" -if [ -f /opt/yourpart/frontend/.env ]; then +if [ -f "$FRONTEND_TARGET/.env" ]; then echo "Nutze bestehende .env-Datei vom Zielverzeichnis für Build..." - sudo cp /opt/yourpart/frontend/.env "$TEMP_ENV" + sudo cp "$FRONTEND_TARGET/.env" "$TEMP_ENV" sudo chown $USER:$USER "$TEMP_ENV" cp "$TEMP_ENV" .env elif [ -f .env.production ]; then @@ -73,36 +78,36 @@ rm -f "$TEMP_ENV" # 6. Zielverzeichnis erstellen (falls nicht vorhanden) echo "Erstelle Zielverzeichnis..." -sudo mkdir -p /opt/yourpart/frontend/dist +sudo mkdir -p "$FRONTEND_TARGET/dist" # 7. Altes Frontend löschen (außer .env-Dateien) echo "Lösche altes Frontend (außer .env-Dateien)..." -sudo find /opt/yourpart/frontend/dist -mindepth 1 -exec rm -rf {} + 2>/dev/null || true +sudo find "$FRONTEND_TARGET/dist" -mindepth 1 -exec rm -rf {} + 2>/dev/null || true # 8. Neues Frontend kopieren echo "Kopiere neues Frontend..." -sudo cp -r dist/* /opt/yourpart/frontend/dist/ +sudo cp -r dist/* "$FRONTEND_TARGET/dist/" # 9. .env-Dateien NICHT überschreiben - bestehende beibehalten -if [ -f /opt/yourpart/frontend/.env ]; then +if [ -f "$FRONTEND_TARGET/.env" ]; then echo "✓ Bestehende .env-Datei wurde beibehalten (nicht überschrieben)" else echo "⚠ Keine .env-Datei im Zielverzeichnis gefunden" # Falls .env im Quellverzeichnis existiert, kopiere sie nur wenn sie im Ziel nicht existiert if [ -f .env ]; then echo "Kopiere .env-Datei (nur wenn nicht vorhanden)..." - sudo cp .env /opt/yourpart/frontend/ + sudo cp .env "$FRONTEND_TARGET/" fi fi # 10. Berechtigungen setzen echo "Setze Berechtigungen..." -sudo chown -R www-data:www-data /opt/yourpart/frontend/dist -if [ -f /opt/yourpart/frontend/.env ]; then - sudo chown www-data:www-data /opt/yourpart/frontend/.env - sudo chmod 644 /opt/yourpart/frontend/.env +sudo chown -R www-data:www-data "$FRONTEND_TARGET/dist" +if [ -f "$FRONTEND_TARGET/.env" ]; then + sudo chown www-data:www-data "$FRONTEND_TARGET/.env" + sudo chmod 644 "$FRONTEND_TARGET/.env" fi -sudo chmod -R 755 /opt/yourpart/frontend/dist +sudo chmod -R 755 "$FRONTEND_TARGET/dist" # 11. Apache neu laden echo "Lade Apache neu..." @@ -115,4 +120,3 @@ echo "✅ Frontend aktualisiert" echo "✅ .env-Dateien wurden NICHT überschrieben" echo "✅ Apache neu geladen" echo "" - diff --git a/update.sh b/update.sh index 7274ee2..64dfc40 100755 --- a/update.sh +++ b/update.sh @@ -1,7 +1,10 @@ #!/usr/bin/env bash set -euo pipefail +TARGET_DIR="${1:?Zielverzeichnis fehlt: ./update.sh }" + echo "=== YourPart Update Script ===" +echo "Ziel-Slot: $TARGET_DIR" echo "Aktualisiert die Anwendung, ohne .env-Dateien zu überschreiben" echo "" @@ -35,11 +38,11 @@ fi echo "" echo "=== Updating Backend ===" -./update-backend.sh +./update-backend.sh "$TARGET_DIR" echo "" echo "=== Building and Updating Frontend ===" -./update-frontend.sh +./update-frontend.sh "$TARGET_DIR" echo "" echo "=== Update Completed! ==="