99 lines
4.5 KiB
Markdown
99 lines
4.5 KiB
Markdown
# FotkyBuzalkovi
|
||
|
||
Systém pro organizaci a tagování ~200 000 rodinných fotek. Lokální nasazení, bez cloudu.
|
||
|
||
## Kde jsme
|
||
|
||
- **85 833 fotek** zpracovaných v DB (EXIF, hashe, metadata)
|
||
- **39 961 unikátních souborů** fyzicky zálohovaných na Tower1
|
||
- Sběr fotek běží ze dvou serverů (tower, Tower1) i z Windows PC
|
||
- Průzkumný Streamlit dashboard hotový (`run_webreport.py`)
|
||
|
||
## Stack
|
||
|
||
- **PostgreSQL** (192.168.1.76:5432) — jediná databáze, JSONB nahrazuje MongoDB
|
||
- **Filesystem** — fotky zůstávají na disku, v DB jen cesty a metadata
|
||
- **Python** — veškeré skripty (ExifRead pro EXIF, imagehash pro pHash, blake3 pro zálohy)
|
||
|
||
## Struktura projektu
|
||
|
||
```
|
||
FotkyBuzalkovi/
|
||
├── 00 PictureCollector/ # Sběr fotek ze všech počítačů na Tower1
|
||
│ ├── collect_pictures.py # Hlavní skript (Linux, běží na tower + Tower1)
|
||
│ ├── collect_pictures_windows.py # Windows verze (pro libovolný PC v síti)
|
||
│ ├── create_tables.py # Vytvoření tabulek zaloha_obrazku + zdrojove_soubory
|
||
│ ├── verify_tables.py # Ověření struktury tabulek
|
||
│ ├── clear_tables.py # TRUNCATE obou tabulek (pozor!)
|
||
│ ├── stats.py # Statistiky sběru
|
||
│ ├── ssh_deploy.py # Nasazení skriptu na tower
|
||
│ ├── ssh_deploy_tower1.py # Nasazení skriptu na Tower1
|
||
│ ├── ssh_install_deps.py # Instalace závislostí na tower
|
||
│ ├── ssh_install_tower1.py # Instalace závislostí na Tower1
|
||
│ ├── ssh_check_mount.py # Kontrola NFS mountu
|
||
│ ├── ssh_check_tower1.py # Kontrola Tower1
|
||
│ └── ssh_find_userscripts.py # Hledání Unraid user scriptů
|
||
│
|
||
├── 20 PrůzkumFotek/ # Průzkum a vizualizace dat
|
||
│ ├── report.py # Streamlit dashboard (spouštět přes run_webreport.py)
|
||
│ └── analyze_all.py # Konzolová analýza (jednorázová)
|
||
│
|
||
├── 30 SběrDat/ # Zpracování fotek — EXIF parsing, import do DB
|
||
│ ├── explore_photos.py # Explorační skript (hashe, EXIF, IPTC, XMP)
|
||
│ ├── 10_collect_metadata.py # Sběr metadat z fotek
|
||
│ ├── import_to_db.py # Import do tabulky photos
|
||
│ ├── create_schema.py # Vytvoření tabulek photos/tags/photo_tags
|
||
│ └── photo_exploration.json # Výstup exploreru (7 demo fotek)
|
||
│
|
||
├── demo_fotky/ # 7 testovacích fotek (iPhone, screenshot, sirotek)
|
||
├── output/ # Výstupy skriptů
|
||
│ └── 10_metadata.jsonl # Nasbíraná metadata
|
||
├── trash/ # Zastaralé skripty (test_mongo.py, test_db_connection.py)
|
||
│
|
||
├── run_webreport.py # Spustí Streamlit dashboard (1 klik v PyCharm)
|
||
├── .env # Konfigurace (hesla)
|
||
├── .gitignore
|
||
│
|
||
├── NAVRH.md # → viz docs/NAVRH.md (architektonická rozhodnutí, hashe, metadata)
|
||
└── SCHEMA.md # → viz docs/SCHEMA.md (kompletní DB schéma)
|
||
```
|
||
|
||
## Detailní dokumentace
|
||
|
||
| Soubor | Obsah |
|
||
|--------|-------|
|
||
| [SCHEMA.md](SCHEMA.md) | Kompletní DB schéma — všechny tabulky, sloupce, indexy, constrainty |
|
||
| [NAVRH.md](NAVRH.md) | Architektonická rozhodnutí, 4 úrovně hashů, EXIF/IPTC/XMP, workflow importu |
|
||
|
||
## Infrastruktura
|
||
|
||
| Server | IP | Role |
|
||
|--------|----|------|
|
||
| **tower** | 192.168.1.76 | Hlavní NAS, PostgreSQL, spouští skripty |
|
||
| **Tower1** | 192.168.1.50 | Archivní NAS, fyzická záloha fotek (`/mnt/user/ZalohaVsechObrazku`) |
|
||
|
||
SSH klíče sdílené mezi servery. Z tower přístup na Tower1 přes NFS mount.
|
||
|
||
## Rychlý start
|
||
|
||
```powershell
|
||
# Spustit dashboard
|
||
python run_webreport.py
|
||
|
||
# Nasadit collect_pictures na server
|
||
python "00 PictureCollector/ssh_deploy.py"
|
||
python "00 PictureCollector/ssh_deploy_tower1.py"
|
||
|
||
# Spustit sběr fotek z Windows PC
|
||
python "00 PictureCollector/collect_pictures_windows.py"
|
||
```
|
||
|
||
## Otevřené otázky
|
||
|
||
1. Fotky bez EXIF (7 % fotek) — importovat s mtime / odmítnout / označit?
|
||
2. Shoda `sha256_pixels` — přeskočit / sloučit metadata / uložit oba?
|
||
3. Storage layout — in-place / `archiv/YYYY/MM/` / content-addressable?
|
||
4. Propojení tabulek skupiny 1 (photos) a skupiny 2 (zaloha_obrazku) — zatím žádný FK
|
||
5. Fotky 2013–2021 — velký propad, chybí zdroje (mobily, iCloud?)
|
||
6. 4 210 fotek z 2022 bez kamery — pravděpodobně hromadný export z iCloudu (25.9.2023)
|