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.
This commit is contained in:
commit
cc9e0786c2
189 files changed
+29792
No files matched your search
Executable
+104
@@ -0,0 +1,104 @@
|
||||
#!/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>"
|
||||
Reference in new issue
Block a user