#!/usr/bin/env bash # Richtet einen frischen Debian/Ubuntu-LXC als Erkennungs-Host ein. # # curl -fsSL /scripts/setup_detector_host.sh | sudo bash # oder nach dem Klonen: # sudo ./scripts/setup_detector_host.sh # # Idempotent — ein zweiter Lauf aktualisiert nur, was sich geändert hat. set -euo pipefail REPO="${VOGELALBUM_REPO:-https://gitea.gaertner.onl/christian/vogelalbum.git}" TARGET="/opt/vogelalbum" DATA="/var/lib/vogelalbum" ENV_FILE="/etc/vogelalbum.env" USER_NAME="vogelalbum" say() { printf '\n\033[1;32m==> %s\033[0m\n' "$1"; } warn() { printf '\033[1;33m %s\033[0m\n' "$1"; } if [[ $EUID -ne 0 ]]; then echo "Bitte mit sudo ausführen." >&2 exit 1 fi say "Pakete" export DEBIAN_FRONTEND=noninteractive apt-get update -qq # git zum Klonen, python3-venv weil Debian das venv-Modul auslagert, # ca-certificates für HTTPS zur Web-App. apt-get install -y -qq --no-install-recommends \ git python3 python3-venv python3-pip ca-certificates curl say "Dienstbenutzer '$USER_NAME'" if ! id "$USER_NAME" &>/dev/null; then # Systemkonto ohne Login: der Dienst braucht keine Shell. useradd --system --home-dir "$TARGET" --shell /usr/sbin/nologin "$USER_NAME" echo " angelegt" else echo " vorhanden" fi say "Code nach $TARGET" if [[ -d "$TARGET/.git" ]]; then git -C "$TARGET" pull --ff-only else git clone --depth 1 "$REPO" "$TARGET" fi say "Virtualenv und Abhängigkeiten" if [[ ! -x "$TARGET/venv/bin/python" ]]; then python3 -m venv "$TARGET/venv" fi "$TARGET/venv/bin/pip" install --quiet --upgrade pip "$TARGET/venv/bin/pip" install --quiet -r "$TARGET/requirements-detector.txt" say "Modelle" bash "$TARGET/scripts/fetch_models.sh" say "Datenverzeichnis $DATA" mkdir -p "$DATA/rohdaten" chown -R "$USER_NAME:$USER_NAME" "$DATA" "$TARGET" say "Konfiguration $ENV_FILE" if [[ -f "$ENV_FILE" ]]; then warn "existiert bereits — bleibt unangetastet" else cat > "$ENV_FILE" <<'EOF' # Stream der Kamera. MJPEG, RTSP, Einzelbild-URL oder Ordner. VOGELALBUM_SOURCE=http://vogelkamera.local:8080/stream # Basis-URL der Web-App. Der Detector meldet nur ausgehend dorthin — # eingehend muss auf diesem Host nichts offen sein. VOGELALBUM_API=https://vogelalbum.gaertner.onl # Token dieser Kamera, einmalig ausgegeben von: # manage.py camera add --name "..." VOGELALBUM_TOKEN=HIER_EINTRAGEN # Rohbilder je Sichtung — Trainingsmaterial für ein eigenes Modell später. VOGELALBUM_SAVE_TO=/var/lib/vogelalbum/rohdaten EOF chmod 600 "$ENV_FILE" warn "angelegt — VOGELALBUM_TOKEN und VOGELALBUM_SOURCE noch eintragen!" fi say "systemd" cp "$TARGET/deploy/vogelalbum-detector.service" /etc/systemd/system/ systemctl daemon-reload echo if grep -q "HIER_EINTRAGEN" "$ENV_FILE"; then say "Fast fertig" echo " 1. $ENV_FILE ausfüllen (Token und Stream-URL)" echo " 2. systemctl enable --now vogelalbum-detector" echo " 3. journalctl -u vogelalbum-detector -f" else systemctl enable --now vogelalbum-detector say "Läuft" echo " journalctl -u vogelalbum-detector -f" fi echo echo "Kurztest ohne Dienst:" echo " sudo -u $USER_NAME $TARGET/venv/bin/python -m detector tune --source "