On-Premises Installation
Updated Jul 2026

Documentation › On-Premises Installation

On-Premises Installation & Deployment

Admin  For teams running MaxTAF Cloud inside their own network — for example to test an internal Maximo without exposing it to the internet.

MaxTAF Cloud is a Kubernetes-native platform of Spring-Boot microservices with an Angular frontend. This guide describes the architecture, prerequisites and topology a self-hosted deployment must provide, so your platform team can plan and stand it up.

Work with Code Development Ltd on a production install

Production images, registry access, licensing and a hardened configuration are provided by Code Development Ltd as part of an on-prem engagement. This page is a reference architecture to plan against — it is not a copy-paste installer. Engage your account manager before deploying to production.

On this page

Architecture at a glance

Internet / intranet
     │
     ▼
  Ingress (TLS)  ─►  Frontend (Angular + nginx)  ─►  Gateway (auth + routing)
                                                        │
        ┌───────────────────────────────────────────────┼───────────────────────────────┐
        ▼               ▼            ▼           ▼        ▼            ▼                   ▼
      cloud          storage     scheduler      ai   user-project  utam-recorder   engine-<project>
   (cases/runs)     (files)     (schedules)  (AI cfg) (users/projs)  (UTAM)        (runs tests; 1/project)
        └───────────────┬───────────────────────────────┘                              │
                        ▼                                                               ▼
                   MariaDB (per-project DBs)                            Selenium grid / Playwright (AI) grid
                        ▲
                   Keycloak (OIDC / SSO)  ◄── Gateway validates JWTs

Requests enter through an ingress with TLS, hit the Angular frontend, and are proxied to the gateway, which authenticates every request and routes it to the right service by path prefix. Tests execute on a per-project engine pod that the platform creates on demand, backed by a browser execution grid.

Components

ComponentRolePath prefix
frontendAngular SPA served by nginx; proxies API/auth traffic to the gateway.
gatewaySingle auth chokepoint (OIDC JWT + API-key) and router to all services.
cloudCore: cases, runs, reports, import/export, per-project DB provisioning, Allure./api/maxtaf
storageProject file storage (mounts the project volume)./api/storage
schedulerScheduled/cron test runs./api/schedule
user-projectUsers, projects, permissions; creates the per-project engine pod at runtime./api/userproject
aiAI features and AI-provider configuration./api/ai
utam-recorderUTAM route-resolution backend for the recorder./api/utamRecorder
engine (per project)Compiles and runs tests (MXML/Java/UTAM); spun up on demand, one per project./api/engineengine-<project>
Per-project engines

Rather than one shared executor, MaxTAF creates an engine pod per project on demand. This gives each project isolation and its own language servers, but means the platform needs Kubernetes RBAC to create pods and services in its namespace.

Prerequisites

RequirementNotes
Kubernetes clusterVanilla Kubernetes or OpenShift. Must allow the platform service account to create pods/services in its namespace. Some pods run privileged (Docker-in-pod / volume mounts).
DatabaseMariaDB / MySQL. Each project gets its own database; schema is managed automatically by Liquibase on startup.
Identity providerKeycloak (with its own database) for OIDC/SSO. The gateway validates JWTs against a MaxTAF realm.
Container registry + pull secretTo host and pull the MaxTAF service images provided by CDL.
Persistent storageA shared, read-write-many volume for project files (the OpenShift path uses a PVC; a multi-node cluster needs RWX storage rather than node-local hostPath).
Ingress + TLSAn ingress controller and certificate management (e.g. cert-manager) terminating TLS to the frontend.
Browser execution gridA Selenium grid for scripted/MXML cases, and (for AI cases) the Playwright/AI grid. See Execution grids.

Topology & namespaces

A typical deployment uses separate namespaces to isolate concerns:

The platform's environment setting selects the engine image, storage type (hostPath vs PVC), image-pull policy and service account — this is the main knob distinguishing a dev cluster from an OpenShift/production target.

Configuration & ports

ItemDetail
Service portsEach application service listens on 8080. The engine additionally exposes language-server and terminal ports.
DatabaseMariaDB on 3306; the platform connects as a superuser to create per-project databases.
AuthGateway trusts Keycloak-issued JWTs; API-key access uses X-Maxtaf-Api-Key + X-Project-Id headers (see the REST API).
Frontend proxyThe frontend proxies /api, /keycloak and terminal traffic to the gateway.
Maximo & executionNot global config — the Maximo URL and Selenium/AI server are per-project parameters (mx.maximo.address, mx.selenium.server, mx.playwright.server) stored per project and injected into the engine at run time.
Harden secrets before production

The development manifests carry example, hardcoded secrets (database and Keycloak admin credentials). A production install must replace these with proper Kubernetes Secrets / an external secret manager, and scope the platform's RBAC to the minimum required to create per-project engines.

Execution grids

Running these grids inside your network is exactly what lets on-prem MaxTAF reach an internal Maximo without exposing it externally.

Backup & upgrade

Planning checklist

Related

Security & Compliance · REST API · How AI cases execute