Files
2026-09-09 14:37:20 +02:00

143 lines
6.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
if [[ $# == 0 || ${1:-} == --help || ${1:-} == -h ]]; then
cat <<'HELP'
Werkjournal — Serverwerkzeuge
remote backend install-jdk [--force]
Geprüftes Temurin JDK 25 im Home des Zielusers installieren.
--force installiert den gepinnten Stand erneut.
remote backend deploy-prototype --artifact DIRECTORY
Erstdeployment des geprüften Prototyps; verweigert bestehende Releases/Daten.
remote backend deploy-guest-preview --artifact DIRECTORY
Einmaliger Wechsel vom datenlosen Prototyp zur Gastoberfläche.
Verweigert vorhandene Daten; erhält die bisherige Anwendung als Rückfall.
Konfiguration: .env im Repository (Vorlage .env.example).
remote backend deploy [-y] --artifact DIRECTORY
Geprüftes CI-Artefakt mit Wartung, geschlossener H2-Sicherung und Rückfall aktivieren.
remote backend restore --backup FILE
Geprüfte Sicherung nach ausdrücklicher Bestätigung einspielen; Vorzustand sichern.
remote backend restore --recover
Unterbrochenen Restore sicher abschließen oder vor Freigabe zurücknehmen.
remote backend backup [FILE]
Dienst kurz anhalten und Datenbank samt Programmstand privat sichern.
Vorgabe: git-ignoriertes backups/; vorhandene Dateien werden nicht überschrieben.
remote backend upload [-y] --artifact DIRECTORY
Geprüften Kandidaten nur bereitstellen. Erst deploy aktiviert ihn; Neustart genügt nicht.
remote backend setup-push
Push-Schlüssel geschützt erzeugen; vorhandene Schlüssel erhalten, Versand bleibt aus.
remote backend prepare-admin-recovery
Einmaligen Admin-Code für 24 Stunden freischalten, nur wenn kein Administrator existiert.
Kurze Wartung; Code liegt geschützt auf dem Server und wird nicht ausgegeben.
remote backend recover
Unterbrochenes Deployment anhand des dauerhaften Journals wiederherstellen.
remote backend start|stop|restart|status|enable|disable
Den bestehenden systemd-User-Dienst steuern; Start/Neustart prüfen die Bereitschaft.
Mutationen verwenden die Deployment-Sperre. Vorhandene Wartung bleibt bestehen.
enable/disable verändern nur den Autostart, nicht den laufenden Prozess.
remote backend log [JOURNALCTL-ARGS]
Letzte 100 Journalzeilen, z.B. --follow oder --since '1 hour ago'. Kein Pager.
remote backend setup
Unit aus Vorlage schreiben und daemon-reload; kein Neustart, keine Geheimnisänderung.
remote backend info
Version/Commit und Bereitschaft intern sowie öffentlich per HTTPS prüfen.
remote ssh [COMMAND [ARG...]]
Interaktive SSH-Shell oder einen Befehl mit getrennten Argumenten ausführen.
HELP
exit 0
fi
if [[ ${1:-} == backend && ${2:-} == install-jdk ]]; then
shift 2
exec "$ROOT/scripts/install-jdk.sh" "$@"
fi
if [[ ${1:-} == backend && ${2:-} == deploy-prototype ]]; then
shift 2
exec "$ROOT/scripts/deploy-prototype.sh" "$@"
fi
if [[ ${1:-} == backend && ${2:-} == deploy-guest-preview ]]; then
shift 2
[[ $# == 2 && $1 == --artifact ]] || { echo 'Usage: remote backend deploy-guest-preview --artifact DIRECTORY' >&2; exit 2; }
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
exec python3 "$ROOT/scripts/deploy-prototype.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$2" --guest-preview
fi
if [[ ${1:-} == backend && ${2:-} == deploy ]]; then
shift 2
if [[ ${1:-} == -y ]]; then shift; fi
[[ $# == 2 && $1 == --artifact ]] || { echo 'Usage: remote backend deploy --artifact DIRECTORY' >&2; exit 2; }
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/deploy-prototype.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$2" --update
fi
if [[ ${1:-} == backend && ${2:-} == restore ]]; then
shift 2
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/operator-restore.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$@"
fi
if [[ ${1:-} == backend && ${2:-} == backup ]]; then
shift 2
[[ $# -le 1 ]] || { echo 'Usage: remote backend backup [FILE]' >&2; exit 2; }
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/backup.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$@"
fi
if [[ ${1:-} == backend && ${2:-} == upload ]]; then
shift 2
if [[ ${1:-} == -y ]]; then shift; fi
[[ $# == 2 && $1 == --artifact ]] || { echo 'Usage: remote backend upload [-y] --artifact DIRECTORY' >&2; exit 2; }
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/deploy-prototype.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$2" --upload
fi
if [[ ${1:-} == backend && ${2:-} == setup-push ]]; then
[[ $# == 2 ]] || exit 2
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/setup-push.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}"
fi
if [[ ${1:-} == backend && ${2:-} == prepare-admin-recovery ]]; then
[[ $# == 2 ]] || exit 2
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/admin-recovery.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}"
fi
if [[ ${1:-} == backend && ${2:-} == recover ]]; then
[[ $# == 2 ]] || exit 2
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/recover-deployment.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}"
fi
if [[ ${1:-} == backend ]]; then
case "${2:-}" in
start|stop|restart|status|enable|disable|log|setup|info)
action=$2
shift 2
[[ $action == log || $# == 0 ]] || { echo 'Dieser Dienstbefehl akzeptiert keine weiteren Argumente.' >&2; exit 2; }
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
require_deploy_layout "${target:-mih04-werkjournal@mih04.hostsharing.net}"
exec python3 "$ROOT/scripts/service-control.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$action" "$@"
;;
esac
fi
if [[ ${1:-} == ssh ]]; then
shift
source "$ROOT/scripts/lib-env.sh"
target=$(env_value BACKEND_SSH)
exec python3 "$ROOT/scripts/ssh-command.py" "${target:-mih04-werkjournal@mih04.hostsharing.net}" "$@"
fi
printf 'Unbekannter Befehl. Siehe remote --help.\n' >&2
exit 2