"clear" schlägt ohne TERM/Pseudo-Terminal mit Exit-Code 1 fehl ("TERM
environment variable not set") -- z.B. genau dann, wenn install.sh (wie von
update.sh vorgesehen) per SSH exec_command ohne pty aufgerufen wird. Mit
"set -e" hat das die GESAMTE Installation sofort an Zeile 2 abgebrochen,
noch bevor auch nur ein apt-Paket installiert oder eine einzige Zeile ins
Install-Log geschrieben wurde -- kein Fehlertext, kein Hinweis, einfach
Stille. Live reproduziert: update.sh lud das Release-Paket korrekt herunter
und entpackte es, install.sh selbst tat aber schlicht nichts.
Behoben: "clear" ist jetzt bewusst nie fatal (2>/dev/null || true) -- rein
kosmetisch, hat keinen Einfluss auf die eigentliche Installation.
102 lines
4.7 KiB
Bash
102 lines
4.7 KiB
Bash
#!/bin/bash
|
|
# ============================================================================
|
|
# TESM — Installer
|
|
# Richtet System-Pakete, die Flask-App (systemd) sowie den Erreichbarkeits-
|
|
# Check-Dienst (systemd + Timer) ein. Auszuführen als root, nachdem dieses
|
|
# Repo z.B. nach /root/tesm geklont wurde.
|
|
# ============================================================================
|
|
set -e
|
|
|
|
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
NC='\033[0m'
|
|
|
|
print_status() { echo -e "${GREEN}✔${NC} ${1} completed."; }
|
|
step() { echo -e "${RED}→${NC} ${1}..." | tee -a /var/log/tesm-install.log; }
|
|
|
|
# "clear" schlägt ohne TERM/Pseudo-Terminal fehl (z.B. bei Automatisierung
|
|
# per SSH exec_command ohne pty, genau wie update.sh dieses Skript aufruft)
|
|
# -- mit "set -e" bricht das sonst die GESAMTE Installation sofort und ohne
|
|
# jede Fehlermeldung an dieser Stelle ab, noch bevor auch nur ein Paket
|
|
# installiert wurde (live so reproduziert). Rein kosmetisch, daher bewusst
|
|
# nie fatal.
|
|
clear 2>/dev/null || true
|
|
|
|
# ---- Pakete ----
|
|
step "Installing system packages"
|
|
sudo apt-get update >>/var/log/tesm-install.log 2>&1 && print_status "apt update"
|
|
sudo apt-get install -y python3 python3-venv python3-pip nginx sqlite3 expect openssh-client git rsync iputils-ping logrotate >>/var/log/tesm-install.log 2>&1 && print_status "Packages installed"
|
|
|
|
# ---- Log-Verzeichnis ----
|
|
# Weltweit beschreibbar, da sowohl root (tesm.service/poe.sh) als auch
|
|
# der i.d.R. unprivilegierte kea-dhcp4-server-Dienstbenutzer (_kea) hier
|
|
# ihre jeweils eigene Log-Datei anlegen/schreiben müssen. Die eigentliche
|
|
# logrotate-Konfiguration (/etc/logrotate.d/tesm) schreibt die App
|
|
# selbst beim Start bzw. beim Speichern unter Systemeinstellungen → Logs.
|
|
sudo mkdir -p /var/log/tesm
|
|
sudo chmod 777 /var/log/tesm
|
|
|
|
# ---- App-Verzeichnis ----
|
|
step "Deploying application to /srv/tesm"
|
|
sudo mkdir -p /srv/tesm
|
|
sudo rsync -a --delete --exclude 'venv' --exclude 'sqlite.db' --exclude 'fernet.key' --exclude 'secret.key' \
|
|
"$REPO_DIR/srv/tesm/" /srv/tesm/ >>/var/log/tesm-install.log 2>&1
|
|
print_status "Application files copied"
|
|
|
|
# ---- Python venv ----
|
|
step "Setting up Python virtual environment"
|
|
cd /srv/tesm
|
|
sudo python3 -m venv venv
|
|
sudo ./venv/bin/pip install --upgrade pip >>/var/log/tesm-install.log 2>&1
|
|
sudo ./venv/bin/pip install -r requirements.txt >>/var/log/tesm-install.log 2>&1
|
|
print_status "Virtual environment ready"
|
|
|
|
# ---- Datenbank ----
|
|
if [ ! -f /srv/tesm/sqlite.db ]; then
|
|
step "Initializing database"
|
|
sudo ./venv/bin/python3 create_db.py >>/var/log/tesm-install.log 2>&1
|
|
print_status "Database initialized"
|
|
echo -e "${RED}→${NC} Kein Admin-Benutzer vorhanden. Bitte danach ausführen: sudo /srv/tesm/venv/bin/python3 /srv/tesm/create_admin.py"
|
|
fi
|
|
|
|
# ---- Custom-Skripte + systemd ----
|
|
step "Copying custom scripts and systemd units"
|
|
sudo mkdir -p /usr/local/bin/custom
|
|
sudo cp "$REPO_DIR/usr/local/bin/custom/poe.sh" /usr/local/bin/custom/poe.sh
|
|
sudo chmod +x /usr/local/bin/custom/poe.sh
|
|
sudo cp "$REPO_DIR"/etc/systemd/system/*.service /etc/systemd/system/
|
|
sudo cp "$REPO_DIR"/etc/systemd/system/*.timer /etc/systemd/system/
|
|
print_status "Scripts and units copied"
|
|
|
|
# ---- SSH-Login-Banner (MOTD) ----
|
|
# Live-Flotten-Status (Online/Offline, DHCP) statt der Standard-Ubuntu-
|
|
# Willkommensmeldung -- siehe srv/tesm/motd_banner.py für die Datenquellen.
|
|
# Die Standard-Skripte bleiben erhalten, werden aber deaktiviert (chmod -x,
|
|
# nicht gelöscht), damit ein Rückbau jederzeit per chmod +x möglich ist.
|
|
step "Setting up TESM SSH login banner"
|
|
sudo cp "$REPO_DIR/etc/update-motd.d/50-tesm" /etc/update-motd.d/50-tesm
|
|
sudo chmod 755 /etc/update-motd.d/50-tesm
|
|
sudo chmod -x /etc/update-motd.d/00-header /etc/update-motd.d/10-help-text \
|
|
/etc/update-motd.d/50-motd-news /etc/update-motd.d/60-unminimize \
|
|
/etc/update-motd.d/91-release-upgrade /etc/update-motd.d/92-unattended-upgrades \
|
|
2>/dev/null || true
|
|
print_status "SSH login banner configured"
|
|
|
|
# ---- nginx ----
|
|
step "Configuring nginx reverse proxy"
|
|
sudo cp "$REPO_DIR/etc/nginx/sites-available/tesm" /etc/nginx/sites-available/tesm
|
|
sudo ln -sf /etc/nginx/sites-available/tesm /etc/nginx/sites-enabled/tesm
|
|
sudo rm -f /etc/nginx/sites-enabled/default
|
|
sudo nginx -t >>/var/log/tesm-install.log 2>&1 && sudo systemctl reload nginx
|
|
print_status "nginx configured"
|
|
|
|
# ---- Dienste aktivieren ----
|
|
step "Enabling services"
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now tesm.service
|
|
sudo systemctl enable --now tesm-check.service tesm-check-restart.timer
|
|
print_status "Services enabled and started"
|
|
|
|
echo -e "${GREEN}✔${NC} Installation abgeschlossen. Web-App erreichbar auf Port 80 (nginx) bzw. 5000 (Flask direkt)."
|