From 8af049a9ff0d92ec80d5d2d64b849f8d6593d384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lohrer?= Date: Wed, 15 Apr 2026 15:59:46 +0200 Subject: [PATCH] =?UTF-8?q?spa:=20deploy-script=20und=20htaccess=20f=C3=BC?= =?UTF-8?q?r=20svelte.joerg-lohrer.de?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 (1M context) --- app/static/.htaccess | 13 ++++++++++ scripts/README.md | 10 ++++++++ scripts/deploy-svelte.sh | 55 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 app/static/.htaccess create mode 100644 scripts/README.md create mode 100755 scripts/deploy-svelte.sh diff --git a/app/static/.htaccess b/app/static/.htaccess new file mode 100644 index 0000000..a94ed23 --- /dev/null +++ b/app/static/.htaccess @@ -0,0 +1,13 @@ +RewriteEngine On + +# HTTPS forcieren +RewriteCond %{HTTPS} !=on +RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] + +# Existierende Datei oder Verzeichnis? Direkt ausliefern. +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# Alles andere → SPA-Fallback (SvelteKit mit adapter-static) +RewriteRule ^ /index.html [L] diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..f2c01cf --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,10 @@ +# Scripts + +- **`deploy-svelte.sh`** — deployed den SvelteKit-Build aus `app/build/` nach + `svelte.joerg-lohrer.de` via FTPS. Benötigt `.env.local` im Repo-Root mit + den Variablen `SVELTE_FTP_HOST`, `SVELTE_FTP_USER`, `SVELTE_FTP_PASS`, + `SVELTE_FTP_REMOTE_PATH`. Aufruf: + + ```sh + cd app && npm run build && cd .. && ./scripts/deploy-svelte.sh + ``` diff --git a/scripts/deploy-svelte.sh b/scripts/deploy-svelte.sh new file mode 100755 index 0000000..9091b3f --- /dev/null +++ b/scripts/deploy-svelte.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# Deploy: SvelteKit-Build nach svelte.joerg-lohrer.de per FTPS. +# Credentials kommen aus ./.env.local (gitignored), Variablen-Prefix SVELTE_FTP_. + +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +if [ ! -f .env.local ]; then + echo "FEHLER: .env.local fehlt — Credentials ergänzen (siehe .env.example)." >&2 + exit 1 +fi + +# nur SVELTE_FTP_* exportieren (via Tempfile — process substitution ist nicht +# überall verfügbar, je nach Shell/Sandbox). +_ENV_TMP="$(mktemp)" +trap 'rm -f "$_ENV_TMP"' EXIT +grep -E '^SVELTE_FTP_' .env.local > "$_ENV_TMP" || true +set -a +# shellcheck disable=SC1090 +. "$_ENV_TMP" +set +a + +for v in SVELTE_FTP_HOST SVELTE_FTP_USER SVELTE_FTP_PASS SVELTE_FTP_REMOTE_PATH; do + if [ -z "${!v:-}" ]; then + echo "FEHLER: $v fehlt in .env.local." >&2 + exit 1 + fi +done + +BUILD_DIR="$ROOT/app/build" +if [ ! -d "$BUILD_DIR" ]; then + echo "FEHLER: app/build nicht vorhanden. Bitte vorher 'npm run build' in app/ ausführen." >&2 + exit 1 +fi + +echo "Lade Build von $BUILD_DIR nach ftp://$SVELTE_FTP_HOST$SVELTE_FTP_REMOTE_PATH" + +# pro Datei ein curl-Upload (zuverlässig auf macOS ohne lftp) +find "$BUILD_DIR" -type f -print0 | while IFS= read -r -d '' local_file; do + rel="${local_file#$BUILD_DIR/}" + remote="ftp://$SVELTE_FTP_HOST${SVELTE_FTP_REMOTE_PATH%/}/$rel" + echo " → $rel" + # --tls-max 1.2: All-Inkl/Kasserver FTPS schließt bei TLS 1.3 die Data- + # Connection mit "426 Transfer aborted" — mit 1.2 läuft es sauber durch. + curl -sSf --ssl-reqd --tls-max 1.2 --ftp-create-dirs \ + --retry 3 --retry-delay 2 --retry-all-errors \ + --connect-timeout 15 \ + --user "$SVELTE_FTP_USER:$SVELTE_FTP_PASS" \ + -T "$local_file" "$remote" +done + +echo "Upload fertig. Live-Check:" +curl -sIL "https://svelte.joerg-lohrer.de/" | head -5