# 🛢️ 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