Skip to content

Distribuer Lumi

Lumi kjøres på din egen infrastruktur. Denne guiden hjelper DevOps-ansvarlig å sette opp Lumi API, dashboard og database — og opprette en organisasjon klar for bruk.

Vil du bare evaluere Lumi raskt?

30 minutter til første innsikt tar deg fra ren installasjon til den første survey-responsen i dashboardet, med lokal Keycloak som OIDC-provider. Bruk dette løpet for å validere produktet før en full utrulling.

Forutsetninger

KravMinimum
Kubernetes (for Helm) eller Docker (for Compose)
PostgreSQL15+
OIDC-providerEntra ID, Keycloak, Auth0, o.l.
Docker-imageghcr.io/asorheim/lumi-analytics/lumi-api og ghcr.io/asorheim/lumi-analytics/lumi-dashboard

Lokal testing

Du kan kjøre Lumi uten OIDC-provider ved å sette AUTH_PROVIDER=local. Anbefales kun for utvikling.

Miljøvariabler

Sett LUMI_ENV=production og AUTH_PROVIDER=oidc på både API og dashboard i alle deployede miljøer. AUTH_PROVIDER=local er kun for lokal utvikling og demooppsett bak egen skrivebeskyttelse.

VariabelBrukt avPåkrevdBeskrivelse
LUMI_ENVAPI + dashboardJa (prod)Sett til production i produksjonsmiljøer. Aktiverer streng startup-validering.
AUTH_PROVIDERAPI + dashboardJa (prod)Må være oidc i produksjon. local er kun for lokal utvikling.
OIDC_ISSUER_URLAPI + dashboardJa (OIDC)OIDC issuer URL, f.eks. https://login.microsoftonline.com/{tenant}/v2.0. API-verdien må matche tokenets iss.
OIDC_BROWSER_ISSUER_URLDashboardNeiBrowser-facing issuer hvis dashboard-containeren når provideren på en intern URL, men brukeren må redirectes til en offentlig URL.
OIDC_AUDIENCEAPIJa (OIDC)Forventet audience i access-tokenet.
OIDC_JWKS_URIAPINeiEksplisitt JWKS-endepunkt hvis discovery via issuer ikke er reachable fra API-containeren.
OIDC_CLIENT_IDDashboardJa (OIDC)Dashboardets OIDC client ID.
OIDC_CLIENT_SECRETDashboardKun confidential clientsClient secret for confidential OIDC clients. Public/PKCE clients lar den stå tom.
OIDC_REDIRECT_URIDashboardJa (OIDC)Callback-URL, typisk https://lumi.din-bedrift.no/auth/callback.
OIDC_SCOPESDashboardNeiKomma-separerte scopes dashboardet ber om. Default: openid,profile,email; Entra trenger ofte openid,profile,email,api://{api-client-id}/access_as_user.
LUMI_DASHBOARD_CLIENT_IDAPIJa (prod)OIDC client ID som API-et tillater for dashboard-kall. Skal normalt matche OIDC_CLIENT_ID.
LUMI_ADMIN_GROUPAPIJa (prod OIDC)OIDC-gruppe-ID som gir tilgang til admin-funksjonalitet. API-et feiler startup uten denne i produksjon.
DB_JDBC_URLAPINeiAvansert API-only override for komplett JDBC URL, f.eks. ved SSL-parametre. Hvis du bruker denne, må dashboardets DB_* samtidig peke til samme fysiske database fordi dashboardet lagrer OIDC-sesjoner der. For Docker Compose-eksempelet under: bruk DB_HOST/DB_PORT/DB_DATABASE.
DB_HOST / DB_PORT / DB_DATABASEAPI + dashboardJaPostgreSQL host, port og database. Dashboardet bruker samme database til server-side OIDC-sesjoner.
DB_USERNAME / DB_PASSWORDAPI + dashboardJaPostgreSQL credentials. I Helm kan de komme fra chart-generert Secret eller existingSecret.
LUMI_SESSION_SECRETDashboardJa (OIDC)32+ tegn/base64 for kryptering av session-cookie. Kan kommasepareres ved nøkkelrotasjon.
VALKEY_URI_LUMI_CACHEAPINeiValkey URI for delt cache/rate-limit-state. Helm setter denne automatisk når Valkey-subchartet er aktivert.
VALKEY_USERNAME_LUMI_CACHE / VALKEY_PASSWORD_LUMI_CACHEAPIVed autentisert ValkeyValkey credentials.
LUMI_ALLOW_UNRESTRICTED_PK_ORIGINSAPINeiNår true, kan nye pk_-nøkler opprettes uten allowedOrigins, og origin-upgrade guard lar aktive legacy pk_-nøkler uten origins passere. Kun for lokal utvikling eller eksplisitte, lukkede unntak. La stå av i produksjon.
LUMI_API_LOG_LEVELAPINeiAPI-loggnivå for root og no.lumi loggere. Default: INFO. Bruk DEBUG midlertidig ved feilsøking.

Installer med Helm

Chartet publiseres som OCI-artefakt til ghcr.io:

sh
helm install lumi oci://ghcr.io/asorheim/lumi-analytics/charts/lumi \
  --version 1.0.0 \
  --namespace lumi \
  --create-namespace \
  --set postgresql.auth.password=<sikkert-passord> \
  --set valkey.auth.password=<sikkert-passord> \
  --set api.env.oidcIssuerUrl=https://login.microsoftonline.com/{tenant}/v2.0 \
  --set api.env.oidcAudience=api://{api-client-id} \
  --set api.env.dashboardClientId={dashboard-client-id} \
  --set api.env.adminGroup={entra-admin-group-id} \
  --set dashboard.env.oidcIssuerUrl=https://login.microsoftonline.com/{tenant}/v2.0 \
  --set dashboard.env.oidcClientId={dashboard-client-id} \
  --set dashboard.env.oidcRedirectUri=https://lumi.din-bedrift.no/auth/callback \
  --set-string 'dashboard.env.oidcScopes=openid\,profile\,email\,api://{api-client-id}/access_as_user' \
  --set dashboard.secret.oidcClientSecret={client-secret} \
  --set dashboard.secret.sessionSecret=$(openssl rand -base64 32) \
  --set ingress.host=lumi.din-bedrift.no

Chartet inkluderer PostgreSQL og Valkey (stats-cache) som subcharts. Bruk --set postgresql.enabled=false med api.externalDatabase.* for ekstern database.

Tredjeparts images, mirroring og pinning

PostgreSQL og Valkey leveres av låste Bitnami-subcharts, men runtime-imagene må fortsatt være en bevisst BYOC-beslutning. Chartets default rendrer digest-pinnede image references:

KomponentChart-artefaktRuntime image default
PostgreSQLbitnamicharts/postgresql:18.5.15 (sha256:f3a4ac042d9b79dbee563cbe7e3a98444a1a30f13ce0f5a49068e25c487f45d8)docker.io/bitnami/postgresql@sha256:7651d7f24aad83fe68a222f7f20eded10d325c96ebee285ca5bf8162eddcba64
PostgreSQL metrics exporterbitnamicharts/postgresql:18.5.15docker.io/bitnami/postgres-exporter@sha256:1bfd64c3db49e224d5191f499bfcd26dcd67450f6ef01dccb1ba66588ff6defc
PostgreSQL volume permissionsbitnamicharts/postgresql:18.5.15docker.io/bitnami/os-shell@sha256:05fb76571cfd18c4f5c57da9d01c6c7fa01450306d44fa93e484d17b4b43e975
Valkeybitnamicharts/valkey:5.4.9 (sha256:cb4285ce0ac1fde8106ccdc2a4c29e5d8627b877893888418a1716776301a514)docker.io/bitnami/valkey@sha256:50df82d73e43760cced94c934f7d52af1dd6001f2b2475a0797daf2b43e5d17f
Valkey metrics exporterbitnamicharts/valkey:5.4.9docker.io/bitnami/redis-exporter@sha256:45bb5398ae0fe3494a5b435e565ee5f8c882e37bf4da9a5ae7677af5aabcac65
Valkey volume permissionsbitnamicharts/valkey:5.4.9docker.io/bitnami/os-shell@sha256:05fb76571cfd18c4f5c57da9d01c6c7fa01450306d44fa93e484d17b4b43e975

For clusters uten direkte Docker Hub-tilgang: speil imagene til intern registry, behold digest-pinningen, og override registry/repository ved installasjon:

sh
helm install lumi oci://ghcr.io/asorheim/lumi-analytics/charts/lumi \
  --version 1.0.0 \
  --namespace lumi \
  --create-namespace \
  --set global.security.allowInsecureImages=true \
  --set global.imageRegistry=registry.din-bedrift.no \
  --set global.imagePullSecrets[0].name=internal-regcred \
  --set postgresql.image.repository=mirror/bitnami/postgresql \
  --set-string postgresql.image.digest=sha256:7651d7f24aad83fe68a222f7f20eded10d325c96ebee285ca5bf8162eddcba64 \
  --set valkey.image.repository=mirror/bitnami/valkey \
  --set-string valkey.image.digest=sha256:50df82d73e43760cced94c934f7d52af1dd6001f2b2475a0797daf2b43e5d17f

Legg til resten av OIDC-, ingress- og secret-verdiene fra installasjonseksempelet over.

Hvis du aktiverer Bitnami-subchartenes metrics exporter eller volume-permissions init-container, speil og pin disse image-kildene i samme values-fil:

yaml
postgresql:
  metrics:
    image:
      repository: mirror/bitnami/postgres-exporter
      digest: sha256:1bfd64c3db49e224d5191f499bfcd26dcd67450f6ef01dccb1ba66588ff6defc
  volumePermissions:
    image:
      repository: mirror/bitnami/os-shell
      digest: sha256:05fb76571cfd18c4f5c57da9d01c6c7fa01450306d44fa93e484d17b4b43e975
valkey:
  metrics:
    image:
      repository: mirror/bitnami/redis-exporter
      digest: sha256:45bb5398ae0fe3494a5b435e565ee5f8c882e37bf4da9a5ae7677af5aabcac65
  volumePermissions:
    image:
      repository: mirror/bitnami/os-shell
      digest: sha256:05fb76571cfd18c4f5c57da9d01c6c7fa01450306d44fa93e484d17b4b43e975

global.security.allowInsecureImages=true er Bitnami-chartets eksplisitte opt-in for ikke-standard registry/repository. Sett den bare når din releaseprosess har verifisert at mirroret inneholder riktig image-digest.

Ta med disse linjene i installasjonsbeviset for kunden:

sh
helm dependency build charts/lumi/
helm template lumi charts/lumi/ -f customer-values.yaml > lumi-install-proof.yaml
grep -E 'bitnami/(postgresql|valkey|postgres-exporter|redis-exporter|os-shell)|mirror/bitnami/(postgresql|valkey|postgres-exporter|redis-exporter|os-shell)' lumi-install-proof.yaml

Installasjonsbeviset skal lagre chart-versjon, subchart-digests fra helm dependency build, og de eksakte rendrende image-linjene for alle aktiverte PostgreSQL/Valkey-relaterte Bitnami-images.

Se referansen for miljøvariabler ovenfor for de mest brukte verdiene. Helm-chartet eksponerer flere alternativer som er dokumentert i kommentarfeltet av values.yaml i din lokale klone av chartet.


Installer med Docker Compose

yaml
# docker-compose.yml
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_DB: lumi
      POSTGRES_USER: lumi
      POSTGRES_PASSWORD: <db-password>
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U lumi"]
      interval: 5s
      retries: 5

  api:
    image: ghcr.io/asorheim/lumi-analytics/lumi-api:1.0.0
    depends_on:
      db:
        condition: service_healthy
    environment:
      LUMI_ENV: production
      AUTH_PROVIDER: oidc
      DB_HOST: db
      DB_PORT: "5432"
      DB_DATABASE: lumi
      DB_USERNAME: lumi
      DB_PASSWORD: <db-password>
      OIDC_ISSUER_URL: https://login.microsoftonline.com/{tenant}/v2.0
      OIDC_AUDIENCE: api://{api-client-id}
      LUMI_DASHBOARD_CLIENT_ID: "{dashboard-client-id}"
      LUMI_ADMIN_GROUP: "{entra-group-id}"
      LUMI_API_LOG_LEVEL: INFO
    ports:
      - "8080:8080"

  dashboard:
    image: ghcr.io/asorheim/lumi-analytics/lumi-dashboard:1.0.0
    environment:
      LUMI_API_URL: http://api:8080
      LUMI_ENV: production
      AUTH_PROVIDER: oidc
      DB_HOST: db
      DB_PORT: "5432"
      DB_DATABASE: lumi
      DB_USERNAME: lumi
      DB_PASSWORD: <db-password>
      OIDC_ISSUER_URL: https://login.microsoftonline.com/{tenant}/v2.0
      OIDC_CLIENT_ID: "{dashboard-client-id}"
      OIDC_CLIENT_SECRET: <client-secret>
      OIDC_REDIRECT_URI: https://lumi.din-bedrift.no/auth/callback
      OIDC_SCOPES: "openid,profile,email,api://{api-client-id}/access_as_user"
      LUMI_SESSION_SECRET: <32+ tegn tilfeldig secret>
    ports:
      - "3000:3000"

volumes:
  pgdata:

Start med:

sh
docker compose up -d

Opprett organisasjon

Etter at tjenestene er oppe, må du opprette en organisasjon. Dette gjøres én gang.

Via dashboard-veiviseren (anbefalt)

  1. Åpne dashboardet i nettleseren (standard: http://localhost:3000)
  2. Logg inn med din OIDC-konto
  3. Veiviseren starter automatisk første gang — ingen eksisterende organisasjon finnes
  4. Følg stegene: organisasjonsnavn → opprett admin-team → ferdig

Via CLI (alternativ)

Alle setup-endepunkter krever OIDC Bearer-token. Hent et token fra din OIDC-provider først.

sh
# Sjekk at setup ikke er gjort ennå
curl https://lumi.din-bedrift.no/api/v1/setup/status \
  -H "Authorization: Bearer <jwt>"

# Svar: { "orgExists": false, "hasApiKeys": false, "orgName": null }

# Opprett organisasjon
curl -X POST https://lumi.din-bedrift.no/api/v1/setup \
  -H "Authorization: Bearer <jwt>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Din Bedrift AS"}'

# Svar: 201 Created
# { "org": { "slug": "din-bedrift-as", "name": "Din Bedrift AS" },
#   "team": { "slug": "default", "name": "Default" } }

# Generer API-nøkler
curl -X POST https://lumi.din-bedrift.no/api/v1/setup/keys \
  -H "Authorization: Bearer <jwt>"

# Svar: 201 Created
# { "secretKey": "lumi_sk_live_...", "publishableKey": "lumi_pk_live_..." }

API-nøkler opprettes av utviklerne

Etter at organisasjonen er opprettet, kan teammedlemmer selv opprette pk_-nøkler fra Innstillinger → API-nøkler i dashboardet. Ingen admin-handling nødvendig.


Neste steg

Lumi Analytics — bygget på navikt/lumi (MIT-lisens)