Services, data stores, trust boundaries, and supported production topology for HMIS.
HMIS is a Laravel application deployed as a multi-service Docker Compose project. Dokploy builds the application image, starts the services, terminates public HTTPS through its proxy, and provides logs and container access.
The supported production baseline is one hardened Linux server running one Dokploy installation. This is suitable for an initial or small installation when the server has adequate CPU, memory, storage, backup capacity, and operational support.
This topology is not highly available. A host, storage, or Docker failure can interrupt the entire installation. Move PostgreSQL, imaging storage, and application replicas to redundant infrastructure before the clinical or imaging load exceeds a single server’s capacity or the hospital requires an RTO below eight hours.
Begin with at least 4 vCPU, 16 GB RAM, and 200 GB SSD storage for a staging or small production installation that includes integrations. Size imaging storage from expected study volume and retention, not from this minimum. Maintain at least 25% free disk space and alert at 80% utilization.Review the topology before go-live when any of these conditions applies:
The installation requires continuous availability during host maintenance.
The stated RPO of 24 hours or RTO of 8 hours is insufficient.
Imaging growth could consume the host within 12 months.
Database workload causes sustained CPU, memory, or I/O saturation.
Security policy requires separate database, integration, or PACS networks.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"HMIS Documentation","description":"Operational and developer documentation for the HMIS platform.","colors":{"primary":"#0B5D6B","light":"#0E7C86","dark":"#083D49"},"api":{"openapi":"openapi.yaml","playground":{"display":"interactive","proxy":true},"examples":{"defaults":"all","languages":["bash","javascript","python"],"prefill":false,"autogenerate":true}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"derrick-mugabwa","hasAudioNarration":false,"actualSubdomain":"derrick-mugabwa","customDomains":["hmis-docs.derrickmugabwa.dev"],"gitSource":{"type":"github","owner":"derrickmugabwa","repo":"hmis-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6a773be80eda53582ec39a97","collectionId":"6c025432-97d4-4c04-a17d-666e69163791","liveDeploymentHistoryId":"6a773be80eda53582ec39a97","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6a773be80eda53582ec39a97:success","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"API reference","count":79},{"language":"default","tag":"Staff workflows","count":33},{"language":"default","tag":"Patient mobile","count":25},{"language":"default","tag":"Platform","count":22},{"language":"default","tag":"Foundation and integrations","count":20},{"language":"default","tag":"Implementation","count":15},{"language":"default","tag":"Laboratory integration","count":14},{"language":"default","tag":"Staff clinical workspace","count":14},{"language":"default","tag":"Radiology integration","count":13},{"language":"default","tag":"Staff appointments","count":11}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"platform/architecture","slug":"/platform/architecture","pageMetadata":{"title":"Platform architecture","description":"Services, data stores, trust boundaries, and supported production topology for HMIS.","href":"/platform/architecture"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Services, data stores, trust boundaries, and supported production topology for HMIS.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Table,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`HMIS is a Laravel application deployed as a multi-service Docker Compose project. Dokploy builds the application image, starts the services, terminates public HTTPS through its proxy, and provides logs and container access.`}),`\n`,_jsx(Heading,{level:`2`,id:`supported-topology`,children:`Supported topology`}),`\n`,_jsx(_components.p,{children:`The supported production baseline is one hardened Linux server running one Dokploy installation. This is suitable for an initial or small installation when the server has adequate CPU, memory, storage, backup capacity, and operational support.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`This topology is not highly available. A host, storage, or Docker failure can interrupt the entire installation. Move PostgreSQL, imaging storage, and application replicas to redundant infrastructure before the clinical or imaging load exceeds a single server’s capacity or the hospital requires an RTO below eight hours.`})}),`\n`,_jsx(Heading,{level:`2`,id:`service-map`,children:`Service map`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Service`}),_jsx(_components.th,{children:`Purpose`}),_jsx(_components.th,{children:`Persistent data`}),_jsx(_components.th,{children:`Public access`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`app`})}),_jsx(_components.td,{children:`Laravel/Apache web and API process`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`app-storage`})}),_jsx(_components.td,{children:`HTTPS through Dokploy`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`queue`})}),_jsx(_components.td,{children:`Laravel database queue worker`}),_jsx(_components.td,{children:`Shared application storage and HMIS database`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`scheduler`})}),_jsx(_components.td,{children:`Laravel task scheduler`}),_jsx(_components.td,{children:`HMIS database`}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`postgres`})}),_jsx(_components.td,{children:`HMIS PostgreSQL 17 database`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`postgres-data`})}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`oie`})}),_jsx(_components.td,{children:`Open Integration Engine`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`oie-appdata`}),`, `,_jsx(_components.code,{children:`oie-extensions`}),`, and OIE database`]}),_jsx(_components.td,{children:`Administrator access only; analyzer listeners remain private`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`oie-postgres`})}),_jsx(_components.td,{children:`OIE PostgreSQL 17 database`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`oie-postgres-data`})}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orthanc`})}),_jsx(_components.td,{children:`PACS and DICOMweb service`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`orthanc-storage`}),` and Orthanc database`]}),_jsx(_components.td,{children:`DICOM only through an approved private network`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`orthanc-postgres`})}),_jsx(_components.td,{children:`Orthanc PostgreSQL 17 database`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`orthanc-postgres-data`})}),_jsx(_components.td,{children:`None`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`ohif`})}),_jsx(_components.td,{children:`Browser-based DICOM viewer`}),_jsx(_components.td,{children:`No application volume`}),_jsx(_components.td,{children:`Protected HTTPS through Dokploy`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`mock-analyzer`})}),_jsx(_components.td,{children:`Laboratory simulator`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`Local and staging only`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`mock-modality`})}),_jsx(_components.td,{children:`Radiology simulator`}),_jsx(_components.td,{children:`None`}),_jsx(_components.td,{children:`Local and staging only`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`request-and-data-flow`,children:`Request and data flow`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Users connect to the HMIS or OHIF domain over HTTPS.`}),`\n`,_jsx(_components.li,{children:`Dokploy routes the request to the relevant container without publishing its database ports.`}),`\n`,_jsxs(_components.li,{children:[`HMIS stores transactional data in PostgreSQL and uploaded files in `,_jsx(_components.code,{children:`app-storage`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`The queue worker processes asynchronous work; the scheduler closes expired outpatient visits at `,_jsx(_components.code,{children:`00:01`}),`.`]}),`\n`,_jsx(_components.li,{children:`When enabled, OIE exchanges orders and results between HMIS and approved devices.`}),`\n`,_jsx(_components.li,{children:`Orthanc stores imaging studies and exposes DICOMweb to OHIF on the internal network.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`trust-boundaries`,children:`Trust boundaries`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Expose only SSH, HTTP, and HTTPS on the public firewall.`}),`\n`,_jsx(_components.li,{children:`Put OIE administrator access behind a VPN, SSH tunnel, IP allow-list, or identity-aware proxy.`}),`\n`,_jsx(_components.li,{children:`Permit analyzer, MLLP, ASTM, and DICOM traffic only from approved private network ranges.`}),`\n`,_jsx(_components.li,{children:`Never publish PostgreSQL, Orthanc Explorer, raw DICOMweb, or device listener ports to the internet.`}),`\n`,_jsx(_components.li,{children:`Store credentials in Dokploy environment variables or the host backup system, never in Git or documentation.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`capacity-boundaries`,children:`Capacity boundaries`}),`\n`,_jsx(_components.p,{children:`Begin with at least 4 vCPU, 16 GB RAM, and 200 GB SSD storage for a staging or small production installation that includes integrations. Size imaging storage from expected study volume and retention, not from this minimum. Maintain at least 25% free disk space and alert at 80% utilization.`}),`\n`,_jsx(_components.p,{children:`Review the topology before go-live when any of these conditions applies:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`The installation requires continuous availability during host maintenance.`}),`\n`,_jsx(_components.li,{children:`The stated RPO of 24 hours or RTO of 8 hours is insufficient.`}),`\n`,_jsx(_components.li,{children:`Imaging growth could consume the host within 12 months.`}),`\n`,_jsx(_components.li,{children:`Database workload causes sustained CPU, memory, or I/O saturation.`}),`\n`,_jsx(_components.li,{children:`Security policy requires separate database, integration, or PACS networks.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`related-guides`,children:`Related guides`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/platform/environments`,children:`Environment model`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/platform/deployment/server-preparation`,children:`Server preparation`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/platform/operations/backup-and-restore`,children:`Backup and restore`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/platform/operations/security-and-incidents`,children:`Security and incidents`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Platform architecture","description":"Services, data stores, trust boundaries, and supported production topology for HMIS.","href":"/platform/architecture"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Supported topology","slug":"supported-topology","depth":2,"children":[]},{"title":"Service map","slug":"service-map","depth":2,"children":[]},{"title":"Request and data flow","slug":"request-and-data-flow","depth":2,"children":[]},{"title":"Trust boundaries","slug":"trust-boundaries","depth":2,"children":[]},{"title":"Capacity boundaries","slug":"capacity-boundaries","depth":2,"children":[]},{"title":"Related guides","slug":"related-guides","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"derrick-mugabwa","siteName":"HMIS Documentation","title":"Platform architecture - HMIS Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-04T15:19:04.771Z","originalFileLocation":"platform/architecture.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Services, data stores, trust boundaries, and supported production topology for HMIS.\">\u003cmeta data-mint-head name=\"application-name\" content=\"HMIS Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/derrick-mugabwa/_generated/favicon/apple-touch-icon.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/derrick-mugabwa/_generated/favicon/favicon-32x32.png?v=3\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/derrick-mugabwa/_generated/favicon/favicon-16x16.png?v=3\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/derrick-mugabwa/_generated/favicon/favicon.ico?v=3\">\u003cmeta data-mint-head property=\"og:title\" content=\"Platform architecture - HMIS Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Services, data stores, trust boundaries, and supported production topology for HMIS.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"HMIS Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://hmis-docs.derrickmugabwa.dev/platform/architecture\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://derrick-mugabwa.mintlify.app/_mintlify/api/og/v2?division=Getting+started\u0026amp;title=Platform+architecture\u0026amp;description=Services%2C+data+stores%2C+trust+boundaries%2C+and+supported+production+topology+for+HMIS.\u0026amp;theme=c8cb1bf06d72132755fda86b\u0026amp;signature=564b2ca1a28e105ced0bde3be88e157bec341c754b0c7b9ad3ba95c965d43bca\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Platform architecture - HMIS Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Services, data stores, trust boundaries, and supported production topology for HMIS.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://derrick-mugabwa.mintlify.app/_mintlify/api/og/v2?division=Getting+started\u0026amp;title=Platform+architecture\u0026amp;description=Services%2C+data+stores%2C+trust+boundaries%2C+and+supported+production+topology+for+HMIS.\u0026amp;theme=c8cb1bf06d72132755fda86b\u0026amp;signature=564b2ca1a28e105ced0bde3be88e157bec341c754b0c7b9ad3ba95c965d43bca\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/derrick-mugabwa/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"HMIS Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0B5D6B\">\u003clink data-mint-head rel=\"canonical\" href=\"https://hmis-docs.derrickmugabwa.dev/platform/architecture\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/platform/architecture.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://hmis-docs.derrickmugabwa.dev/#organization\",\"name\":\"HMIS Documentation\",\"url\":\"https://hmis-docs.derrickmugabwa.dev\"},{\"@type\":\"WebSite\",\"@id\":\"https://hmis-docs.derrickmugabwa.dev#website\",\"name\":\"HMIS Documentation\",\"url\":\"https://hmis-docs.derrickmugabwa.dev\",\"publisher\":{\"@id\":\"https://hmis-docs.derrickmugabwa.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture#webpage\",\"url\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture\",\"name\":\"Platform architecture\",\"description\":\"Services, data stores, trust boundaries, and supported production topology for HMIS.\",\"dateModified\":\"2026-08-04T15:19:04.771Z\",\"isPartOf\":{\"@id\":\"https://hmis-docs.derrickmugabwa.dev#website\"},\"breadcrumb\":{\"@id\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting started\",\"item\":\"https://hmis-docs.derrickmugabwa.dev/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Platform architecture\",\"item\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture#article\",\"headline\":\"Platform architecture\",\"name\":\"Platform architecture\",\"description\":\"Services, data stores, trust boundaries, and supported production topology for HMIS.\",\"url\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture\",\"mainEntityOfPage\":{\"@id\":\"https://hmis-docs.derrickmugabwa.dev/platform/architecture#webpage\"},\"dateModified\":\"2026-08-04T15:19:04.771Z\",\"publisher\":{\"@id\":\"https://hmis-docs.derrickmugabwa.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://hmis-docs.derrickmugabwa.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"HMIS Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"HMIS Documentation","nav":{"global":null,"tabs":[{"tab":"Platform","groups":[{"group":"Getting started","pages":[{"title":"HMIS documentation","description":"The operational and developer knowledge base for HMIS.","href":"/introduction"},{"title":"Platform architecture","href":"/platform/architecture"},{"title":"Environment model","description":"Required separation and promotion rules for local, staging, and production HMIS environments.","href":"/platform/environments"},{"title":"Prerequisites","href":"/platform/prerequisites"},{"title":"Deployment terminology","href":"/platform/terminology"}]},{"group":"Local development","pages":[{"title":"Native Windows setup","href":"/platform/local-development/native-windows"},{"title":"Docker Desktop setup","href":"/platform/local-development/docker-desktop"},{"title":"Local environment and test data","href":"/platform/local-development/environment-and-data"},{"title":"Local verification","href":"/platform/local-development/verification"}]},{"group":"Dokploy deployment","pages":[{"title":"Prepare the Dokploy server","href":"/platform/deployment/server-preparation"},{"title":"Create the Dokploy project","href":"/platform/deployment/dokploy-project"},{"title":"Production environment variables","href":"/platform/deployment/environment-variables"},{"title":"Domains, TLS, and storage","href":"/platform/deployment/domains-and-storage"},{"title":"First production deployment","href":"/platform/deployment/first-deployment"}]},{"group":"Initial configuration","pages":[{"title":"Initial hospital configuration","href":"/platform/initial-configuration"}]},{"group":"Integrations","pages":[{"title":"Optional integrations","href":"/platform/optional-integrations"}]},{"group":"Operations","pages":[{"title":"Release and rollback","href":"/platform/operations/release-and-rollback"},{"title":"Backup and restore","href":"/platform/operations/backup-and-restore"},{"title":"Monitoring and maintenance","href":"/platform/operations/monitoring-and-maintenance"},{"title":"Security and incident response","href":"/platform/operations/security-and-incidents"},{"title":"Deployment troubleshooting","href":"/platform/operations/troubleshooting"},{"title":"Production go-live checklist","href":"/platform/operations/go-live-checklist"}]}]},{"tab":"Laboratory integration","pages":[{"title":"Laboratory integration","href":"/laboratory-integration/integration-context"}]},{"tab":"Radiology integration","pages":[{"title":"Radiology integration","href":"/radiology-integration/architecture"}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/overview"}]}]},"title":"Platform architecture - HMIS Documentation","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":[],"chunks":[]}