This Helm chart deploys Solace Agent Mesh (SAM) in enterprise mode on Kubernetes.
- Prerequisites
- Installation
- Accessing SAM
- Upgrading
- Uninstalling
- Configuration Options
- Troubleshooting
- Kubernetes cluster (1.34+)
- Helm 3.19.0+ (Download Helm from https://helm.sh/docs/intro/install/)
- kubectl configured to communicate with your cluster
- A Solace Event Broker instance
- LLM service credentials (e.g., OpenAI API key)
- OIDC provider configured (for enterprise mode authentication)
- TLS certificate and key files (only for LoadBalancer/NodePort without Ingress; not needed when using Ingress with ACM/cert-manager)
- PostgreSQL database (version 17+, for production deployments with external persistence)
- S3-compatible storage (e.g., Amazon S3, for production deployments with external persistence)
Before installing SAM, review the available configuration templates and customize the values according to your deployment requirements. For detailed configuration options, see the Configuration Options section.
Add the Solace Agent Mesh Helm repository:
helm repo add solace-agent-mesh https://solaceproducts.github.io/solace-agent-mesh-helm-quickstart/
helm repo updateHelm chart releases are accessible at: https://github.com/SolaceProducts/solace-agent-mesh-helm-quickstart/tree/gh-pages
SAM requires access to container images. You have two options:
Option 1: Use Solace Cloud Image Pull Secret (Recommended)
Obtain the image pull secret from Solace Cloud following the instructions at Download Image Pull Secret.
Create the secret in your Kubernetes cluster:
kubectl apply -f <path-to-downloaded-secret-file>.yamlOption 2: Use Your Own Container Registry
Download the SAM images from Solace Products, push them to your own container registry, and create an image pull secret for your registry:
kubectl create secret docker-registry my-registry-secret \
--docker-server=<your-registry-server> \
--docker-username=<your-username> \
--docker-password=<your-password> \
--docker-email=<your-email>When using your own registry, you have two options:
- Set
global.imageRegistryto override the registry for all images (e.g.,gcr.io/my-project) - Or update individual image repository paths in your values file (Step 3)
Choose one of the sample values files based on your deployment needs. Before proceeding, review the Required Configuration section to understand what values you need to provide.
Sample values: samples/values
-
sam-tls-bundled-persistence-no-auth.yaml⚠️ Development Only- Enterprise features enabled (agent builder), no authentication/RBAC
- Bundled persistence (PostgreSQL + SeaweedFS)
- For local development and testing only
-
sam-tls-oidc-bundled-persistence.yaml- POC/Demo- OIDC authentication, bundled persistence
- For quick start, proof-of-concept, or demo environments
- Note: When using bundled persistence in managed cloud providers, configure regional node pools (one per availability zone) and a default StorageClass with
volumeBindingMode: WaitForFirstConsumerto prevent scheduling failures
-
sam-tls-oidc-customer-provided-persistence.yaml⭐ Production- OIDC authentication, external PostgreSQL + S3
- For production deployments with managed database/storage
Note: TLS certificates are only required when using
service.type: LoadBalancerorNodePort. When using Ingress, TLS is managed at the Ingress level (see Network Configuration Guide).
Copy your chosen template and customize it:
cp samples/values/sam-tls-oidc-bundled-persistence.yaml custom-values.yaml
# Edit custom-values.yaml with your configurationKey values to update:
sam.dnsName: Your DNS hostnamesam.sessionSecretKey: Generate a secure random stringsam.oauthProvider.oidc: Your OIDC provider detailssam.authenticationRbac.users: User email addresses and rolesbroker.*: Your Solace broker credentialsllmService.*: Your LLM service credentialsglobal.imageRegistry: Optional - Override registry for all images (e.g.,gcr.io/my-project)samDeployment.imagePullSecret: Required - Name of the image pull secret created in Step 2 (e.g.,solace-image-pull-secretormy-registry-secret)samDeployment.image.repository: Image repository path (if using your own registry from Step 2, Option 2)samDeployment.image.tag: SAM application image version (if using specific version)samDeployment.agentDeployer.image.repository: Agent deployer image repository path (if using your own registry from Step 2, Option 2)samDeployment.agentDeployer.image.tag: Agent deployer image version (if using specific version)
Install using Helm with your custom values and TLS certificates:
helm install agent-mesh solace-agent-mesh/solace-agent-mesh \
-f custom-values.yaml \
--set-file service.tls.cert=/path/to/tls.crt \
--set-file service.tls.key=/path/to/tls.keyTo install a specific version (see available releases):
# List available versions
helm search repo solace-agent-mesh/solace-agent-mesh --versions
# Install specific version
helm install agent-mesh solace-agent-mesh/solace-agent-mesh \
--version 0.4.0 \
-f custom-values.yaml \
--set-file service.tls.cert=/path/to/tls.crt \
--set-file service.tls.key=/path/to/tls.key \
--set service.tls.passphrase="your-passphrase"Note: TLS certificates are only required when using service.type: LoadBalancer or NodePort. When using Ingress, TLS is managed at the Ingress level. See the Network Configuration Guide for details.
Check the deployment status:
# Check Helm release status
helm status agent-mesh
# Check pod status
kubectl get pods -l app.kubernetes.io/instance=agent-meshSAM can be accessed through LoadBalancer, NodePort, Ingress, or port-forward depending on your service configuration.
For detailed network configuration options, access methods, and production deployment recommendations, see the Network Configuration Guide.
Before upgrading, always update your Helm repository to get the latest chart versions:
helm repo update solace-agent-meshTo upgrade your SAM core deployment, you can reuse your existing Helm values and apply updates on top of them.
Get your current deployment values and save them to a file:
helm get values agent-mesh -n <namespace> > current-values.yamlReview and edit current-values.yaml to make your desired changes, then upgrade:
helm upgrade agent-mesh solace-agent-mesh/solace-agent-mesh \
-n <namespace> \
-f current-values.yaml \
--set-file service.tls.cert=/path/to/tls.crt \
--set-file service.tls.key=/path/to/tls.keyReuse all existing values and override specific values:
# Upgrade while reusing existing values and updating specific settings
helm upgrade agent-mesh solace-agent-mesh/solace-agent-mesh \
-n <namespace> \
--reuse-values \
--set samDeployment.image.tag=new-version \
--set-file service.tls.cert=/path/to/tls.crt \
--set-file service.tls.key=/path/to/tls.keyIf you still have your original custom-values.yaml file, update it with any new changes and upgrade:
helm upgrade agent-mesh solace-agent-mesh/solace-agent-mesh \
-n <namespace> \
-f custom-values.yaml \
--set-file service.tls.cert=/path/to/tls.crt \
--set-file service.tls.key=/path/to/tls.keyNote: After upgrading, verify the deployment status:
kubectl rollout status deployment/agent-mesh-core -n <namespace>
kubectl get pods -n <namespace> -l app.kubernetes.io/instance=agent-meshTo upgrade individual agents deployed through SAM, use the agent's release name and update the image tag:
Important: If the agent chart name has changed between versions, you may need to delete and recreate the agent deployment instead of upgrading. See Troubleshooting below.
# Update Helm repository first
helm repo update solace-agent-mesh
# Upgrade the agent with new image version
helm upgrade -i <agent-release-name> solace-agent-mesh/sam-agent \
-n <namespace> \
--reuse-values \
--set image.tag=<new-version>Example:
helm upgrade -i sam-agent-0a42a319-13a8-4b31-b696-9f750d5c6a20 solace-agent-mesh/sam-agent \
-n fwanssa \
--reuse-values \
--set image.tag=1.14.9Verify the agent upgrade:
kubectl get deployment <agent-release-name> -n <namespace>
kubectl logs deployment/<agent-release-name> -n <namespace> --tail=50To uninstall the chart:
helm uninstall agent-meshNote: This will not delete PersistentVolumeClaims when using bundled persistence. To delete them:
kubectl delete pvc -l app.kubernetes.io/instance=agent-meshBefore deploying SAM, you must configure the following required values in your values.yaml or custom values file:
-
SAM Configuration (
samsection):dnsName: DNS-resolvable hostname for SAM web UI/API (e.g.,sam.example.com)sessionSecretKey: Secret key for session management
-
Solace Broker Configuration (
brokersection):url: WebSocket Secure URL to your broker (e.g.,wss://mr2zq0g0f1.messaging.solace.cloud:443)clientUsername: Broker usernamepassword: Broker passwordvpn: VPN name
-
LLM Service Configuration (
llmServicesection):planningModel,generalModel,reportModel,imageModel,transcriptionModel: Model namesllmServiceEndpoint: LLM service API endpoint (e.g.,https://api.openai.com/v1)llmServiceApiKey: API key for LLM service
SAM supports multiple exposure methods. The default is ClusterIP with Ingress for production use:
service:
type: ClusterIP # or LoadBalancer, NodePort
annotations: {}
tls:
enabled: false # Set to true for LoadBalancer/NodePort without Ingress
passphrase: ""
ingress:
enabled: false # Set to true for production deployments
className: "alb" # or "nginx", "traefik", etc.For detailed configuration options and examples, see the Network Configuration Guide.
Adjust resource requests and limits based on your workload:
samDeployment:
resources:
sam:
requests:
cpu: 1000m
memory: 1024Mi
limits:
cpu: 2000m
memory: 2048Mi
agentDeployer:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 200m
memory: 512MiSAM requires persistent storage for session data and artifacts. You can choose between two persistence options:
Security Note: The embedded persistence uses predictable passwords based on the namespaceId pattern (e.g., {namespaceId}_webui). This is acceptable for development environments because:
- The PostgreSQL and SeaweedFS services are NOT exposed outside the cluster (ClusterIP only)
- These services should NEVER be exposed externally via NodePort or LoadBalancer
- The predictable passwords are only accessible within the Kubernetes cluster
To enable built-in persistence:
global:
persistence:
enabled: true # This must be explicitly enabled
namespaceId: "solace-agent-mesh" # Must be unique per SAM installationUse your own managed PostgreSQL database and S3-compatible storage for better scalability, reliability, and separation of concerns.
Note: Built-in persistence is disabled by default (global.persistence.enabled: false), so you only need to configure your external data stores.
Configure external database and S3 storage
Configure your external PostgreSQL and S3 storage using the dataStores section in your values.yaml.
Important:
- The database
adminUsernameandadminPasswordmust have admin privileges (SUPERUSERrecommended; or at minimumCREATEROLEandCREATEDB) because SAM's init container uses them to automatically create users and databases for both the main application and any agents deployed through the SAM UI. - The
applicationPasswordfield is REQUIRED when using external persistence. This single password will be used for all database users created by SAM (webui, orchestrator, platform, and all agents), replacing the default pattern-based passwords.
namespaceId, the applicationPassword cannot be changed. Password rotation is not currently supported. If you need to change the password, you must either:
- Use a new
namespaceId(which creates new databases and users), or - Manually update the passwords directly in the database
# Disable built-in persistence layer
global:
persistence:
enabled: false # Optional (this is false by default)
namespaceId: "solace-agent-mesh" # Must be unique per SAM installation
# Configure external PostgreSQL and S3 for SAM application
dataStores:
database:
protocol: "postgresql+psycopg2"
host: "your-postgres-host"
port: "5432"
adminUsername: "your-db-admin-user" # Must have CREATEDB and CREATEROLE privileges
adminPassword: "your-db-admin-password"
applicationPassword: "your-secure-application-password" # REQUIRED: Password for all application database users
s3:
endpointUrl: "your-s3-endpoint-url"
bucketName: "your-bucket-name"
accessKey: "your-s3-access-key"
secretKey: "your-s3-secret-key"Supabase with Connection Pooler
If you're using Supabase with the connection pooler (required for IPv4 networks or if you haven't purchased the IPv4 addon for the Direct connection option), you'll need to provide your Supabase tenant ID. This is shown in your Supabase connection options as postgresql://postgres.<SUPABASE_TENANT_ID>:[YOUR-PASSWORD]@...:
dataStores:
database:
protocol: "postgresql+psycopg2"
host: "aws-1-us-east-1.pooler.supabase.com" # Connection pooler endpoint
port: "5432"
adminUsername: "postgres"
adminPassword: "your-supabase-postgres-password"
applicationPassword: "your-secure-application-password" # REQUIRED: Password for all application database users
supabaseTenantId: "your-project-id" # Extract from Supabase connection options
s3:
endpointUrl: "https://your-project-id.storage.supabase.co/storage/v1/s3"
bucketName: "your-bucket-name"
accessKey: "your-supabase-s3-access-key"
secretKey: "your-supabase-s3-secret-key"Note: If you're using Supabase's Direct Connection with IPv4 addon, you do not need the supabaseTenantId field.
When SAM is deployed in enterprise mode, it includes a built-in RBAC system to control user access to tools and features. The RBAC configuration is managed through Kubernetes ConfigMaps.
The RBAC system consists of:
- Roles: Named collections of permissions (scopes)
- User Assignments: Mappings of users (by email) to roles
By default, two roles are provided:
sam_admin: Full access to all features (scope:*)sam_user: Basic access to read artifacts and basic tools
For quick changes to running deployments, you can edit the ConfigMaps directly:
1. Edit role definitions:
kubectl edit configmap <release-name>-role-definitions
# Example: kubectl edit configmap agent-mesh-role-definitionsModify the role-to-scope-definitions.yaml data:
data:
role-to-scope-definitions.yaml: |
roles:
sam_admin:
description: "Full access for SAM administrators"
scopes:
- "*"
custom_role:
description: "Your custom role"
scopes:
- "artifact:read"
- "tool:custom:*"2. Edit user role assignments:
kubectl edit configmap <release-name>-user-roles
# Example: kubectl edit configmap agent-mesh-user-rolesNote: Email addresses in user-to-role-assignments must all be lowercase.
Modify the user-to-role-assignments.yaml data:
data:
user-to-role-assignments.yaml: |
users:
[email protected]:
roles: ["sam_admin"]
description: "SAM Administrator"
[email protected]:
roles: ["sam_user"]
description: "New User"3. Restart the deployment to apply changes:
kubectl rollout restart deployment/<release-name>
# Example: kubectl rollout restart deployment/solace-agent-meshTo make permanent changes that survive Helm upgrades:
1. Edit the chart template charts/solace-agent-mesh/templates/configmap_sam_config_files.yaml:
Find the sam-role-definitions ConfigMap section (around line 340) and modify roles:
data:
role-to-scope-definitions.yaml: |
roles:
sam_admin:
description: "Full access for SAM administrators"
scopes:
- "*"
custom_role:
description: "Your custom role"
scopes:
- "artifact:read"
- "tool:specific:action"Find the sam-user-roles ConfigMap section (around line 369) and modify user assignments:
data:
user-to-role-assignments.yaml: |
users:
[email protected]:
roles: ["sam_admin"]
description: "SAM Administrator"
[email protected]:
roles: ["custom_role"]
description: "Custom role user"2. Upgrade the Helm deployment:
helm upgrade agent-mesh solace-agent-mesh/solace-agent-mesh \
-f custom-values.yaml \
--set-file service.tls.cert=/path/to/tls.crt \
--set-file service.tls.key=/path/to/tls.key3. Verify the changes:
kubectl get configmap <release-name>-role-definitions -o yaml
kubectl get configmap <release-name>-user-roles -o yaml
# Example: kubectl get configmap agent-mesh-role-definitions -o yaml*- All permissions (admin access)tool:data:*- All data-related toolstool:specific:action- Specific tool and actiontool:artifact:list- List artifactstool:artifact:load- Download artifactssam:agent_builder:create- Create agent builderssam:agent_builder:read- Read agent builderssam:agent_builder:update- Update agent builderssam:agent_builder:delete- Delete agent builderssam:connectors:create- Create connectorssam:connectors:read- Read connectorssam:connectors:update- Update connectorssam:connectors:delete- Delete connectorssam:deployments:create- Create deploymentssam:deployments:read- Read deploymentssam:deployments:update- Update deploymentssam:deployments:delete- Delete deployments
After updating RBAC configuration:
- Check pod logs to verify configuration loaded:
kubectl logs -l app.kubernetes.io/instance=agent-mesh --tail=50-
Test user access by logging in as different users through the SAM web UI
-
Review ConfigMaps to confirm changes:
kubectl describe configmap <release-name>-role-definitions
kubectl describe configmap <release-name>-user-roles
# Example: kubectl describe configmap agent-mesh-role-definitionsFor more details on RBAC configuration, see the SAM RBAC Setup Guide.
For troubleshooting common issues with SAM deployments, see the Troubleshooting Guide.
For issues, questions, or contributions, please open an issue in GitHub Issues.