Skip to main content
A standalone engine has no control-plane identity or management stream. Kubernetes owns process lifecycle, while a ConfigMap owns non-secret engine configuration and a Secret supplies connector credentials.
Standalone engines cannot be administered with ventstreamctl. To gain CLI lifecycle and managed-configuration operations, deploy a new Fleet-managed engine.

Standalone CDC

The following Postgres example is a current baseline StatefulSet. Adapt the source section using the relevant connector guide for Neo4j, MongoDB, MySQL, or Kafka. Create the workload namespace once:

Create connector secrets

Use External Secrets, Secrets Store CSI, SOPS, or another approved secret workflow in production. The resulting Secret must expose the environment variables referenced by ventstream.yaml:
Do not commit the populated Secret.

Create canonical configuration

The example uses Postgres SQL denormalization mode. Add related tables and the required source indexes before production use. Use memory when you intentionally want the persisted in-process join engine instead.

Run the engine

The published engine image runs as numeric UID/GID 10001; the pod-level fsGroup makes a newly provisioned PVC writable without a root init container. If you replace the runtime stage or user in a custom image, change all three IDs to that image’s fixed non-root UID/GID. Apply the namespace, Secret, ConfigMap, Service, and StatefulSet through your normal deployment repository, then verify:
After a ConfigMap change, trigger a controlled restart. The process resumes from the source cursor and PVC state:

Standalone realtime gateways

The engine repository’s ventstream-gateway chart runs the horizontally scalable ws, graphql, or combined roles without Fleet:
This chart currently configures NATS; enable JetStream for GraphQL subscriptions and resumable native WebSocket delivery. The engine also supports Redis Streams through canonical configuration when you deploy it without this chart. Use a Service or ingress appropriate for long-lived WebSocket connections, and validate client authorization before exposing either listener outside a trusted network.