From bfb58b62e98ec292abd430c771df0a0316189df7 Mon Sep 17 00:00:00 2001 From: alientim Date: Thu, 13 Aug 2026 19:24:59 +0200 Subject: [PATCH] =?UTF-8?q?Update/Reinstall-Skript=20f=C3=BCr=20frische=20?= =?UTF-8?q?Release-Installationen=20(update.sh)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ergänzt install.sh (das ein bestehendes Checkout voraussetzt) um einen Weg, eine bisher ad-hoc gepflegte Installation (z.B. per manuellem Datei-Upload während der Entwicklung) durch eine frische, aus einem Git-Tag geklonte Installation zu ersetzen: - Stoppt/deaktiviert tesm.service, tesm-check.service, tesm-check-restart.timer. - Verschiebt das bestehende /srv/tesm NICHT gelöscht, sondern nach /srv/tesm-backup- -- bleibt als Rückfalloption und Datenquelle für einen späteren Export/Import vollständig erhalten. - Klont den angegebenen Release-Tag frisch und führt darin install.sh aus. - Weist sowohl vor dem Start als auch am Ende deutlich darauf hin, dass das Ergebnis eine FRISCHE Installation ohne die Daten der alten Instanz ist -- vorher exportieren (Einstellungen -> Im-/Export) oder danach alles neu einrichten. README um den entsprechenden Abschnitt ergänzt. --- README.md | 28 ++++++++++++++++ update.sh | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 update.sh diff --git a/README.md b/README.md index 2139a4a..704ec2d 100644 --- a/README.md +++ b/README.md @@ -1114,6 +1114,34 @@ konfiguriert nginx als Reverse-Proxy auf Port 80. | `TESM_SECRET_KEY` | Flask Secret Key (überschreibt Datei) | zufällig, in `secret.key` gespeichert| | `PORT`, `FLASK_DEBUG` | Flask-Serverport / Debug-Modus | `5000` / aus | +### Frische Neuinstallation aus einem Release (`update.sh`) + +Für einen Host, dessen `/srv/tesm` bislang ad-hoc gepflegt wurde (z.B. per +manuellem Datei-Upload statt über `install.sh`), oder um einen sauberen +Stand aus einem getaggten Release herzustellen, gibt es zusätzlich zum +`git pull` + `install.sh`-Update oben `update.sh`: + +```bash +sudo ./update.sh +# oder mit einer anderen Version/Repo-URL: +sudo TESM_RELEASE_TAG=v1.0.0 TESM_REPO_URL=https://gitea.../alientim/tesm.git ./update.sh +``` + +Das Skript stoppt und deaktiviert zunächst die laufenden Dienste +(`tesm.service`, `tesm-check.service`, `tesm-check-restart.timer`), +verschiebt das bestehende `/srv/tesm` **ohne es zu löschen** nach +`/srv/tesm-backup-` (bleibt inkl. `sqlite.db` als Rückfall- +option und Datenquelle erhalten), klont dann den angegebenen Git-Tag frisch +und führt darin `install.sh` aus. + +**Ergebnis ist eine komplett frische Installation** — neue, leere Datenbank, +keine Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen aus der alten +Instanz. Vor dem Ausführen deshalb unbedingt unter **Einstellungen → +Im-/Export** ein Backup der alten Instanz exportieren; danach entweder alles +manuell neu einrichten oder dieses Backup in die neue Installation +importieren (siehe [Import/Export](#importexport)). Das Skript weist sowohl +vor dem Start als auch am Ende explizit darauf hin. + ## Browser-SSH-Terminal (Switch-Verbindungstest) „Verbindung testen“ im Switch-Modal öffnet eine WebSocket-Verbindung zu diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..2b8ebe0 --- /dev/null +++ b/update.sh @@ -0,0 +1,97 @@ +#!/bin/bash +# ============================================================================ +# TESM — Update/Reinstall +# Ersetzt eine bestehende Installation (z.B. eine während der Entwicklung +# manuell gepflegte) durch eine frische, paketbasierte Installation aus dem +# Git-Repository (Tag/Release statt Ad-hoc-Dateikopien). Die ALTE +# Installation wird dabei NICHT gelöscht, sondern nur gestoppt/deaktiviert +# und beiseite verschoben (siehe BACKUP_DIR) -- als Rückfalloption UND als +# Datenquelle für einen späteren Export/Import. +# +# WICHTIG: Das Ergebnis ist eine FRISCHE Installation OHNE die Daten der +# alten Instanz (Geräte, Switche, Zugangsdaten, Benutzer, Einstellungen, …). +# Vor dem Ausführen unbedingt unter Einstellungen -> Im-/Export ein Backup +# der alten Instanz exportieren -- danach entweder alles neu einrichten oder +# dieses Backup in die neue Installation importieren. +# +# Auszuführen als root auf dem Zielsystem (z.B. POETEST): +# sudo ./update.sh +# Optional übersteuerbar: +# TESM_REPO_URL=https://user:token@gitea.../alientim/tesm.git \ +# TESM_RELEASE_TAG=v1.0.0 sudo -E ./update.sh +# ============================================================================ +set -e + +REPO_URL="${TESM_REPO_URL:-https://gitea.int.eertmoed.net/alientim/tesm.git}" +RELEASE_TAG="${TESM_RELEASE_TAG:-v1.0.0}" +INSTALL_DIR="/srv/tesm" +BACKUP_DIR="/srv/tesm-backup-$(date +%Y%m%d-%H%M%S)" +CLONE_DIR="/tmp/tesm-update-$(date +%s)" + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +if [ "$(id -u)" -ne 0 ]; then + echo "Bitte als root ausführen (sudo ./update.sh)." >&2 + exit 1 +fi + +echo -e "${YELLOW}============================================================================${NC}" +echo -e "${YELLOW} TESM Update/Reinstall — Release ${RELEASE_TAG}${NC}" +echo -e "${YELLOW}============================================================================${NC}" +echo +echo -e "${RED}ACHTUNG:${NC} Dies richtet TESM KOMPLETT NEU ein — frische Datenbank, KEINE" +echo "Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen aus der aktuellen Installation." +echo +echo "Die aktuelle Installation unter ${INSTALL_DIR} wird dabei NICHT gelöscht, sondern" +echo "nach dem Stoppen der Dienste nach folgendem Pfad verschoben (bleibt vollständig" +echo "erhalten, inkl. sqlite.db):" +echo " ${BACKUP_DIR}" +echo +echo -e "${YELLOW}Falls noch nicht geschehen: JETZT abbrechen und zuerst unter${NC}" +echo -e "${YELLOW}Einstellungen -> Im-/Export ein Backup der aktuellen Daten exportieren!${NC}" +echo "Nach dem Update entweder dieses Backup importieren, oder alles manuell neu anlegen." +echo + +read -r -p "Fortfahren? [y/N] " confirm +if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then + echo "Abgebrochen — nichts wurde verändert." + exit 0 +fi + +echo -e "${RED}→${NC} Stoppe und deaktiviere die bestehenden Dienste..." +systemctl stop tesm.service tesm-check.service tesm-check-restart.timer 2>/dev/null || true +systemctl disable tesm.service tesm-check.service tesm-check-restart.timer 2>/dev/null || true +echo -e "${GREEN}✔${NC} Dienste gestoppt und deaktiviert." + +if [ -d "$INSTALL_DIR" ]; then + echo -e "${RED}→${NC} Sichere bestehende Installation nach ${BACKUP_DIR}..." + mv "$INSTALL_DIR" "$BACKUP_DIR" + echo -e "${GREEN}✔${NC} Alte Installation gesichert (nicht gelöscht)." +fi + +echo -e "${RED}→${NC} Lade Release ${RELEASE_TAG} von ${REPO_URL}..." +git clone --branch "$RELEASE_TAG" --depth 1 "$REPO_URL" "$CLONE_DIR" +echo -e "${GREEN}✔${NC} Release heruntergeladen." + +echo -e "${RED}→${NC} Starte install.sh aus dem heruntergeladenen Release..." +bash "$CLONE_DIR/install.sh" + +echo +echo -e "${GREEN}============================================================================${NC}" +echo -e "${GREEN} Frische TESM-Installation (${RELEASE_TAG}) abgeschlossen.${NC}" +echo -e "${GREEN}============================================================================${NC}" +echo +echo -e "${YELLOW}WICHTIG — dies ist eine FRISCHE Installation ohne die Daten der alten Instanz.${NC}" +echo "Bitte jetzt eines von beidem tun:" +echo " a) Alle Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen manuell neu anlegen, oder" +echo " b) Ein vor dem Update exportiertes Backup unter Einstellungen -> Im-/Export importieren." +echo +echo "Falls kein Export gemacht wurde: die alte Datenbank liegt unverändert unter" +echo " ${BACKUP_DIR}/sqlite.db" +echo "und kann bei Bedarf manuell ausgelesen werden (z.B. mit sqlite3)." +echo +echo "Hinweis zum Admin-Konto der neuen Installation: siehe Ausgabe von install.sh oben" +echo "(bei einer frischen Datenbank wird dort auf create_admin.py hingewiesen)."