Server Requirements¶
What a Huddo release needs from your Kubernetes cluster, and where to start with resource requests and limits. These figures apply to the huddo chart. The Component Pack chart runs the same services but reuses the MongoDB and cache that Component Pack already provides.
Starting points, not guarantees
The figures below come from the chart defaults and from running Huddo Boards in production. Huddo's own services have not yet been benchmarked under load, so treat them as a first setting: watch actual usage with kubectl top pods for the first few weeks and adjust.
Size your cluster¶
Choose the products you are installing, start from the size closest to your organisation, then adjust the numbers. Everything below the inputs updates as you type.
The calculator assumes:
- Search is always on. Spaces comes with Huddo Wikis.
- At the busiest hour, 10% of licensed users are online and 15% of those are editing a page.
- Two replicas of every stateless service, so a node can be drained without an outage. Three nodes let the scheduler keep the two replicas apart.
- Memory limits about twice the request, with a quarter more node memory than the limits add up to.
CPU requests are low because most services are idle between requests. Set CPU requests but no CPU limits, so that a burst (a page render, an image resize) is not throttled.
Sizes at a glance¶
For Huddo Wikis on its own. Licensed users, content and storage are the calculator's starting sizes; the rest is what it works out for them.
| Starter | Small | Medium | Large | |
|---|---|---|---|---|
| Licensed users | up to 200 | up to 500 | up to 2,000 | up to 10,000 |
| Wikis | about 20 | about 50 | about 150 | about 600 |
| Pages | about 3,000 | about 10,000 | about 40,000 | about 150,000 |
| Attachments | about 5 GB | about 20 GB | about 60 GB | about 250 GB |
| S3 storage to provide | 200 GB | 250 GB | 500 GB | 1 TB |
| Worker nodes | 3 × 2 vCPU, 8 GB | 3 × 2 vCPU, 8 GB | 3 × 4 vCPU, 8 GB | 3 × 4 vCPU, 16 GB |
| Pods | 32 | 32 | 32 | 36 |
| CPU requests | 2.1 vCPU | 2.3 vCPU | 2.5 vCPU | 3.0 vCPU |
| Memory requests / limits | 4.8 GB / 12 GB | 5.9 GB / 14 GB | 8.2 GB / 16 GB | 13 GB / 22 GB |
| OpenSearch heap / memory | 512m / 1 Gi |
1g / 2 Gi |
2g / 4 Gi |
4g / 8 Gi |
| OpenSearch volume | 20 Gi | 20 Gi | 20 Gi | 30 Gi |
| MongoDB data | about 0.3 GB | about 1 GB | about 4 GB | about 14 GB |
Adding products to Wikis, at any size:
| Also installing | Adds |
|---|---|
| Huddo Ideas | 2 pods, about 0.2 vCPU, 0.3 GB of memory requests (0.8 GB limits) |
| Huddo Boards | 10 pods, about 0.5 vCPU, 1 GB of memory requests (3.8 GB limits), and a second S3 bucket |
Trying Huddo out
Turning off high availability runs one replica of each service. Starter then fits on a single node with 4 vCPU and 16 GB (19 pods, 3.4 GB of memory requests). There is no room to drain that node without an outage, so use it for a trial rather than production.
What drives each figure¶
| As this grows… | …this needs more |
|---|---|
| Users online at once | wikis replicas (about one per 250 users online), attachments replicas, and socketcluster workers: every open browser tab holds a live connection, so add a worker per 500 tabs |
| Pages open for editing | editor memory: each open page is held in memory while it is being edited |
| Pages and attachments | OpenSearch memory and volume, and MongoDB storage. Text from PDF and Office files, and text found in images, is searchable, so attachments add to the index as well as pages |
| Number of wikis | OpenSearch heap: every search filters by the wikis the user can read. Above about 1,000 wikis, move up one heap size |
| Attachments | Object storage: the files themselves, plus about 15% for the resized copies of images |
| Licensed users | user replicas, which handle sign-in (about one per 5,000 users) |
Applying the values¶
Every service accepts resources and replicaCount in your values file, and OpenSearch also takes heapSize and persistence.size. The socketcluster broker and state, and draw.io, run with the chart's own settings; only the socketcluster worker's replicaCount can be changed. For example:
wikis:
replicaCount: 2
resources:
requests:
cpu: 80m
memory: 128M
limits:
memory: 384M
opensearch:
heapSize: 1g
resources:
requests:
cpu: 400m
memory: 2Gi
limits:
memory: 2Gi
persistence:
size: 20Gi
socketcluster:
worker:
replicaCount: 2
Our team can produce a complete values file for your size; ask support@huddo.com.
Give attachments-indexer a memory limit
It reads PDF and Office files and scans images for text, two files at a time, each in a process of up to 512 MB. On some kernels the image scanner cannot be capped from inside the container, so the pod limit is the only guard against an unusual file.
Search¶
Search runs on a single-node OpenSearch deployed by the chart, with one persistent volume.
| Search index size | heapSize |
Memory request and limit |
|---|---|---|
| up to 400 MB | 512m |
1 Gi |
| up to 1.5 GB | 1g |
2 Gi (chart default) |
| up to 4 GB | 2g |
4 Gi |
| larger | 4g |
8 Gi |
- Estimate the index at about 12 KB per page plus about 2% of the attachments' size.
- Keep the memory limit at twice the heap. The other half caches the index files, which keeps searches fast.
- Size the volume at three times the index. Rebuilding the index writes a new copy beside the old one.
- Every node that can run OpenSearch needs
vm.max_map_countof at least262144. The chart sets it with a privileged init container; where privileged containers are not allowed, set it on the node instead. - OpenSearch is the largest pod, so it is the one that fails to schedule on a tight cluster. To keep it off your application nodes, pin it to a node pool of its own. See Giving OpenSearch room.
- To use an OpenSearch cluster you already run, set
opensearch.enabled: falseand point the search service at it. See Configuration.
Importing content¶
Plan extra headroom for the weeks you import existing content.
- Raise the
wikisandattachmentsmemory limits to 1G while imports run. - Raise the
attachments-indexerlimit to 2G, and OpenSearch one step in the table above. - Expect search results to fill in after the import finishes. Pages are indexed at about 40 a second; text in attachments takes longer, about 2 to 3 hours for 60 GB of files.
- Put the limits back once the import is done.
External services¶
| Service | Requirement |
|---|---|
| MongoDB | 5.0 or later, running as a replica set (MongoDB Atlas always is). Huddo uses transactions and change streams, which a standalone server does not support. On first start each service builds its indexes, which can take several minutes on a large imported database |
| S3 storage | Any S3-compatible endpoint. Allow for the attachments plus about 15% |
| Valkey/Redis | Deployed by the chart. Holds caches and work queues only, so nothing needs backing up |
Images¶
Most images come from Huddo's repository on Quay.io, which needs access to our images. A few come from Docker Hub. For an air-gapped cluster, or to avoid Docker Hub's pull limits, mirror these into your own registry.
| Registry | Images |
|---|---|
quay.io/huddo |
core, wikis, spaces, ideas, editor, attachments, discussions, notifications, search, acl, user, provider, licence, socketcluster |
| Docker Hub | opensearchproject/opensearch, valkey/valkey, socketcluster/scc-broker, socketcluster/scc-state, busybox |
| Docker Hub (only with diagrams enabled) | jgraph/drawio |