Cloud, Docker & DevOps — rask og pålitelig utrulling
Vi containeriserer alle applikasjoner med Docker, orkestrerer dem med Docker Compose (eller Kubernetes for enterprise-prosjekter), konfigurerer Caddy som reverse proxy med automatisk SSL og automatiserer hele utrullingssyklusen med GitHub Actions — automatisk fra commit til produksjon.
Containerisering med Docker og Docker Compose
Hver tjeneste har sin egen multi-stage Dockerfile: et build-trinn som installerer avhengigheter og kompilerer, og et minimalt sluttrinn (distroless eller alpine) som bare inneholder de nødvendige artefaktene. Et typisk Next.js-image blir under 150 MB, og et FastAPI-image under 80 MB. Imagene bygges på nytt ved hver merge til main og får semantiske tagger (`v1.2.3` + `latest`).
Docker Compose definerer hele stacken: frontend, API, DB, Redis, worker. Sensitive variabler (DB-passord, API-nøkler, Stripe-hemmelighet) ligger i `.env`, som er utelatt fra git — aldri hardkodet i imaget. Helsesjekker i Compose sikrer at avhengighetene er klare før oppstart (DB klar → API starter → frontend starter).
- Build-cache med `--mount=type=cache` for installasjon av avhengigheter i CI
- Optimalisert lagrekkefølge: stabile avhengigheter → kildekode
- Håndtering av hemmeligheter med Docker secrets eller HashiCorp Vault for enterprise-prosjekter
- `restart: unless-stopped` + `docker compose up --no-deps` for atomisk utrulling
Caddy — moderne reverse proxy med automatisk SSL
Caddy 2.8 håndterer SSL/TLS automatisk via ACME (Let's Encrypt eller ZeroSSL) — ingen utløpte sertifikater og ingen manuell konfigurasjon. HTTP/2 og HTTP/3 (QUIC) er aktivert som standard. Sikkerhetshoder (HSTS, X-Frame-Options, CSP) settes globalt gjennom gjenbrukbare snippets. Den deklarative Caddyfile-konfigurasjonen kan diffes og versjoneres i git.
Rate limiting, gzip-/brotli-komprimering og strukturert JSON-logging aktiveres med Caddys egne direktiver — uten nginx-moduler eller kompleks Apache-konfigurasjon. Tilgang til sensitive ruter (`/admin`, `.env`, `.git`) returnerer 444 (ingen respons), satt opp som en global sikkerhetssnippet.
- Kun TLS 1.3 med moderne cipher suites
- On-demand TLS for multi-tenant SaaS med dynamiske underdomener
- Reload uten nedetid — `caddy reload` avbryter ikke aktive tilkoblinger
- Caddy-logging → Loki → Grafana — trafikkanalyse og varsling ved avvik
GitHub Actions CI/CD og overvåking
CI-pipelinen kjører for hver PR: lint, typesjekk, enhetstester, bygging av Docker-image og sårbarhetsskanning (Trivy). Hvis alt går gjennom, pushes imaget til registeret og utrullingen til staging skjer automatisk. Merge til main = automatisk utrulling til produksjon med helsesjekk etter utrulling. Automatisk tilbakerulling hvis helsesjekken feiler innen 60 sekunder.
Overvåking med Grafana + Prometheus for applikasjonsmetrikker (latens, feilrate, køstørrelse) og Loki for logg-aggregering. Varsler konfigureres på Slack/e-post: feilrate >1 %, P95-latens >500 ms, disk >85 %. Ekstern oppetidsovervåking med Better Uptime — offentlig SLA-dashbord tilgjengelig på forespørsel.
- Trivy-sårbarhetsskanning av image — blokkering ved kritiske CVE-er
- Dependabot + auto-merge for patch-oppdateringer (grønn CI kreves)
- Automatisk DB-backup til S3-kompatibel lagring (hver natt, 30 dagers oppbevaring)
Fordeler og begrensninger
Fordeler
- Den nye versjonen startes ved siden av den gamle, med automatisk tilbakerulling når helsesjekken feiler.
- Automatisk SSL/TLS via Caddy — ingen sertifikater som utløper på grunn av manuell håndtering.
- Reproduserbart miljø: samme Docker-image på dev, staging og produksjon.
- Overvåking og varsler (Grafana, Loki) på feilrate, latens og logger.
Begrensninger
- Docker Compose skalerer ikke som Kubernetes for enterprise med flere noder.
- Det første CI/CD-oppsettet krever tid og DevOps-kompetanse.
- Images og logger bruker diskplass — krever periodisk opprydding.
- Full overvåking (Prometheus + Grafana) gir flere tjenester å vedlikeholde.
Kort vurdering
Docker + Caddy + GitHub Actions er den ideelle kombinasjonen for pålitelig utrulling på en VPS eller noen få noder. For titalls noder med aggressiv auto-skalering bør du gå over til Kubernetes.
Spesifikasjonstabell
| Egenskap | Grense / terskel | Typisk bruk | |
|---|---|---|---|
| Orkestrering | Docker Compose, komplett stack | Én node; flere noder krever Swarm/K8s | VPS, små og mellomstore prosjekter |
| Reverse proxy | Caddy 2.8, HTTP/3, automatisk SSL | Svært komplekse regler krever omfattende konfigurasjon | Flere domener, multi-tenant |
| CI/CD | GitHub Actions, automatisk utrulling | CI-minutter belastes utover gratisnivået | Automatisk fra commit til produksjon |
| Typisk kostnad | VPS fra ~5€/måned | Overvåking + backup gir ekstra kostnad | Fra ett enkelt nettsted til flere merkevarer |
Docker Compose mot Kubernetes
| Kriterium | Docker Compose | Kubernetes |
|---|---|---|
| Oppsettkompleksitet | Lav | Høy |
| Skalering over flere noder / auto-skalering | Begrenset (én node) | Utmerket |
| Egnet for | VPS, små og mellomstore prosjekter | Store flåter, enterprise |
Ofte stilte spørsmå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 konfigurasjon. Nginx krever certbot og mer manuell konfigurasjon for å oppnå det samme.
Trenger jeg Kubernetes?
Ikke for de fleste nettsteder. Docker Compose på en VPS håndterer ett nettsted eller noen få tjenester på en pålitelig måte. Kubernetes blir først nyttig med titalls noder og aggressiv auto-skalering.
Hvordan fungerer en utrulling med helsesjekk?
GitHub Actions bygger et nytt image, starter det ved siden av det gamle, kjører en helsesjekk og bytter deretter trafikken over. Hvis helsesjekken feiler innen 60 sekunder, rulles det automatisk tilbake til forrige versjon.
Hvilken overvåking anbefaler dere?
Grafana + Prometheus for metrikker (latens, feilrate) og Loki for aggregerte logger, med varsler på Slack/e-post. For ekstern oppetidsovervåking legger vi til en uavhengig tjeneste som Better Uptime.