Shuffle scaling with Docker Swarm and Kubernetes

Scaling Shuffle means spreading Orborus runtime nodes, worker starts and app containers across servers, and choosing Docker Swarm or Kubernetes deliberately. This page covers the decisions, build order, effort drivers and tests.

On this page

Shuffle scaling with Docker Swarm and Kubernetes: when one server stops being enough

When playbooks queue or time out under load, the practical fix is to add runtime capacity across servers. In Shuffle, that means running Orborus in Docker Swarm or Kubernetes mode so that workflow execution can be spread over more than one host. Orborus polls the Shuffle backend for jobs, so how it is deployed decides where workflow work can land. Many teams first enlarge the single server, then see the same queueing return once that host runs out of memory or process capacity. This section explains why scaling is harder than adding nodes and what to settle before changing any setting.

The difficulty is that each workflow execution starts a worker, and the worker starts the app containers for the actions it runs. Every run therefore draws on CPU, memory and disk on the host that receives it, plus the image pulls needed to start each app. Capacity is the combined result of three things: how many hosts are available, how large and how current the app images are, and how many executions each host may run at once. Tuning the backend alone leaves the runtime hosts as the likely bottleneck, so the sizing exercise has to cover all three factors together.

Shuffle's documentation describes distributed Docker Swarm and Kubernetes deployment with Helm charts as documented architectures, so both are patterns your team can plan around. Choose the orchestrator your organization already operates and can support, because the runtime hosts will sit inside its network, storage and image policies. Then confirm the Orborus mode, concurrency and placement settings for the exact release you intend to run in the configuration documentation for that release. Do not copy values from older guides or forum posts, since defaults and option names can change between versions.

Before changing anything, collect evidence: which playbooks queue, how long they wait, which apps they call, and which hosts their containers land on. Ask your platform team to confirm node resources, registry access from every host, and where image caches are stored. Plan for two risks. A runtime node can fail in the middle of a workflow, and an image update can leave apps at different versions across hosts. Redundant Orborus nodes are covered in the high availability section, and version alignment is covered in the upgrades section, so treat both as dependencies for any scaling design.

Docker Swarm or Kubernetes for the Shuffle runtime

This table compares a single Compose host, distributed Docker Swarm and Kubernetes with Helm charts as runtime options for Shuffle workflow execution. Read each row as a decision factor, with the operational cost on the right-hand columns. The main takeaway is that the choice mostly depends on who will operate the cluster, not on which option Shuffle documents.

FactorSingle Compose hostDocker SwarmKubernetes with Helm
When it fitsPilot projects, a small number of playbooks and a single team that accepts one server as the runtimeSeveral servers that your team already operates with Docker, and a need to spread backends, frontends and workers across nodesTeams with existing Kubernetes operations, cluster standards and a need for Helm-based deployment and multi-environment consistency
Skills requiredDocker Compose and Linux administrationDocker Swarm operations, overlay networking and node managementKubernetes administration, Helm, ingress, storage classes and RBAC
Upgrade pathPull new tagged images and restart the stack, with a maintenance windowRolling service updates across nodes, with image versions kept alignedHelm chart upgrades tied to cluster version support, with values files kept under version control
Registry handlingApps pulled on the host, usually from a public registry unless you add a mirrorEach node pulls app images, so registry access and credentials must work on every nodeCluster nodes pull app images, so pull secrets and image policies must be set per namespace
MonitoringHost metrics and container logs, usually added by handService-level metrics and logs across nodes, requiring a stack you select and runCluster metrics, pod logs and events, requiring a monitoring stack that your team selects
Where Orborus and app containers runOrborus and app containers on the same host, sharing its CPU and memoryOrborus as a service with worker and app containers scheduled across swarm nodesOrborus as a deployment with worker and app pods scheduled across cluster nodes
One central Orborus or one per nodeOne Orborus on the host, which is also a single point of failureOne central Orborus can run in the swarm, and extra Orborus nodes add redundancy and localityOne central Orborus or several in separate node pools, depending on network zones and failure tolerance
Public registry or private mirrorPublic registry works for a pilot, but a mirror makes pulls predictable and auditableA private mirror reduces pull failures and rate-limit exposure across many nodesA private mirror, combined with pull secrets, is usually needed for production clusters

How Orborus turns one workflow run into worker and app containers

The scaling question for Shuffle starts with one chain of components. The frontend and the Go backend API, which listens on port 5001, handle users and workflow definitions, and OpenSearch stores the documents behind them. Orborus is the runtime piece. It polls the backend for jobs, and for each workflow execution it starts a worker container. The worker then starts the app containers that perform the individual actions in the workflow. Load therefore moves in stages: the backend and OpenSearch carry the control plane and the bookkeeping, while the runtime hosts carry the containers that actually execute work. Sizing the backend alone will not tell you how much the runtime hosts need.

For planning, the useful question is where each container lands. In Docker Swarm mode and in Kubernetes mode, the scheduler decides placement, so the number of workers and app containers that a given host receives depends on the orchestrator, the resource requests set for those containers, and any placement constraints you define. Ask your implementation partner or the Shuffle team to show you, in your own environment, which hosts receive worker containers and which receive app containers, and how a failed host is handled. Do not assume that a second Orborus node automatically spreads load evenly. Confirm how each Orborus node claims jobs and how that interacts with your chosen orchestrator.

Many short app runs and a few long ones stress the runtime differently. Short runs create many container starts, which means frequent image pulls if images are not cached on the host, heavier churn in the Docker daemon or Kubernetes node, and bursts of scheduling activity. Long runs hold memory and CPU for longer and reduce the number of containers that fit on a host at once, but they generate fewer starts. A workflow that calls one API hundreds of times per hour and a workflow that runs a single long enrichment job can need very different host capacity even when the total number of app runs looks similar. Pull a sample of your expected run profile before deciding host sizes and registry placement.

Concurrency and placement settings are where assumptions cause the most trouble. The configuration documentation describes the environment variables and options that control how many workflows and apps can run in parallel, how Orborus behaves across nodes, and how images are pulled and handled in the runtime. Those names, defaults and limits must be read from the current configuration docs for the release you deploy, not copied from a blog post or an older version. Record the values you set, the release tag you run, and the test result that shows the setting behaves as you expect under load.

Before go-live, run a controlled load test that mirrors your real mix of short and long runs, watch image pull times, host memory and CPU, and failed or queued executions, and then repeat the test after any change to concurrency, placement or registry configuration. Keep the frontend, backend and worker images on matching releases, because a mismatch between components can show up as failures that look like scaling problems. Plan for the case where a runtime host or Orborus node stops during a busy period, and confirm in writing how queued workflows resume.

Shuffle scaling build sequence, step by step

This sequence takes a single Shuffle installation to a scaled setup where several runtime nodes execute workflows and app containers land on the intended hosts. Each step closes with a check, so the team knows when to move on. Work proceeds in the order below because later steps depend on the images, database and registry settings set earlier.

  1. Confirm release and matching images

    Choose one Shuffle release and pin the frontend, backend and runtime images to that same version. The Shuffle docs recommend the latest Docker tag for stable releases and the nightly tag only for experimental changes, so confirm which channel your environment is approved to run. Check the release notes on the GitHub releases page for version-specific steps. Done when every server pulls the same tag for all three images and your change record names that tag.

  2. Establish backend and OpenSearch baseline

    Bring up the backend API, which listens on port 5001, and the OpenSearch document database on a single host first. Record the SHUFFLE_ENCRYPTION_MODIFIER value in your secrets store before anything is saved, because the docs warn that changing or losing it breaks all saved app authentications. Done when the backend answers on port 5001, the frontend logs in, and OpenSearch reports healthy with the expected indices created.

  3. Join Swarm nodes or prepare Helm deployment

    For Docker Swarm, join each additional server to the cluster and confirm that the manager sees every node in the ready state. For Kubernetes, prepare the Helm chart values for your cluster, namespaces and storage class, then render the manifests and review them before applying. Confirm which hosts will run the backend and frontend and which will run Orborus. Done when the node list or cluster inventory matches the planned topology, with no unexpected hosts.

  4. Deploy Orborus on each runtime node

    Orborus polls the backend for jobs, starts a worker for each workflow execution, and the worker starts app containers. Deploy one Orborus instance on each runtime node or location, and keep at least two so workflows continue if one fails. Use the Orborus settings in the configuration docs for each location. Done when every Orborus instance appears as registered in the Shuffle interface and shows a recent heartbeat.

  5. Set concurrency per the configuration docs

    Set the concurrency limits for workflow execution and app containers according to the values and guidance in the Shuffle configuration docs, applied to each runtime node. Record the values per node so that capacity is known and changes are traceable. Do not raise limits on one node without checking the host resources and the placement plan from the previous steps. Done when each node reports the agreed limits in its configuration and the settings are stored in version control or your change system.

  6. Configure registry access and pull behavior

    Decide where app images will be pulled from, whether a private registry or a public one, and set credentials on every runtime node that needs them. Confirm the pull policy so each node fetches the versioned app image it is assigned rather than a different tag. Ask your platform or security team to confirm registry allow lists and certificate trust for internal registries. Done when a test pull succeeds on each runtime node using the same credentials and the expected image digest.

  7. Pre-pull the app images workflows need

    List the app images used by the workflows in scope, including the versions each workflow expects, and pull them onto every node that may run them. Pre-pulling keeps the first execution on each node from waiting on a network download and shows registry problems before production traffic arrives. Repeat the pull after any app update. Done when an image listing on each node shows every required app version present, and the list matches the workflow inventory.

  8. Run a controlled load test

    Run a test workflow that exercises several runtime nodes, using a known input set and a defined number of parallel executions that your team agrees in advance. Watch the backend, OpenSearch and each Orborus instance during the run, and confirm the app containers start on the nodes the placement plan assigned. Stop the test if a node stalls or a container lands on an unintended host. Done when the test workflows complete, the results match the expected output, and the placement log confirms the intended hosts.

Shuffle scaling with Kubernetes Helm compared with Docker Swarm

In a distributed Docker Swarm deployment, Orborus runs alongside the Shuffle backend and polls it for jobs, then starts a worker for each workflow execution, and the worker starts the app containers. Placement depends on Swarm node labels and placement constraints, so your team decides which nodes may run workers and which may run app containers.

  • Orborus deployment: Run Orborus as a Swarm service with more than one replica, following the distributed Swarm layout in the architecture docs.
  • Placement: Label nodes by role, such as worker or app, and use placement constraints to keep worker and app containers on the intended nodes. Confirm which label or constraint settings the current Orborus release reads.
  • Image pulls and caching: Every node that runs a worker or app container pulls the image it needs and keeps it in its local Docker image cache. Confirm that each node can reach your registry and that the image tags you pin match the release you test.
  • Node loss: Swarm reschedules Orborus replicas onto healthy nodes. Check the execution history for workflows that were running on the lost node, because a restarted worker may not resume a partly completed run.
  • Release checks: Confirm in the release notes how v2.3.0 changes Swarm environment variables and whether the latest or nightly tag applies to your environment.

Before go-live, confirm the placement rules in a test cluster by draining a node and checking that workers and app containers land where your labels say they should.

Image registries and caching for app containers at scale

Every Shuffle app runs as a versioned Docker container, so the speed at which a scaled run starts depends on how quickly each runtime node can pull the app image it needs. When Orborus starts a worker for a workflow execution and the worker starts app containers, any node that lacks a required image must fetch it before the step can run. On a long-lived host the image is usually already cached. On a new host added to a Docker Swarm or Kubernetes cluster to absorb load, the first run pays the full pull cost. That makes the registry path a scaling decision, not just a packaging detail, and it should be designed before you add nodes.

The first decision is where the registry lives. Every runtime node must be able to reach it over the network and authenticate if the registry is private. Confirm this from each node, not only from the server that builds images, because Swarm workers and Kubernetes nodes often sit in different subnets or security zones than the Shuffle backend. For hybrid setups where Orborus runs inside a private network, the registry should be inside that network too, so app pulls never depend on an outbound path to a public registry. Ask your team which registry will serve each runtime location, who owns it, and how it is backed up.

For private networks, mirror the images your workflows depend on into a registry you control. A mirror removes dependence on external availability during a scale-out event and keeps pulls on fast internal links. Decide which images are mirrored, how the mirror is refreshed when Shuffle or an app is updated, and who approves a new image before it reaches production nodes. Pin app image versions explicitly so every node runs the same build of an app. A floating tag can resolve to different digests on different hosts, so one worker may execute a different app build than another for the same workflow. Record the version of each app in your change process and verify it on every node after a rollout.

The Shuffle documentation recommends using the latest Docker tag for stable releases and the nightly tag only for experimental changes. Apply that split to your own environment: production runtimes should track stable tags that you have tested, and nightly images should stay in a test location where failures cost little. Do not use nightly images in a runtime that serves live security automation. Confirm the exact tag names, registry configuration, credential handling and any image caching options in the configuration documentation for the release you deploy, because these settings change between versions. Check how registry credentials are supplied to Swarm services or Kubernetes pull secrets, and keep those credentials out of workflow definitions.

Before you rely on this design at scale, run a controlled test. Add a new node, schedule a workflow that uses several apps, and time the first execution against a warm node. Repeat the test after each registry change or app upgrade. Also simulate loss of the registry and confirm which runs fail and how the team is alerted. A registry that works for a single server may still be a bottleneck when many workers pull at once, so measure concurrent pulls as well as single pulls. Ask whoever plans your implementation to include this test in the scope, since it reveals problems that a single-node check will miss.

What drives scaling effort and how to keep it down

This table lists the drivers that change how much work a Shuffle scale-out takes and what it costs to run afterward. Read each row as a question to answer before sizing: the middle column explains the effect, and the right column names the design choice that limits it. The main takeaway is that node count and app catalog size are decisions made early, so fixing a standard node template, a small app catalog and a placement standard before scaling keeps build and upkeep effort contained.

DriverHow it raises effort or costHow to keep it down
Runtime nodes and locationsEach node runs an Orborus instance that needs its own configuration, image pulls, monitoring and patching.Use one standard node template and a written placement standard that says which apps run where.
Concurrent workflow runsOrborus starts a worker per execution and workers start app containers, so peak overlap drives CPU, memory and container count.Load test a representative workflow mix, set concurrency per node from results and split high-volume playbooks.
Number and size of app imagesEach app is a versioned container, so more and larger images mean more builds, tests, storage and update work.Keep a small fixed app catalog, retire unused apps and pin versions for each release.
Registry distance and bandwidthPulling images over a slow or distant link delays first runs and new nodes, and a registry outage blocks new containers.Run a local mirror inside the runtime network and pre-pull approved images onto each node.
Network segmentation between runtime and backendOrborus polls the backend, so each segment needs approved outbound paths, and app containers need reachable targets.List every required flow in a table, open only those paths and test each zone before go-live.
Kubernetes skills in-houseHelm-based deployment, ingress, storage and upgrades need Kubernetes skills, and gaps add partner or vendor effort.Match the orchestrator to the team's skills, and agree Helm values, runbooks and on-call coverage before build.
Shared encryption secret across backendsEvery backend must use the same SHUFFLE_ENCRYPTION_MODIFIER value, and changing it breaks saved app authentications.Store the value in your secrets manager, keep one value per environment and document the rotation procedure.
Evidence for compliance reviewsAssessors usually ask for configuration baselines, change records, image sources, access reviews and restore test results, and collecting them late adds effort.Agree the evidence list before build and keep configuration in version control. Independent auditors make the final call.

How to prove scaled workflows keep running when a node fails

A scaled Shuffle deployment is proven only when a written test shows that workflows keep completing after a runtime node stops and that every run can be traced to the host that executed it. Start with a fixed set of workflows, agreed with the business owners, run at the target concurrency from your scope document. Use the same set before and after the failure so the results are comparable. For each run, record when it was queued, when it started, when it finished and whether it failed. Queueing is the first signal. If runs wait longer after the failure and do not return to the pre-failure pattern, the remaining capacity is too small for the load, and the sizing needs to change before go-live.

Before any failure is injected, confirm placement. In Docker Swarm mode, list the tasks for the backend, Orborus and worker services and map each worker and app container to its host. In Kubernetes mode, map each worker and app pod to its node. Check that the second Orborus node actually receives jobs during the run. An idle Orborus node will look healthy in a dashboard but provides no failover. Then test scale-out: add a new node, schedule a run that needs each app image, and confirm the image pulls cleanly from your registry on that node. Registry authentication and network reachability from new nodes are common failure points, so record pull success, the image tags used and any pull errors.

Next, stop one Orborus node during a steady run. The Shuffle HA guidance calls for more than one Orborus node so workflows keep running if one fails, which means a single-Orborus setup cannot pass this test. Watch for runs stuck in a running state, and confirm that queued jobs are picked up by the surviving node. Repeat the exercise by stopping one Swarm worker or one Kubernetes worker node that hosts app containers. Run this in an approved change window with a documented rollback, and record the exact time of each stop and restart. Note which runs were in flight on the stopped node and what state they ended in, because those runs are the ones most likely to be lost.

Securing scaled runtime nodes and registry access

Scaling Shuffle across several servers multiplies the places where credentials, container runtime access and network paths matter. The cards below cover the points that change when Orborus and worker nodes run under Docker Swarm or Kubernetes, and what to confirm in the Shuffle configuration docs before a rollout.

Registry credentials on every node

Each Swarm or Kubernetes node that pulls worker and app images needs registry credentials, and those credentials must be stored and rotated on every node, not only on the first one. Decide where credentials live (node-level Docker config, Kubernetes pull secrets or a managed secret store), who can read them, and how a rotation reaches all nodes at once. Confirm the exact registry and pull configuration with the Shuffle configuration docs for your chosen mode.

Docker socket access on runtime hosts

Orborus and the worker hosts need access to the Docker socket to start containers, and that access is effectively root on the host. Limit which accounts and containers can reach the socket, keep Orborus on dedicated runtime hosts where possible, and avoid mounting the socket into containers that do not need it. Review the socket mount in the deployment files for each node type before adding nodes to the cluster.

Identical encryption modifier across nodes

Shuffle encrypts saved app credentials and API keys in OpenSearch using the SHUFFLE_ENCRYPTION_MODIFIER secret. Every backend and runtime node that reads those credentials must use the same value, and changing or losing it breaks all saved app authentications. Store the value in your secret manager, document it in your recovery runbook, and check that it is identical on every node after each scaling change.

Network paths to backend and registry

Runtime nodes must reach the Shuffle backend API on port 5001 and the container registry. Map each path from every Swarm or Kubernetes node to these endpoints, and allow only those flows through host and network policies. For hybrid runtime locations, confirm the outbound-only pattern described in the architecture docs so no inbound firewall ports are opened.

Least-privilege integration API keys

Apps and workflows call external tools such as SIEM, EDR and ticketing systems using API keys stored in Shuffle. Create a dedicated key per integration with only the permissions its playbooks need, and rotate keys on a schedule you can audit. Ask each tool's vendor which scopes are available, because read-only and write scopes often differ, and test that each workflow still runs after a key is narrowed.

What to monitor and document after scaling Shuffle runtime

Once Shuffle runs across more than one server, the first thing to watch is whether workflow execution is keeping up. Track queue depth and run failures per node, so that a single Orborus instance or worker host falling behind is visible before users notice delayed playbooks. Compare failure rates across nodes rather than only in aggregate, because a node with a stale image or a full disk often fails in a way the others do not. Record a baseline during the first weeks after go-live, when load is still close to what the concurrency settings were tested against, and keep that baseline with the handover pack so later changes have something to be measured against.

Watch host CPU, memory and disk on every server that runs worker and app containers, not only on the backend hosts. Worker containers are short-lived, so disk pressure often comes from unpruned images and stopped containers rather than from data. Image pull errors deserve their own alert, since a registry outage or a missing tag on one node causes runs to fail only where that node is scheduled. Confirm that each Orborus node shows as registered with the backend, and check that a node that drops out of the list is detected and reported. Ask your platform team which Docker Swarm or Kubernetes events and node conditions they already collect, and extend those rather than building a parallel system.

Back up OpenSearch data and the SHUFFLE_ENCRYPTION_MODIFIER secret as separate items, stored in different places with separate access controls. The secret is required to decrypt saved app credentials and API keys, so a restored OpenSearch snapshot without the matching secret leaves integrations unusable, and a secret kept only beside the database defeats its purpose. Confirm the backup scope with the vendor documentation for your version, and test a restore into a non-production environment. When you upgrade, align the frontend, backend and runtime images to the same Shuffle release. The docs recommend the latest Docker tag for stable releases and the nightly tag only for experimental changes, so record which tag each environment runs. The current release at the time of writing is v2.3.0, published on September 28, 2026. Confirm the edition before scaling too. Paid tiers differ in scaling limits, and since v2.1.1 those limits are enforced, so a cluster sized on the open-source assumption may stop executing runs above the limit. Confirm the limit with Shuffle before adding nodes.

The handover pack should let a new engineer rebuild the runtime without asking the original team. Include the node inventory with hostnames, roles and Orborus registration identifiers, the placement standard that states which workloads may run where, and the registry layout with image names, tags and the cache or mirror location. Add the concurrency settings with the values chosen, the reason for each and the test that justified them, and the results of load and failover tests with the dates and Shuffle version tested. Note any Kubernetes Helm values or Swarm stack files used.

Write a runbook for adding and removing a node. Adding a node means checking the edition limit, pulling the aligned images, registering Orborus, confirming it appears in the node list, running a test workflow pinned to that node, and then updating the inventory. Removing a node means draining it, waiting for running workflows to finish or be rescheduled, deregistering Orborus, confirming no pending runs reference it, and removing its entry from the inventory and monitoring. Assign an owner for each step and review the runbook after every Shuffle upgrade, because placement behavior and image requirements can change between releases.

How much effort is Shuffle scaling with Docker Swarm and Kubernetes?

What drives the effort of scaling Shuffle across servers?

The effort depends mostly on how many servers the runtime will span, how many workflows run at once, and how much of the platform you want to be highly available. Each Orborus node polls the backend for jobs and starts a worker per workflow execution, and the worker starts app containers, so the number of concurrent executions and the apps they call shape the sizing and placement work. Other drivers include the number of app images that need to be pulled onto each node, whether you need a shared cache or shared file storage across several backends, and how many environments (test, staging, production) must match. Ask any partner to break its estimate into these items so you can see which ones your own environment makes larger or smaller.

Can our team scale Shuffle with Docker Swarm or Kubernetes without a partner?

Yes, if your team already runs container orchestration in production and has someone who can own the runtime after go-live. Shuffle's documentation covers distributed Docker Swarm and Kubernetes with Helm charts, so the build is not unusual for a platform team. The work that most often stalls internal teams is not the first install but the concurrency tuning, the image registry and caching design, and the change-window testing that proves a failed node does not stop running workflows. A partner is most useful when those items are new to your team or when you need a documented, repeatable build for several environments.

What does the scaling work need from our infrastructure team?

You need to provide the servers or cluster capacity, a container image registry the runtime can reach, named owners for the platform, and change windows for disruptive steps. On the infrastructure side, confirm node counts and sizes, network paths between backend, OpenSearch, and runtime nodes, and storage for shared files if you run several backends. Your registry must hold the Shuffle images and the app images your workflows call, and your nodes must be able to pull them. Skills needed include Docker Swarm or Kubernetes operations, OpenSearch administration, and basic Linux networking. Plan change windows for upgrades and for any test that restarts nodes, since these steps affect running workflows.

Do we have to run Kubernetes to scale Shuffle?

No. Shuffle documents distributed Docker Swarm as one supported architecture and Kubernetes with Helm charts as another, so the choice is driven by what your organization already operates. Docker Swarm is usually simpler to add when you already run Docker hosts and do not need the wider Kubernetes ecosystem. Kubernetes fits when your platform team already runs clusters, uses Helm-based delivery, or needs its scheduling and policy features. Either way, the same concerns apply: concurrency settings, placement of worker and app containers, and registry access. Confirm the current chart and Swarm guidance for the release you plan to run before deciding.

Does scaling Shuffle change our licensing costs?

Scaling the runtime does not by itself change the license model, but the paid tiers are priced on app runs, so the volume of workflow actions matters. Shuffle states that all features are available in the open-source edition, while paid tiers differ in feature limits, scaling and support. Its pricing article says licensing uses one metric, app runs, meaning actions that actually execute in a workflow. Triggers and skipped actions are not counted, and users, apps and workflows are unlimited. Since version 2.1.1, limits between the open-source and enterprise editions are actively enforced, so confirm with Shuffle which limits apply to your planned node count and tier before you size the cluster.

How long does a Shuffle scaling project take?

Duration follows from the same drivers as effort: the number of runtime locations, the number of environments, the number of app images to validate, and the change windows available. A single-site Swarm build with a small set of apps is a different job from a multi-site Kubernetes build that must match production, pass recovery tests and be documented for handover. Ask for a timeline that lists each phase, including concurrency tuning, registry setup, test runs, and cutover, and that states which items depend on your approvals or change windows. No duration should be accepted until those dependencies are written down in the agreed scope.

What should we test before we rely on a scaled Shuffle runtime?

Test that workflows keep running when a runtime node fails, that worker and app containers start on the intended nodes, and that the registry serves every image under load. Shuffle's configuration guidance recommends more than one Orborus node so workflows keep running if one fails, which gives you a concrete failure test to run. Also confirm that a new app version deploys cleanly to every node, that concurrency limits hold when many workflows trigger at once, and that the encryption secret for saved app credentials is protected and backed up, since changing it breaks saved app authentications. Record each result so the evidence can support later reviews.

Who pays for the scaling work, and what recurs afterward?

The one-time costs are design, build, testing and handover, and the recurring costs are infrastructure, upgrades, app upkeep and any support or license tier you choose. Your internal staff time and any partner fees for the fixed-scope build sit in the one-time column, along with the registry and cluster setup. Recurring items include the servers and storage that run the runtime, the time to align frontend, backend and worker images with each release, and updates to apps after upgrades. Ask any quote to separate these items, to name who performs each one, and to state what is excluded, such as ongoing support or continuous testing, which DeployOpen offers as retainers.

How DeployOpen scopes, builds and hands over Shuffle scaling

DeployOpen scopes Shuffle scaling as part of the platform's runtime design, starting from how Orborus, the workers and app containers should spread across your servers in Docker Swarm or Kubernetes. Engagements are fixed-scope, so the written scope sets which runtime locations, concurrency settings, image registries and caching choices are covered before build starts. Each deliverable is tested, documented and handed to your team.

How we scope

  • Inventory which Shuffle runtime locations are needed, Docker Swarm nodes or Kubernetes cluster, and where each must run.
  • Record the expected app-run volume per workflow, so concurrency settings and worker placement follow a documented assumption.
  • Write the scope in writing, listing servers, registries, caching, backup and acceptance tests before any build begins.

How we build

  • Deploy the backend, frontend and OpenSearch, then Orborus nodes with the agreed Swarm or Helm configuration.
  • Set concurrency, container placement and image registry pull paths, then test workflows that fan out across more than one node.
  • Configure shared cache and file storage where several backends run, then verify failover by stopping a node in test.

How we hand over

  • Deliver runbooks covering Orborus restarts, scaling steps, image tag selection and rollback to the previous release.
  • Document how the SHUFFLE_ENCRYPTION_MODIFIER secret is stored, since changing it breaks saved app authentications.
  • Hand over a test workflow set and the app inventory so your team can confirm each run after changes.

How we support

  • Ongoing support, upgrades and continuous testing are available as a retainer after go-live.
  • Keep frontend, backend and worker images on aligned Shuffle releases, and confirm the tag policy for each environment.
  • Confirm with your team which support tier your Shuffle edition and app-run volume require before go-live.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.