Production Checklist
Auth server registration
-
client_id=aj-fhir-immunizationregistered inregistered_appstable -
redirect_uriuses HTTPS and matchesSMART_REDIRECT_URIexactly -
allowed_scopesincludes all six required scopes - Client is
active=true
Consent Manager
-
patient/Immunization.rspresent inSCOPE_TO_RESOURCEmap ✓ (already added) -
patient/ImmunizationRecommendation.rspresent ✓ (already added) - Consent portal accessible to patients for granting immunisation access
Application
-
SMART_CLIENT_ID,SMART_REDIRECT_URI,AUTH_SERVER_URL,FHIR_BASE_URLall set to production values -
server.forward-headers-strategy=nativeset when behind a reverse proxy -
spring.thymeleaf.cache=true(default, confirmed) - Logging level is
INFO, notDEBUG, forcom.ajfhir.immunization
HTTPS
- TLS certificate installed on reverse proxy
-
redirect_uriuseshttps:// - HTTP → HTTPS redirect enabled on proxy
- No HTTP-only cookies in production
Session
- Redis configured if running more than one instance
-
spring.session.timeout=3600smatches 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/healthresponding 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_expiredon expiry - Token refresh tested (wait > 58 minutes or temporarily reduce
access-token-ttl-seconds)