Cloud, Docker i DevOps — brza i pouzdana isporuka
Sve aplikacije kontejneriziramo pomoću Dockera, orkestriramo ih s Docker Compose (ili Kubernetesom za enterprise projekte), konfiguriramo Caddy kao reverse proxy s automatskim SSL-om i automatiziramo cijeli ciklus isporuke putem GitHub Actions — od commita do produkcije.
Kontejnerizacija s Dockerom i Docker Compose
Svaki servis ima vlastiti multi-stage Dockerfile: build faza koja instalira zavisnosti i kompajlira te minimalna završna faza (distroless ili alpine) koja sadrži samo potrebne artefakte. Tipična Next.js slika izlazi ispod 150 MB, a FastAPI ispod 80 MB. Slike se ponovo grade pri svakom spajanju u main i označavaju semantički (`v1.2.3` + `latest`).
Docker Compose definira cijeli stack: frontend, API, bazu, Redis, worker. Osjetljive varijable (lozinka baze, API ključevi, Stripe secret) nalaze se u `.env` koji je isključen iz gita — nikad zapisane u slici. Health checkovi u Composeu osiguravaju da su zavisnosti spremne prije pokretanja (baza spremna → pokretanje API-ja → pokretanje frontenda).
- Build keš pomoću `--mount=type=cache` — npm ci za <30 s na CI-ju
- Optimiziran redoslijed slojeva: stabilne zavisnosti → izvorni kod
- Upravljanje tajnama pomoću Docker secrets ili HashiCorp Vaulta za enterprise projekte
- `restart: unless-stopped` + `docker compose up --no-deps` za atomsku isporuku
Caddy — moderni reverse proxy s automatskim SSL-om
Caddy 2.8 automatski upravlja SSL/TLS-om putem ACME-a (Let's Encrypt ili ZeroSSL) — bez isteklih certifikata, bez ručne konfiguracije. HTTP/2 i HTTP/3 (QUIC) uključeni su po defaultu. Sigurnosna zaglavlja (HSTS, X-Frame-Options, CSP) postavljaju se globalno putem ponovno upotrebljivih snippeta. Deklarativna konfiguracija Caddyfile može se porediti diffom i verzionirana je u gitu.
Ograničavanje broja zahtjeva, gzip/brotli kompresija i strukturirano JSON logiranje aktiviraju se izvornim Caddy direktivama — bez nginx modula ili složene Apache konfiguracije. Pristup osjetljivim rutama (`/admin`, `.env`, `.git`) vraća 444 (bez odgovora), što je podešeno kao globalni sigurnosni snippet.
- Samo TLS 1.3 s modernim cipher suiteovima i HSTS zaglavljem
- On-demand TLS za multi-tenant SaaS s dinamičnim poddomenama
- Reload bez zastoja — `caddy reload` ne prekida aktivne veze
- Caddy logiranje → Loki → Grafana — analiza prometa i upozorenja na anomalije
GitHub Actions CI/CD i nadzor
CI pipeline se pokreće na svakom PR-u: lint, provjera tipova, unit testovi, build Docker slike, skeniranje ranjivosti (Trivy). Ako sve prođe, slika se šalje u registry, a isporuka na staging odvija se automatski. Spajanje u main = automatska isporuka u produkciju s healthcheckom nakon isporuke. Automatski povratak na prethodnu verziju ako healthcheck ne uspije u roku od 60 sekundi.
Nadzor pomoću Grafana + Prometheus za metrike aplikacije (latencija, stopa grešaka, veličina reda) i Loki za agregaciju logova. Upozorenja su podešena na Slack/e-poštu: stopa grešaka >1%, P95 latencija >500 ms, disk >85%. Vanjski nadzor dostupnosti pomoću Better Uptime — javna SLA nadzorna ploča dostupna na zahtjev.
- Trivy skeniranje ranjivosti na slikama — blokira se pri Critical CVE-u
- Dependabot + auto-merge za patch ažuriranja (zahtijeva zeleni CI)
- Automatska sigurnosna kopija baze na S3-kompatibilnu pohranu (noćna, zadržavanje 30 dana)
Prednosti i nedostaci
Prednosti
- Isporuka s automatskim povratkom na prethodnu verziju pri neuspjelom healthchecku.
- Automatski SSL/TLS putem Caddyja — bez ručno isteklih certifikata.
- Ponovljivo okruženje: ista Docker slika na razvoju, stagingu i produkciji.
- Nadzor i upozorenja (Grafana, Loki) — problemi se vide prije korisnika.
Ograničenja
- Docker Compose se ne skalira kao Kubernetes za enterprise okruženja s više čvorova.
- Početno postavljanje CI/CD-a traži vrijeme i DevOps stručnost.
- Slike i logovi troše prostor na disku — potrebno je periodično čišćenje.
- Potpun nadzor (Prometheus + Grafana) dodaje servise koje treba održavati.
Brzi zaključak
Docker + Caddy + GitHub Actions idealna je kombinacija za pouzdanu isporuku na VPS-u ili na nekoliko čvorova. Za desetine čvorova s agresivnim automatskim skaliranjem pređite na Kubernetes.
Tabela specifikacija
| Mogućnost | Ograničenje / prag | Tipična upotreba | |
|---|---|---|---|
| Orkestracija | Docker Compose, cijeli stack | Jedan čvor; za više čvorova treba Swarm/K8s | VPS, mali i srednji projekti |
| Reverse proxy | Caddy 2.8, HTTP/3, automatski SSL | Vrlo složena pravila traže proširenu konfiguraciju | Više domena, multi-tenant |
| CI/CD | GitHub Actions, automatska isporuka | CI minute se naplaćuju iznad besplatnog nivoa | Automatski od commita do produkcije |
| Tipični trošak | VPS od ~€5/mjesečno | Nadzor + sigurnosna kopija povećavaju trošak | Od jedne web-stranice do više brendova |
Docker Compose naspram Kubernetesa
| Kriterij | Docker Compose | Kubernetes |
|---|---|---|
| Složenost postavljanja | Niska | Visoka |
| Više čvorova / automatsko skaliranje | Ograničeno (jedan čvor) | Odlično |
| Najbolje za | VPS, mali i srednji projekti | Velike flote, enterprise |
Često postavljana pitanja
Zašto Caddy, a ne Nginx?
Caddy automatski upravlja SSL/TLS-om putem ACME-a, po defaultu uključuje HTTP/2 i HTTP/3 i ima kratku deklarativnu konfiguraciju. Nginx za isti rezultat traži certbot i više ručne konfiguracije.
Treba li mi Kubernetes?
Za većinu web-stranica ne. Docker Compose na VPS-u pouzdano vodi web-stranicu ili nekoliko servisa. Kubernetes postaje koristan tek kod desetina čvorova s agresivnim automatskim skaliranjem.
Kako funkcionira isporuka i povratak na prethodnu verziju?
GitHub Actions gradi novu sliku, pokreće je pored stare, izvršava healthcheck, a zatim prebacuje promet. Ako healthcheck ne uspije u roku od 60 sekundi, automatski se vraća na prethodnu verziju.
Koji nadzor preporučujete?
Grafana + Prometheus za metrike (latencija, stopa grešaka) i Loki za agregirane logove, uz Slack/e-mail upozorenja. Za vanjski nadzor dostupnosti dodajemo nezavisan servis poput Better Uptime.