7. Driftsättningsvy
7.1 Infrastruktur#
Ersvia körs i containrar på Kubernetes eller OpenShift och har inga beroenden till molnspecifika tjänster. Helm-chartet deploy/helm/ersvia (byggt i F12a, ADR 0020) fungerar i regionens datacenter och hos en leverantör (svar på TV-ADR 1). Lokalt startar .NET Aspire (Ersvia.AppHost) eller deploy/compose (PostgreSQL, Keycloak, OTel-collector) hela miljön. Driften beskrivs i docs/drift/runbook.md, kontinuitet.md, nis2-incidentrutin.md och earkiv-och-gallring.md.
Images och värdar#
| Komponent | Image (deploy/docker/*.Dockerfile) |
Värd | Zon | Hälsa |
|---|---|---|---|---|
| patientdata | ersvia/patientdata |
Ersvia.Patientdata (Ersvia:Zon=patientdata) |
Patientdatazon | /healthz, /readyz |
| api | ersvia/api |
Ersvia.Api (Ersvia:Zon=ersattning, eller alla i utveckling) |
Ersättningszon | /healthz, /readyz |
| portal | ersvia/portal |
Ersvia.Portal (CSP med nonce, OIDC) |
Ersättningszon | /healthz, /readyz |
| ai | ersvia/ai |
AI-tjänsten (REST /ai) |
AI-zon | /healthz, /readyz |
| mcp | ersvia/mcp |
Ersvia.Mcp (/mcp) |
AI-zon | /healthz, /readyz |
Alla images har fasta basimages (version och digest), körs som icke-root med skrivskyddat rotfilsystem och följer OpenShift restricted SCC. Driftjobben använder samma images med --jobb <namn>. Hittills har bara API-imagen körts; de övriga är byggda och skannade i CI men inte körda.
Helm-chartets struktur#
Mall (deploy/helm/ersvia/templates/) |
Innehåll |
|---|---|
deployments.yaml |
Deployment per komponent med probes, säkerhetskontext och miljö per zon |
services.yaml |
ServiceAccount, Service, HorizontalPodAutoscaler och PodDisruptionBudget |
ingress.yaml |
Ingress, och OpenShift Route när det är valt: /v2, /snod, /api/carelisting, /api/kompatibilitet och /api/uppfoljning/v1/val till patientdata; /api, /, /ai, /mcp till ersättnings- och AI-zonen. mTLS-terminering med vidarebefordrat certifikat eller passthrough. |
zon-certifikat.yaml |
cert-manager-certifikat för zonbryggan (zonernas interna CA och tillåtna namn) |
networkpolicies.yaml |
neka-allt, dns-och-telemetri, fran-ingress, till-api, till-ai, zonbryggan och extraEgress per zon (t.ex. VAL från patientdatazonen) |
jobb.yaml |
Job migrera-<zon> (Helm-hook, kör migrationer och zonroller --utfor före utrullningen), CronJobs gallring-<zon>, backup-<zon>, aterlasningstest och e-arkiv |
lagring.yaml |
ConfigMap för backupskript och PersistentVolumeClaims |
7.2 Nätzoner, zonbrygga och nätpolicyer#
| Nätzon | Komponenter | Tillåten trafik in | Tillåten trafik ut |
|---|---|---|---|
| Ingress (DMZ) | Ingress-controller eller OpenShift Route, WAF | HTTPS från vårdgivare och regionen; mTLS med SITHS för system | Till patientdata, api, portal, ai, mcp enligt sökväg |
| Patientdatazon | patientdata |
Från ingressen (insamling, fasader, VAL-uttag) och zonbryggan från api |
Till sin databas, zonbryggan till api, folkbokföringen, VAL (extraEgress), OTel |
| Ersättningszon | api, portal |
Från ingressen och zonbryggan från patientdata |
Till sin databas, zonbryggan till patientdata, ekonomisystem, e-arkiv, OTel |
| AI-zon | ai, mcp |
Från ingressen (MCP, /ai) och portalen |
Till api (läsning), egen databas, lokal modell eller godkänd extern leverantör |
| Databaser | PostgreSQL per zon (rekommenderat) eller en databas med separata roller | Bara från respektive zon | WAL-arkiv i objektlagring |
Zonbryggan (ADR 0020). Portar som går över zongränsen ersätts av proxyer (DispatchProxy) som anropar POST /intern/zon/v1/{port}/{metod} hos den andra zonen över HTTPS med ömsesidig TLS (port 8443). Klientcertifikatet valideras mot zonernas interna CA och tillåtna namn. Varje värd exponerar bara en vitlista (Zonkopplingar): patientdatazonen exponerar beräkningsunderlag (pseudonym och härledda fält), ersättningszonen referensdata. W3C-spårkontexten följer med. Svar från patientdatazonen passerar personnummervakten på båda sidor (kap. 8.4).
Databasroller per zon (Zonroller). Applikationsroll och gallringsroll per zon, grants bara till zonens scheman, uttryckligt nekande av andra zoners scheman och inga rättigheter för PUBLIC. Plattformsdata (idempotensnycklar) ligger i ett schema per zon. Jobbet zonroller --utfor sätter rollerna.
mTLS från system (F9a). Antingen terminerar ingressen TLS och vidarebefordrar klientcertifikatet i en header (Kompatibilitet:Mtls:VidarebefordratCertifikat), eller så går TLS hela vägen till Kestrel (passthrough eller Route med passthrough). Ersvia validerar kedjan mot SITHS-roten och hämtar HSA-id ur SERIALNUMBER.
7.3 Observerbarhet, kontinuitet och säkerhetsdrift#
| Område | Lösning (F12a) |
|---|---|
| OpenTelemetry | Spår, mätvärden och loggar med OTLP till regionens collector (otel.endpoint). W3C-traceparent sparas i outboxen och följer med zonbryggan. Viktiga mätvärden: http.server.request.duration, ersvia.sakerhet.handelser, ersvia.zon.anrop och ersvia.zon.personnummerstopp (ska alltid vara 0, larm vid > 0). |
| Loggar | Strukturerade och tvättade från personnummer, samordningsnummer och reservnummer (Personnummertvatt). Säkerhets- och åtkomstloggar går till en separat sink med minst 5 års bevarande; kortare konfiguration vägras vid start. |
| Backup och WAL | WAL-arkivering och PITR via databasoperatorn (archive_timeout = 300, RPO ≤ 5 minuter) till objektlagring utanför klustret; logisk kopia varje dygn (deploy/backup/ersvia-backup.sh); automatiskt återläsningstest varje vecka (ersvia-aterlasning.sh, ersvia-verifiera.sh) med verifiering av hashkedjor. |
| NIS 2 | Incidentrutin med tidig varning inom 24 timmar, incidentanmälan inom 72 timmar och slutrapport inom 1 månad (nis2-incidentrutin.md). |
| CI | Build, test (utan Category=Last), kontrakt, JUnit, dotnet list package --vulnerable, SBOM (CycloneDX), helm lint och kubeconform, compose-kontroll och per image Docker-bygge, Trivy och image-SBOM (.github/workflows/ci.yml). |
7.4 Miljöer#
| Miljö | Syfte | Data | AI | Identitet |
|---|---|---|---|---|
utv (lokal, Aspire) |
Utveckling | Syntetisk seed | FakeChatClient |
Keycloak, dev-CA |
test |
Integration, kontrakt, E2E | Syntetisk, "Region Exempel" och region Stockholm | FakeChatClient eller lokal modell |
Keycloak, test-CA |
acceptans |
Användartest (KRAV-77), parallellkörning | Pseudonymiserad kopia | Lokal modell | Regionens IdP (test), SITHS test |
simulering |
Isolerade simuleringar med produktionsunderlag | Pseudonymiserad, läsbar kopia | Lokal modell | Regionens IdP |
produktion |
Drift | Riktig | Lokal modell (standard), extern bara efter explicit aktivering | Regionens IdP, SITHS |
7.5 Tillgänglighet, backup och återställning#
| Krav | Lösning |
|---|---|
| 99,5 % tillgänglighet under kontorstid (KRAV-70) | Flera repliker med HPA och PodDisruptionBudget, rullande uppgraderingar, /readyz-probes, PostgreSQL med replik via operatorn |
| Återställning utan dataförlust äldre än 1 timme (KRAV-70) | WAL-arkivering och PITR med RPO ≤ 5 minuter, logisk kopia varje dygn, veckovis återläsningstest med hashkedjeverifiering (kontinuitet.md) |
| RTO | Mål 4 timmar under kontorstid (förslag, ska beslutas) |
| Månadsstängningen är kritisk | Körningen kan göras om idempotent; manifest och snapshot ger samma resultat |
| Tillbakarullning | helm rollback; migrationer är framåtkompatibla, och databasen rullas bara tillbaka med PITR |
7.6 Övergångsarkitektur och införande#
Bytet sker stegvis enligt strangler fig-mönstret. Ingen utbetalning får avbrytas (F13, B19).
| Platå | Vad som gäller | Utbetalning görs av | Klart när |
|---|---|---|---|
| A Dubbelskrivning | Kompatibilitet tar emot GVR v2-trafik, sparar i Ersvia och vidarebefordrar till GVR. Listning och väntande speglas. |
ERSMO/HEJ/VF | Alla journalsystem har bytt bas-URL |
| B Parallellkörning | Berakning räknar på samma underlag som ERSMO/HEJ. Migrering jämför per vårdgivare och förklarar skillnaderna (med AI-stöd). |
ERSMO/HEJ/VF | Minst 3 månader med förklarade skillnader (risk 1, KRAV-72) |
| C Ersvia betalar | Fakturering skickar e-faktura till Raindance. Systemen som ersätts är i läsläge. VF-bokföringsfil och AF-rapport skapas av Kompatibilitet. |
Ersvia | Avtalstexterna är ändrade, vårdgivarna informerade |
| D Avveckling | Historiska beräkningar och avstämningar är migrerade (KRAV-73). Systemen som ersätts stängs. | Ersvia | Arkivleverans av systemen som ersätts |
Fasplan#
Tabellen över faser följer den tabell i planen som gäller (docs/plan/PLAN.md avsnitt 8, kontroll 3 Ä1). Ordningen gör att vi tidigt prövar vad regelmotorn kan uttrycka och hur snabb den är. Full paritet med dagens system (legacy) får vänta till F9. Aktuell status finns i Byggstatus.
| Fas | Innehåll | Moduler | Krav (urval) | Status |
|---|---|---|---|---|
| F0 | Skelett: solution, Aspire, BuildingBlocks, Api-host, arkitekturtester, CI, ADR:er | BuildingBlocks | KRAV-36, KRAV-71, KRAV-78 | Klar |
| F1 | Kontrakt v1 (OpenAPI/AsyncAPI, regelschema) och legacykontrakt (GVR v2/1.9.5, CVR, VF, felkoder) | contracts/ |
KRAV-71, KRAV-72 | Klar |
| F2 | Masterdata, Kodverk, Personuppgifter, Överenskommelse, bitemporalt i PostgreSQL med RLS, med mockar | Masterdata, Kodverk, Personuppgifter, Overenskommelse | KRAV-1 till KRAV-5, KRAV-16 till KRAV-18, KRAV-76 | Klar |
| F3 | Regelverk: primitiver, 42 mallar med facit, fyra ögon, körfaser och DAG, import av rapporteringsanvisningar. Identitet med attest- och delegationsmatris. AI-adapter som FakeChatClient. |
Regelverk, Identitet | KRAV-19 till KRAV-23, KRAV-66 | Klar |
| F4 | Vårdhändelser och Väntande (GVR v2-kärnan), validering ≤ 1 h, status per vårdhändelse, torrkörning | Vardhandelser, Vantande, Kompatibilitet (v2-kärna) | KRAV-6 till KRAV-10, KRAV-14, KRAV-15, KRAV-61 | Klar |
| F5 | Listning (ListOn) med intervall-lagring, carelisting-producent som mock och folkbokföring | Listning | KRAV-12, KRAV-24 | Klar |
| F6 | Beräkning: walking skeleton (kapitering och produktion), alla mallar, manifest, lasttest 3× (75 miljoner händelser), FUMS/FUL-insamling. Region Exempel i CI. | Berakning, MedicinskService, Lakemedel | KRAV-13, KRAV-24 till KRAV-38, KRAV-40, KRAV-56 | Klar |
| F7 | Simulering, Målrelaterad och Granskning (attest i två steg, kontrollregler, riskpoäng) | Simulering, Malrelaterad, Granskning | KRAV-41 till KRAV-49, KRAV-64, KRAV-65 | Klar (Simulering i F6; Målrelaterad och Granskning i F7) |
| F8 | Fakturering (zongräns, utlämningsexport och återidentifiering, Raindance/Peppol, Migrationsverket, budgetjustering) och Avstämning | Fakturering, Avstamning | KRAV-38, KRAV-39, KRAV-50 till KRAV-60 | Klar |
| F9 | Kompatibilitet fullt ut (GVR v1.9.5/v2 med full paritet, SNOD, CVR, VF-.prn, AF-Excel) och Rapportering (RAPP) |
Kompatibilitet, Rapportering | KRAV-6, KRAV-11, KRAV-72 | Klar (F9a och F9b) |
| F10 | Uppföljning/VAL och Migrering/parallellkörning (dubbelmatning från GVR, legacy-manifest) | Uppfoljning, Migrering | KRAV-62, KRAV-63, KRAV-72, KRAV-73 | Klar |
| F11 | Portal (Blazor, WCAG 2.2 AA) och AI/MCP-förmågorna | Portal, Ai, Mcp | KRAV-5, KRAV-50 till KRAV-52, KRAV-59, KRAV-69, KRAV-77 | Klar (F11a och F11b) |
| F12 | E2E-scenario och Region Exempel, Drift (K70-mätning, PITR), e-arkiv, Helm och Docker | Drift | KRAV-67, KRAV-68, KRAV-70, KRAV-75, KRAV-79 | Klar (F12a och F12b: E2E i delat zonläge 24/24, fullstack-smoke 15/15) |
Koppling till TestVioras releaser: R1 (insamling, masterdata och avstämning) ≈ F0–F5 och F9. R2 (regelverk och beräkning) ≈ F3, F6 och F7. R3 (granskning, fakturering och uppföljning) ≈ F7, F8, F10 och F11. F12 avslutar.
Händelser som påverkar införandet: Sopra Steria moderniserar BEST, och HSN 2026-0799 är en samlad plan för vårdersättning. Symfoni 2.0 kommer. Kontroller av leverantörer ska upphandlas. NVID gäller för ny registrering från Q1 2027. En Psykiatrinämnd kan komma 2027 (den är föreslagen). Patientregistret för primärvården gäller från 2027-01-01. Cosmic tar över efter TakeCare cirka 2029, och ICD-11 gäller från 2029-01-01.