SSL/TLS-Verwaltung (Upload+Aktivieren), install.sh-Idempotenz, poe_web/rpi-check-Cleanup entfernt

SSL/TLS (neue Seite Einstellungen -> SSL/TLS, eigenes Recht settings_ssl.view/.edit):
- Zertifikat+privater Schluessel per Upload hinterlegbar (PEM), Validierung
  VOR dem Speichern: gueltiges Zertifikat, noch nicht abgelaufen, Schluessel
  passt zum Zertifikat (Abgleich ueber die oeffentlichen Schluessel als
  DER-Bytes -- funktioniert algorithmus-unabhaengig fuer RSA/EC/...).
  Speicherort /etc/tesm/ssl (bewusst ausserhalb von /srv/tesm, damit
  rsync --delete beim Update das Zertifikat nicht mitloescht), Key mit
  chmod 600.
- HTTPS aktivieren schreibt/validiert (nginx -t) eine neue nginx-Konfiguration
  und laedt erst danach neu; Port 80 leitet dann automatisch auf https weiter.
  HSTS optional zuschaltbar, setzt aktives SSL voraus.
- Gleiches Sicherheitsnetz wie bei den Netzwerkeinstellungen: nach dem
  Anwenden 45s Zeitfenster zum Bestaetigen, sonst automatischer Rueckroll
  der nginx-Konfiguration UND der ssl_enabled/hsts_enabled-Einstellungen.
  Beide Pfade (Timeout-Rollback und Bestaetigen-verhindert-Rollback) live
  auf Testsystem-Update-Restart verifiziert, inklusive eines ECHTEN,
  ungeplant ausgeloesten Rollbacks waehrend des Testens.
- Noch KEINE Let's-Encrypt-Automatisierung (siehe Kommentar im Code) --
  alle bekannten Instanzen laufen intern ohne oeffentliche Domain, HTTP-01
  wuerde dort nicht funktionieren; kann bei Bedarf separat ergaenzt werden.

install.sh: Update-Idempotenz ("nur anfassen, was sich geaendert hat"):
- install_if_changed()-Helfer: Custom-Skript/systemd-Units/MOTD-Banner
  werden nur noch bei tatsaechlich geaendertem Inhalt neu geschrieben,
  daemon-reload nur wenn sich mindestens eine Unit geaendert hat.
- nginx-Konfiguration wird nur noch bei einer Frischinstallation aus dem
  Repo-Template geschrieben -- eine bereits vorhandene (egal ob unveraendert
  oder von der App selbst um SSL erweitert) wird nie wieder ueberschrieben.
  Voraussetzung dafuer, dass die neue SSL-Funktion ein Update ueberlebt.

update.sh: komplette Sonderbehandlung fuer die zwei TESM vorausgehenden
Generationen (rpi-check.service, poe_web.service/poe_manager) entfernt --
auf allen aktuellen Installationen laengst migriert. Deaktivierte
Unit-Dateien dieser Generationen wurden auf Testsystem-Update-Restart
zusaetzlich manuell endgueltig geloescht (waren dort seit einer Migration
im September 2025 nur deaktiviert, nicht entfernt).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 11:56:55 +02:00
co-authored by Claude Sonnet 5
parent 8253ab3f0e
commit f27dde466b
5 changed files with 503 additions and 40 deletions
+9 -31
View File
@@ -9,16 +9,15 @@
# automatischem Backup + Migrations-Sicherheitsnetz samt Rückroll-
# Möglichkeit -- siehe install.sh für Details).
#
# Dieses Skript selbst ist nur noch für das Ablösen ÄLTERER, TESM
# vorausgehender Installationsstufen auf diesem Host zuständig:
# 1. Das ursprüngliche, reine Bash-Setup aus dem separaten Repo
# https://gitea.int.eertmoed.net/WiS/Aruba-PoE (rpi-check.service +
# statische ips.list, keine Datenbank/Web-UI).
# 2. Die spätere Flask-App "PoE Manager" unter /srv/poe_manager
# (poe_web.service, Vorgänger von TESM in diesem Repo vor der
# Umbenennung).
# Beide werden NICHT gelöscht, sondern nur gestoppt/deaktiviert und
# (falls vorhanden) beiseite verschoben.
# Dieses Skript ist reiner Bootstrapper: Download + Entpacken + Aufruf von
# install.sh. Die frühere Sonderbehandlung zweier TESM vorausgehender
# Installationsstufen (rpi-check.service aus dem ursprünglichen reinen
# Bash-Setup, poe_web.service/poe_manager als Flask-Vorgänger von TESM)
# wurde entfernt -- diese Stufen sind auf allen aktuellen Installationen
# längst migriert, die dazugehörigen Unit-Dateien wurden dort manuell
# entfernt. Ein heute noch unmigriertes System wäre ohnehin so alt, dass
# ein manueller Blick vor dem Update angebracht ist statt automatischer
# stillschweigender Bereinigung.
#
# Auszuführen als root auf dem Zielsystem:
# sudo ./update.sh
@@ -38,7 +37,6 @@ GITEA_TOKEN="${TESM_GITEA_TOKEN:-}"
PACKAGE_NAME="tesm-${RELEASE_TAG}.tar.gz"
DOWNLOAD_URL="${GITEA_BASE}/${REPO_OWNER}/${REPO_NAME}/releases/download/${RELEASE_TAG}/${PACKAGE_NAME}"
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
WORK_DIR="/tmp/tesm-update-$(date +%s)"
PACKAGE_FILE="$WORK_DIR/${PACKAGE_NAME}"
@@ -61,10 +59,6 @@ echo "install.sh daraus -- das erkennt selbst, ob es sich um eine frische"
echo "Installation oder ein Update einer bestehenden handelt, und sichert"
echo "die Datenbank bei einer Schema-Änderung automatisch vorsorglich ab."
echo
echo "Ältere, TESM vorausgehende Installationsstufen (PoE Manager unter"
echo "/srv/poe_manager, das ursprüngliche reine Bash-Setup) werden dabei"
echo "erkannt, gestoppt/deaktiviert und beiseite verschoben (nicht gelöscht)."
echo
read -r -p "Fortfahren? [y/N] " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
@@ -86,22 +80,6 @@ mkdir -p "$WORK_DIR/pkg"
tar xzf "$PACKAGE_FILE" -C "$WORK_DIR/pkg" --strip-components=1
echo -e "${GREEN}${NC} Paket entpackt."
echo -e "${RED}${NC} Stoppe/deaktiviere ältere Installationsstufen (falls vorhanden)..."
# "|| true" macht nichts kaputt, falls einzelne Units gar nicht vorhanden
# sind. tesm.service selbst wird NICHT hier, sondern von install.sh
# gestoppt -- das entscheidet dort auch gleich, ob ein Backup nötig ist.
systemctl stop poe_web.service 2>/dev/null || true
systemctl disable poe_web.service 2>/dev/null || true
systemctl stop rpi-check.service rpi-check-restart.service rpi-check-restart.timer 2>/dev/null || true
systemctl disable rpi-check.service rpi-check-restart.service rpi-check-restart.timer 2>/dev/null || true
if [ -d /srv/poe_manager ]; then
dest="/srv/poe_manager-backup-${TIMESTAMP}"
echo -e "${RED}${NC} Sichere /srv/poe_manager nach ${dest}..."
mv /srv/poe_manager "$dest"
echo -e "${GREEN}${NC} Gesichert (nicht gelöscht)."
fi
echo -e "${GREEN}${NC} Ältere Installationsstufen bereinigt."
echo -e "${RED}${NC} Starte install.sh aus dem Paket..."
bash "$WORK_DIR/pkg/install.sh"