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