Cloud, Docker & DevOps — Hurtig og pålidelig udrulning
Vi containeriserer alle applikationer med Docker, orkestrerer dem med Docker Compose (eller Kubernetes til enterprise-projekter), konfigurerer Caddy som reverse proxy med automatisk SSL og automatiserer hele udrulningscyklussen via GitHub Actions — fra commit til produktion.
Containerisering med Docker og Docker Compose
Hver tjeneste har sin egen multi-stage Dockerfile: en build-fase, der installerer afhængigheder og kompilerer, og en minimal slutfase (distroless eller alpine), der kun indeholder de nødvendige artefakter. Et typisk Next.js-image fylder under 150 MB, et FastAPI-image under 80 MB. Images bygges om ved hver sammenfletning til main og får semantiske tags (`v1.2.3` + `latest`).
Docker Compose definerer hele stakken: frontend, API, DB, Redis, worker. Følsomme variabler (DB-adgangskode, API-nøgler, Stripe-hemmelighed) ligger i `.env`, som er udelukket fra git — aldrig hardkodet i imaget. Health checks i Compose sikrer, at afhængighederne er klar før start (DB klar → API starter → frontend starter).
- Build-cache med `--mount=type=cache` — npm ci på under 30 s i CI
- Optimeret lagrækkefølge: stabile afhængigheder → kildekode
- Håndtering af hemmeligheder med Docker secrets eller HashiCorp Vault til enterprise-projekter
- `restart: unless-stopped` + `docker compose up --no-deps` til atomisk udrulning
Caddy — moderne reverse proxy med automatisk SSL
Caddy 2.8 håndterer SSL/TLS automatisk via ACME (Let's Encrypt eller ZeroSSL) — ingen udløbne certifikater og ingen manuel konfiguration. HTTP/2 og HTTP/3 (QUIC) er aktiveret som standard. Sikkerhedsheadere (HSTS, X-Frame-Options, CSP) sættes globalt via genbrugelige snippets. Den deklarative Caddyfile-konfiguration kan diffes og versioneres i git.
Rate limiting, gzip/brotli-komprimering og struktureret JSON-logning aktiveres via Caddys native direktiver — ingen nginx-moduler eller kompleks Apache-konfiguration. Adgang til følsomme ruter (`/admin`, `.env`, `.git`) returnerer 444 (intet svar), konfigureret som et globalt sikkerhedssnippet.
- Kun TLS 1.3 med moderne cipher suites, konfigureret globalt i Caddy
- On-demand TLS til multi-tenant SaaS med dynamiske subdomæner
- Reload uden nedetid — `caddy reload` afbryder ikke aktive forbindelser
- Caddy-logning → Loki → Grafana — trafikanalyse og alarmer ved anomalier
GitHub Actions CI/CD og overvågning
CI-pipelinen kører ved hver PR: lint, typetjek, enhedstest, build af Docker-image og sårbarhedsscanning (Trivy). Hvis alt består, pushes imaget til registret, og udrulning til staging sker automatisk. Sammenfletning til main = automatisk udrulning til produktion med healthcheck efter udrulningen. Automatisk rollback, hvis healthchecket fejler inden for 60 sekunder.
Overvågning med Grafana + Prometheus til applikationsmetrikker (latenstid, fejlrate, kølængde) og Loki til logaggregering. Alarmer er konfigureret til Slack/e-mail: fejlrate > 1 %, P95-latenstid > 500 ms, disk > 85 %. Ekstern oppetidsovervågning med Better Uptime — et offentligt SLA-dashboard er tilgængeligt på forespørgsel.
- Trivy-sårbarhedsscanning af images — blokeret ved kritisk CVE
- Dependabot + auto-merge til patch-opdateringer (grøn CI er et krav)
- Automatisk DB-backup til S3-kompatibel lagring (hver nat, 30 dages opbevaring)
Fordele og begrænsninger
Fordele
- Udrulning med automatisk rollback ved fejlet healthcheck.
- Automatisk SSL/TLS via Caddy — ingen manuelt udløbne certifikater.
- Reproducerbart miljø: samme Docker-image på dev, staging og produktion.
- Overvågning og alarmer (Grafana, Loki) — problemer opdages før brugerne.
Begrænsninger
- Docker Compose skalerer ikke som Kubernetes til enterprise med flere noder.
- Den indledende CI/CD-opsætning kræver tid og DevOps-ekspertise.
- Images og logs optager diskplads — kræver periodisk oprydning.
- Fuld overvågning (Prometheus + Grafana) tilføjer tjenester, der skal vedligeholdes.
Kort konklusion
Docker + Caddy + GitHub Actions er den ideelle kombination til pålidelig udrulning på en VPS eller et par noder. Til dusinvis af noder med aggressiv autoskalering bør du gå over til Kubernetes.
Specifikationstabel
| Egenskab | Grænse / tærskel | Typisk anvendelse | |
|---|---|---|---|
| Orkestrering | Docker Compose, hele stakken | Enkelt node; flere noder kræver Swarm/K8s | VPS, små til mellemstore projekter |
| Reverse proxy | Caddy 2.8, HTTP/3, automatisk SSL | Meget komplekse regler kræver udvidet konfiguration | Multi-domæne, multi-tenant |
| CI/CD | GitHub Actions, udrulning < 5 min | CI-minutter afregnes ud over den gratis kvote | Automatisk fra commit til produktion |
| Typisk pris | VPS fra ca. 5 €/måned | Overvågning + backup øger prisen | Fra et enkelt site til multi-brand |
Docker Compose vs. Kubernetes
| Kriterium | Docker Compose | Kubernetes |
|---|---|---|
| Opsætningskompleksitet | Lav | Høj |
| Flere noder / autoskalering | Begrænset (én node) | Fremragende |
| Bedst til | VPS, små til mellemstore projekter | Store flåder, enterprise |
Ofte stillede spørgsmål
Hvorfor Caddy og ikke Nginx?
Caddy håndterer SSL/TLS automatisk via ACME, aktiverer HTTP/2 og HTTP/3 som standard og har en kort, deklarativ konfiguration. Nginx kræver certbot og mere manuel konfiguration for at opnå det samme.
Har jeg brug for Kubernetes?
Ikke til de fleste sites. Docker Compose på en VPS håndterer et site eller nogle få tjenester pålideligt. Kubernetes bliver først nyttigt ved dusinvis af noder med aggressiv autoskalering.
Hvordan fungerer udrulning?
GitHub Actions bygger et nyt image, starter det side om side med det gamle, kører et healthcheck og skifter derefter trafikken. Hvis healthchecket fejler inden for 60 sekunder, ruller det automatisk tilbage til den forrige version.
Hvilken overvågning anbefaler I?
Grafana + Prometheus til metrikker (latenstid, fejlrate) og Loki til aggregerede logs, med alarmer via Slack/e-mail. Til ekstern oppetidsovervågning tilføjer vi en uafhængig tjeneste som Better Uptime.