Files
vogelalbum/scripts/setup_detector_host.sh
T
christian c11fe9ab04 Vogelalbum 1.0.0
Eine Kamera am Vogelhaus, ein Rechner der erkennt wer da war — und eine
Sammlung, die sich von allein fuellt.

Zwei neuronale Netze: eines findet den Vogel im Bild, eines bestimmt die
Art. 148 heimische Arten, auf Deutschland eingeschraenkt und neu normiert —
ohne diese Einschraenkung wird aus einer Kohlmeise eine nordamerikanische
Schwesterart. Daraus entsteht ein Sammelalbum: nummerierte Seiten,
gefundene Arten in Farbe, fehlende als Schatten, dazu Erstfang, Punkte,
Stufen und 15 Abzeichen.

Laeuft vollstaendig auf eigener Hardware. Kein Cloud-Dienst, kein Konto,
keine Telemetrie; die Bilder verlassen das eigene Netz nicht.

Zwei getrennt deploybare Teile: die Sammlung als Django-Anwendung, die
Erkennung als eigener Dienst. Der Erkennungs-Dienst fragt selbst an und
braucht deshalb weder eine erreichbare Adresse noch einen offenen Port —
er laeuft hinter einem gewoehnlichen Router.

Dabei: Firmware fuer Raspberry Pi und ESP32-S3, Anbindung an Home
Assistant ueber MQTT, Oberflaeche auf Deutsch und Englisch, Einstellungen
je Kamera aus dem Browser, und ein Weg fuer Fotos von unterwegs.

AGPL-3.0.
2026-10-15 14:30:02 +00:00

105 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Richtet einen frischen Debian/Ubuntu-LXC als Erkennungs-Host ein.
#
# curl -fsSL <raw-url>/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 <slug> --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 <url>"