App Suite Releases
  • 8.47
  • 8.35
  • 7.10.6
Imprint
  • 8.47
  • 8.35
  • 7.10.6
Imprint
  • Release 8.51
    • Noteworthy Changes
      • Important Changes
      • App Suite Middleware
    • Changelogs
      • App Suite UI
      • App Suite Middleware
      • Additional Components
        • AI Service
        • OX Guard UI
        • Switchboard
        • Changelog
    • Helm Charts
      • AI-Service documentation
      • App Suite Stack Chart
      • Helm Chart core-cacheservice
      • Helm Chart core-documentconverter
      • Helm Chart core-imageconverter
      • core-mw
      • UI Service
      • Switchboard
  • Release 8.50
  • Release 8.49
  • Release 8.48
  • Release 8.47
  • Release 8.46

UI Service

Provides the collected manifest.json of services in a cluster as well as a list of dependencies for each source file. This information can be used to dynamically compile all ui components at runtime in the browser. Besides serving the information about all resources, this service can also function to provide snapshots of all the resources available at a specific point in time.

Requirements

  • Redis (always required, for version coordination and pub/sub)
  • For the S3 storage backend: an S3 compatible storage bucket (e.g. Minio)

Storage backend

Asset bytes (manifests, JS, CSS, assets) are stored in one of two backends, selected with storage.backend (see ADR 0010). Redis is required either way; the switch only decides where the files live.

  • S3 (the strategic direction): an S3 compatible bucket is the source of truth for all UI files. Recommended for scalable, multi-replica, and multi-site setups.
  • Redis: asset bytes are kept in Redis (compatibility mode for operators who cannot run S3). Redis memory then scales with total asset volume across retained versions.

storage.backend defaults to auto, which resolves to S3 when S3 is configured (s3.endpoint set, or minio.enabled: true) and to Redis otherwise. An unchanged 2.x values file (no S3 configured) therefore keeps running on the Redis backend after an upgrade, while a fresh install that supplies S3 gets the S3 path. Set storage.backend to s3 or redis to force the choice.

Redis default setup

For setups where scaling of the UI middleware is not necessary you can use the default values of the helm chart, which will deploy a redis server as a sidecar container.

Minio setup

In cases where no external S3 storage is available or desired, you can use a Minio deployment that is part of this helm chart by setting minio.enabled: true. This deploys an in-cluster S3 and makes the storage backend resolve to S3. We are referencing the bitnami/minio chart for this purpose, so please refer to their documentation for all available options. We recommend to at least enable persistence for the Minio deployment, as the UI Service will store all files in the S3 bucket and those should not be lost when the Minio pod is restarted.

So there are three options to run the S3 storage backend for the UI Service:

  1. Use an external S3 storage (preferred for production and multi-site setups)
  2. Use the Minio deployment with persistence (should also work for simple production environments)
  3. Use the Minio deployment without persistence (for development and testing)

Generally we advise to use an external S3 storage for production setups instead of the integrated Minio deployment.

The integrated Bitnami MinIO chart requires a rootPassword to be set in your values.yaml file. If this value is not set, MinIO will generate a random password during the initial installation, which can cause future upgrades to fail. Due to Minio's password policy, the password must be at least 8 characters long.

minio:
  auth:
    rootPassword: "myrootpassword"

Minio Resources

In standalone mode, Minio requests 2G memory by default. Therefore we configure memory limits to match this, by default. In practice we have seen this working with much less memory (like 256Mi), so you might want to adjust this value to your needs.

Configuration Parameters

Deployment Configuration

Basic Kubernetes deployment settings for the UI middleware service.

Helm VariableEnvironment VariableDescriptionDefault
replicaCountN/ANumber of pod replicas (typically managed by autoscaling)1
image.repositoryN/AContainer image repositoryappsuite-core-internal/core-ui-middleware
image.tagN/AContainer image tag (defaults to chart appVersion)""
image.pullPolicyN/AImage pull policyIfNotPresent
imagePullSecretsN/ASecrets for pulling from private registries[]

Pod Configuration

Security and runtime configuration for pods.

Helm VariableDescriptionDefault
podAnnotationsAnnotations to add to pods{"logging.open-xchange.com/format": "appsuite-json"}
podSecurityContextSecurity context for the pod{}
defaultPodSecurityContextDefault pod security context (if podSecurityContext is empty){runAsNonRoot: true, runAsUser: 65532, runAsGroup: 65532}
securityContextSecurity context for the container{}
defaultSecurityContextDefault container security contextSee values.yaml for full configuration

Service Configuration

Kubernetes service configuration for network access.

Helm VariableDescriptionDefault
service.typeKubernetes service typeClusterIP
service.portService port80

Resource Management

CPU and memory resource limits and requests.

Helm VariableDescriptionDefault
resources.limits.cpuMaximum CPU allocation1
resources.limits.memoryMaximum memory allocation768Mi
resources.requests.cpuRequested CPU allocation500m
resources.requests.memoryRequested memory allocation196Mi
autoscaling.enabledEnable horizontal pod autoscalingfalse
autoscaling.minReplicasMinimum number of replicas1
autoscaling.maxReplicasMaximum number of replicas100
autoscaling.targetCPUUtilizationPercentageTarget CPU utilization for scaling80
autoscaling.targetMemoryUtilizationPercentageTarget memory utilization for scaling80

Scheduling & Placement

Node selection and pod placement controls.

Helm VariableDescriptionDefault
nodeSelectorNode labels for pod scheduling{}
tolerationsTolerations for pod scheduling[]
affinityAffinity rules for pod scheduling{}

Health Probes

Kubernetes liveness and readiness probe configuration.

Helm VariableDescriptionDefault
probe.liveness.enabledEnable liveness probetrue
probe.liveness.periodSecondsLiveness check interval10
probe.liveness.failureThresholdFailures before pod restart15
probe.readiness.enabledEnable readiness probetrue
probe.readiness.initialDelaySecondsDelay before first readiness check1
probe.readiness.periodSecondsReadiness check interval5
probe.readiness.failureThresholdFailures before marking unready2
probe.readiness.timeoutSecondsReadiness check timeout5

Server Configuration

Network binding and port settings for the Fastify server.

Helm VariableEnvironment VariableDescriptionDefault
bindAddrBIND_ADDRIP address to bind for connections ("::" = IPv4 and IPv6)"::"
containerPortPORTContainer port for the UI middleware service8080
N/AMETRICS_PORTPrometheus metrics endpoint port9090
N/ALIGHTSHIP_PORTLightship health check port9000

UI Middleware Configuration

Core service behavior and UI serving settings.

Helm VariableEnvironment VariableDescriptionDefault
baseUrlsN/AList of UI service base URLs to fetch manifests from (required)[]
coreServiceURLCORE_SERVICE_URLCore middleware service URL for inter-service communication""
global.appsuite.appRootAPP_ROOTBase path for all routes (must start with /)"/"
N/AEXPOSE_API_DOCSExpose OpenAPI documentation at /documentationfalse

Logging Configuration

Structured JSON logging via Pino.

Helm VariableEnvironment VariableDescriptionDefault
logLevelLOG_LEVELLog level (trace, debug, info, warn, error, fatal)"info"

Caching & Performance

Cache TTL and performance optimization settings.

Helm VariableEnvironment VariableDescriptionDefault
cacheTTLCACHE_TTLIn-memory cache TTL for manifest data (milliseconds)30000
externalCache.enabledENABLE_EXTERNAL_CACHEEnable external cache mode (disables in-memory file caching)false

Compression Configuration

Response compression settings for HTTP responses.

Helm VariableEnvironment VariableDescriptionDefault
compressFileSizeCOMPRESS_FILE_SIZEMinimum file size (bytes) to enable gzip compression600
compressFileTypesCOMPRESS_FILE_TYPESMIME types eligible for compression (space-separated)application/javascript application/json application/x-javascript application/xml application/xml+rss text/css text/html text/javascript text/plain text/xml image/svg+xml

Performance Monitoring

Request performance tracking and alerting.

Helm VariableEnvironment VariableDescriptionDefault
slowRequestThresholdSLOW_REQUEST_THRESHOLDThreshold (ms) for logging slow HTTP requests4000

Key Prefix Configuration

Namespace isolation for Redis keys and S3 paths.

Helm VariableEnvironment VariableDescriptionDefault
keyPrefixKEY_PREFIXPrefix for all Redis keys and S3 folder paths"ui-service"

Storage Backend Selection

Selects where asset bytes (manifests, JS, CSS, assets) are stored. See ADR 0010. Redis is required either way for version coordination and pub/sub; this switch only decides where the files live.

Helm VariableEnvironment VariableDescriptionDefault
storage.backendSTORAGE_BACKENDauto, s3, or redis. auto derives the backend from whether S3 is configured."auto"

In auto mode the backend resolves to s3 when an S3 endpoint or the internal MinIO is configured (s3.endpoint set, or minio.enabled: true), and to redis otherwise. This keeps an unchanged 2.x values file (no S3 configured) running on the Redis storage backend after an upgrade, while a fresh install that supplies S3 gets the S3 path. Set s3 or redis to force the choice.

Note: With the Redis backend, asset bytes live in Redis, so Redis memory scales with total asset volume across retained versions.

Redis Configuration

Redis connection settings for distributed caching and pub/sub.

Helm VariableEnvironment VariableDescriptionDefault
redis.modeREDIS_MODERedis deployment mode (standalone, sentinel, cluster)"standalone"
redis.hostsREDIS_HOSTSRedis hosts (comma-separated string in env, list in Helm)["localhost:6379"]
redis.dbREDIS_DBRedis database number (0-15, only for standalone/sentinel)0
redis.sentinelMasterIdREDIS_SENTINEL_MASTER_IDSentinel master ID (only used when mode=sentinel)"mymaster"
redis.auth.enabledN/AGenerate Redis auth secretfalse
redis.auth.usernameREDIS_USERNAMERedis username for authentication""
redis.auth.passwordREDIS_PASSWORDRedis password for authentication""
redis.tls.enabledREDIS_TLS_ENABLEDEnable TLS for Redis connectionsfalse
redis.tls.caREDIS_TLS_CAPEM-encoded CA certificate for Redis TLS""
redis.prefixKEY_PREFIXDEPRECATED: Use top-level keyPrefix instead""
redis.sidecar.imageN/ARedis sidecar container image (development only)"redis:latest"

S3 Storage Configuration

S3-compatible storage settings (source of truth for UI files).

Helm VariableEnvironment VariableDescriptionDefault
s3.endpointS3_ENDPOINTS3 API endpoint URL"" (uses internal MinIO when minio.enabled)
s3.bucketNameS3_BUCKET_NAMES3 bucket name for storing UI files"ui-service"
s3.createBucketS3_CREATE_BUCKETAutomatically create bucket if it doesn't existfalse
s3.auth.userS3_ACCESS_KEYS3 access key ID""
s3.auth.passwordS3_SECRET_KEYS3 secret access key""
s3.auth.existingSecretN/AName of existing Kubernetes secret for S3 credentials""
s3.auth.userSecretKeyN/AKey in existing secret for S3 access key"access"
s3.auth.passwordSecretKeyN/AKey in existing secret for S3 secret key"secret"

Required S3 Permissions

The UI Service requires the following S3 permissions on the bucket:

  • s3:ListBucket
  • s3:ListBucketMultipartUploads
  • s3:ListMultipartUploadParts
  • s3:PutObject
  • s3:AbortMultipartUpload
  • s3:GetBucketLocation
  • s3:GetObject

If s3.createBucket is enabled, also add: s3:CreateBucket

Example S3 Policy

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Effect": "Allow",
   "Action": [
    "s3:ListBucket",
    "s3:ListBucketMultipartUploads",
    "s3:ListMultipartUploadParts",
    "s3:PutObject",
    "s3:AbortMultipartUpload",
    "s3:GetBucketLocation",
    "s3:GetObject"
   ],
   "Resource": [
    "arn:aws:s3:::<BUCKETNAME>/*"
   ]
  }
 ]
}

MinIO Sub-chart Configuration

DEPRECATED: the bundled MinIO sub-chart is deprecated and will be removed in a future release. It remains only as a development/testing convenience. For real storage, point s3.endpoint at an external S3-compatible service (the in-cluster Garage operator is recommended for preview/test clusters) or use the Redis storage backend (storage.backend: redis). See ADR 0010.

Integrated MinIO deployment settings (for development/testing). Opt-in: enabling it deploys an in-cluster S3 and makes storage.backend: auto resolve to S3.

Helm VariableDescriptionDefault
minio.enabledDeploy MinIO sub-chart (bitnami/minio)false
minio.disableWebUIDisable MinIO web consoletrue
minio.auth.rootPasswordMinIO root password (min 8 chars, recommended to set explicitly)Auto-generated if not set
minio.resources.limits.memoryMinIO memory limit2.5Gi
minio.resources.requests.cpuMinIO CPU request500m
minio.resources.requests.memoryMinIO memory request2Gi

For additional MinIO configuration options, see the bitnami/minio chart documentation.

Version Updater Configuration

Version update propagation and update job settings.

Helm VariableEnvironment VariableDescriptionDefault
updater.propagateUpgradesPROPAGATE_UPGRADESEnable automatic propagation of UI version updates across replicastrue
updater.s3MaxParallelRequestsS3_MAX_PARALLEL_REQUESTSMaximum parallel S3 requests during version updates20
updater.resources.limits.memoryN/AUpdater job memory limit768Mi
updater.resources.requests.cpuN/AUpdater job CPU request100m
updater.resources.requests.memoryN/AUpdater job memory request196Mi

Kubernetes Auto-Discovery

Automatic discovery of UI services in the same namespace.

Helm VariableDescriptionDefault
k8sAutoDiscovery.enabledAutomatically discover UI services with label appsuite.ox.io/ui-provider: manifesttrue

Services can optionally specify a custom base path using the annotation: appsuite.ox.io/ui-base-path: "/"

Monitoring & Observability

Prometheus metrics and monitoring integration.

Helm VariableDescriptionDefault
extras.monitoring.enabledEnable Prometheus ServiceMonitor (requires prometheus-operator)false
global.extras.monitoring.enabledGlobal monitoring enablement flagfalse

CORS Configuration

Cross-Origin Resource Sharing settings.

Environment VariableDescriptionDefault
ORIGINSAllowed origins for CORS requests (comma-separated or * for all)"*"

Note: This configuration is only available via environment variable, not through Helm values.

Upgrading

To 4.0.0

The UI Service has been updated to use S3 storage instead of Redis for storing the manifests and assets. Redis is still in use for propagating updates to the UI Service.

Migrating from redis storage to S3 storage

Notice that the previous versions stored in redis will be lost when migrating to S3 storage, as the UI Service will not be able to access the redis storage anymore and only use redis to propagate updates after this. If you are using an external S3 storage, you should either create a new bucket on your S3 storage or use an existing one. You can also let the UI Service create the bucket for you by setting s3.createBucket to true. Additionally redis.prefix is used for the folder name inside the bucket.

If you want to migrate from redis storage to S3 storage, you can use the following steps:

  1. Use at least chart version 4.0.5 and image version latest for the UI Service.

  2. Set a minio root password in your values.yaml file if you use the integrated Minio deployment (like in the example of the previous section). Otherwise disable the internal Minio deployment and configure an external S3 storage, e.g.:

    minio:
      enabled: false
    s3:
      bucketName: "your-bucket-name"
      endpoint: https://your-s3-endpoint
      auth:
        user: example-user
        password: example-password
    
  3. Deploy the updated helm chart.

  4. Wait until everything is up and running.

The UI Service will now use the S3 storage.

Migration Guide

Renaming redis.prefix to keyPrefix

The redis.prefix configuration parameter has been renamed to keyPrefix and moved to the top level to better reflect that it's used for both Redis keys and S3 folder paths, not just Redis.

What changed:

  • Helm value: redis.prefix → keyPrefix (top-level)
  • Environment variable: REDIS_PREFIX → KEY_PREFIX
  • The prefix is used for both Redis keys AND S3 folder structure

Backwards compatibility: The old redis.prefix parameter is still supported for backwards compatibility. If redis.prefix is set, it will be used. Otherwise, the new keyPrefix will be used.

Migration steps:

  1. Update your values.yaml or Helm command:

    Before:

    redis:
      prefix: my-custom-prefix
    

    After:

    keyPrefix: my-custom-prefix
    
  2. Deploy the updated chart - no service interruption required since backwards compatibility is maintained.

  3. After confirming everything works, remove the old redis.prefix from your configuration.

Note: If you don't have a custom prefix configured, the default value "ui-service" will be used automatically.

Prev
core-mw
Next
Switchboard