Appearance
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
| Krav | Minimum |
|---|---|
| Kubernetes (for Helm) eller Docker (for Compose) | — |
| PostgreSQL | 15+ |
| OIDC-provider | Entra ID, Keycloak, Auth0, o.l. |
| Docker-image | ghcr.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.
| Variabel | Brukt av | Påkrevd | Beskrivelse |
|---|---|---|---|
LUMI_ENV | API + dashboard | Ja (prod) | Sett til production i produksjonsmiljøer. Aktiverer streng startup-validering. |
AUTH_PROVIDER | API + dashboard | Ja (prod) | Må være oidc i produksjon. local er kun for lokal utvikling. |
OIDC_ISSUER_URL | API + dashboard | Ja (OIDC) | OIDC issuer URL, f.eks. https://login.microsoftonline.com/{tenant}/v2.0. API-verdien må matche tokenets iss. |
OIDC_BROWSER_ISSUER_URL | Dashboard | Nei | Browser-facing issuer hvis dashboard-containeren når provideren på en intern URL, men brukeren må redirectes til en offentlig URL. |
OIDC_AUDIENCE | API | Ja (OIDC) | Forventet audience i access-tokenet. |
OIDC_JWKS_URI | API | Nei | Eksplisitt JWKS-endepunkt hvis discovery via issuer ikke er reachable fra API-containeren. |
OIDC_CLIENT_ID | Dashboard | Ja (OIDC) | Dashboardets OIDC client ID. |
OIDC_CLIENT_SECRET | Dashboard | Kun confidential clients | Client secret for confidential OIDC clients. Public/PKCE clients lar den stå tom. |
OIDC_REDIRECT_URI | Dashboard | Ja (OIDC) | Callback-URL, typisk https://lumi.din-bedrift.no/auth/callback. |
OIDC_SCOPES | Dashboard | Nei | Komma-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_ID | API | Ja (prod) | OIDC client ID som API-et tillater for dashboard-kall. Skal normalt matche OIDC_CLIENT_ID. |
LUMI_ADMIN_GROUP | API | Ja (prod OIDC) | OIDC-gruppe-ID som gir tilgang til admin-funksjonalitet. API-et feiler startup uten denne i produksjon. |
DB_JDBC_URL | API | Nei | Avansert 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_DATABASE | API + dashboard | Ja | PostgreSQL host, port og database. Dashboardet bruker samme database til server-side OIDC-sesjoner. |
DB_USERNAME / DB_PASSWORD | API + dashboard | Ja | PostgreSQL credentials. I Helm kan de komme fra chart-generert Secret eller existingSecret. |
LUMI_SESSION_SECRET | Dashboard | Ja (OIDC) | 32+ tegn/base64 for kryptering av session-cookie. Kan kommasepareres ved nøkkelrotasjon. |
VALKEY_URI_LUMI_CACHE | API | Nei | Valkey URI for delt cache/rate-limit-state. Helm setter denne automatisk når Valkey-subchartet er aktivert. |
VALKEY_USERNAME_LUMI_CACHE / VALKEY_PASSWORD_LUMI_CACHE | API | Ved autentisert Valkey | Valkey credentials. |
LUMI_ALLOW_UNRESTRICTED_PK_ORIGINS | API | Nei | Nå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_LEVEL | API | Nei | API-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.noChartet 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:
| Komponent | Chart-artefakt | Runtime image default |
|---|---|---|
| PostgreSQL | bitnamicharts/postgresql:18.5.15 (sha256:f3a4ac042d9b79dbee563cbe7e3a98444a1a30f13ce0f5a49068e25c487f45d8) | docker.io/bitnami/postgresql@sha256:7651d7f24aad83fe68a222f7f20eded10d325c96ebee285ca5bf8162eddcba64 |
| PostgreSQL metrics exporter | bitnamicharts/postgresql:18.5.15 | docker.io/bitnami/postgres-exporter@sha256:1bfd64c3db49e224d5191f499bfcd26dcd67450f6ef01dccb1ba66588ff6defc |
| PostgreSQL volume permissions | bitnamicharts/postgresql:18.5.15 | docker.io/bitnami/os-shell@sha256:05fb76571cfd18c4f5c57da9d01c6c7fa01450306d44fa93e484d17b4b43e975 |
| Valkey | bitnamicharts/valkey:5.4.9 (sha256:cb4285ce0ac1fde8106ccdc2a4c29e5d8627b877893888418a1716776301a514) | docker.io/bitnami/valkey@sha256:50df82d73e43760cced94c934f7d52af1dd6001f2b2475a0797daf2b43e5d17f |
| Valkey metrics exporter | bitnamicharts/valkey:5.4.9 | docker.io/bitnami/redis-exporter@sha256:45bb5398ae0fe3494a5b435e565ee5f8c882e37bf4da9a5ae7677af5aabcac65 |
| Valkey volume permissions | bitnamicharts/valkey:5.4.9 | docker.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:50df82d73e43760cced94c934f7d52af1dd6001f2b2475a0797daf2b43e5d17fLegg 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:05fb76571cfd18c4f5c57da9d01c6c7fa01450306d44fa93e484d17b4b43e975global.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.yamlInstallasjonsbeviset 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 -dOpprett organisasjon
Etter at tjenestene er oppe, må du opprette en organisasjon. Dette gjøres én gang.
Via dashboard-veiviseren (anbefalt)
- Åpne dashboardet i nettleseren (standard:
http://localhost:3000) - Logg inn med din OIDC-konto
- Veiviseren starter automatisk første gang — ingen eksisterende organisasjon finnes
- 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
- Rask start (5 min) — embed widgeten i appen din
- Produksjonsherdning — origin-validering, rate limiting og nøkkelrotasjon
- Oppgradering — oppgrader Lumi, rollback og backup
