feat(tools): remote <ziel> <aktion> als Vordertuer zum Server (D77-Nachtrag)

Deployen, Log ansehen, Dienst schalten und fragen was laeuft waren vier
verschiedene Beschwoerungen, drei davon von Hand als ssh + systemctl. Jetzt:

  remote backend deploy|upload|setup|install-jdk|reset-password
  remote backend start|stop|restart|status|enable|disable
  remote backend log|info|documents|backup
  remote frontend deploy|preview|info
  remote ssh

Die Skripte unter scripts/ bleiben die Implementierung und einzeln aufrufbar;
tools/remote bringt nur mit, wofuer es bisher nichts gab. Wo ein Schalter
noetig war, kam er ins Skript statt ins Werkzeug: --unit-only in
deploy-backend.sh (sonst kennte eine zweite Stelle die Unit-Platzhalter) und
--dry-run in deploy-prod.sh, das die Befoerderung ausdruecklich mit abschaltet.

Neu ist die Sicherung: H2 haelt die Datei offen, also anhalten, holen, wieder
starten (gemessen ~8 s Auszeit) - und das Archiv lesen, bevor der Befehl es
behaelt. Gegenprobe von Hand: lokal ausgepackt, Backend mit --werkbaum.data-dir
dagegen gestartet, es liefert genau die Dokumente des Servers.

.envrc legt tools/ auf den PATH (direnv), 217 Plan-Knoten, 0 Warnungen.
This commit is contained in:
mhoennig
2026-08-26 19:59:24 +02:00
parent 9443790382
commit ac6df1bb6b
11 changed files with 566 additions and 31 deletions
+14 -1
View File
@@ -11,12 +11,17 @@
# Zielverzeichnis. `--delete`: am Ziel bleibt nichts Altes stehen.
#
# Verwendung:
# scripts/deploy-prod.sh [-y] [--no-promote] [rsync-ziel]
# scripts/deploy-prod.sh [-y] [--no-promote] [--dry-run] [rsync-ziel]
#
# -y ohne Rückfrage befördern und spiegeln (sonst erst Vorschau
# via --dry-run + Nachfrage)
# --no-promote Beförderungsschritt überspringen (z. B. Wiederholung eines
# Deploys, der schon befördert hat)
# --dry-run nur zeigen, was sich am Ziel änderte, und dann aufhören.
# Schaltet die Beförderung ausdrücklich mit ab: die macht einen
# Commit, und ein Probelauf, der etwas schreibt, ist keiner.
# Gebaut und zusammengestellt wird trotzdem — sonst wüsste der
# Vergleich nicht, wogegen er läuft.
#
# Das Ziel ist entweder das Argument ODER — wenn keins angegeben ist — die
# Variable DEPLOY_TARGET aus der git-ignorierten Datei .env im Repo-Wurzelordner
@@ -38,11 +43,13 @@ set -euo pipefail
# ---- Argumente ----
YES=0
PROMOTE=1
DRY=0
TARGET=""
for arg in "$@"; do
case "$arg" in
-y|--yes) YES=1 ;;
--no-promote) PROMOTE=0 ;;
--dry-run) DRY=1; PROMOTE=0 ;;
-h|--help)
awk 'NR>2 { if ($0 ~ /^#/) { sub(/^# ?/, ""); print } else exit }' "$0"
exit 0 ;;
@@ -158,6 +165,12 @@ sed -e "s/__BACKEND_PORT__/${BACKEND_PORT}/g" scripts/prod.htaccess > "$STAGE/.h
# abräumen. Bedient Hostsharing die Challenge außerhalb des Docroots, ist es ein
# No-op.
RSYNC_OPTS=(-avz --delete --chmod=D755,F644 --filter='protect /.well-known/***')
if [ "$DRY" -eq 1 ]; then
echo "==> Probelauf (rsync --dry-run --delete) nach ${TARGET}:"
rsync "${RSYNC_OPTS[@]}" --dry-run "$STAGE"/ "$TARGET"
echo "==> Nichts geschrieben (--dry-run)."
exit 0
fi
if [ "$YES" -ne 1 ]; then
echo "==> Vorschau (rsync --dry-run --delete) nach ${TARGET}:"
rsync "${RSYNC_OPTS[@]}" --dry-run "$STAGE"/ "$TARGET"