#!/usr/bin/env bash # deploy-vps.sh — Synchronisiert den eldov-win Workspace auf den VPS-Container. # Host: free-warez.win · Container-Pfad: /opt/containers/eldov-portfolio # # eldov.win läuft auf demselben VPS wie w-make.com und minecraft-portal. # Traefik routet dort die Subdomains per Docker-Labels. # # Voraussetzungen: # - ssh-Zugang zu free-warez.win ist konfiguriert # - .env.local ist lokal vorhanden (wird NICHT übertragen) # - auf dem VPS liegt bereits ein Container namens 'eldov-portfolio' set -euo pipefail VPS_HOST="${VPS_HOST:-free-warez.win}" VPS_DIR="${VPS_DIR:-/opt/containers/eldov-portfolio}" # 1. Check SSH connection echo "→ Prüfe SSH-Verbindung zu $VPS_HOST..." if ! ssh -q -o BatchMode=yes -o ConnectTimeout=10 "$VPS_HOST" exit; then echo "❌ Keine SSH-Verbindung zu $VPS_HOST möglich." exit 1 fi # 2. Push git commits if in git repo LOCAL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -d "$LOCAL_DIR/.git" ]; then echo "→ Prüfe Git-Status..." if ! git -C "$LOCAL_DIR" diff-index --quiet HEAD -- 2>/dev/null; then echo "⚠️ Lokale uncommitted Änderungen vorhanden." fi echo "→ Pushe Commits nach Gitea..." git -C "$LOCAL_DIR" push origin main 2>/dev/null || echo "ℹ️ Git push übersprungen oder bereits aktuell." fi echo "→ Synchronisiere Quelldateien nach $VPS_HOST:$VPS_DIR" rsync -avz --delete \ --exclude ".git" \ --exclude "node_modules" \ --exclude ".next" \ --exclude "data" \ --exclude ".env.local" \ --exclude "*.log" \ ./ "$VPS_HOST:$VPS_DIR/" echo "→ Build-Hash ermitteln" COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo unknown) BUILD_DATE=$(date -u +%Y-%m-%d) echo " Commit: $COMMIT_HASH · Date: $BUILD_DATE" echo "→ Baue und starte Container auf $VPS_HOST neu" ssh "$VPS_HOST" "export NEXT_PUBLIC_BUILD_HASH='$COMMIT_HASH' && \ export NEXT_PUBLIC_BUILD_DATE='$BUILD_DATE' && \ cd '$VPS_DIR' && \ [ -f .env.local ] || { echo 'FEHLT: .env.local auf dem VPS — bitte anlegen'; exit 1; } && \ docker compose build app && \ docker compose up -d app && \ docker image prune -f" echo "✓ Deploy abgeschlossen. Healthcheck in 5 s…" sleep 5 echo -n " Docker Health: " ssh "$VPS_HOST" "docker inspect --format='{{if .State.Health}}{{.State.Health.Status}}{{else}}no healthcheck{{end}}' eldov-portfolio" echo -n " Public URL (https://eldov.win): " if curl -fs -o /dev/null --resolve eldov.win:443:217.160.217.196 -m 5 "https://eldov.win/"; then echo "✅ 200 OK" else echo "⚠️ Nicht erreichbar" fi echo "✨ Deployment erfolgreich beendet!"