Skip to main content
UlexIoTy
Conduitby UlexIoTy
Features
OT Engineers
Query data across historians
IT Directors
Security-first data access
Plant Managers
Real-time operational KPIs
Division Directors
Multi-facility visibility
Routing Intelligence
AI-learned decision routing
All Solutions
View all roles
Use Cases
Blog
Insights and tutorials
ROI Calculator
Calculate your savings
Glossary
Industrial data terminology
ContactRequest Demo
Features
Use Cases
ContactRequest Demo

Footer

UlexIoTy

Conduit — Industrial Context Mesh

The Industrial Context Mesh that adds meaning to your OT data without moving it.

Meaning without movement.

Product

  • Features
  • How It Works
  • Integrations

Resources

  • Use Cases

Company

  • About
  • Contact

Legal

  • Privacy
  • Terms

© 2026 UlexIoTy LLC. All rights reserved.

Press ↑ ↓ to navigate, Enter to select
Getting Started
  • Platform Overview
  • Getting Started
Concepts
  • Context Engine
  • AI-Mediated Collaboration
  • Privacy & Security Model
  • Architecture
  • Mesh Routing Fabric
  • Natural Query Engine (NQE)
Guides
  • Configuration
  • Deployment
  • Multi-Plant Federation
Adapters
  • Splunk Translator
  • OPC-UA Translator
  • MCP IoT Gateway
  • MQTT Translator
API Reference
  • REST API
Reference
  • Query Reference
Need help? Contact us
Docs/Deployment

Deployment

Deploy Conduit in production - Docker Compose with PostgreSQL, Redis, and NATS infrastructure.

Deployment Guide

This guide covers deploying Conduit in various production environments.

Deployment Options

| Option | Best For | | -------------- | ---------------------------------- | | Docker Compose | Small deployments, evaluation | | Kubernetes | Cloud-native, scalable deployments | | Air-Gapped | Secure, isolated environments |

Docker Compose Deployment

Basic Setup

# docker-compose.yaml
version: "3.8"

services:
  control-plane:
    image: conduit/control-plane:latest
    ports:
      - "3001:3001"
    environment:
      - DATABASE_URL=postgresql://conduit:password@postgres:5432/conduit
      - REDIS_URL=redis://redis:6379
      - NATS_URL=nats://nats:4222
      - LLM_PROVIDER=claude
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - JWT_SECRET=${JWT_SECRET}
    depends_on:
      - postgres
      - redis
      - nats
    volumes:
      - ./config:/etc/conduit

  portal:
    image: conduit/portal:latest
    ports:
      - "5173:5173"
    environment:
      - VITE_API_URL=http://control-plane:3001

  postgres:
    image: pgvector/pgvector:pg15
    environment:
      - POSTGRES_USER=conduit
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=conduit
    volumes:
      - postgres-data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data

  nats:
    image: nats:2.10-alpine
    command: >
      --name conduit-nats
      --js
      --sd /data
    ports:
      - "4222:4222"
      - "8222:8222"
    volumes:
      - nats-data:/data
    restart: unless-stopped

volumes:
  postgres-data:
  redis-data:
  nats-data:

Starting the Stack

# Start all services
docker-compose up -d

# View logs
docker-compose logs -f control-plane

# Check status
docker-compose ps

Kubernetes Deployment

Helm Chart

# Add Conduit Helm repository
helm repo add conduit https://charts.ulexioty.com
helm repo update

# Install Conduit
helm install conduit conduit/conduit \
  --namespace conduit \
  --create-namespace \
  --set controlPlane.replicas=3 \
  --set database.host=postgres.database.svc \
  --set nats.url=nats://nats.messaging.svc:4222

Custom Values

# values.yaml
controlPlane:
  replicas: 3
  image:
    repository: conduit/control-plane
    tag: latest

  resources:
    requests:
      cpu: 500m
      memory: 512Mi
    limits:
      cpu: 2000m
      memory: 2Gi

  ingress:
    enabled: true
    className: nginx
    hosts:
      - host: conduit.company.com
        paths:
          - path: /
            pathType: Prefix
    tls:
      - secretName: conduit-tls
        hosts:
          - conduit.company.com

database:
  host: postgres.database.svc
  port: 5432
  name: conduit
  username: conduit
  existingSecret: conduit-db-credentials

nats:
  url: nats://nats.messaging.svc:4222

monitoring:
  serviceMonitor:
    enabled: true

Manual Kubernetes Manifests

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: conduit-control-plane
  namespace: conduit
spec:
  replicas: 3
  selector:
    matchLabels:
      app: conduit-control-plane
  template:
    metadata:
      labels:
        app: conduit-control-plane
    spec:
      containers:
        - name: control-plane
          image: conduit/control-plane:latest
          ports:
            - containerPort: 8080
          env:
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: conduit-secrets
                  key: database-url
          resources:
            requests:
              cpu: 500m
              memory: 512Mi
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 30
          readinessProbe:
            httpGet:
              path: /ready
              port: 8080

Translator Deployment

Docker

docker run -d \
  --name conduit-translator-splunk \
  -e CONDUIT_NATS_URL=nats://nats:4222 \
  -e CONDUIT_API_KEY=${API_KEY} \
  -v /etc/conduit/adapters:/etc/conduit \
  conduit/translator-splunk:latest

Kubernetes DaemonSet

For deploying translators across nodes:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: conduit-translator
  namespace: conduit-edge
spec:
  selector:
    matchLabels:
      app: conduit-translator
  template:
    spec:
      containers:
        - name: translator
          image: conduit/translator-splunk:latest
          env:
            - name: CONDUIT_NATS_URL
              value: nats://control-plane.conduit:4222
          volumeMounts:
            - name: config
              mountPath: /etc/conduit
      volumes:
        - name: config
          configMap:
            name: conduit-edge-config

Native Binary

For resource-constrained edge hardware:

# Download binary
curl -LO https://releases.ulexioty.com/translator/latest/conduit-translator-linux-arm64

# Install
chmod +x conduit-translator-linux-arm64
sudo mv conduit-translator-linux-arm64 /usr/local/bin/conduit-translator

# Create systemd service
sudo cat > /etc/systemd/system/conduit-translator.service << EOF
[Unit]
Description=Conduit Translator
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/conduit-translator --config /etc/conduit/translator.yaml
Restart=always
User=conduit

[Install]
WantedBy=multi-user.target
EOF

# Start service
sudo systemctl enable conduit-translator
sudo systemctl start conduit-translator

Air-Gapped Deployment

For environments without internet access:

1. Export Images

# On internet-connected machine
docker pull conduit/control-plane:latest
docker pull conduit/translator-splunk:latest
docker save conduit/control-plane:latest | gzip > conduit-control-plane.tar.gz
docker save conduit/translator-splunk:latest | gzip > conduit-translator-splunk.tar.gz

2. Transfer to Air-Gapped Environment

# Transfer files via approved media

3. Import Images

# On air-gapped machine
docker load < conduit-control-plane.tar.gz
docker load < conduit-translator-splunk.tar.gz

4. Configure for Offline

# config/conduit.yaml
updates:
  autoCheck: false

telemetry:
  enabled: false

# All dependencies must be internal
database:
  host: internal-postgres.local

nats:
  url: nats://internal-nats.local:4222

Production Checklist

Security

  • [ ] TLS enabled for all connections
  • [ ] Secrets managed via secret manager (Vault, AWS Secrets, etc.)
  • [ ] Network policies restrict traffic
  • [ ] RBAC configured with least privilege
  • [ ] Audit logging enabled

High Availability

  • [ ] Control Plane: 3+ replicas
  • [ ] Database: Replicated (primary + standby)
  • [ ] NATS: 3-node hub cluster
  • [ ] Load balancer configured
  • [ ] Health checks enabled

Monitoring

  • [ ] Metrics exported (Prometheus)
  • [ ] Dashboards created (Grafana)
  • [ ] Alerts configured
  • [ ] Log aggregation (ELK, Loki)
  • [ ] Tracing enabled (Jaeger, Zipkin)

Backup & Recovery

  • [ ] Database backups scheduled
  • [ ] Configuration versioned in Git
  • [ ] Disaster recovery plan documented
  • [ ] Recovery procedures tested

Performance

  • [ ] Resource limits set appropriately
  • [ ] Connection pools sized correctly
  • [ ] Query timeouts configured
  • [ ] Caching enabled

Scaling Considerations

Horizontal Scaling

| Component | Scale Strategy | | ------------- | --------------------------------- | | Control Plane | Add replicas behind load balancer | | Translators | One per data source location | | Database | Read replicas for query scaling | | NATS | Hub cluster + leaf nodes |

Vertical Scaling

| Symptom | Solution | | ------------------- | --------------------------------- | | Slow queries | Increase Control Plane memory | | Connection timeouts | Increase pool sizes | | High latency | Add translators closer to sources |

Troubleshooting

Health Checks

# Control Plane health
curl https://conduit.company.com/health

# Translator status
curl http://localhost:9090/metrics | grep conduit_translator

Common Issues

Control Plane won't start

  • Check database connectivity
  • Verify NATS server is reachable
  • Review logs: docker logs conduit-control-plane

Translator can't connect

  • Verify API key is valid
  • Check network path to Control Plane
  • Confirm NATS ports are open (4222, 8222)

Slow query performance

  • Check database indexes
  • Review query patterns
  • Consider adding caching

Next Steps

  • Configuration Guide - Detailed configuration
  • Architecture - System architecture
  • API Reference - REST API docs
Previous
Configuration
Next
Multi-Plant Federation