# 🛢️ PostgreSQL v Dockeru: Centrální databáze vs. oddělené instance 👉 [[1.1.1 O projektu]] 👉 [[1.1.2 Vlastní digitální svět (přehled článků)]] ## 🛢️ Proč právě PostgreSQL? Když už máme správně nastavenou infrastrukturu s **Dockerem, Portainerem a reverzní proxy Traefik**, je čas přemýšlet o **databázích**. [PostgreSQL](https://www.postgresql.org/) je **výkonná open-source relační databáze**, která se hodí jak pro malé projekty, tak pro velké aplikace s miliony záznamů. ✅ **Flexibilita:** Můžete ji použít jako **centrální databázi** pro více aplikací nebo nasadit oddělené instance pro různé služby. ✅ **Výkon a škálovatelnost:** PostgreSQL zvládá velké objemy dat a podporuje **pokročilé indexování, replikaci a paralelní dotazy**. ✅ **Bezpečnost:** Nabízí robustní možnosti řízení přístupů a šifrování dat. ✅ **Podpora pro JSON a NoSQL:** Umožňuje hybridní přístup mezi tradiční relační databází a flexibilním NoSQL modelem. ## 📌 Úvod: Proč potřebujeme databázi v našem ekosystému Dockeru? Většina aplikací potřebuje někde ukládat data. V našem ekosystému můžeme zvolit: - **Centrální databázi** pro více aplikací (snazší správa a propojení dat). - **Oddělené databázové instance** pro každou aplikaci zvlášť (lepší izolace, škálovatelnost). - **Hybridní přístup** – některé aplikace sdílejí databázi, zatímco jiné mají vlastní instanci. V tomto článku si ukážeme, jak nasadit PostgreSQL v Dockeru, zajistit **perzistenci dat**, správu uživatelů a propojení s aplikacemi. ![[image_postgresql.png]] --- ## 📜 Licence a cena | Aspekt | Detail | |--------|--------| | **Licence** | PostgreSQL License (podobná MIT/BSD) | | **Self-hosting** | ✅ Ano, zcela zdarma | | **Komerční použití** | ✅ Bez jakýchkoliv omezení | | **Cloud verze** | AWS RDS, Google Cloud SQL, Supabase, Neon... | | **Zdrojový kód** | [github.com/postgres/postgres](https://github.com/postgres/postgres) | > PostgreSQL je **100% open-source** pod vlastní licencí, která je jedna z nejpermisivnějších vůbec. Můžete ho používat, modifikovat, distribuovat i prodávat bez jakýchkoliv omezení. Žádné "community vs enterprise" edice – všechny funkce jsou zdarma. ### Proč je PostgreSQL licence výjimečná | Aspekt | PostgreSQL | MySQL | MongoDB | |--------|------------|-------|---------| | Licence | PostgreSQL (free) | GPL/Commercial | SSPL | | Všechny funkce zdarma | ✅ | ❌ (některé jen v Enterprise) | ❌ | | Možnost forku | ✅ | ⚠️ | ❌ | | Cloud-friendly | ✅ | ✅ | ⚠️ | --- ## 🔄 Centrální vs. oddělené databáze: Co je lepší? | Kritérium | Centrální databáze | Oddělené instance | Hybridní přístup | |--------------------------|-------------------|--------------------|-----------------| | **Správa dat** | Snazší zálohování, přístup k více aplikacím | Každá aplikace má vlastní správu | Kombinace obou | | **Výkon** | Může být náročnější na optimalizaci | Lépe škálovatelné individuálně | Balanc mezi izolací a sdílením výkonu | | **Zabezpečení** | Vyžaduje pečlivější řízení přístupů | Lepší izolace jednotlivých aplikací | Možnost řídit oprávnění na úrovni schémat | | **Zálohování** | Jednodušší, jedno centrální místo | Každá aplikace musí mít vlastní zálohování | Lze centralizovat nebo oddělit podle potřeby | **📌 Hybridní přístup:** Některé aplikace mohou sdílet jednu centrální databázi s oddělenými schématy (`SCHEMA_A`, `SCHEMA_B`), zatímco aplikace s vysokou zátěží či specifickými požadavky mohou mít vlastní oddělenou instanci. --- ## 🚀 Instalace PostgreSQL v Dockeru (s `docker-compose.yml`) ```yaml version: '3.8' services: postgres: image: postgres:latest container_name: postgres_db restart: always networks: - digilifehub_network env_file: - .env volumes: - postgres_data:/var/lib/postgresql/data networks: digilifehub_network: external: true volumes: postgres_data: ``` 📌 **Perzistence dat:** Používáme `volumes`, abychom neztratili data při restartu. 📌 **Bezpečnost:** Hesla nejsou přímo v `docker-compose.yml`, ale jsou ukládána v `.env` souboru (ten vytvořte ve stejném adresáři). Vytvořte `.env` soubor: ```ini POSTGRES_USER=admin POSTGRES_PASSWORD=supersecurepassword POSTGRES_DB=main_db ``` --- ## 🔗 Propojení PostgreSQL s aplikacemi 📌 **Aplikace musí běžet ve stejné síti (`digilifehub_network`)** 📌 **Připojení z aplikace (např. n8n.io, WordPress, atd.):** ```yaml DB_HOST: postgres_db DB_USER: ${POSTGRES_USER} DB_PASSWORD: ${POSTGRES_PASSWORD} DB_NAME: ${POSTGRES_DB} ``` --- ## 📈 Monitoring a ladění PostgreSQL 📌 **Logy PostgreSQL:** ```sh docker logs postgres_db --follow ``` 📌 **Použití AI pro debugování:** - **1️⃣ Zkopírujte chybovou hlášku z logů.** - **2️⃣ Vložte ji do ChatGPT/Gemini a požádejte o diagnostiku a opravu.** - **3️⃣ AI navrhne řešení.** --- ## 💡 Praktické použití ### Use case 1: Backend pro e-commerce startup **Situace:** Stavíte e-shop s produkty, objednávkami, uživateli. Potřebujete spolehlivou databázi, která zvládne růst. **Řešení s PostgreSQL:** - **Schéma:** `products`, `orders`, `users`, `inventory`, `payments` - **JSONB:** Flexibilní atributy produktů (velikost, barva, custom fields) - **Full-text search:** Vyhledávání v produktech bez Elasticsearch - **Transakce:** ACID garantuje konzistenci objednávek - **Partitioning:** Archivace starých objednávek pro výkon - **Replikace:** Read replicas pro reporting bez zatížení produkce **Výsledek:** Databáze, která škáluje od MVP po miliony objednávek. ### Use case 2: Multi-tenant SaaS aplikace **Situace:** Vaše SaaS aplikace má 100+ zákazníků. Každý potřebuje izolovaná data, ale nechcete spravovat 100 databází. **Řešení s PostgreSQL:** - **Row Level Security (RLS):** Automatická izolace dat podle `tenant_id` - **Schemas:** Alternativně jeden schema per tenant - **Connection pooling:** PgBouncer pro efektivní využití spojení - **Backup:** Jeden backup pro všechny tenanty - **Migrace:** Jedna migrace aplikovaná na všechny **Příklad RLS:** ```sql CREATE POLICY tenant_isolation ON orders USING (tenant_id = current_setting('app.tenant_id')::int); ``` **Výsledek:** Enterprise-grade multi-tenancy bez složitosti. ### Use case 3: Analytická databáze pro BI **Situace:** Marketing potřebuje reporty z produkčních dat. Nechcete zatěžovat produkční databázi. **Řešení s PostgreSQL:** - **Read replica:** Streaming replikace z produkce - **Materialized views:** Předpočítané agregace pro rychlé dashboardy - **Window functions:** Komplexní analytické dotazy - **Foreign Data Wrappers:** Spojení dat z více zdrojů - **Partitioning:** Rychlé dotazy přes časová období **Výsledek:** Real-time analytics bez dopadu na produkci. ### Use case 4: GIS a prostorová data **Situace:** Aplikace pracuje s mapami – body zájmu, polygony, routing. Potřebujete prostorové dotazy. **Řešení s PostgreSQL + PostGIS:** - **PostGIS extension:** Plnohodnotný GIS v databázi - **Spatial indexy:** Rychlé hledání "co je v okolí 5 km" - **Geometry types:** Body, linie, polygony, 3D objekty - **Routing:** pgRouting pro výpočet tras - **Integration:** Kompatibilní s QGIS, Leaflet, Mapbox **Výsledek:** Enterprise GIS možnosti bez drahých licencí (ESRI). ### Use case 5: Message queue a job processing **Situace:** Potřebujete frontu úloh pro background processing. Redis/RabbitMQ je další závislost. **Řešení s PostgreSQL:** - **SKIP LOCKED:** Efektivní concurrent queue - **LISTEN/NOTIFY:** Real-time notifikace bez pollingu - **pg_cron:** Scheduled jobs přímo v databázi - **Transakce:** Job a jeho výsledek v jedné transakci - **Monitoring:** Stav fronty jedním SQL dotazem **Příklad queue:** ```sql SELECT * FROM jobs WHERE status = 'pending' ORDER BY created_at FOR UPDATE SKIP LOCKED LIMIT 1; ``` **Výsledek:** Méně závislostí, jednodušší architektura. --- ## 🆚 PostgreSQL vs alternativy | Databáze | Licence | JSON podpora | Full-text | GIS | |----------|---------|--------------|-----------|-----| | **PostgreSQL** | PostgreSQL | ✅ JSONB | ✅ Native | ✅ PostGIS | | **MySQL** | GPL/Commercial | ⚠️ JSON | ⚠️ Základní | ❌ | | **MariaDB** | GPL | ⚠️ JSON | ⚠️ | ❌ | | **SQLite** | Public Domain | ✅ JSON1 | ✅ FTS5 | ⚠️ Spatialite | | **MongoDB** | SSPL | ✅ Native | ✅ | ✅ | > **PostgreSQL** je nejuniverzálnější volba – kombinuje výhody relační databáze s flexibilitou NoSQL (JSONB), full-text search a GIS. --- ## 🏁 Závěr a další kroky ✅ **PostgreSQL je nainstalovaná a běží v Dockeru.** ✅ **PostgreSQL License – 100% open-source, všechny funkce zdarma.** ✅ **Zajištěná perzistence dat a bezpečnostní nastavení.** ✅ **Podpora centrální, oddělené i hybridní databázové architektury.** --- ### ⏪ Související články ⏩ > **🔙 Předchozí článek:** > [[2025-02-06 Traefik (Reverzní proxy pro Docker – správa subdomén a HTTPS)|Traefik reverzní proxy]] > > **🔜 Následující článek:** > [[2025-02-12 Adminer (webový správce databáze)|Adminer (webový správce databáze)]] #docker #postgresql #osobniDigitalizace #digilifehub