You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Container_Ext(rtd_orms, "Realtime Database", "us-central1", "Temporarily stores shortened patient names to call patients via TV screens in the waiting rooms") {
57
-
58
-
}
46
+
' Container_Ext(rtd_orms, "Realtime Database", "us-central1", "Temporarily stores shortened patient names to call patients via TV screens in the waiting rooms") {
Rel(traefik, opaladmin, "Sends requests to /opalAdmin to")
64
-
Rel(traefik, labs, "Sends requests to /opal-labs to")
65
-
Rel(traefik, orms, "Sends requests to /orms to")
66
-
67
-
Rel(nginx, mirth, "Forwards requests to", "HTTP")
68
-
Rel(mirth, oie_dbs, "Reads from and writes to")
69
-
Rel(mirth, backend, "Makes API calls to", "HTTPS")
70
-
Rel(mirth, opaladmin, "Makes API calls to", "HTTPS")
71
-
Rel(mirth, labs, "Makes API calls to", "HTTPS")
72
-
Rel(mirth, orms, "Makes API calls to", "HTTPS")
73
-
74
-
Rel(backend, nginx, "Makes API calls to", "HTTPS")
75
-
Rel(listener, nginx, "Makes API calls to", "HTTPS")
76
-
Rel(opaladmin, nginx, "Makes API calls to", "HTTPS")
77
-
Rel(orms, nginx, "Makes API calls to", "HTTPS")
78
-
79
-
' Rel(backend, pdfgen, "Makes API calls to", "HTTP")
80
-
Rel(pdfgen, highcharts, "Makes API calls to", "HTTP")
81
-
Rel(labs, redis, "Makes calls to")
82
-
Rel(orms, memcached, "Makes calls to")
83
-
84
-
Rel(backend, backend_db, "Reads from and writes to", "TLS")
85
-
Rel(backend, legacy_dbs, "Reads from and writes to", "TLS")
86
-
Rel(opaladmin, legacy_dbs, "Reads from and writes to", "TLS")
87
-
Rel(labs, legacy_dbs, "Reads from and writes to", "TLS")
88
-
Rel(listener, legacy_dbs, "Reads from and writes to", "TLS")
89
-
Rel(orms, legacy_dbs, "Reads from and writes to", "TLS")
90
-
Rel(pdfgen, legacy_dbs, "Reads from and writes to", "TLS")
91
-
Rel(alembic, legacy_dbs, "Reads from and writes to", "TLS", $tags="init")
52
+
Rel(traefik, admin, "Sends requests to / to")
53
+
Rel(traefik, admin_legacy, "Sends requests to /opalAdmin to")
54
+
' Rel(traefik, orms, "Sends requests to /orms to")
55
+
56
+
Rel(integration_engine, traefik, "Makes API calls to", "HTTPS")
57
+
'Rel(integration_engine, admin_legacy, "Makes API calls to", "HTTPS")
58
+
'Rel(integration_engine, orms, "Makes API calls to", "HTTPS")
59
+
60
+
Rel(admin, integration_engine, "Makes API calls to", "HTTPS")
61
+
Rel(listener, integration_engine, "Makes API calls to", "HTTPS")
62
+
Rel(admin_legacy, integration_engine, "Makes API calls to", "HTTPS")
63
+
'Rel(orms, integration_engine, "Makes API calls to", "HTTPS")
64
+
65
+
Rel(admin_legacy, redis, "Makes calls to")
66
+
' Rel(orms, memcached, "Makes calls to")
67
+
68
+
Rel(admin, admin_db, "Reads from and writes to", "")
69
+
Rel(admin, legacy_dbs, "Reads from and writes to", "")
70
+
Rel(admin_legacy, legacy_dbs, "Reads from and writes to", "")
71
+
Rel(listener, legacy_dbs, "Reads from and writes to", "")
72
+
' Rel(orms, legacy_dbs, "Reads from and writes to", "")
73
+
Rel(db_management, legacy_dbs, "Reads from and writes to", "", $tags="init")
92
74
93
75
Rel(listener, rtd_opal, "Connects to, reads from, and writes to")
94
-
Rel(orms, rtd_orms, "Connects to, reads from, and writes to")
76
+
' Rel(orms, rtd_orms, "Connects to, reads from, and writes to")
77
+
78
+
Lay_Left(admin_legacy, admin)
79
+
Lay_Up(redis, db)
95
80
96
-
LAYOUT_WITH_LEGEND()
81
+
' LAYOUT_WITH_LEGEND()
97
82
SHOW_LEGEND()
98
83
99
-
footerdrawn with PlantUML version %version() and C4-PlantUML version C4Version()
84
+
footerRelationships between components on the same host are left out for brevity (except those making use of third-party components).\n\ndrawn with PlantUML version %version() and C4-PlantUML version C4Version()
' SPDX-FileCopyrightText: Copyright (C) 2024 Opal Health Informatics Group at the Research Institute of the McGill University Health Centre <[email protected]>
2
+
'
3
+
' SPDX-License-Identifier: CC-BY-SA-4.0
4
+
5
+
@startuml Opal PIE Deployment
6
+
!include <C4/C4_Deployment>
7
+
8
+
titleDeployment diagram for the Opal PIE with a separate database server
Container(traefik, "Reverse Proxy", "traefik", "Takes care of TLS termination and path rewrites\nRedirects all HTTP requests to HTTPS")
22
+
Container(admin, "Opal Admin", "", "Web application exposing APIs and providing new OpalAdmin interface")
23
+
Container(admin_legacy, "Opal Admin Legacy", "Apache, PHP", "Web application for clinicians and staff to set up and manage data")
24
+
Container(listener, "Listener", "Node.js", "Handles requests from the user applications to access patient data")
25
+
' Container(orms, "ORMS", "Apache, PHP", "Opal Room Management Software that provides the virtual waiting room and live clinician dashboard")
26
+
Container(redis, "redis", "", "Caches patients being processed to avoid sending push notifications when batch processing lab results")
27
+
Container(db_management, "db-management", "", "Database migrations\nRun at initialization or upgrade time to migrate DBs", $tags="init")
28
+
Container(ofelia, "ofelia", "", "Sidecar to run tasks periodically on containers")
29
+
}
30
+
}
31
+
Deployment_Node(dbs, "Application Server", "CentOS Stream9 or Ubuntu LTS") {
32
+
Deployment_Node(db, "MariaDB", "MariaDB") {
33
+
ContainerDb(legacy_dbs, "Legacy Databases", "RDS", "DBs for legacy components\n(OpalDB, QuestionnaireDB)")
34
+
ContainerDb(admin_db, "Backend Database", "RDS", "DB for admin")
35
+
36
+
}
37
+
}
38
+
39
+
Container_Ext(integration_engine, "Integration Engine", "", "Interfaces with source systems\nExposes API endpoints")
40
+
}
41
+
}
42
+
43
+
Deployment_Node(firebase, "Firebase") {
44
+
Container_Ext(rtd_opal, "Realtime Database", "us-central1", "Temporarily stores requests and responses from the user applications") {
45
+
46
+
}
47
+
48
+
' Container_Ext(rtd_orms, "Realtime Database", "us-central1", "Temporarily stores shortened patient names to call patients via TV screens in the waiting rooms") {
Rel(traefik, admin_legacy, "Sends requests to /opalAdmin to")
56
+
' Rel(traefik, orms, "Sends requests to /orms to")
57
+
58
+
Rel(integration_engine, traefik, "Makes API calls to", "HTTPS")
59
+
'Rel(integration_engine, admin_legacy, "Makes API calls to", "HTTPS")
60
+
'Rel(integration_engine, orms, "Makes API calls to", "HTTPS")
61
+
62
+
Rel(admin, integration_engine, "Makes API calls to", "HTTPS")
63
+
Rel(listener, integration_engine, "Makes API calls to", "HTTPS")
64
+
Rel(admin_legacy, integration_engine, "Makes API calls to", "HTTPS")
65
+
'Rel(orms, integration_engine, "Makes API calls to", "HTTPS")
66
+
67
+
Rel(admin_legacy, redis, "Makes calls to")
68
+
' Rel(orms, memcached, "Makes calls to")
69
+
70
+
Rel(admin, admin_db, "Reads from and writes to", "TLS")
71
+
Rel(admin, legacy_dbs, "Reads from and writes to", "TLS")
72
+
Rel(admin_legacy, legacy_dbs, "Reads from and writes to", "TLS")
73
+
Rel(listener, legacy_dbs, "Reads from and writes to", "TLS")
74
+
' Rel(orms, legacy_dbs, "Reads from and writes to", "")
75
+
Rel(db_management, legacy_dbs, "Reads from and writes to", "TLS", $tags="init")
76
+
77
+
Rel(listener, rtd_opal, "Connects to, reads from, and writes to")
78
+
' Rel(orms, rtd_orms, "Connects to, reads from, and writes to")
79
+
80
+
Lay_Left(admin_legacy, admin)
81
+
Lay_Up(redis, db)
82
+
83
+
' LAYOUT_WITH_LEGEND()
84
+
SHOW_LEGEND()
85
+
86
+
footer Relationships between components on the same host are left out for brevity (except those making use of third-party components).\n\ndrawn with PlantUML version %version() and C4-PlantUML version C4Version()
The platform's primary goal is to securely share data across the perimeter of a healthcare institution's protected network between the Opal app and their medical record in the hospital's source systems.
16
+
This is achieved using a cloud-hosted authentication service and *Realtime Database* relay.
17
+
Currently, this service is provided by Google's [Firebase](https://firebase.google.com/) service.
18
+
19
+
The Opal PIE is typically deployed in a hospital (but does not have to be).
20
+
The user applications are deployed separately, on a web server and the mobile app stores.
11
21
12
22
## Deploying the Opal PIE
13
23
14
-
### Deployment diagram
24
+
### Deployment diagrams
25
+
26
+
We support different deployment scenarios for how the database is deployed.
27
+
28
+
For ease of deployment (such as when testing a deployment) you can deploy the database as a container:
0 commit comments