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.
105 lines
3.1 KiB
Bash
Executable File
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>"
|