Vorher: 'VAR=val ssh host "command"' — die env-vars galten nur für den ssh-Aufruf selbst, nicht für die Remote-Shell, die 'command' ausführt. docker-compose bekam die env-vars nicht, und der Dockerfile-RUN fiel auf den Default 'dev' zurück. Fix: ssh-Argument enthält explizites 'export VAR=val && command', damit die Variable in der Remote-Shell sichtbar ist. Build-Hash fließt jetzt korrekt durch und erscheint im Footer aller Seiten.
74 lines
2.5 KiB
Bash
Executable File
74 lines
2.5 KiB
Bash
Executable File
#!/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!"
|
||
|