#!/usr/bin/env bash # ============================================================================ # EPI-Support Monitor – Setup / Deploy auf dem Linux-Webserver (SRHNWEB) # # Annahme: die Projektdateien liegen bereits unter /var/www/html/episupport # (z. B. per git clone, scp oder rsync dorthin kopiert). # # Aufruf auf dem Server: # sudo bash /var/www/html/episupport/deploy/setup.sh # # Das Skript ist idempotent – mehrfaches Ausführen ist unproblematisch # (z. B. nach einem Update der Dateien für einen Neustart der Dienste). # ============================================================================ set -euo pipefail APP_DIR="/var/www/html/episupport" SERVICE_USER="www-data" PY="${PYTHON:-python3}" bold() { printf "\033[1m%s\033[0m\n" "$*"; } info() { printf " • %s\n" "$*"; } if [[ $EUID -ne 0 ]]; then echo "Bitte mit sudo/root ausführen: sudo bash $0" >&2 exit 1 fi if [[ ! -f "$APP_DIR/wsgi.py" ]]; then echo "Projektdateien nicht in $APP_DIR gefunden. Erst dorthin kopieren." >&2 exit 1 fi cd "$APP_DIR" # --- 1) System-Pakete (nur falls fehlend) ----------------------------------- bold "1/6 System-Pakete prüfen" if ! command -v "$PY" >/dev/null; then info "Installiere python3 ..." apt-get update -qq && apt-get install -y python3 python3-venv python3-pip fi if ! "$PY" -m venv --help >/dev/null 2>&1; then info "Installiere python3-venv ..." apt-get update -qq && apt-get install -y python3-venv fi # --- 2) Virtualenv + Abhängigkeiten ----------------------------------------- bold "2/6 Python-Umgebung einrichten" # Ein vorhandenes venv ohne bin/python ist ungültig (z. B. versehentlich von # Windows mitkopiert -> hat venv/Scripts/ statt venv/bin/). Dann neu anlegen. if [[ -d venv && ! -x venv/bin/python ]]; then info "Ungültiges/fremdes venv gefunden – wird neu erstellt" rm -rf venv fi # Erreicht der Server PyPI? Falls nicht (häufig in abgeschotteten Netzen), # installieren wir die Pakete über apt und geben dem venv via # --system-site-packages Zugriff darauf. PYPI_OK=1 if ! curl -sS --max-time 15 -o /dev/null https://pypi.org/simple/ 2>/dev/null; then PYPI_OK=0 info "PyPI nicht erreichbar – nutze System-Pakete (apt) statt pip" fi VENV_ARGS="" [[ $PYPI_OK -eq 0 ]] && VENV_ARGS="--system-site-packages" if [[ ! -x venv/bin/python ]]; then if ! "$PY" -m venv $VENV_ARGS venv 2>/dev/null; then info "venv-Erstellung fehlgeschlagen – installiere python3-venv und versuche erneut" apt-get update -qq && apt-get install -y python3-venv "$PY" -m venv $VENV_ARGS venv fi info "venv erstellt" fi if [[ $PYPI_OK -eq 1 ]]; then ./venv/bin/python -m pip install --upgrade pip ./venv/bin/python -m pip install -r requirements.txt else apt-get update -qq apt-get install -y python3-flask python3-requests python3-dotenv \ python3-openpyxl gunicorn fi # Verifizieren, dass alle Importe verfügbar sind ./venv/bin/python -c "import flask, requests, dotenv, openpyxl, gunicorn" \ && info "Abhängigkeiten verfügbar" \ || { echo " ! Python-Abhängigkeiten fehlen weiterhin." >&2; exit 1; } # --- 3) Konfiguration + Datenverzeichnis ------------------------------------ bold "3/6 Konfiguration" mkdir -p data if [[ ! -f .env ]]; then cp .env.example .env info ".env aus Vorlage erstellt – BITTE Zugangsdaten eintragen:" info " nano $APP_DIR/.env" else info ".env vorhanden (unverändert gelassen)" fi chown -R "$SERVICE_USER:$SERVICE_USER" "$APP_DIR" chmod 640 .env info "Besitzrechte auf $SERVICE_USER gesetzt" # --- 4) systemd-Dienste ------------------------------------------------------ bold "4/6 systemd-Dienste installieren" cp deploy/episupport-web.service /etc/systemd/system/episupport-web.service cp deploy/episupport-poller.service /etc/systemd/system/episupport-poller.service systemctl daemon-reload systemctl enable --now episupport-poller.service systemctl enable --now episupport-web.service info "episupport-web und episupport-poller aktiviert und gestartet" # --- 5) Apache-Anbindung ----------------------------------------------------- bold "5/6 Apache konfigurieren" a2enmod proxy proxy_http headers >/dev/null cp deploy/episupport-apache.conf /etc/apache2/conf-available/episupport.conf a2enconf episupport >/dev/null if apache2ctl configtest 2>/dev/null; then systemctl reload apache2 info "Apache neu geladen – erreichbar unter http(s)://srhnweb/episupport" else echo " ! Apache-Konfigtest fehlgeschlagen – bitte prüfen (apache2ctl configtest)." >&2 fi # --- 6) Status --------------------------------------------------------------- bold "6/6 Status" systemctl --no-pager --lines=0 status episupport-web episupport-poller || true echo bold "Fertig." echo " Dashboard: http(s)://srhnweb/episupport" echo " Logs Web: journalctl -u episupport-web -f" echo " Logs Poller: journalctl -u episupport-poller -f" echo echo " WICHTIG: Falls noch nicht geschehen, Zugangsdaten in .env eintragen und" echo " danach: sudo systemctl restart episupport-poller episupport-web"