Secrets (S3 keys, PG password, DeerMapper API key) were committed in config.yaml and .env and remain in git history. This removes them from the tracked tree and moves all secrets to env injection. Security: - config.yaml: drop all credentials, keep only non-secret app tunables - untrack .env, add .env.example template; .gitignore excludes .env - main.py: tolerant config lookups + fail-fast validation for missing secrets - docker-compose: env_file injection, no full-repo bind mount, debug port off - Dockerfile: bake config into image, run as non-root user Efficiency: - OCR: run the second (expensive) tesseract pass only when the first is unparsable; identical fallback behavior Docs: - README with operation + security notes - MIGRATION.md runbook: secret rotation, server cutover, decommission, git history purge Note: the leaked secrets are compromised and MUST be rotated; removing them from the tree is not sufficient. See MIGRATION.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.8 KiB
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.