Bakgrunn

Gjøvik kommune samarbeider med NTNU om bachelor- og masteroppgaver der studenter utvikler programvare for kommunen. Problemet kommunen hadde var at de gjerne ville fortsette å bruke noen av disse studentløsningene i etterkant — men hadde ingen egnet driftsmiljø til å faktisk kjøre dem i, uavhengig av kommunens interne systemer.

Sammen med tre medstudenter fikk jeg i oppgave å bygge dette driftsmiljøet fra grunnen av, i Microsoft Azure.

Hva vi bygde

Et skybasert driftsmiljø der studentoppgaver kjører som containere, med automatisert utrulling og fjerning gjennom GitHub Actions. Kravet til en studentoppgave for å kunne driftes i miljøet er enkelt: den må være Dockerized, og hvis den trenger lagring må det skje via PostgreSQL.

Teknologier:

  • Terraform — all infrastruktur er kode, organisert i moduler (nettverk, database, lagring, containere, alerts)
  • Microsoft Azure — Container Apps, PostgreSQL Flexible Server, Key Vault, Storage Account
  • Docker — hver studentoppgave bygges som et image og lagres i GitHub Container Registry
  • GitHub Actions — tre workflows håndterer bygging av Docker-images, Terraform-apply og fjerning av oppgaver

Arkitektur og moduler

Systemarkitektur for IT-driftsmiljøet

Terraform-koden er delt i egne moduler per ansvarsområde i stedet for én stor flat konfigurasjon:

  • network — Network Security Groups med “deny all” som utgangspunkt for databasen, og kun HTTPS tillatt inn til containerne
  • database — PostgreSQL Flexible Server med konfigurerbar backup-retention og auto-grow
  • storage — Storage Account for Terraform-variabler, med delt nøkkeltilgang deaktivert
  • containers — Container Apps og Key Vault for sikker lagring av databasepassord
  • alerts — automatiske varsler på e-post og SMS ved høy CPU-bruk

Denne modulstrukturen gjør det mulig å gjenbruke og teste enkeltkomponenter uten å måtte forholde seg til hele infrastrukturen samtidig.

Automatisert utrulling

Når en ny studentoppgave skal driftes, kjøres et Python-script som pusher koden til repoet og trigger to workflows i sekvens:

  1. docker-build.yml bygger et nytt Docker-image og lagrer det i GitHub Container Registry
  2. buildTerraform.yml legger til de nye verdiene i Terraform-konfigurasjonen og kjører terraform apply

Fjerning av en studentoppgave skjer på samme måte — en tom commit trigger remove.yml, som fjerner Docker-imaget og kjører Terraform på nytt med oppdatert konfigurasjon.

Sikkerhetshensyn

Som student innen digital infrastruktur og cybersikkerhet var det viktig for meg at sikkerhet står i fokus:

  • Databasepassord og andre hemmeligheter lagres i Azure Key Vault, ikke i kode
  • Network Security Groups følger prinsippet om minste privilegium — databasen er stengt for alt unntatt nødvendig trafikk
  • Autentisering mot Azure skjer via en dedikert service principal med avgrensede rettigheter, ikke personlige brukerkontoer
  • Terraform state lagres i Azure Storage med delt nøkkeltilgang deaktivert

Resultat

Vi leverte et fungerende driftsmiljø som Gjøvik kommune kan ta i bruk for å drifte og videreutvikle studentoppgaver de ønsker å beholde, med full automatisering fra kode til kjørende container i Azure.

Lenker