System Requirements
Hardware, software, and network requirements for deploying the Zynomi CTMS platform.
Server Requirements
Production Server
| Specification | Minimum | Recommended |
|---|---|---|
| CPU | 4 vCPU | 8 vCPU |
| RAM | 8 GB | 16 GB |
| Disk | 50 GB SSD | 100 GB SSD |
| Architecture | amd64 (x86_64) | amd64 (x86_64) |
Development Machine
| Specification | Minimum | Recommended |
|---|---|---|
| CPU | 4 cores | 8 cores |
| RAM | 8 GB | 16 GB |
| Disk | 50 GB SSD | 100 GB SSD |
Images like zynomi/zynexa, zynomi/sublink, cubejs/cubestore are amd64-only. Apple Silicon (ARM) works for local dev with CUBEJS_DEV_MODE=true but is not recommended for production.
Supported Operating Systems
Since the platform runs entirely in Docker containers, any Linux distribution that supports Docker is suitable for production.
| OS | Version | Notes |
|---|---|---|
| Amazon Linux | 2023 (recommended) | Recommended for AWS EC2 production |
| Rocky Linux | 9, 10 | Tested on Hetzner Cloud (Rocky 10.1) |
| AlmaLinux | 9 | Community RHEL rebuild |
| Ubuntu | 22.04 / 24.04 LTS | Widely supported alternative |
| Any Linux | — | Any distro with Docker Engine support |
| macOS | 12+ | Development only (ARM caveat below) |
| Windows | 10/11 with WSL2 | Development only |
Software Requirements
The platform runs entirely inside Docker containers — no application runtimes (Node.js, Python, etc.) need to be installed on the host.
| Software | Version | Required | Notes |
|---|---|---|---|
| Docker Engine | >= 24.0 | Yes | Container runtime |
| Docker Compose | >= 2.20 | Yes | Multi-container orchestration (included with Docker Desktop / Engine) |
| Docker Buildx | >= 0.10 | Yes (self-hosted) | Required when building the Frappe image locally (docker compose build). Included with Docker Desktop; on Linux servers install the docker-buildx-plugin package. |
| GNU Make | >= 4.0 | Yes | Task runner for deployment commands (Makefile) |
| Git | 2.x | Yes | Clone the deployment repository |
All other runtimes — Node.js, Python, Bun, dbt — are bundled inside the Docker images. You do not need to install them on the server.
Amazon Linux / RHEL / CentOS:
sudo yum install -y make
Ubuntu / Debian:
sudo apt-get install -y make
macOS ships with Make pre-installed (via Xcode Command Line Tools). Verify with make --version.
Port Requirements
Application Ports
| Port | Service | Protocol | Description |
|---|---|---|---|
| 80 | Caddy | TCP | HTTP (redirects to HTTPS) |
| 443 | Caddy | TCP | HTTPS reverse proxy |
| 3000 | Zynexa | TCP | Main CTMS web application |
| 3001 | Sublink | TCP | Mobile web application |
| 4000 | Cube.js | TCP | Analytics semantic layer |
| 5080 | OpenObserve | TCP | Observability dashboard |
| 5433 | Lakehouse DB | TCP | PostgreSQL (external port) |
| 8006 | MCP Server | TCP | AI agent (Model Context Protocol) |
| 9080 | KrakenD | TCP | API gateway |
| 8001 | ODM API | TCP | CDISC ODM report generator |
Self-Hosted Only Ports
These ports are used only in self-hosted mode where Frappe and Supabase run locally alongside the CTMS stack.
| Port | Service | Protocol | Description |
|---|---|---|---|
| 8080 | Frappe | TCP | Clinical backend (ERPNext + MarleyHealth) |
| 8000 | Supabase Kong | TCP | Supabase API gateway / Studio |
In self-hosted mode, Frappe binds to port 8080 and Supabase Kong binds to port 8000. Because of this, the KrakenD API gateway and ODM API are remapped to 9080 and 8001 respectively to avoid conflicts.
| Service | Cloud Port | Self-Hosted Port | Reason |
|---|---|---|---|
| KrakenD (API Gateway) | 8080 | 9080 | Frappe occupies 8080 |
| ODM API | 8000 | 8001 | Supabase Kong occupies 8000 |
These mappings are defined in docker-compose.prod.yml.
Internal Docker Ports
| Port | Service | Description |
|---|---|---|
| 5432 | Lakehouse DB | PostgreSQL (Docker-internal) |
| 4000 | Cube.js | Analytics API (Docker-internal) |
For cloud deployments (AWS EC2, etc.), open the application ports above in your security group. For Phase 2 (DNS + HTTPS), only ports 80 and 443 need to be publicly exposed.
External Cloud Services
Required
| Service | Provider | Purpose | Local Alternative |
|---|---|---|---|
| Authentication | Supabase | Auth, user profiles, PostgreSQL | Self-hosted Supabase via Docker |
| Clinical Backend | Frappe Cloud | EHR, patient data, API backend | Self-hosted Frappe via Docker |
| AI / LLM | OpenAI | GPT-4o-mini for AI chatbot | — (required for AI features) |
When purchasing a Frappe Cloud site, the default setup creates a site with only the ERPNext app. The CTMS platform requires the MarleyHealth (Healthcare module) app to be installed on top of ERPNext.
After site creation on Frappe Cloud:
- Go to Sites → Your Site → Apps
- Click Install App and search for MarleyHealth (or the Healthcare module)
- Install it — this adds the Healthcare DocTypes (Patient, Healthcare Practitioner, Vital Signs, etc.) that CTMS depends on
Without MarleyHealth, the 5-stage Frappe provisioning (DocTypes, Custom Fields, RBAC, seed data, practitioner) will fail because the base Healthcare DocTypes it extends do not exist.
For self-hosted Frappe via Docker, the MarleyHealth app is already included in the Frappe stack configuration.
Optional
| Service | Provider | Purpose | When Needed |
|---|---|---|---|
| Push Notifications | Firebase | Mobile push notifications | Only if using Sublink mobile app |
| Web Hosting | Vercel | Next.js hosting, edge functions | Only for serverless deployment |
| Container Hosting | Fly.io | Serverless containers (Cube, dbt) | Only for serverless deployment |
GitHub is used for the code repository and CI/CD but is not a runtime dependency of the platform.
Both Supabase and Frappe can be self-hosted using Docker, enabling fully local / air-gapped deployments without any cloud service dependencies (except OpenAI for AI features).
Network / Firewall Allowlist
Outbound access required from the server:
| Domain Pattern | Service | Required |
|---|---|---|
*.supabase.co | Authentication & database | Yes (unless self-hosted) |
*.frappe.cloud | Clinical backend | Yes (unless self-hosted) |
api.openai.com | LLM / AI features | Yes |
github.com | Source control (deploy only) | Yes |
*.googleapis.com | Firebase push notifications | Optional |
*.vercel.app | Web hosting | Only for serverless deployment |
*.fly.dev | Container hosting | Only for serverless deployment |
Deployment Options
| Option | Description | Best For |
|---|---|---|
| Docker Compose on EC2 (Recommended) | Self-hosted via Docker on AWS EC2 (Amazon Linux) | Most deployments, full control |
| Docker Compose (any Linux) | Self-hosted via Docker on any Linux server | On-premises, other cloud providers |
| Serverless (Optional) | Vercel (web) + Fly.io (containers) | Rapid scaling, low maintenance |
Next Steps
- Installation — Clone the repo and configure environment
- Initial Setup & Configuration — Provision Frappe, seed data