# FotkyBuzalkovi Systém pro zpracování, ukládání a vyhledávání rodinných fotografií s automatickou extrakcí EXIF metadat. ## Architektura Projekt používá kombinaci tří databází, kde každá řeší specifickou úlohu: ``` ┌─────────────────────────────────────────────────────────┐ │ Python aplikace │ │ (zpracování fotek, EXIF, hash) │ └────────────┬──────────────┬──────────────┬───────────────┘ │ │ │ ▼ ▼ ▼ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ PostgreSQL │ │ MongoDB │ │ Redis │ │ (relační) │ │ (EXIF/doc) │ │ (cache) │ └────────────┘ └────────────┘ └────────────┘ 192.168.1.76 192.168.1.76 localhost :5432 :27017 :6379 ``` ### Proč tři databáze? | Databáze | Role | Co ukládá | |----------|------|-----------| | **PostgreSQL** | Strukturovaná data, relace | `photos`, `cameras`, `photo_tags` - ID, cesty, hashe, FK | | **MongoDB** | Flexibilní dokumenty | Plná EXIF metadata (různé fotoaparáty = různá pole) | | **Redis** | Cache + fronty | Miniatury, výsledky vyhledávání, fronta zpracování | ## Datové úložiště ### PostgreSQL - `fotky_buzalkovi` - **cameras** - seznam fotoaparátů (model, vyrobce) - **photos** - hlavní tabulka (file_name, file_path, file_hash, taken_at, rozměry, FK na camera) - **photo_tags** - tagy ke každé fotce (many-to-many) ### MongoDB - `fotky_buzalkovi` - **photos** kolekce - kompletní EXIF data, GPS souřadnice, nastavení clony, ISO, atd. ### Redis (plánováno) - **cache:thumb:{photo_id}** - cached miniatury (TTL 1h) - **queue:process** - fronta nezpracovaných fotek - **session:{user_id}** - session data ## K čemu Redis 1. **Cache miniatur** - generování miniatur je drahé, Redis je drží v RAM (rychlost ~0.1ms vs ~50ms z disku) 2. **Cache vyhledávání** - "fotky z dovolené 2025" se může opakovat, výsledek se cachuje 3. **Fronta zpracování** - když nahrajete 1000 fotek, Redis funguje jako worker queue 4. **Deduplikace** - rychlá kontrola, zda hash fotky už existuje 5. **Rate limiting** - omezení uploadů ## Instalace ### 1. Python prostředí ```powershell python -m venv .venv .venv\Scripts\Activate.ps1 pip install psycopg2-binary pymongo redis pillow exifread python-dotenv ``` ### 2. PostgreSQL Předpoklad: PostgreSQL běží na `192.168.1.76:5432`. ```powershell python create_schema.py ``` ### 3. MongoDB Předpoklad: MongoDB běží na `192.168.1.76:27017`. ```powershell python test_mongo.py ``` ### 4. Redis (Windows) Redis oficiálně Windows nepodporuje. Tři možnosti: **Možnost A - WSL2 (doporučeno):** ```powershell wsl --install # v WSL: sudo apt update sudo apt install redis-server sudo service redis-server start ``` **Možnost B - Docker:** ```powershell docker run -d --name redis -p 6379:6379 redis:latest ``` **Možnost C - Memurai (Windows-native Redis-kompatibilní):** - Stáhnout z https://www.memurai.com/ Test: ```powershell python test_db_connection.py ``` ## Konfigurace **⚠️ Hesla v současných skriptech jsou v plain textu - před nasazením přesunout do `.env`:** ```env PG_HOST=192.168.1.76 PG_PORT=5432 PG_USER=vladimir.buzalka PG_PASSWORD=... PG_DB=fotky_buzalkovi MONGO_URI=mongodb://192.168.1.76:27017/ MONGO_DB=fotky_buzalkovi REDIS_HOST=localhost REDIS_PORT=6379 ``` ## Struktura projektu ``` FotkyBuzalkovi/ ├── demo_fotky/ # Testovací fotografie ├── create_schema.py # Vytvoření PostgreSQL schématu ├── test_db_connection.py # Test všech tří databází ├── test_mongo.py # Test MongoDB + vytvoření kolekcí ├── .gitignore └── README.md ``` ## Známé problémy - `create_schema.py` používá MySQL syntaxi `INDEX idx_x` uvnitř `CREATE TABLE` - v PostgreSQL je potřeba `CREATE INDEX` zvlášť po `CREATE TABLE` - Hesla jsou hardcodovaná v Python souborech - migrovat do `.env` + `python-dotenv` ## Roadmap - [ ] Opravit PostgreSQL schéma (INDEX syntaxe) - [ ] Migrace hesel do `.env` - [ ] Instalace Redis - [ ] Skript pro hromadný import fotek z `demo_fotky/` - [ ] EXIF parser (pillow + exifread) - [ ] Generování miniatur s Redis cache - [ ] Web UI pro prohlížení galerie