Skip to main content

Production Checklist

Auth server registration

  • client_id=aj-fhir-immunization registered in registered_apps table
  • redirect_uri uses HTTPS and matches SMART_REDIRECT_URI exactly
  • allowed_scopes includes all six required scopes
  • Client is active=true
  • patient/Immunization.rs present in SCOPE_TO_RESOURCE map ✓ (already added)
  • patient/ImmunizationRecommendation.rs present ✓ (already added)
  • Consent portal accessible to patients for granting immunisation access

Application

  • SMART_CLIENT_ID, SMART_REDIRECT_URI, AUTH_SERVER_URL, FHIR_BASE_URL all set to production values
  • server.forward-headers-strategy=native set when behind a reverse proxy
  • spring.thymeleaf.cache=true (default, confirmed)
  • Logging level is INFO, not DEBUG, for com.ajfhir.immunization

HTTPS

  • TLS certificate installed on reverse proxy
  • redirect_uri uses https://
  • HTTP → HTTPS redirect enabled on proxy
  • No HTTP-only cookies in production

Session

  • Redis configured if running more than one instance
  • spring.session.timeout=3600s matches access token TTL
  • Redis password set if exposed on a network

VDS-NC certificates (if used in production)

  • Decide whether unsigned QR codes are acceptable for your use case
  • If ICAO-compliant signing required: obtain a Document Signer Certificate (DSC) from your national authority
  • Patient name is in the correct FHIR format for MRZ encoding
  • Test QR codes scan correctly with a VDS-NC-compatible reader

HIPAA / data handling

  • PHI in HTTP session (patient ID, vaccination history in cache) encrypted at rest if using Redis
  • Access logs retained per organisational policy
  • BAA signed with cloud provider if patient data transits their infrastructure
  • Session timeout (1 hour) appropriate for your clinical environment

Health checks

  • /actuator/health responding before traffic is routed
  • Load balancer or Kubernetes liveness probe configured to hit /actuator/health
  • Startup probe allows 60 seconds (start_period: 60s) — HAPI FHIR discovery cached on first request

Testing before go-live

  • Full launch from auth server portal → dashboard renders with patient data
  • History filter (by vaccine code, date range) works
  • Certificate page generates QR code and prints correctly
  • Session timer visible and redirects to /launch?error=session_expired on expiry
  • Token refresh tested (wait > 58 minutes or temporarily reduce access-token-ttl-seconds)

Deployment