131 lines
4.3 KiB
YAML
Executable File
131 lines
4.3 KiB
YAML
Executable File
# =============================================================
|
||
# docker-compose.yaml – Konfigurácia všetkých služieb
|
||
# =============================================================
|
||
# Docker Compose číta tento súbor a spustí všetky kontajnery
|
||
# naraz, so správnym prepojením a konfiguráciou.
|
||
#
|
||
# SLUŽBY:
|
||
# db – PostgreSQL databáza (port 5432)
|
||
# backend – Node.js API server (port 3000, interný)
|
||
# nginx – Webserver + proxy (port 80, verejný)
|
||
# pgadmin – Webové rozhranie DB (port 8080)
|
||
#
|
||
# SIEŤ: blog-network (interná Docker sieť)
|
||
# ZVÄZOK: db-data (trvalé uloženie dát databázy)
|
||
# =============================================================
|
||
|
||
services:
|
||
|
||
# ── 1. DATABÁZA ─────────────────────────────────────────────
|
||
db:
|
||
image: postgres:16-alpine # oficiálny obraz, alpine = menší
|
||
container_name: blog-db
|
||
restart: unless-stopped # reštartuj po páde, nie po ručnom zastavení
|
||
|
||
environment:
|
||
POSTGRES_DB: blog # názov databázy ktorá sa vytvorí
|
||
POSTGRES_USER: blog_user # používateľ
|
||
POSTGRES_PASSWORD: blog_pass # heslo
|
||
ports:
|
||
- "5432:5432"
|
||
volumes:
|
||
# Trvalý zväzok – dáta v DB prežijú reštart kontajnera
|
||
- db-data:/var/lib/postgresql/data
|
||
# Init skript – PostgreSQL ho spustí pri prvom štarte
|
||
- ./backend/init.sql:/docker-entrypoint-initdb.d/init.sql
|
||
|
||
networks:
|
||
- blog-network
|
||
|
||
# Healthcheck – Docker kontroluje či je DB pripravená
|
||
# Backend nesmie štartovať skôr, než DB prijíma spojenia
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U blog_user -d blog"]
|
||
interval: 5s # kontroluj každých 5 sekúnd
|
||
timeout: 5s # čakaj max 5 sekúnd na odpoveď
|
||
retries: 5 # po 5 neúspechoch = unhealthy
|
||
|
||
# ── 2. BACKEND ──────────────────────────────────────────────
|
||
backend:
|
||
build: ./backend # zostav obraz z ./backend/Dockerfile
|
||
container_name: blog-backend
|
||
restart: unless-stopped
|
||
|
||
environment:
|
||
# Tieto premenné číta db.js – takto heslo nie je v kóde
|
||
DB_HOST: db # názov DB služby = hostname v Docker sieti
|
||
DB_PORT: 5432
|
||
DB_NAME: blog
|
||
DB_USER: blog_user
|
||
DB_PASSWORD: blog_pass
|
||
PORT: 3000
|
||
|
||
networks:
|
||
- blog-network
|
||
|
||
# Čakaj kým DB je zdravá – až potom spusti backend
|
||
depends_on:
|
||
db:
|
||
condition: service_healthy
|
||
|
||
# ── 3. NGINX (webserver + reverse proxy) ────────────────────
|
||
nginx:
|
||
image: nginx:alpine
|
||
container_name: blog-nginx
|
||
restart: unless-stopped
|
||
|
||
ports:
|
||
# Mapovanie portov: HOST:KONTAJNER
|
||
# Prehliadač sa pripojí na localhost:80
|
||
- "80:80"
|
||
|
||
volumes:
|
||
# Statické súbory frontendu
|
||
- ./frontend:/usr/share/nginx/html:ro # :ro = read-only
|
||
# Naša konfigurácia namiesto predvolenej
|
||
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||
|
||
networks:
|
||
- blog-network
|
||
|
||
depends_on:
|
||
- backend
|
||
|
||
# ── 4. PGADMIN (webové rozhranie pre databázu) ───────────────
|
||
pgadmin:
|
||
image: dpage/pgadmin4:latest
|
||
container_name: blog-pgadmin
|
||
restart: unless-stopped
|
||
|
||
environment:
|
||
PGADMIN_DEFAULT_EMAIL: admin@blog.local
|
||
PGADMIN_DEFAULT_PASSWORD: admin
|
||
|
||
ports:
|
||
# pgAdmin dostupný na localhost:8080
|
||
- "8080:80"
|
||
|
||
networks:
|
||
- blog-network
|
||
|
||
depends_on:
|
||
- db
|
||
|
||
# =============================================================
|
||
# SIETE
|
||
# =============================================================
|
||
# Interná virtuálna sieť – kontajnery sa navzájom vidia
|
||
# cez názov služby (napr. "db", "backend")
|
||
# Zvonka (z hosťovského počítača) sú viditeľné len cez ports:
|
||
networks:
|
||
blog-network:
|
||
driver: bridge
|
||
|
||
# =============================================================
|
||
# ZVÄZKY
|
||
# =============================================================
|
||
# Pomenovaný zväzok – Docker ho spravuje samostatne
|
||
# Dáta prežijú aj keď sa kontajner zmaže a znova vytvorí
|
||
volumes:
|
||
db-data:
|