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.
48 lines
2.1 KiB
Bash
Executable File
48 lines
2.1 KiB
Bash
Executable File
#!/bin/sh
|
|
set -e
|
|
|
|
# Im Betrieb verlangen die Settings einen SECRET_KEY und verweigern sonst den
|
|
# Start. Fuer ein oeffentliches Deployment ist das richtig — dort gehoert der
|
|
# Schluessel in die Umgebung. Zu Hause ist es eine Huerde ohne Gegenwert:
|
|
# niemand soll sich ein Geheimnis ausdenken muessen, um Vögel zu zaehlen.
|
|
# Deshalb hier einmalig erzeugen und aufs Datenvolume legen. Er muss ueber
|
|
# Neustarts stabil bleiben, sonst sind alle Sitzungen jedes Mal ungueltig.
|
|
if [ -z "${DJANGO_SECRET_KEY:-}" ]; then
|
|
KEYFILE="${SQLITE_DIR:-/app}/secret_key"
|
|
if [ ! -s "$KEYFILE" ]; then
|
|
mkdir -p "$(dirname "$KEYFILE")"
|
|
python -c "from django.core.management.utils import get_random_secret_key as g; print(g())" > "$KEYFILE"
|
|
chmod 600 "$KEYFILE"
|
|
echo "SECRET_KEY erzeugt: $KEYFILE"
|
|
fi
|
|
DJANGO_SECRET_KEY="$(cat "$KEYFILE")"
|
|
export DJANGO_SECRET_KEY
|
|
fi
|
|
|
|
python manage.py migrate --noinput
|
|
python manage.py collectstatic --noinput
|
|
|
|
# Katalog und Abzeichen sind Stammdaten, keine Nutzerdaten — bei jedem Start
|
|
# abgleichen, damit neue Arten ohne manuellen Schritt ankommen.
|
|
python manage.py seed_dex
|
|
|
|
# Referenzfotos aus Wikipedia. Der Befehl überspringt Arten, die schon eins
|
|
# haben — nach dem ersten Start kostet er also keine einzige Anfrage mehr.
|
|
# Netzprobleme dürfen den Start nicht blockieren: ohne Referenzfotos ist die
|
|
# Sammlung hässlich, aber funktionsfähig.
|
|
#
|
|
# 🔑 **Im Hintergrund, und zwar seit dem 09.10.2026.** Davor lief der Abruf
|
|
# vor gunicorn — bei einer leeren Datenbank sind das rund 148 Anfragen an
|
|
# Wikipedia, und weil Wikimedia hart drosselt, liegen Pausen dazwischen. Der
|
|
# allererste Start hat damit minutenlang nichts ausgeliefert: kein Fehler,
|
|
# keine Seite, nur Stille. Wer dem Schnellstart aus dem README folgt, hält
|
|
# genau das für kaputt — und es war die Stelle, an der es am leichtesten
|
|
# passiert.
|
|
#
|
|
# Jetzt steht die Sammlung sofort, und die Fotos tropfen nach. Die Arten sind
|
|
# schon da (seed_dex oben), es fehlen anfangs nur ihre Bilder.
|
|
python manage.py fetch_reference_images \
|
|
|| echo "Referenzfotos übersprungen" &
|
|
|
|
exec gunicorn vogelalbum.wsgi:application --bind 0.0.0.0:8000 --workers 3
|