Skip to main content
Version: Next

Deployment options

Introduction

StreamPipes supports several deployment models, from a simple single-host installation to distributed industrial setups with extension services running close to machines. This page explains how to deploy StreamPipes with Docker Compose or Kubernetes, how broker and transport choices affect the setup, and which configuration options are available in the current Helm chart.

At a high level, every deployment contains the same main parts:

  • Core and UI provide the central platform services and browser interface.
  • CouchDB stores metadata, configuration, users, pipelines, adapters, dashboards, assets, and other platform objects.
  • InfluxDB stores persisted event data and datasets.
  • One or more extension services provide adapters, processors, and sinks.
  • A broker such as NATS, Kafka, or Pulsar transports events between runtime components.

Deployment models

Choose the deployment model based on where StreamPipes runs and how much operational control you need:

  • Docker Compose is the fastest way to install StreamPipes on one host. It is a good fit for evaluation, demos, local environments, and smaller installations.
  • Kubernetes is the right option when you need cluster-level operations, service management, persistent storage classes, ingress control, and more explicit infrastructure configuration.
  • Distributed deployments are useful when extension services should run outside the central data center, for example in the OT network or on edge systems close to industrial machines.

Docker Compose deployment

The repository contains several ready-to-run Compose presets in the StreamPipes source tree:

Default Compose setup

The default preset is docker-compose.yml. It installs:

  • backend
  • ui
  • couchdb
  • influxdb
  • nats
  • extensions-all-iiot

This is the recommended starting point for new installations. It uses NATS as the internal event broker and the standard IIoT-focused extension package.

Start it with:

docker-compose up -d

Stop it with:

docker-compose down

Remove the persisted volumes as well:

docker-compose down -v

Kafka-based Compose setup

If your environment already standardizes on Kafka, use docker-compose.kafka.yml. This variant replaces NATS with Kafka and configures StreamPipes accordingly.

Start it with:

docker-compose -f docker-compose.kafka.yml up -d

Minimal Compose setup

docker-compose.minimal.yml is the leanest preset. It uses the minimal IIoT extension service and is useful when you want a smaller footprint and do not need the full catalog of adapters and pipeline elements.

Start it with:

docker-compose -f docker-compose.minimal.yml up -d

Token-based NATS authentication

If you want to protect internal NATS communication with a token, set SP_NATS_TOKEN and add the auth override file:

docker-compose -f docker-compose.yml -f docker-compose.nats-auth.yml up -d

For the minimal setup:

docker-compose -f docker-compose.minimal.yml -f docker-compose.minimal.nats-auth.yml up -d

When to use Compose

Use Compose when you want:

  • a fast installation on one machine
  • a documented reference setup
  • a simple way to compare the default, kafka, and minimal variants
  • a development or test environment that closely matches the official installer

Distributed deployments

A central advantage of StreamPipes is that extension services do not have to run in the same place as the UI and core. In industrial environments, this matters because data sources often live in restricted OT networks or on edge systems close to production equipment.

Distributed deployment

Distributed deployment with an extension service placed in the OT network for data connectivity.
Distributed deployment with an extension service placed in the OT network for data connectivity.

A common topology looks like this:

  • Central IT environment: UI, Core, CouchDB, InfluxDB, the main broker and an extension service with data processors and sinks.
  • OT or edge environment: one or more extension services that connect to local machines, PLCs, brokers, or APIs

This split is useful when:

  • machine data should stay inside a plant network as long as possible
  • adapter traffic should terminate close to the source
  • firewall rules allow controlled service-to-service communication but not full central access to machines
  • lower latency is needed for ingestion or preprocessing

In practice, an extension service in the OT network can:

  • collect data from local sources
  • normalize or preprocess the events
  • expose adapters and pipeline elements to the central StreamPipes installation
  • forward stream events through the configured message broker

To reflect the security requirements typically found in OT networks, by enabling the NATS-based transport mode (see below), no incoming traffic needs to be allowed for the OT extension service, while adapters can still be managed from the central StreamPipes instance.

This means StreamPipes can be operated as a central industrial data platform while still placing data collection and processing components near the edge.

Message brokers

StreamPipes supports different brokers for transporting events between adapters, processors, and sinks. In deployment terms, the broker is a core runtime decision because it affects both the infrastructure you install and the broker-specific configuration values you provide.

Supported Message Brokers

NATS

NATS is the recommended default for new installations.

Use NATS when you want:

  • the simplest current reference setup
  • a lightweight internal broker
  • an easy path into distributed deployments with StreamPipes extension services

Kafka

Kafka remains available and is a good choice when:

  • your organization already operates Kafka
  • event streams should integrate with an existing Kafka-based data platform
  • operational standards already assume Kafka tooling and operations

The Compose installer includes a dedicated Kafka preset, and the Helm chart keeps Kafka configuration values.

Pulsar

Pulsar is also part of the Kubernetes configuration model. It is relevant when your infrastructure already uses Pulsar or when you want StreamPipes to align with a Pulsar-based streaming environment.

MQTT

MQTT can also be configured but, similar to Pulsar, must be used from a custom docker compose setup which includes an MQTT broker. See the Environment Variables page for MQTT-specific configuration options.

Unlike NATS and Kafka, there is no dedicated Compose preset for Pulsar in the standard installer. In practice, Pulsar is therefore mainly a Kubernetes or custom-deployment topic.

Choosing a broker setup

You should decide at installation time which protocol StreamPipes should use for internal communication. The protocol can be set by providing an environment variable to the core (backend) service.

# Use nats
SP_PRIORITIZED_PROTOCOL=nats

# Use kafka
SP_PRIORITIZED_PROTOCOL=kafka

# Use pulsar
SP_PRIORITIZED_PROTOCOL=pulsar

# Use mqtt
SP_PRIORITIZED_PROTOCOL=mqtt

HTTP and NATS transport modes

It is important to distinguish two different communication paths:

  1. Event transport
  2. Core-to-extension service transport

These are related, but they are not the same.

Event transport

Event transport is controlled primarily through SP_PRIORITIZED_PROTOCOL in the backend. This decides which messaging system StreamPipes should prioritize for exchanging events between runtime components.

Examples:

  • nats in the default Compose setup
  • kafka in the Kafka Compose setup

Core-to-extension service transport

Core-to-extension communication is controlled separately. The relevant settings are:

  • SP_CORE_EXTENSION_TRANSPORT_MODE on the core side
  • SP_EXTENSION_TRANSPORT_MODE on the extension side

The currently supported modes are:

  • Core: http, nats, or auto
  • Extension service: http, nats, or dual

Use them as follows:

  • HTTP is the simplest direct model. Core sends requests directly to the extension service over HTTP.
  • NATS uses request/reply over NATS for core-to-extension communication.
  • AUTO on the core side prefers NATS when the service supports it and falls back to HTTP when necessary.
  • DUAL on the extension side allows a service to support both HTTP and NATS-based requests.

This distinction matters in distributed installations. For example:

  • You may use NATS as the event broker between runtime components.
  • At the same time, core may still reach an extension service over HTTP.
  • Or you may move both event transport and core-to-extension requests to NATS when that better fits a segmented or broker-centric network design.

The UI also needs to know where live adapter requests should be forwarded. In the Compose presets, this is configured through SP_HTTP_SERVER_ADAPTER_ENDPOINT, which points the UI proxy to the installed extension service.

Choosing a deployment pattern

Use the following rules of thumb:

  • Start with Docker Compose if you want the quickest supported installation.
  • Choose the default NATS setup unless there is a clear reason to align with Kafka.
  • Use the minimal Compose preset for smaller installations or leaner edge-style setups.
  • Move to Kubernetes when you need cluster operations, ingress control, and persistent infrastructure management.
  • Place extension services in the OT network or at the edge when data sources should stay close to the machine network.
  • Use HTTP transport first if you want the most direct service wiring.
  • Use NATS or AUTO transport modes when broker-based service communication fits the deployment better.

Kubernetes deployment

The Kubernetes deployment is provided as a Helm chart in the StreamPipes source repository. The central configuration file is:

Install the chart from the installer/k8s directory:

helm install streampipes ./

Remove it again with:

helm uninstall streampipes

Kubernetes is the better choice when you need:

  • managed persistent volumes
  • ingress or Traefik-based routing
  • explicit service exposure rules
  • cluster operations and lifecycle management
  • flexible deployment of central services and extension services

Ingress and storage

The Helm chart supports both:

  • standard Kubernetes Ingress
  • Traefik IngressRoute

It also supports storage customization through the storageClassName values for the persistent components.

Kubernetes configuration reference

The following tables summarize the Helm values that are currently exposed in the Kubernetes installer.

Common parameters

Parameter NameDescriptionValue
deploymentDeployment type (lite or full)lite
preferredBrokerPreferred broker for deployment"nats"
monitoringSystemEnable monitoring system (true or false)false
pullPolicyImage pull policy"Always"
restartPolicyRestart policy for the containerAlways
persistentVolumeReclaimPolicyReclaim policy for persistent volumes"Delete"
persistentVolumeAccessModesAccess mode for persistent volumes"ReadWriteOnce"
initialDelaySecondsInitial delay for liveness and readiness probes60
periodSecondsInterval between liveness and readiness probes30
failureThresholdNumber of consecutive failures for readiness probes30
hostPathHost path for the application""

StreamPipes common parameters

Parameter NameDescriptionValue
streampipes.versionStreamPipes version"0.99.0-SNAPSHOT"
streampipes.registryStreamPipes registry URL"apachestreampipes"
streampipes.auth.secretNameSecret name for storing secrets"sp-secrets"
streampipes.auth.users.admin.userInitial admin user"admin@streampipes.apache.org"
streampipes.auth.users.admin.passwordInitial admin password"admin"
streampipes.auth.users.service.userInitial service account user"sp-service-client"
streampipes.auth.users.service.secretInitial service account secretempty (auto-generated)
streampipes.auth.encryption.passcodePasscode for value encryptionempty (auto-generated)
streampipes.core.appNameStreamPipes backend application name"backend"
streampipes.core.portStreamPipes backend port8030
streampipes.core.persistence.storageClassNameStorage class name for backend PVs"hostpath"
streampipes.core.persistence.storageSizeSize of the backend PV"1Gi"
streampipes.core.persistence.claimNameName of the backend PersistentVolumeClaim"backend-pvc"
streampipes.core.persistence.pvNameName of the backend PersistentVolume"backend-pv"
streampipes.core.service.nameName of the backend service"backend"
streampipes.core.service.portTarget port of the StreamPipes backend service8030
streampipes.ui.appNameStreamPipes UI application name"ui"
streampipes.ui.resolverActiveEnable DNS resolver for the Nginx proxytrue
streampipes.ui.portStreamPipes UI port8088
streampipes.ui.resolverDNS resolver for the Nginx proxy"kube-dns.kube-system.svc.cluster.local"
streampipes.ui.service.nameName of the UI service"ui"
streampipes.ui.service.typeType of the UI service"ClusterIP"
streampipes.ui.service.nodePortNode port for the UI service8088
streampipes.ui.service.portTarget port of the StreamPipes UI service8088
streampipes.ingress.activeEnable Ingress for StreamPipesfalse
streampipes.ingress.annotationsAnnotations for Ingress{}
streampipes.ingress.hostHostname for Ingress""
streampipes.ingressroute.activeEnable IngressRoute for StreamPipestrue
streampipes.ingressroute.annotationsAnnotations for IngressRoute{}
streampipes.ingressroute.entryPointsEntry points for IngressRoute["web", "websecure"]
streampipes.ingressroute.hostHostname for IngressRoute""
streampipes.ingressroute.certResolverActiveEnable certificate resolver for IngressRoutetrue
streampipes.ingressroute.certResolverCertificate resolver for IngressRoute""

Extensions common parameters

Parameter NameDescriptionValue
extensions.iiot.appNameIIoT extensions application nameextensions-all-iiot
extensions.iiot.imageNameContainer image name for the extensionsextensions-all-jvm
extensions.iiot.portPort for the IIoT extensions application8090
extensions.iiot.service.nameName of the IIoT extensions serviceextensions-all-iiot
extensions.iiot.service.portTarget port of the IIoT extensions service8090

External common parameters

CouchDB common parameters

Parameter NameDescriptionValue
external.couchdb.appNameCouchDB application name"couchdb"
external.couchdb.versionCouchDB version3.3.1
external.couchdb.userCouchDB admin username"admin"
external.couchdb.passwordCouchDB admin passwordempty (auto-generated)
external.couchdb.portPort for the CouchDB service5984
external.couchdb.service.nameName of the CouchDB service"couchdb"
external.couchdb.service.portTarget port of the CouchDB service5984
external.couchdb.persistence.storageClassNameStorage class name for CouchDB PVs"hostpath"
external.couchdb.persistence.storageSizeSize of the CouchDB PV"1Gi"
external.couchdb.persistence.claimNameName of the CouchDB PersistentVolumeClaim"couchdb-pvc"
external.couchdb.persistence.pvNameName of the CouchDB PersistentVolume"couchdb-pv"

InfluxDB common parameters

Parameter NameDescriptionValue
external.influxdb.appNameInfluxDB application name"influxdb"
external.influxdb.versionInfluxDB version2.6
external.influxdb.usernameInfluxDB admin username"admin"
external.influxdb.passwordInfluxDB admin password"sp-admin"
external.influxdb.adminTokenInfluxDB admin tokenempty (auto-generated)
external.influxdb.initOrgInfluxDB initial organization"sp"
external.influxdb.initBucketInfluxDB initial bucket"sp"
external.influxdb.initModeInfluxDB initialization mode"setup"
external.influxdb.apiPortPort number for the InfluxDB API service8083
external.influxdb.httpPortPort number for the InfluxDB HTTP service8086
external.influxdb.grpcPortPort number for the InfluxDB gRPC service8090
external.influxdb.service.nameName of the InfluxDB service"influxdb"
external.influxdb.service.apiPortTarget port of the InfluxDB API service8083
external.influxdb.service.httpPortTarget port of the InfluxDB HTTP service8086
external.influxdb.service.grpcPortTarget port of the InfluxDB gRPC service8090
external.influxdb.persistence.storageClassNameStorage class name for InfluxDB PVs"hostpath"
external.influxdb.persistence.storageSizeSize of the InfluxDB PV"1Gi"
external.influxdb.persistence.storageSizeV1Size of the InfluxDB PV for v1 databases"1Gi"
external.influxdb.persistence.claimNameName of the InfluxDB v2 PersistentVolumeClaim"influxdb2-pvc"
external.influxdb.persistence.claimNameV1Name of the InfluxDB v1 PersistentVolumeClaim"influxdb-pvc"
external.influxdb.persistence.pvNameName of the InfluxDB v2 PersistentVolume"influxdb2-pv"
external.influxdb.persistence.pvNameV1Name of the InfluxDB v1 PersistentVolume"influxdb-pv"

NATS common parameters

Parameter NameDescriptionValue
external.nats.appNameNATS application name"nats"
external.nats.portPort for the NATS service4222
external.nats.versionNATS versionempty
external.nats.service.typeType of the NATS service"NodePort"
external.nats.service.externalTrafficPolicyExternal traffic policy for NATS"Local"
external.nats.service.nameName of the NATS service"nats"
external.nats.service.portTarget port of the NATS service4222

Kafka common parameters

Parameter NameDescriptionValue
external.kafka.appNameKafka application name"kafka"
external.kafka.versionKafka version2.2.0
external.kafka.portPort for the Kafka service9092
external.kafka.external.hostnameHostname advertised to external clients"localhost"
external.kafka.service.nameName of the Kafka service"kafka"
external.kafka.service.portTarget port of the Kafka service9092
external.kafka.service.portOutsidePort for Kafka clients outside of the cluster9094
external.kafka.persistence.storageClassNameStorage class name for Kafka PVs"hostpath"
external.kafka.persistence.storageSizeSize of the Kafka PV"1Gi"
external.kafka.persistence.claimNameName of the Kafka PersistentVolumeClaim"kafka-pvc"
external.kafka.persistence.pvNameName of the Kafka PersistentVolume"kafka-pv"

Pulsar common parameters

Parameter NameDescriptionValue
external.pulsar.appNamePulsar application name"pulsar"
external.pulsar.versionPulsar version3.0.0
external.pulsar.portPort for the Pulsar service6650
external.pulsar.service.nameName of the Pulsar service"pulsar"
external.pulsar.service.portTarget port of the Pulsar service6650
external.pulsar.persistence.storageClassNameStorage class name for Pulsar PVs"hostpath"
external.pulsar.persistence.storageSizeSize of the Pulsar PV"1Gi"
external.pulsar.persistence.claimNameName of the Pulsar PersistentVolumeClaim"pulsar-pvc"
external.pulsar.persistence.pvNameName of the Pulsar PersistentVolume"pulsar-pv"

Monitoring common parameters

Prometheus

Parameter NameDescriptionValue
monitoring.prometheus.appNamePrometheus application name"prometheus"
monitoring.prometheus.versionPrometheus version2.45.0
monitoring.prometheus.portPrometheus port9090
monitoring.prometheus.service.namePrometheus service name"prometheus"
monitoring.prometheus.service.portPrometheus service port9090
monitoring.prometheus.persistence.storageClassNamePrometheus storage class name"hostpath"
monitoring.prometheus.persistence.storageSizePrometheus storage size"2Gi"
monitoring.prometheus.persistence.claimNamePrometheus PVC claim name"prometheus-pvc"
monitoring.prometheus.persistence.pvNamePrometheus PV name"prometheus-pv"
monitoring.prometheus.persistence.tokenStorageSizePrometheus token storage size"16Ki"
monitoring.prometheus.config.scrapeIntervalPrometheus scrape interval10s
monitoring.prometheus.config.evaluationIntervalPrometheus evaluation interval15s
monitoring.prometheus.config.backendJobNamePrometheus backend job namebackend
monitoring.prometheus.config.extensionsNamePrometheus extensions job nameextensions-all-iiot
monitoring.prometheus.config.tokenFileNamePrometheus token file nametoken
monitoring.prometheus.config.tokenFileDirPrometheus token file directory/opt/data

Grafana

Parameter NameDescriptionValue
monitoring.grafana.appNameGrafana application name"grafana"
monitoring.grafana.versionGrafana version10.1.2
monitoring.grafana.portGrafana port3000
monitoring.grafana.service.nameGrafana service name"grafana"
monitoring.grafana.service.portGrafana service port3000
monitoring.grafana.persistence.storageClassNameGrafana storage class name"hostpath"
monitoring.grafana.persistence.storageSizeGrafana storage size"1Gi"
monitoring.grafana.persistence.claimNameGrafana PVC claim name"grafana-pvc"
monitoring.grafana.persistence.pvNameGrafana PV name"grafana-pv"

Auto-generated secrets in Kubernetes

The Helm chart generates several secret values automatically when they are left empty. This includes:

  • the initial admin password
  • the initial service account secret
  • the encryption passcode
  • the CouchDB password
  • the InfluxDB password
  • the InfluxDB admin token

This behavior is implemented in the chart's secrets.yaml template and is useful for first installations. In managed environments, many teams still choose to provide those values explicitly through their deployment process.

For the detailed environment-variable reference, continue with Environment Variables. For the operational view of registered services and runtime service configuration, see Extension Services.