Files
vogelalbum/entrypoint.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

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