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