Projo FHIR Documentation
0.1.0 - ci-build Switzerland flag

Projo FHIR Documentation - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Storage & Capacity

Storage & Capacity

Fire Arrow Server

HAPI FHIR R4 server (custom com.evoleen.hapi.faserver.* package) on Azure App Service + Azure Database for PostgreSQL.

Key configuration:

  • hapi.fhir.fhir_version: R4
  • hapi.fhir.cr.enabled: true (Clinical Reasoning for $extract/$apply)
  • hapi.fhir.subscription.message_enabled: true
  • hapi.fhir.advanced_lucene_indexing: true, search_index_full_text_enabled: true
  • HikariCP maximum-pool-size: 10 (dev)
  • Azure Managed Identity passwordless auth to PostgreSQL
  • Binary storage: Azure Blob (container: fhir-resource-attachments)
  • Subscription delivery: Azure Storage Queues (fire-arrow.subscription.azure-queue)

Custom Fire Arrow operations

  • $subscribe-due-events (CarePlan scheduling)
  • $apply (PlanDefinition)
  • $extract (QuestionnaireResponse, SDC Clinical Reasoning)
  • $reindex (system-level)
  • $binary-upload
  • $renew-due-events

Auth

  • Managed Identity on Function App (Device role)
  • Entra CIAM (Practitioner/Patient roles)
  • FIRE_ARROW_IDENTIFIER_URI must be the actual app registration identifier URI
  • Do NOT set AZURE_CLIENT_ID (breaks system-assigned MI)

Authorization rules

  • Device role (orchestrator): create/read/search on most resources; Patient/patch for write-back; Library CRUD for CQL routing; QuestionnaireResponse $extract
  • Practitioner role (admin UI): broader read access
  • binary-upload: deny-by-default; both roles need explicit operation rule

Capacity derivation (ADR 0004)

measure-fhir-capacity CLI: ramps Basic resource CRUD load, detects saturation knee (R_knee, C), derives per-app batchSize/newBatchThreshold/maximumInstanceCount enforcing C_orchestrator + C_sidecar <= effectiveC <= hikariPoolSize. Re-measure whenever App Service plan, Postgres SKU, or HAPI maximum-pool-size changes.

PostgreSQL

  • Dev: B2s (~95 max_connections)
  • Prod: D2s_v3 (~135)
  • Alerts: cpu, memory, storage, connections (>50 default), long-query (>60s), deadlocks, iops

Attachment storage

  • Fire Arrow stores Attachment.url as firearrow://{uuid}.{extension}
  • Rewritten to SAS-signed Azure URL on every read by BinaryUrlRewriteInterceptor
  • SAS expires after 120s
  • Cannot copy blob directly between storage accounts; must use $binary-upload to re-register