# 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) ```bash 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.yaml` oder ins Git schreiben - nur in `.env`. - `PG_DSN` mit `?sslmode=require`; die Datenbank sollte **nicht** oeffentlich erreichbar sein (privates Netz / Firewall / SSH-Tunnel). - Debug-Port (`5678`) ist standardmaessig aus; bei Bedarf nur an `127.0.0.1` binden. - Nach Kompromittierung (z.B. Secrets waren im Git): **rotieren**, nicht nur entfernen. Siehe [`MIGRATION.md`](MIGRATION.md) fuer Secret-Rotation, Umzug auf einen neuen Server und Stilllegung des Altservers.