#!/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