zkt26/zadanie 1/docker-compose.yaml
2026-03-22 12:58:49 +01:00

131 lines
4.3 KiB
YAML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# =============================================================
# 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: