135 lines
5.0 KiB
Bash
135 lines
5.0 KiB
Bash
#!/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"
|