Brac POC — jboss-chat app

Two-user chat application for the bank-employees division, delivered through GitLab, Jenkins, Trivy, Nexus, and OpenShift GitOps. It uses WSO2 Identity Server and API Manager, a BFF, VM Kafka and Redis, canary frontends, and a JBoss/WildFly managed-domain backend topology.

Delivered-state page for the jboss-chat proof-of-concept. The app is a small bank-employees chat service for shaikat and zahid, built to show how a regulated Java workload can move through the existing bank toolchain and land on OpenShift with identity, API gateway enforcement, observability, and GitOps control.

At a glance

Applicationjboss-chat
Division / namespacebank-employees / bank-employees-jboss-chat
Clusterspoke-dc-v6
Frontend routehttps://jboss-chat.apps.sub.comptech-lab.com
WSO2 API routehttps://gateway.apps.sub.comptech-lab.com/jboss-chat/1.0.0
Usersshaikat, zahid
LoginWSO2 Identity Server, OpenID Connect authorization code + PKCE
API protectionWSO2 API Manager gateway plus BFF JWT validation through WSO2 JWKS
Backend patternBrowser -> frontend canary -> BFF -> JBoss/WildFly managed domain
MessagingVM Kafka topic for message events; VM Redis Sentinel for notifications
ObservabilityOpenShift Logging, user-workload monitoring, OpenTelemetry to the platform collector
DeliveryGitLab -> Jenkins -> Trivy -> Nexus app-registry -> Argo CD -> OpenShift

What got built

ComponentRuntimeRole
frontend-v1React static frontendBlue login page, one half of the 50/50 canary route.
frontend-v2React static frontendRed login page, the other half of the 50/50 canary route.
bffNode.js / FastifyBrowser-facing API. Validates WSO2 JWTs, enforces allowed users, calls the backend, and publishes notifications.
chat-backendJava / Open LibertyCompatibility backend and health endpoint. Kept as a fallback during the transition to the managed-domain backend.
eap-domainWildFly managed domain imageLab implementation of the requested JBoss EAP shape: one Domain Controller, one Host Controller, and two server groups exposed on separate ports.

The main runtime path now prefers the managed-domain service:

Browser
  -> frontend-v1 or frontend-v2
  -> same-origin /api route
  -> BFF
  -> eap-domain group A on 8080
  -> eap-domain group B on 8230
  -> chat-backend fallback on 9080

Identity and API gateway

The login flow uses WSO2 Identity Server as the identity provider. The SPA is registered as a public OIDC client with PKCE enabled, and the redirect URI is the production callback route:

https://jboss-chat.apps.sub.comptech-lab.com/callback

The frontend calls the WSO2 API Manager gateway base path:

https://gateway.apps.sub.comptech-lab.com/jboss-chat/1.0.0

The BFF validates bearer tokens again by loading the WSO2 JWKS endpoint. It allows only the expected demo users and group:

ControlValue
Allowed usersshaikat, zahid
Required groupbank-employees-chat-users
Gateway behavior without tokenHTTP 401 from WSO2 API Manager
BFF behavior without tokenHTTP 401 with Unauthorized

JBoss managed-domain topology

The app includes a managed-domain backend image to match the requested JBoss EAP operational model. In the lab it runs as a single OpenShift pod containing:

PiecePurpose
Domain ControllerOwns the domain configuration and deploys the chat WAR.
Host ControllerStarts and manages the server instances inside the domain.
Server group AExposes the app on port 8080.
Server group BExposes the app on port 8230.

This is intentionally a lab-sized implementation of the domain pattern. A production HA version should split controllers and hosts across pods or nodes, then add backup domain-controller behavior and persistent management state.

Kafka and Redis

The app uses the existing VM middleware rather than deploying new Kafka or Redis inside OpenShift.

DependencyEndpoint
Kafkakafka-bootstrap.sub.comptech-lab.com:9092
Redisredis.sub.comptech-lab.com:6379
Redis Sentinelredis-sentinel.sub.comptech-lab.com:26379

Kafka receives message events. Redis is used for notification fan-out. Both are allowed by the tenant NetworkPolicy only on the required VM ports.

Observability

The app follows the cluster’s OpenShift observability model:

SignalCurrent path
LogsPod stdout collected by OpenShift Logging.
MetricsBFF /metrics and backend /metrics exposed through ServiceMonitor resources.
TracesOpenTelemetry auto-instrumentation sends OTLP to otelcol-platform-collector.tracing.svc:4317.
External forwardingThe platform collector is the live in-cluster handoff point; direct SigNoz forwarding remains a platform follow-up if SigNoz is required as the final sink.

The tenant NetworkPolicy allows the app to reach the platform OpenTelemetry collector in the tracing namespace and allows user-workload monitoring to scrape the metrics endpoints.

Pipeline and controls

The delivery flow is deliberately plain:

StepControl
GitLabSource repository in divisions/bank-employees/jboss-chat.
JenkinsPipeline builds backend, BFF, frontends, and the managed-domain image.
TrivyCritical CVE gate; the build fails before push if a critical finding is present.
NexusImages are pushed to app-registry.apps.sub.comptech-lab.com/bank-employees-jboss-chat.
Argo CDApplication/jboss-chat deploys the app repo; spoke-dc-v6-cluster-config owns tenant guardrails.
OpenShiftRoutes, Deployments, Services, ExternalSecrets, NetworkPolicies, and ServiceMonitors run the app.

The managed-domain image was updated to a current WildFly base and the unused Artemis server module was removed from that image so the Trivy critical scan passes while preserving the domain-controller and server-group topology.

Current live status

As of the last review:

CheckResult
Application/jboss-chatSynced / Healthy
Application/spoke-dc-v6-cluster-configSynced / Healthy
Frontend routeHTTP 200
Callback routeHTTP 200
Same-origin protected API without tokenHTTP 401
WSO2 gateway without tokenHTTP 401 from API Manager
BFF healthHTTP 200
JBoss server group A healthHTTP 200
JBoss server group B healthHTTP 200
Jenkins image buildPassed through Trivy and pushed to Nexus

Residual work

The core app is live, but these items should be treated as follow-up hardening:

  • Split the JBoss managed-domain controllers and host controllers into a more production-like HA shape.
  • Replace the shared app-default Redis ACL user with a workload-specific jboss-chat Redis ACL user.
  • Add Kafka TLS/SASL and app-specific Kafka ACLs.
  • Decide whether SigNoz must be the terminal store for traces and metrics, or whether the OpenShift platform collector and Tempo/User Workload Monitoring path is the accepted OpenShift-native endpoint.
  • Add an automated browser login smoke test for shaikat and zahid once the demo credentials are promoted into a test-runner secret.

Last reviewed: 2026-05-12