Sterling B2B Integration

Sterling B2B Integration

Come for answers, stay for best practices. All we're missing is you.

 View Only

IBM Sterling B2B Integrator - Complete Installation Guide on IBM Cloud ROKS

By Kulasekaran Krishnaraj posted 04/07/26 10:36 AM

  

Introduction

IBM Sterling B2B Integrator (B2BI) is a powerful platform for managing complex B2B integrations, EDI processing, and secure data exchange. Deploying B2BI on Red Hat OpenShift on IBM Cloud (ROKS) enables scalability, high availability, and better resource management.

In this guide, we’ll walk through a complete, end-to-end installation of B2BI on ROKS, including cluster setup, Db2 configuration, networking, and deployment using Helm.

This tutorial is based on a real-world setup and focuses on practical steps, common pitfalls, and best practices.

 

The deployment consists of the following core components:

  • ASI Pod – Main application server hosting the B2BI dashboard
  • AC Pod – Handles protocol adapters (FTP, SFTP, HTTP, etc.)
  • API Pod – Provides REST APIs and Swagger interface
  • Db2 – External database storing configurations and transactions
  • VPE Gateway – Enables private connectivity between ROKS and Db2
  • PVCs – Persistent storage for logs, documents, and resources

 

Prerequisites

Before starting, ensure the following:

  • IBM Cloud account (Pay-As-You-Go or Subscription)
  • Administrator access (IAM role)
  • Resource group created (e.g., rg-b2bi)
  • Required CLI tools installed:
    • IBM Cloud CLI
    • OpenShift CLI (oc)
    • Helm 3



Install CLI Tools on Your Laptop

macOS (Homebrew):

brew install ibmcloud-cli
brew install openshift-cli
brew install helm

Linux (curl):

# IBM Cloud CLI
curl -fsSL https://clis.cloud.ibm.com/install/linux | sh

# OpenShift CLI and container-service plugin
ibmcloud plugin install oc
ibmcloud plugin install container-service

# Helm 3
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Verify all tools are installed:

ibmcloud --version   # ibmcloud version 2.x.x
oc version           # Client Version: 4.14.x
helm version         # version.BuildInfo{Version:"v3.x.x"}

Step 1: Create ROKS Cluster on IBM Cloud

To begin the installation, first create a Red Hat OpenShift cluster on IBM Cloud.

Navigate to:
IBM Cloud → Containers → Clusters → Create

1.1: Select Orchestrator and Infrastructure

  • Choose Red Hat OpenShift (Highlighted as 1)
  • Select VPC infrastructure (Highlighted as 2)

image


1.2: Create a Virtual Private Cloud (VPC)

If no VPC exists:

  • Choose region (e.g., Dallas – us-south)
  • Provide a VPC name
  • Select the resource group
  • Enable Attach public gateway

Click Create.

image 

 

image

1.3: Configure Subnets and Zones

Configure worker zones:

  • Enable multiple zones (e.g., us-south-1, 2, 3)
  • Ensure subnets are created for each zone

This improves availability and resilience.

image

1.4: Configure Worker Pool Name

  • Provide a worker pool name (e.g., wp-psts)

This defines how worker nodes are grouped

image

1.5: Select Worker Node Flavor

Choose appropriate node configuration:

  • Example: bx2.8x32
    • 8 vCPU
    • 32 GB RAM

Click Save worker pool flavor.

image

image


1.6: Configure Networking

Select:

  • Both private and public endpoints

This allows access from both internal and external networks.

image
1.7: Create Cluster

Click Create cluster and wait for provisioning.

Cluster creation may take several minutes.

image
1.8: Verify Cluster Health

After creation:

  • Ensure worker nodes are Healthy
  • Check cluster status is Normal

    image

1.9: Install File Storage Add-on

Navigate to Add-ons and install:

  • File Storage for VPC

This is required for persistent volumes.

image

Step 2: Create DB2 on Cloud

Go to:

  • Databases → Overview → Db2

image
2.1: Select Pricing Plan

Choose:

  • Performance (Gen 3)

This supports production workloads.

image

2.3: Configure Db2 Instance

Provide:

  • Service name (e.g., db2-psts)
  • Resource group
  • Service endpoints (public + private if needed)
  • Accept license agreement
  • Click Create
image

Step 3: Configure VPE Gateway

To connect securely using the Db2 private endpoint, create a Virtual Private Endpoint (VPE) Gateway.

Why this matters:

  • Enables private communication inside IBM network
  • Avoids public internet exposure
  • Required for stable connectivity

image

3.1: Connect Db2 via Private Endpoint

  • Choose Db2 service
  • Select region
  • Pick the correct private endpoint
image

3.2: Configure Reserved IP

  • Select “Select for me”
  • Define IP name prefix

Click Create virtual private endpoint gateway

image

Step 4: Get IBM Entitlement Key

IBM container images (including Sterling B2B Integrator) are hosted in the IBM container registry (cp.icr.io). To pull these images, you need an entitlement key.

Steps:

  1. Navigate to:
    IBM Container Library → Entitlement Keys
  2. Copy your entitlement key
  3. (Optional) Verify locally:
docker login cp.icr.io \
  --username cp \
  --password <YOUR_ENTITLEMENT_KEY>

This key will be used later when creating Kubernetes secrets.

Step 5: Connect CLI to Your ROKS Cluster

Before deploying, connect your local CLI to the cluster.

# Login to IBM Cloud
ibmcloud login --sso # Set resource group ibmcloud target -g rg-b2bi # Configure cluster access ibmcloud oc cluster config --cluster <cluster-name>
# Open OpenShift Cluster Console (UI step) # - Go to your OpenShift cluster in IBM Cloud # - Click "OpenShift Web Console" # - In the top-right corner, click your profile name # - Select "Copy Login Command" # - It will open a new page # - Click "Display Token" # - Copy the oc login command # Login to cluster using copied command # (Paste the copied oc login command in terminal) oc login --token=<your-token> --server=<your-server-url>
# Verify connection oc get nodes

You should see all worker nodes in Ready state.

Step 6: Create Namespace and Persistent Storage

Sterling B2B Integrator requires persistent storage for logs, resources, and documents.

Create Namespace

oc new-project b2b-psts

Create PVCs

Create a file b2bi-pvcs.yaml:

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: b2b-psts-resources
  namespace: b2b-psts
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 20Gi
  storageClassName: ibmc-vpc-file-1000-iops
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: b2b-psts-logs
  namespace: b2b-psts
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  storageClassName: ibmc-vpc-file-1000-iops
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: b2b-psts-documents
  namespace: b2b-psts
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
storageClassName: ibmc-vpc-file-1000-iops

Apply:

oc apply -f b2bi-pvcs.yaml
oc get pvc -n b2b-psts

Step 7: Create Kubernetes Secrets

7.1 IBM Registry Secret

oc create secret docker-registry ibm-entitlement-key \
--docker-server=cp.icr.io \
--docker-username=cp \
--docker-password=<YOUR_ENTITLEMENT_KEY>

7.2 Db2 Credentials

oc create secret generic b2b-psts-db-secret \
--from-literal=DB_USER=<username> \
--from-literal=DB_PASSWORD=<password>

7.3 System Passphrase

oc create secret generic b2b-psts-system-passphrase \
--from-literal=SYSTEM_PASSPHRASE=<secure-password>

Step 8: Create Service Account and Permissions

# 1. Create dedicated service account
oc create serviceaccount b2b-psts-sa -n b2b-psts # 2. Create a role with required permissions
oc create role b2b-psts-role \
  --verb=get,list,watch,create,update,patch,delete \
  --resource=pods,configmaps,secrets,services,routes,persistentvolumeclaims,endpoints \
-n b2b-psts
# 3. Bind the role to the service account
oc create rolebinding b2b-psts-binding \
  --role=b2b-psts-role \
  --serviceaccount=b2b-psts:b2b-psts-sa \
-n b2b-psts# 4. Link the registry pull secret to the service account
oc secrets link b2b-psts-sa ibm-entitlement-key \
--for=pull -n b2b-psts
# 5. Grant anyuid SCC — allows B2BI to run as its required UID (1010)
#    Without this, OpenShift rejects the pod with "permission denied"
oc adm policy add-scc-to-user anyuid \
-z b2b-psts-sa -n b2b-psts

This allows B2BI pods to run with the required user permissions.

Step 9: Upload Required Files to PVC

You must upload:

  • db2jcc4.jar
  • db2TrustStore.jks

Create temporary pod:

# Run on your local machine where you downloaded the Db2 SSL cert
keytool -import -alias db2cert \
  -file db2-cert.pem \
  -keystore db2TrustStore.jks \
  -storepass changeit \
-noprompt # Verify it was created
ls -lh db2TrustStore.jks -------------------------------------------------------

cat <<EOF | oc apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: pvc-uploader
  namespace: b2b-psts
spec:
  containers:
  - name: uploader
    image: image-registry.openshift-image-registry.svc:5000/openshift/tools:latest
    command: ["sleep", "3600"]
    volumeMounts:
    - name: resources
      mountPath: /ibm/resources
    securityContext:
      runAsNonRoot: false
  volumes:
  - name: resources
    persistentVolumeClaim:
      claimName: b2b-psts-resources
  serviceAccountName: b2b-psts-sa
EOF# Wait for pod to be Running
oc get pod pvc-uploader -n b2b-psts -w

Upload the Files:

# Create the resources directory
oc exec -n b2b-psts pvc-uploader -- mkdir -p /ibm/resources
# Upload JDBC driver
oc cp ./db2jcc4.jar b2b-psts/pvc-uploader:/ibm/resources/db2jcc4.jar # Upload SSL truststore
oc cp ./db2TrustStore.jks b2b-psts/pvc-uploader:/ibm/resources/db2TrustStore.jks # Verify both files are present
oc exec -n b2b-psts pvc-uploader -- ls -lh /ibm/resources/
# Expected:
# -rw-r--r-- 1 root root 3.8M db2jcc4.jar
# -rw-r--r-- 1 root root 1.2K db2TrustStore.jks # Clean up the temporary pod
oc delete pod pvc-uploader -n b2b-psts

Step 10: Add IBM Helm Repository

# Add IBM Helm repository
helm repo add ibm-helm \
  https://raw.githubusercontent.com/IBM/charts/master/repo/ibm-helm
helm repo update
# Search available versions
helm search repo ibm-helm/ibm-b2bi-prod --versions
# Latest as of 2026: 3.2.1 (App: 6.2.2.0_1)
# Used in this guide: 3.1.3 (App: 6.2.1.1_2)
# Pull and unpack the chart
helm pull ibm-helm/ibm-b2bi-prod --version 3.1.3 --untar
cd ibm-b2bi-prod
ls

Step 11: Create values-override.yaml

Create a custom configuration file:

# =============================================================
# IBM Sterling B2B Integrator — values-override.yaml
# Chart:   ibm-b2bi-prod 3.1.3  (App: 6.2.1.1_2)
# =============================================================
# ── 1. LICENSE ────────────────────────────────────────────────
global:
  license: true
  licenseType: "non-prod"   # "prod" for customer production license
  image:
  pullSecret: "ibm-entitlement-key"
documentService:
enabled: false
# ── 2. SERVICE ACCOUNT ───────────────────────────────────────
serviceAccount:
  name: "b2b-psts-sa" # ── 3. DATABASE CONFIGURATION ────────────────────────────────
setupCfg:
  dbVendor: "DB2"
  dbHost: "<your-db2-hostname>"
  # Use the hostname from your Db2 service credentials JSON
  # If using public endpoint: cbd4eb2a-xxxx-ussouth.bt1ibm.db2.ibmappdomain.cloud
  # If using private endpoint: cbd4eb2a-xxxx-ussouth-private.bt1ibm.db2.ibmappdomain.cloud   dbPort: 30413
  # Must be an integer (no quotes) — the chart schema enforces integer type dbData: "BLUDB"             # Db2 on Cloud always uses BLUDB
  dbDrivers: "db2jcc4.jar"   # Filename only — B2BI looks in /ibm/resources/
  dbCreateSchema: true        # true = fresh install | false = upgrade
  usessl: true
  dbTruststore: "db2TrustStore.jks"  # Filename only — in /ibm/resources/
  dbTruststorePassword: "changeit"   # Password used when creating the JKS
  dbTruststoreSecret: ""
  dbSecret: "b2b-psts-db-secret"
  systemPassphraseSecret: "b2b-psts-system-passphrase"
  adminEmailAddress: "admin@yourdomain.com"
  smtpHost: "smtp.example.com"
  libertyKeystoreSecret: ""
  basePort: 50000
  defaultDocumentStorageType: DB
  licenseAcceptEnableSfg: false
  licenseAcceptEnableEbics: false
  licenseAcceptEnableFinancialServices: false
  licenseAcceptEnableFileOperation: false
  enableFipsMode: false
  nistComplianceMode: "off"
  restartCluster: false
  useSslForRmi: true
  connectionpoolFailoverEnable: false # ── 4. PERSISTENT VOLUME CLAIMS ──────────────────────────────
appResourcesPVC:
  enabled: true
  storageClassName: "ibmc-vpc-file-1000-iops"
  accessMode: ReadOnlyMany
  size: 100Mi
  preDefinedResourcePVCName: "b2b-psts-resources" appLogsPVC:
  enabled: true
  storageClassName: "ibmc-vpc-file-1000-iops"
  accessMode: ReadWriteMany
  size: 50Gi
  preDefinedLogsPVCName: "b2b-psts-logs" appDocumentsPVC:
  enabled: true
  storageClassName: "ibmc-vpc-file-1000-iops"
  accessMode: ReadWriteMany
  size: 100Gi
  enableVolumeClaimPerPod: false
  preDefinedDocumentPVCName: "b2b-psts-documents" persistence:
  enabled: true
  useDynamicProvisioning: false # ── 5. DATABASE SETUP JOB ────────────────────────────────────
dataSetup:
  enabled: true    # true = fresh install (creates DB schema and 780+ tables)
                   # false = skip DB setup (use after first successful install)
  upgrade: false # ── 6. ASI POD (Application Server Instance) ─────────────────
asi:
  replicaCount: 1
  resources:
    limits:
      cpu: 4000m
      memory: 8Gi
      ephemeral-storage: "4Gi"
    requests:
      cpu: 2000m
      memory: 4Gi
      ephemeral-storage: "2Gi"
  startupProbe:
    initialDelaySeconds: 300
    timeoutSeconds: 30
    periodSeconds: 60
    failureThreshold: 10
  livenessProbe:
    initialDelaySeconds: 60
    timeoutSeconds: 30
    periodSeconds: 60
  readinessProbe:
    initialDelaySeconds: 30
    timeoutSeconds: 5
    periodSeconds: 60
  internalAccess:
    enableHttps: false
    httpsPort: 30202
    tlsSecretName: ""
  ingress:
    internal:
      host: "b2b-psts-asi-internal.<YOUR-INGRESS-DOMAIN>"
      tls:
        enabled: true
        secretName: ""
    external:
      host: "b2b-psts-asi-external.<YOUR-INGRESS-DOMAIN>"
      tls:
        enabled: true
        secretName: ""
  externalAccess:
    protocol: http
    address:
    port: # ── 7. AC POD (Adapter Container) ────────────────────────────
ac:
  replicaCount: 1
  resources:
    limits:
      cpu: 4000m
      memory: 8Gi
      ephemeral-storage: "4Gi"
    requests:
      cpu: 2000m
      memory: 4Gi
      ephemeral-storage: "2Gi"
  livenessProbe:
    initialDelaySeconds: 60
    timeoutSeconds: 5
    periodSeconds: 60
  readinessProbe:
    initialDelaySeconds: 60
    timeoutSeconds: 5
    periodSeconds: 60
  internalAccess:
    enableHttps: false
    tlsSecretName: ""
  ingress:
    internal:
      host: "b2b-psts-ac-internal.<YOUR-INGRESS-DOMAIN>"
      tls:
        enabled: true
        secretName: ""
    external:
      host: "b2b-psts-ac-external.<YOUR-INGRESS-DOMAIN>"
      tls:
        enabled: true
        secretName: "" # ── 8. API POD (REST API Server) ─────────────────────────────
api:
  replicaCount: 1
  resources:
    limits:
      cpu: 4000m
      memory: 4Gi
      ephemeral-storage: "4Gi"
    requests:
      cpu: 2000m
      memory: 2Gi
      ephemeral-storage: "2Gi"
  livenessProbe:
    initialDelaySeconds: 60
    timeoutSeconds: 5
    periodSeconds: 60
  readinessProbe:
    initialDelaySeconds: 60
    timeoutSeconds: 5
    periodSeconds: 60
  internalAccess:
    enableHttps: false
    tlsSecretName: ""
  ingress:
    internal:
      host: "b2b-psts-api-internal.<YOUR-INGRESS-DOMAIN>"
      tls:
        enabled: true
        secretName: "" # ── 9. INGRESS CONTROLLER ────────────────────────────────────
ingress:
  enabled: true
  controller: "ibm"   # "ibm" = use OpenShift Routes (correct for ROKS)
  annotations:
    route.openshift.io/termination: "edge"
  port: # ── 10. ENVIRONMENT ──────────────────────────────────────────
env:
  tz: "America/New_York"   # Set your timezone
  upgradeCompatibilityVerified: false
  debugMode: false # ── 11. LOGS ─────────────────────────────────────────────────
logs:
  enableAppLogOnConsole: false
  # false = logs written to PVC (persistent, survives pod restart)
  # true  = logs to stdout only (lost on pod restart) # ── 12. SECURITY CONTEXT ─────────────────────────────────────
security:
  supplementalGroups: [65534]
  fsGroup:
  fsGroupChangePolicy: "OnRootMismatch"
  runAsUser:
  runAsGroup: # ── 13. DISABLE UNUSED INTEGRATIONS ─────────────────────────
integrations:
  seasIntegration:
    isEnabled: false
  itxIntegration:
    enabled: false
  itxaIntegration:
  enabled: false
as4Service:
enabled: false
# ── 14. PURGE JOB ────────────────────────────────────────────
purge:
  enabled: true
  schedule: "0 0 * * 0"   # Weekly Sunday midnight
suspend: false # ── 15. ARCHITECTURE ─────────────────────────────────────────
arch:
  amd64: "2 - No Preference"
  ppc64le: "0 - Do not use"
s390x: "0 - Do not use"
  • DB hostname (private endpoint recommended)
  • Secrets names

Step 12: Install Sterling B2B Integrator

helm install b2b-psts ibm-helm/ibm-b2bi-prod \
  --version 3.1.3 \
  --namespace b2b-psts \
  --values values-override.yaml \
  --timeout 120m \
--wait

 This step may take 60–90 minutes due to database initialization.

Step 13: Verify Deployment

oc get pods -n b2b-psts -w

Expected pods:

  • ASI
  • AC
  • API

All should be in Running state.

Step 14: Access B2BI Dashboard

oc get routes -n b2b-psts

Open:

http://<asi-route>/dashboard

Default login:

  • Username: admin
  • Password: password

Change your password immediately after login.

Common Issues and Fixes

  • PVC Pending → Check storage class
  • Db2 timeout → Verify VPE gateway
  • ImagePullBackOff → Check entitlement key
  • Helm timeout → Increase timeout value

Conclusion

In this guide, we covered the complete setup of IBM Sterling B2B Integrator on ROKS, including:

  • Cluster setup and networking
  • Db2 configuration
  • Private connectivity using VPE
  • Kubernetes resource preparation
  • Helm-based deployment

By following these steps, you can successfully deploy a scalable and production-ready B2B integration platform on OpenShift.

0 comments
51 views

Permalink