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:
@@ -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
|
||||||
|
|||||||
@@ -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)."
|
||||||
|
|||||||
Reference in New Issue
Block a user