4.8 KiB
4.8 KiB
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
- Cache miniatur - generování miniatur je drahé, Redis je drží v RAM (rychlost ~0.1ms vs ~50ms z disku)
- Cache vyhledávání - "fotky z dovolené 2025" se může opakovat, výsledek se cachuje
- Fronta zpracování - když nahrajete 1000 fotek, Redis funguje jako worker queue
- Deduplikace - rychlá kontrola, zda hash fotky už existuje
- Rate limiting - omezení uploadů
Instalace
1. Python prostředí
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.
python create_schema.py
3. MongoDB
Předpoklad: MongoDB běží na 192.168.1.76:27017.
python test_mongo.py
4. Redis (Windows)
Redis oficiálně Windows nepodporuje. Tři možnosti:
Možnost A - WSL2 (doporučeno):
wsl --install
# v WSL:
sudo apt update
sudo apt install redis-server
sudo service redis-server start
Možnost B - Docker:
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:
python test_db_connection.py
Konfigurace
⚠️ Hesla v současných skriptech jsou v plain textu - před nasazením přesunout do .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.pypoužívá MySQL syntaxiINDEX idx_xuvnitřCREATE TABLE- v PostgreSQL je potřebaCREATE INDEXzvlášť poCREATE 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