update.sh: Release-Asset-Download statt git clone, ursprüngliches Bash-Setup mit abschalten

- update.sh lädt jetzt ein fertig gepacktes Gitea-Release-Asset
  (tesm-<tag>.tar.gz, Default "latest") direkt per curl herunter und
  entpackt es -- kein "git clone" bzw. Git auf dem Zielsystem mehr nötig.
- Stoppt/deaktiviert zusätzlich zu den aktuellen TESM-Diensten auch das
  ursprüngliche, noch ältere reine Bash-Setup (rpi-check.service,
  rpi-check-restart.service/.timer -- der Vorgänger von TESM ganz ohne
  Datenbank/Web-UI, statische ips.list statt generate_ips.py), falls auf
  dem Zielsystem noch vorhanden.
- README entsprechend aktualisiert, inkl. kurzer Anleitung zum Paketieren
  eines neuen Release (versionierter Tag + bewegliches "latest"-Tag).
This commit is contained in:
2026-08-13 19:34:58 +02:00
parent bfb58b62e9
commit 31404266f3
2 changed files with 89 additions and 37 deletions
+28 -11
View File
@@ -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| | `TESM_SECRET_KEY` | Flask Secret Key (überschreibt Datei) | zufällig, in `secret.key` gespeichert|
| `PORT`, `FLASK_DEBUG` | Flask-Serverport / Debug-Modus | `5000` / aus | | `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 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 manuellem Datei-Upload statt über `install.sh`), für das ursprüngliche,
Stand aus einem getaggten Release herzustellen, gibt es zusätzlich zum noch ältere reine Bash-Setup ganz ohne Datenbank/Web-UI (`rpi-check.service`
`git pull` + `install.sh`-Update oben `update.sh`: + 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 ```bash
sudo ./update.sh sudo ./update.sh
# oder mit einer anderen Version/Repo-URL: # oder eine bestimmte Version statt "latest":
sudo TESM_RELEASE_TAG=v1.0.0 TESM_REPO_URL=https://gitea.../alientim/tesm.git ./update.sh sudo TESM_RELEASE_TAG=v1.0.0 ./update.sh
# für ein privates Repo mit Zugriffstoken:
sudo TESM_GITEA_USER=alientim TESM_GITEA_TOKEN=<token> ./update.sh
``` ```
Das Skript stoppt und deaktiviert zunächst die laufenden Dienste Das Skript stoppt und deaktiviert zunächst alle laufenden Dienste — sowohl
(`tesm.service`, `tesm-check.service`, `tesm-check-restart.timer`), die aktuellen (`tesm.service`, `tesm-check.service`,
verschiebt das bestehende `/srv/tesm` **ohne es zu löschen** nach `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-<Zeitstempel>` (bleibt inkl. `sqlite.db` als Rückfall- `/srv/tesm-backup-<Zeitstempel>` (bleibt inkl. `sqlite.db` als Rückfall-
option und Datenquelle erhalten), klont dann den angegebenen Git-Tag frisch option und Datenquelle erhalten), lädt dann das Release-Paket
und führt darin `install.sh` aus. (`tesm-<tag>.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, **Ergebnis ist eine komplett frische Installation** — neue, leere Datenbank,
keine Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen aus der alten 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 importieren (siehe [Import/Export](#importexport)). Das Skript weist sowohl
vor dem Start als auch am Ende explizit darauf hin. 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) ## Browser-SSH-Terminal (Switch-Verbindungstest)
„Verbindung testen“ im Switch-Modal öffnet eine WebSocket-Verbindung zu „Verbindung testen“ im Switch-Modal öffnet eine WebSocket-Verbindung zu
+57 -22
View File
@@ -1,12 +1,16 @@
#!/bin/bash #!/bin/bash
# ============================================================================ # ============================================================================
# TESM — Update/Reinstall # TESM — Update/Reinstall
# Ersetzt eine bestehende Installation (z.B. eine während der Entwicklung # Ersetzt eine bestehende Installation -- egal ob eine während der
# manuell gepflegte) durch eine frische, paketbasierte Installation aus dem # Entwicklung ad-hoc gepflegte TESM-Instanz ODER das ursprüngliche, viel
# Git-Repository (Tag/Release statt Ad-hoc-Dateikopien). Die ALTE # ältere reine Bash-Setup ("aruba-poe": rpi-check.service + statische
# Installation wird dabei NICHT gelöscht, sondern nur gestoppt/deaktiviert # ips.list, keine Datenbank/Web-UI) -- durch eine frische Installation aus
# und beiseite verschoben (siehe BACKUP_DIR) -- als Rückfalloption UND als # einem gepackten Gitea-Release. Lädt dafür NUR den Release-Tarball per HTTP
# Datenquelle für einen späteren Export/Import. # 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 # WICHTIG: Das Ergebnis ist eine FRISCHE Installation OHNE die Daten der
# alten Instanz (Geräte, Switche, Zugangsdaten, Benutzer, Einstellungen, …). # alten Instanz (Geräte, Switche, Zugangsdaten, Benutzer, Einstellungen, …).
@@ -16,17 +20,26 @@
# #
# Auszuführen als root auf dem Zielsystem (z.B. POETEST): # Auszuführen als root auf dem Zielsystem (z.B. POETEST):
# sudo ./update.sh # sudo ./update.sh
# Optional übersteuerbar: # Optional übersteuerbar (z.B. für eine bestimmte Version statt "latest"):
# TESM_REPO_URL=https://user:token@gitea.../alientim/tesm.git \
# TESM_RELEASE_TAG=v1.0.0 sudo -E ./update.sh # 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=<token> sudo -E ./update.sh
# ============================================================================ # ============================================================================
set -e set -e
REPO_URL="${TESM_REPO_URL:-https://gitea.int.eertmoed.net/alientim/tesm.git}" GITEA_BASE="${TESM_GITEA_BASE:-https://gitea.int.eertmoed.net}"
RELEASE_TAG="${TESM_RELEASE_TAG:-v1.0.0}" 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" INSTALL_DIR="/srv/tesm"
BACKUP_DIR="/srv/tesm-backup-$(date +%Y%m%d-%H%M%S)" 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' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
@@ -39,17 +52,21 @@ if [ "$(id -u)" -ne 0 ]; then
fi fi
echo -e "${YELLOW}============================================================================${NC}" 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 -e "${YELLOW}============================================================================${NC}"
echo echo
echo -e "${RED}ACHTUNG:${NC} Dies richtet TESM KOMPLETT NEU ein — frische Datenbank, KEINE" 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 "Geräte/Switche/Zugangsdaten/Benutzer/Einstellungen aus der aktuellen Installation."
echo echo
echo "Die aktuelle Installation unter ${INSTALL_DIR} wird dabei NICHT gelöscht, sondern" echo "Eine ggf. vorhandene Installation unter ${INSTALL_DIR} wird dabei NICHT gelöscht,"
echo "nach dem Stoppen der Dienste nach folgendem Pfad verschoben (bleibt vollständig" echo "sondern nach dem Stoppen der Dienste nach folgendem Pfad verschoben (bleibt"
echo "erhalten, inkl. sqlite.db):" echo "vollständig erhalten, inkl. sqlite.db):"
echo " ${BACKUP_DIR}" echo " ${BACKUP_DIR}"
echo 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}Falls noch nicht geschehen: JETZT abbrechen und zuerst unter${NC}"
echo -e "${YELLOW}Einstellungen -> Im-/Export ein Backup der aktuellen Daten exportieren!${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 "Nach dem Update entweder dieses Backup importieren, oder alles manuell neu anlegen."
@@ -61,9 +78,15 @@ if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
exit 0 exit 0
fi 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 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 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." echo -e "${GREEN}${NC} Dienste gestoppt und deaktiviert."
if [ -d "$INSTALL_DIR" ]; then if [ -d "$INSTALL_DIR" ]; then
@@ -72,16 +95,26 @@ if [ -d "$INSTALL_DIR" ]; then
echo -e "${GREEN}${NC} Alte Installation gesichert (nicht gelöscht)." echo -e "${GREEN}${NC} Alte Installation gesichert (nicht gelöscht)."
fi fi
echo -e "${RED}${NC} Lade Release ${RELEASE_TAG} von ${REPO_URL}..." echo -e "${RED}${NC} Lade Paket von ${DOWNLOAD_URL}..."
git clone --branch "$RELEASE_TAG" --depth 1 "$REPO_URL" "$CLONE_DIR" mkdir -p "$WORK_DIR"
echo -e "${GREEN}${NC} Release heruntergeladen." 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..." echo -e "${RED}${NC} Entpacke Paket..."
bash "$CLONE_DIR/install.sh" 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
echo -e "${GREEN}============================================================================${NC}" 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 -e "${GREEN}============================================================================${NC}"
echo echo
echo -e "${YELLOW}WICHTIG — dies ist eine FRISCHE Installation ohne die Daten der alten Instanz.${NC}" 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 " 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 " b) Ein vor dem Update exportiertes Backup unter Einstellungen -> Im-/Export importieren."
echo echo
if [ -d "$BACKUP_DIR" ]; then
echo "Falls kein Export gemacht wurde: die alte Datenbank liegt unverändert unter" echo "Falls kein Export gemacht wurde: die alte Datenbank liegt unverändert unter"
echo " ${BACKUP_DIR}/sqlite.db" echo " ${BACKUP_DIR}/sqlite.db"
echo "und kann bei Bedarf manuell ausgelesen werden (z.B. mit sqlite3)." echo "und kann bei Bedarf manuell ausgelesen werden (z.B. mit sqlite3)."
echo echo
fi
echo "Hinweis zum Admin-Konto der neuen Installation: siehe Ausgabe von install.sh oben" 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)." echo "(bei einer frischen Datenbank wird dort auf create_admin.py hingewiesen)."