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