ALTER TABLE, CREATE INDEX and CREATE OR REPLACE FUNCTION all require table/function ownership in PostgreSQL. Replace IF NOT EXISTS DDL with explicit existence checks so db_init works for unprivileged application users where the schema was created by a different role (e.g. postgres). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
melesICUmover
Dauer-Poller, der Wildkamera-Bilder aus einem Hetzner-S3-Bucket verarbeitet:
liest neue Bilder + metadata.json (+ optional _categories.json), extrahiert per
OCR (Tesseract) den Overlay-Zeitstempel, schreibt EXIF-Daten (exiftool),
legt verarbeitetes Bild + Thumbnail zurueck nach S3, persistiert alles nach
PostgreSQL (remote_cam.*), pusht optional an die DeerMapper-API und
raeumt den Entrance-Ordner auf. Zustand pro Bild in remote_cam.import_job.status.
Konfiguration
Zweigeteilt - bewusst:
| Datei | Inhalt | Im Git? |
|---|---|---|
config.yaml |
Nicht-geheime App-Tunables + oeffentliche Endpunkte | ja (Template) |
.env |
Secrets: S3-Keys, PG_DSN, API-Key |
nein (.gitignore) |
Secrets werden ausschliesslich ueber Umgebungsvariablen geladen; die Werte in
.env ueberschreiben bzw. ergaenzen config.yaml. Beim Start prueft die App die
Vollstaendigkeit und bricht mit klarer Meldung ab, falls ein Secret fehlt.
Unterstuetzte Umgebungsvariablen: S3_ENDPOINT, S3_BUCKET, S3_ACCESS_KEY,
S3_SECRET_KEY, PG_DSN, DEERMAPPER_API_URL, DEERMAPPER_API_KEY, CONFIG_YAML,
DEBUG.
Betrieb (Docker)
cp .env.example .env # danach echte, rotierte Werte eintragen
chmod 600 .env
docker compose up -d --build
docker compose logs -f
Sicherheitshinweise
- Niemals Secrets in
config.yamloder ins Git schreiben - nur in.env. PG_DSNmit?sslmode=require; die Datenbank sollte nicht oeffentlich erreichbar sein (privates Netz / Firewall / SSH-Tunnel).- Debug-Port (
5678) ist standardmaessig aus; bei Bedarf nur an127.0.0.1binden. - Nach Kompromittierung (z.B. Secrets waren im Git): rotieren, nicht nur entfernen.
Siehe MIGRATION.md fuer Secret-Rotation, Umzug auf einen neuen
Server und Stilllegung des Altservers.