Oblak, Docker in DevOps — hitra in zanesljiva namestitev
Vse aplikacije zapakiramo v vsebnike Docker, jih orkestriramo z Docker Compose (ali Kubernetesom pri enterprise projektih), Caddy nastavimo kot obratni posrednik s samodejnim SSL-jem, celoten cikel namestitve pa avtomatiziramo z GitHub Actions — samodejno od commita do produkcije.
Vsebniki z Dockerjem in Docker Compose
Vsaka storitev ima svoj večstopenjski Dockerfile: stopnja za gradnjo, ki namesti odvisnosti in prevede kodo, ter minimalna končna stopnja (distroless ali alpine), ki vsebuje le potrebne artefakte. Tipična slika Next.js zavzame manj kot 150 MB, slika FastAPI manj kot 80 MB. Slike se na novo zgradijo ob vsakem združevanju v main in se semantično označijo (`v1.2.3` + `latest`).
Docker Compose opredeli celoten sklad: frontend, API, zbirko podatkov, Redis, delavca. Občutljive spremenljivke (geslo zbirke, ključi API, skrivnost Stripe) so v datoteki `.env`, izključeni iz gita — nikoli niso trdo zapisane v sliki. Preverjanja zdravja (health checks) v Compose zagotovijo, da so odvisnosti pripravljene pred zagonom (zbirka pripravljena → zagon API-ja → zagon frontenda).
- Predpomnilnik gradnje z `--mount=type=cache` za namestitev odvisnosti na CI
- Optimiziran vrstni red plasti: stabilne odvisnosti → izvorna koda
- Upravljanje skrivnosti z Docker secrets ali HashiCorp Vault pri enterprise projektih
- `restart: unless-stopped` + `docker compose up --no-deps` za atomarno namestitev
Caddy — sodoben obratni posrednik s samodejnim SSL-jem
Caddy 2.8 samodejno upravlja SSL/TLS prek ACME (Let's Encrypt ali ZeroSSL) — noben potečen certifikat, nobene ročne konfiguracije. HTTP/2 in HTTP/3 (QUIC) sta privzeto vklopljena. Varnostne glave (HSTS, X-Frame-Options, CSP) so globalno nastavljene prek ponovno uporabnih odlomkov. Deklarativna konfiguracija Caddyfile omogoča primerjavo razlik in je verzionirana v gitu.
Omejevanje hitrosti, stiskanje gzip/brotli in strukturirano beleženje JSON se vklopijo z izvornimi direktivami Caddyja — brez modulov nginx ali zapletene konfiguracije Apache. Dostop do občutljivih poti (`/admin`, `.env`, `.git`) vrne 444 (brez odgovora), kar je nastavljeno kot globalni varnostni odlomek.
- Samo TLS 1.3 s sodobnimi šifrirnimi nabori
- On-demand TLS za večnajemniški SaaS z dinamičnimi poddomenami
- Ponovno nalaganje brez izpada — `caddy reload` ne prekine aktivnih povezav
- Beleženje Caddy → Loki → Grafana — analiza prometa in opozarjanje na anomalije
CI/CD z GitHub Actions in nadzor
Cevovod CI se zažene ob vsakem PR: lint, preverjanje tipov, enotni testi, gradnja slike Docker, pregled ranljivosti (Trivy). Če vse uspe, se slika potisne v register, namestitev v staging pa steče samodejno. Združitev v main = samodejna namestitev v produkcijo s preverjanjem zdravja po namestitvi. Če preverjanje zdravja v 60 sekundah odpove, sledi samodejna povrnitev.
Nadzor z Grafana + Prometheus za aplikacijske metrike (zakasnitev, stopnja napak, velikost čakalne vrste) in Loki za zbiranje dnevnikov. Opozorila na Slacku/e-pošti: stopnja napak >1 %, zakasnitev P95 >500 ms, disk >85 %. Zunanji nadzor razpoložljivosti z Better Uptime — javna nadzorna plošča SLA je na voljo na zahtevo.
- Pregled ranljivosti Trivy na slikah — blokada pri kritičnem CVE
- Dependabot + samodejno združevanje za popravke (zahtevan zelen CI)
- Samodejna varnostna kopija zbirke v shrambo, združljivo z S3 (vsako noč, hramba 30 dni)
Prednosti in omejitve
Prednosti
- Nova različica se zažene ob stari, s samodejno povrnitvijo ob neuspelem preverjanju zdravja.
- Samodejni SSL/TLS prek Caddyja — noben ročno pozabljen potečen certifikat.
- Ponovljivo okolje: ista slika Docker na razvoju, stagingu in v produkciji.
- Nadzor in opozorila (Grafana, Loki) za stopnjo napak, zakasnitev in dnevnike.
Omejitve
- Docker Compose se ne skalira kot Kubernetes za večvozliščni enterprise.
- Začetna postavitev CI/CD zahteva čas in znanje DevOps.
- Slike in dnevniki porabljajo prostor na disku — potrebno je redno čiščenje.
- Popoln nadzor (Prometheus + Grafana) doda storitve, ki jih je treba vzdrževati.
Kratek povzetek
Docker + Caddy + GitHub Actions je idealna kombinacija za zanesljivo namestitev na VPS ali nekaj vozlišč. Za deset in več vozlišč z agresivnim samodejnim skaliranjem preidite na Kubernetes.
Tabela specifikacij
| Zmožnost | Omejitev / prag | Tipična uporaba | |
|---|---|---|---|
| Orkestracija | Docker Compose, celoten sklad | Eno vozlišče; za več vozlišč je potreben Swarm/K8s | VPS, majhni in srednji projekti |
| Obratni posrednik | Caddy 2.8, HTTP/3, samodejni SSL | Zelo zapletena pravila zahtevajo obsežno konfiguracijo | Večdomenski, večnajemniški |
| CI/CD | GitHub Actions, samodejna namestitev | Minute CI se nad brezplačno kvoto zaračunavajo | Samodejno od commita do produkcije |
| Tipičen strošek | VPS od ~5 €/mesec | Nadzor + varnostne kopije povečajo strošek | Od ene same strani do več blagovnih znamk |
Docker Compose v primerjavi s Kubernetesom
| Merilo | Docker Compose | Kubernetes |
|---|---|---|
| Zahtevnost postavitve | Majhna | Velika |
| Skaliranje na več vozlišč / samodejno skaliranje | Omejeno (eno vozlišče) | Odlično |
| Primerno za | VPS, majhni in srednji projekti | Velike flote, enterprise |
Pogosta vprašanja
Zakaj Caddy in ne Nginx?
Caddy samodejno upravlja SSL/TLS prek ACME, privzeto vklopi HTTP/2 in HTTP/3 ter ima kratko deklarativno konfiguracijo. Nginx za isti rezultat zahteva certbot in več ročne konfiguracije.
Ali potrebujem Kubernetes?
Za večino spletnih strani ne. Docker Compose na VPS zanesljivo upravlja eno stran ali nekaj storitev. Kubernetes postane uporaben šele pri desetih in več vozliščih z agresivnim samodejnim skaliranjem.
Kako deluje namestitev s preverjanjem zdravja?
GitHub Actions zgradi novo sliko, jo zažene ob stari, izvede preverjanje zdravja in nato preklopi promet. Če preverjanje zdravja v 60 sekundah odpove, se samodejno vrnemo na prejšnjo različico.
Kakšen nadzor priporočate?
Grafana + Prometheus za metrike (zakasnitev, stopnja napak) in Loki za zbrane dnevnike, z opozorili na Slacku/e-pošti. Za zunanji nadzor razpoložljivosti dodamo neodvisno storitev, kot je Better Uptime.