scripts/deploy-prod: Ziel aus git-ignorierter scripts/deploy.env (Fallback)

Ohne Ziel-Argument liest das Skript DEPLOY_TARGET aus scripts/deploy.env
(git-ignoriert; Vorlage scripts/deploy.env.example ist eingecheckt). Argument
hat weiterhin Vorrang.

Der Wert wird bewusst NICHT via `source` gelesen, weil bash bei `host:~/pfad`
die Tilde nach dem ':' lokal expandieren wuerde; stattdessen roh ausgelesen,
Whitespace/CR + umgebende Quotes gestrippt, das ~ bleibt fuer die Remote-Seite
erhalten. Lokal verifiziert: Fallback greift, ~ bleibt in unquoted/single-/
double-quoted erhalten (kein lokales $HOME), Quotes entfernt.

.gitignore: scripts/deploy.env ergaenzt (die vorhandene .env-Regel greift wegen
des abweichenden Dateinamens nicht). README (de/en) aktualisiert; Beispielpfad
auf die htdocs-ssl-Direktaufschaltung umgestellt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-07-22 07:05:40 +02:00
co-authored by Claude Opus 4.8
parent ecf767cfb5
commit 6b83af7d73
5 changed files with 67 additions and 23 deletions
+30 -11
View File
@@ -9,15 +9,19 @@
# nichts Altes stehen.
#
# Verwendung:
# scripts/deploy-prod.sh [-y] <rsync-ziel>
# scripts/deploy-prod.sh [-y] [rsync-ziel]
#
# -y ohne Rückfrage spiegeln (sonst erst Vorschau via --dry-run + Nachfrage)
#
# Beispiel (Hostsharing, Subdomain werkbank.javagil.de unter der Domain
# javagil.de — deshalb `subs-ssl/`; wäre die Domain direkt aufgeschaltet, läge
# das Web-Verzeichnis in `htdocs-ssl/`):
# Das Ziel ist entweder das Argument ODER — wenn keins angegeben ist — die
# Variable DEPLOY_TARGET aus der git-ignorierten Datei scripts/deploy.env
# (Vorlage: scripts/deploy.env.example). Ein Argument hat Vorrang.
#
# scripts/deploy-prod.sh mih00@mih00.hostsharing.net:~/doms/javagil.de/subs-ssl/werkbaum/
# Beispiel (Hostsharing, direkt aufgeschaltete Domain werkbaum.javagil.de —
# Web-Verzeichnis in `htdocs-ssl/`; als Subdomain unter einer anderen Domain
# läge es stattdessen in `subs-ssl/<name>/`):
#
# scripts/deploy-prod.sh mih00@mih00.hostsharing.net:~/doms/werkbaum.javagil.de/htdocs-ssl
#
# ACHTUNG: Das Zielverzeichnis wird als exklusiv für Werkbaum angenommen —
# `--delete` entfernt dort ALLES, was nicht zum Bundle gehört.
@@ -43,16 +47,31 @@ for arg in "$@"; do
esac
done
if [ -z "$TARGET" ]; then
echo "Usage: $0 [-y] <rsync-ziel>" >&2
echo " z.B. $0 mih00@mih00.hostsharing.net:~/doms/javagil.de/subs-ssl/werkbaum/" >&2
exit 2
fi
# ---- Repo-Wurzel (Skript ist unter scripts/) ----
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
# ---- Ziel: Argument hat Vorrang, sonst scripts/deploy.env (git-ignoriert) ----
ENV_FILE="$ROOT/scripts/deploy.env"
if [ -z "$TARGET" ] && [ -f "$ENV_FILE" ]; then
# Bewusst NICHT via `source` lesen: bash würde bei `host:~/pfad` das ~ nach dem
# ':' LOKAL expandieren. Stattdessen roh auslesen (letzte Definition gewinnt),
# trailing Whitespace/CR und umgebende Quotes strippen — das ~ bleibt so für
# die Remote-Seite erhalten.
TARGET="$(sed -n -E 's/^[[:space:]]*DEPLOY_TARGET[[:space:]]*=[[:space:]]*//p' "$ENV_FILE" \
| tail -1 | sed -E 's/[[:space:]]+$//')"
TARGET="${TARGET#\"}"; TARGET="${TARGET%\"}"
TARGET="${TARGET#\'}"; TARGET="${TARGET%\'}"
[ -n "$TARGET" ] && echo "==> Ziel aus scripts/deploy.env: ${TARGET}"
fi
if [ -z "$TARGET" ]; then
echo "Usage: $0 [-y] <rsync-ziel>" >&2
echo " oder DEPLOY_TARGET in scripts/deploy.env setzen (Vorlage: scripts/deploy.env.example)" >&2
echo " z.B. $0 mih00@mih00.hostsharing.net:~/doms/werkbaum.javagil.de/htdocs-ssl" >&2
exit 2
fi
# ---- 1) Prod-Build (ohne Build-Hinweis) ----
if [ ! -d frontend/node_modules ]; then
echo "==> node_modules fehlt — npm ci"