Remove hardcoded credentials, harden deployment, optimize OCR
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>
This commit is contained in:
46
README.md
46
README.md
@@ -1 +1,45 @@
|
||||
# melesICUmover
|
||||
# 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.
|
||||
|
||||
Reference in New Issue
Block a user