docs

nysky.toml — hele referansen

Manifestet er appens sannhetskilde: én TOML-fil som beskriver kjøring, data, ruter og tilgang. Her er hvert felt, med defaults. Skjemaversjonen er 0.2.66.

schema 0.2.66defaults i kursiv

Toppfeltene

  • schema_versionpåkrevd. Kontraktversjonen manifestet er skrevet mot. I dag "0.1".
  • namepåkrevd. App-navnet: små bokstaver, tall og bindestrek (DNS-navn), unikt per konto. Blir adressen <name>.nysky.app.
  • runtime"workerd" (default) for JS/TS, eller "container" for egen Dockerfile.
  • nivaapersonlig / gruppe / offentlig (= Fri). Utelatt = personlig for nye apper. Gamle navn (telt/hytte/hus) godtas og normaliseres. Se prisene og nivåforskjellene.
  • main — workerd: entrypoint som ES-modul, f.eks. src/index.ts. Modulen eksporterer en fetch-handler.
  • compatibility_date — workerd: dato (YYYY-MM-DD) som fryser kjøretidssemantikken — appen oppfører seg likt til du selv bumper den.
  • compatibility_flags — workerd-flagg, f.eks. ["nodejs_compat"] — kreves for node:-API-er, blant annet TCP mot databasen.
  • release_command — container: kommando som kjøres isolert med appens bindings én gang per deploy, FØR trafikk flyttes — typisk migrasjoner.
  • region / jurisdiksjon / soneno1 / NO / INTERN. Hjemregion, jurisdiksjon og datasone. Kun norske verdier i dag; feltene finnes i kontrakten fra første dag.
  • posture — utgår — utelat feltet. Loggvernet styres nå av [logs] og kontoens loggnøkkel.

[container] — egen Dockerfile

  • dockerfile — sti til Dockerfile. Dockerfile
  • git — repoet på git.nysky.no plattformen bygger fra (<eier>/<repo>). Satt = nysky deploy bygger imaget automatisk.
  • ref — gren/tag som bygges. main
  • base"node22-chromium": plattform-basisimage (ARG BASE_IMAGE) — Chromium ferdig installert, hentet fra norsk register.
  • port — porten appen lytter på. 3000
  • health_path — GET-rute for helsesjekk ved oppstart. /

[http], [build] og [static]

[http] — ruteatferd (begge kjøretider)

  • max_body_mb — maks request-body, for filopplasting. 1
  • response_timeout_s — lesetimeout mot appen — sett ≥ 90 for tunge ruter (PDF-generering). 60
  • ssetrue gir strømmevennlig oppsett (Server-Sent Events). false

[build] — byggsteg før bundling

  • command — byggkommandoen, f.eks. "npm run build". Kjøres isolert i plattformens byggemiljø (node 22, npm). Husk install-steget: "npm install --no-audit --no-fund && node build.mjs".
  • output — mappa med ferdig bundle. dist/

[static] — statisk nettsted

  • framework — preset som fyller build + dir: astro, next, vite, sveltekit, eleventy, hugo, jekyll, plain.
  • dir — mappa med de bygde filene (f.eks. dist).
  • build — byggkommando, alternativ til [build].
  • spa — single-page app: server index.html for ukjente ruter. false
  • not_found — egen 404-side relativt til dir. Ignoreres når spa=true.

Statisk vs. dynamisk er et byggevalg, ikke et eget nivå — samme pris.

Data — [[datastores]], [[kv]] og [[buckets]]

[[datastores]] — PostgreSQL

  • namepåkrevd. Logisk navn; appen får bindingen <NAVN>_DATABASE_URL.
  • rls — Row-Level Security. true: på, med én eierrolle. "enforced": egen kjøretidsrolle så policyene faktisk biter — appen får da også <NAVN>_MIGRATE_URL (eierrollen) til migrasjoner. false: av.
  • extensions — Postgres-utvidelser, f.eks. ["pgcrypto"].

[[kv]] — nøkkel/verdi

  • namepåkrevd. Gir bindingen KV_<NAVN>_URL — et eget, isolert lager med ferdig tabell kv(k text primary key, v jsonb, expires_at timestamptz).

[[buckets]] — filer (S3-kompatibelt)

  • namepåkrevd. Gir fire bindings: <NAVN>_S3_ENDPOINT, _ACCESS_KEY, _SECRET_KEY, _BUCKET. Alle S3-klienter virker (SigV4).
  • versioning — ignorert — reservert. Trenger appen objekthistorikk, modellér den i datastore-laget.

[vars] og secrets

  • [vars] — ikke-hemmelige miljøvariabler, rett i manifestet.
  • secrets — KUN navnene, f.eks. secrets = ["API_NOKKEL"]. Verdiene settes skriv-kun med nysky secret put og lever aldri i repo.

Nett — [[routes]], [[kall]] og egress

[[routes]] — offentlige adresser

  • hostnamepåkrevd. Eget domene, f.eks. "app.dittdomene.no". Pek CNAME mot inn.nysky.no; HTTPS-sertifikat utstedes og fornyes automatisk. Uten [[routes]] svarer appen kun på plattform-subdomenet.
  • path — sti-prefiks ruten gjelder. /

[[kall]] — app til app

  • apppåkrevd. Navnet på en annen app på samme konto appen får kalle internt. Gir bindingen KALL_<APP>_URL. Kall går aldri på tvers av kontoer.

egress — utgående allowlist

egress = ["api.vipps.no"]: vertsnavnene appen får kontakte over HTTPS. Uten listen når appen kun sine egne datastores og bøtter — utgående nett er stengt som standard.

[[crons]] — faste jobber

  • schedulepåkrevd. Standard 5-felts cron, i UTC. F.eks. "0 6 * * *".
  • pathpåkrevd. Ruten i appen som mottar POST-kallet.

Plattformen POST-er til pathen etter planen, med headeren X-Nysky-Cron-Key lik appens NYSKY_CRON_KEY-binding — verifiser den, så vet du at kallet kommer fra planleggeren. Inntil 4 jobber per app på alle betalte nivåer; på Personlig og Gruppe må minuttfeltet være ett fast tall (tettest hver time), på Fri og Container er frekvensen fri.

[auth] — innlogging levert av plattformen

  • mode"gate": plattformen legger innlogging med nysky ID foran appen. "app": appen integrerer egne brukere via OIDC og får NYSKY_AUTH_*-bindings.
  • allow — gate: hvem som slipper inn — eksakte e-poster ("kari@x.no") eller hele domener ("@firma.no"). TOM/utelatt liste = kun kontoens utviklere, på alle nivåer. Utvides live med nysky allow add — uten redeploy.
  • gate_stier — gate: hvilke sti-prefikser som krever innlogging, f.eks. ["/admin"]. Utelatt = hele appen gates.
  • slett_webhook — path som mottar et signert varsel når en nysky ID slettes — POST med brukerens sub, så appen kan slette eller anonymisere brukerens data.
  • client — mode=app: "public" (default, PKCE — ingenting hemmelig å lekke) eller "confidential".
  • redirect_path — mode=app: OIDC-callback på appens host. /auth/callback
  • methods — aktive metoder: passkey og email (begge er standard). Andre verdier er reserverte og avvises.
  • signup / roles / login_host — reserverte — godtas, men håndheves ikke ennå.

Bak gaten kommer hver forespørsel med brukerens identitet i to headere: X-Nysky-Auth-User (e-post) og X-Nysky-Auth-Sub (stabil id). Appen trenger ingen egen innlogging — les headeren. På gratis, Personlig og Gruppe er gaten alltid på; gate_stier begrenser hvilke stier den dekker, men den kan ikke skrus av der.

[limits], [scaling] og [logs]

[limits]

  • memory_mb — minne per app. 128 (workerd)
  • timeout_ms — request-timeout. 30 000 — rutetimeouten styres av [http].response_timeout_s
  • cpu_m — container: CPU-request i millicores. 250
  • cpu_ms — ignorert — reservert.

[scaling]

  • max_replicas — maks antall parallelle instanser under last. 4; 1 = fast én instans. For container er > 1 en erklæring om at appen er statsløs.

[logs]

  • recipient — mottakernøkkel (age/X25519) appens logg krypteres til. Lag nøkkelpar med nysky logs keygen — den registrerer samtidig nøkkelen på kontoen, og da arver alle appene dine den automatisk uten dette feltet. Privatnøkkelen forlater aldri deg; les loggen med nysky logs.

[ci] og [livslop]

[ci] — plattform-kjørt test-gate

  • commandpåkrevd. Kommandoen nysky ci run kjører i plattformens byggemiljø i Norge (node 22, corepack) — f.eks. "pnpm -r test". Ingen egen CI-runner å drifte.
  • git / ref — repo og gren som testes. Arver [container].git/.ref når de er satt. main

[livslop] — tidsbegrenset app

  • slettes_etterpåkrevd. Levetid ("30d", "6m", "1y") eller fast ISO-dato. Ved utløp parkeres appen (data trygt); den kan hentes tilbake.
  • varsle_for — hvor lenge før utløp eieren varsles på e-post. 3d
  • hard_sletttrue sletter umiddelbart ved utløp i stedet for å parkere. false

Schemaet er kontrakt: nye felter kommer aldri uten versjonsbump og changelog-oppføring.

Ukjente felter avvises ved deploy — skrivefeil oppdages med én gang.

Videre