diff --git a/README.md b/README.md index 704ec2d..9293967 100644 --- a/README.md +++ b/README.md @@ -1114,25 +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`) +### Frische Neuinstallation aus einem Release-Paket (`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`: +manuellem Datei-Upload statt über `install.sh`), für das ursprüngliche, +noch ältere reine Bash-Setup ganz ohne Datenbank/Web-UI (`rpi-check.service` ++ statische `ips.list`), oder um einen sauberen Stand aus einem Gitea- +Release herzustellen, gibt es zusätzlich zum `git pull` + `install.sh`- +Update oben `update.sh` — es lädt ein fertig gepacktes **Gitea-Release** +direkt per HTTP herunter, **kein `git clone`/Git auf dem Zielsystem nötig**: ```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 +# oder eine bestimmte Version statt "latest": +sudo TESM_RELEASE_TAG=v1.0.0 ./update.sh +# für ein privates Repo mit Zugriffstoken: +sudo TESM_GITEA_USER=alientim TESM_GITEA_TOKEN= ./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 +Das Skript stoppt und deaktiviert zunächst alle laufenden Dienste — sowohl +die aktuellen (`tesm.service`, `tesm-check.service`, +`tesm-check-restart.timer`) als auch, falls noch vorhanden, das +ursprüngliche Bash-only-Setup (`rpi-check.service`, +`rpi-check-restart.service`, `rpi-check-restart.timer`) —, verschiebt ein +bestehendes `/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. +option und Datenquelle erhalten), lädt dann das Release-Paket +(`tesm-.tar.gz`, standardmäßig `latest`) von den Gitea-Releases dieses +Repos herunter 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 @@ -1142,6 +1151,14 @@ 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. +Ein neues Release paketieren (als Maintainer, nicht auf dem Zielsystem): + +```bash +git archive --format=tar.gz --prefix=tesm/ -o tesm-vX.Y.Z.tar.gz vX.Y.Z +# als Release-Asset zum passenden Tag "vX.Y.Z" UND zum beweglichen Tag +# "latest" (zeigt immer auf den neuesten Stand) auf Gitea hochladen. +``` + ## Browser-SSH-Terminal (Switch-Verbindungstest) „Verbindung testen“ im Switch-Modal öffnet eine WebSocket-Verbindung zu diff --git a/update.sh b/update.sh index 2b8ebe0..9d5180c 100644 --- a/update.sh +++ b/update.sh @@ -1,12 +1,16 @@ #!/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. +# Ersetzt eine bestehende Installation -- egal ob eine während der +# Entwicklung ad-hoc gepflegte TESM-Instanz ODER das ursprüngliche, viel +# ältere reine Bash-Setup ("aruba-poe": rpi-check.service + statische +# ips.list, keine Datenbank/Web-UI) -- durch eine frische Installation aus +# einem gepackten Gitea-Release. Lädt dafür NUR den Release-Tarball per HTTP +# herunter (kein "git clone", kein Git auf dem Zielsystem nötig). +# +# Die ALTE Installation wird dabei NICHT gelöscht, sondern nur gestoppt/ +# deaktiviert und (falls vorhanden) 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, …). @@ -16,17 +20,26 @@ # # 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 \ +# Optional übersteuerbar (z.B. für eine bestimmte Version statt "latest"): # TESM_RELEASE_TAG=v1.0.0 sudo -E ./update.sh +# Für ein privates Repo wird ein Zugriffstoken benötigt: +# TESM_GITEA_USER=alientim TESM_GITEA_TOKEN= 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}" +GITEA_BASE="${TESM_GITEA_BASE:-https://gitea.int.eertmoed.net}" +REPO_OWNER="${TESM_REPO_OWNER:-alientim}" +REPO_NAME="${TESM_REPO_NAME:-tesm}" +RELEASE_TAG="${TESM_RELEASE_TAG:-latest}" +GITEA_USER="${TESM_GITEA_USER:-}" +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}" + INSTALL_DIR="/srv/tesm" BACKUP_DIR="/srv/tesm-backup-$(date +%Y%m%d-%H%M%S)" -CLONE_DIR="/tmp/tesm-update-$(date +%s)" +WORK_DIR="/tmp/tesm-update-$(date +%s)" +PACKAGE_FILE="$WORK_DIR/${PACKAGE_NAME}" RED='\033[0;31m' GREEN='\033[0;32m' @@ -39,17 +52,21 @@ if [ "$(id -u)" -ne 0 ]; then fi echo -e "${YELLOW}============================================================================${NC}" -echo -e "${YELLOW} TESM Update/Reinstall — Release ${RELEASE_TAG}${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 "Eine ggf. vorhandene Installation unter ${INSTALL_DIR} wird dabei NICHT gelöscht," +echo "sondern nach dem Stoppen der Dienste nach folgendem Pfad verschoben (bleibt" +echo "vollständig erhalten, inkl. sqlite.db):" echo " ${BACKUP_DIR}" echo +echo "Ebenfalls gestoppt/deaktiviert wird ein noch vorhandenes ursprüngliches" +echo "Bash-only-Setup (rpi-check.service/rpi-check-restart.*, falls vorhanden --" +echo "der Vorgänger von TESM ohne Datenbank/Web-UI)." +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." @@ -61,9 +78,15 @@ if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then exit 0 fi -echo -e "${RED}→${NC} Stoppe und deaktiviere die bestehenden Dienste..." +echo -e "${RED}→${NC} Stoppe und deaktiviere bestehende Dienste..." +# Aktuelle TESM-Dienste UND das ursprüngliche, viel ältere Bash-only-Setup +# (rpi-check.service/rpi-check-restart.*) -- je nachdem, was auf diesem +# Host tatsächlich (noch) existiert. "|| true" macht nichts kaputt, falls +# einzelne Units gar nicht vorhanden sind. 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 +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 echo -e "${GREEN}✔${NC} Dienste gestoppt und deaktiviert." if [ -d "$INSTALL_DIR" ]; then @@ -72,16 +95,26 @@ if [ -d "$INSTALL_DIR" ]; then 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} Lade Paket von ${DOWNLOAD_URL}..." +mkdir -p "$WORK_DIR" +CURL_AUTH=() +if [ -n "$GITEA_USER" ] && [ -n "$GITEA_TOKEN" ]; then + CURL_AUTH=(-u "${GITEA_USER}:${GITEA_TOKEN}") +fi +curl -fsSL "${CURL_AUTH[@]}" -o "$PACKAGE_FILE" "$DOWNLOAD_URL" +echo -e "${GREEN}✔${NC} Paket heruntergeladen ($(du -h "$PACKAGE_FILE" | cut -f1))." -echo -e "${RED}→${NC} Starte install.sh aus dem heruntergeladenen Release..." -bash "$CLONE_DIR/install.sh" +echo -e "${RED}→${NC} Entpacke Paket..." +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} Starte install.sh aus dem Paket..." +bash "$WORK_DIR/pkg/install.sh" echo echo -e "${GREEN}============================================================================${NC}" -echo -e "${GREEN} Frische TESM-Installation (${RELEASE_TAG}) abgeschlossen.${NC}" +echo -e "${GREEN} Frische TESM-Installation (Release \"${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}" @@ -89,9 +122,11 @@ 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 +if [ -d "$BACKUP_DIR" ]; then + 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 +fi 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)."