Skip to main content
Version: 2.2.0

Output Organizer Helm chart

This chart bootstraps an Output Organizer on a Kubernetes cluster using the Helm package manager.

Output Organizer is a scalable web based solution for assembling and annotating documents, and generating output documents to be processed in other applications.

As you can see, the chart provisions four deployments (subchart names in brackets):

  • Output Organizer backend ("organizer")
  • jadice web viewer ("viewer")
  • controller ("controller")
  • export worker ("worker-topdf")

Sample configuration

Prior to installing the Helm chart, you need to provide some required parameters. A minimal values.yaml with these required parameters looks like this:

my-values.yaml

##
# Global configuration to be used by all sub components
##
global:
imageRegistry: "registry.jadice.com" # Global Docker image registry

# Two external ingress configuration have defined for your organizer application.
urls:
fusion:
externalUrl: https://my-output-organizer.com
viewer:
externalUrl: https://my-output-organizer-viewer.com

##
# Secrets for sensitive information:
# -> to use encrypted 'sealed-secrets' see: https://github.com/bitnami-labs/sealed-secrets
##
secrets:
useSealedSecrets: true
# Depending on your configuration of secrets.useSealedSecrets this config has to be configured differently.
# If you don't use sealed secrets the registry credentials can be put here in the fields 'server', 'username' and
# 'password'.
# If you use sealed secrets you have to create a docker config JSON string, seal it and put it in the
# 'dockerconfigjson' field.
imageRegistry:
# Option 1:
server: "***"
username: "***"
password: "***"
# Option 2:
dockerconfigjson: "***"

##
# Organizer specific configuration
##
organizer:
ingress:
# insert your ingress config here.
resources:
# insert your resources config here.

## Secrets for the DB to store fusion collections in. (this section depends on the configured DB - default is H2)
db:
username: "***"
password: "***"

##
# Viewer specific configuration
##
viewer:
ingress:
# insert your ingress config here.
resources:
# insert your resources config here.

##
# Controller specific configuration
##
controller:
resources:
# insert your resources config here.

##
# Exporter specific configuration
##
worker-topdf:
resources:
# insert your resources config here.

Install the helm chart with your values applied:

$ helm repo add levigo https://artifacts.jadice.com/repository/helm-charts/ --username <username> --password <password>
$ helm upgrade --install --namespace my-namespace --values my-values.yaml my-release levigo/fusion-output-organizer

Prerequisites

Kubernetes

  • Kubernetes 1.14+
  • Helm 3.1.0+
  • (optional but recommended: sealed secrets )

Container Image Access

Because the images used in this chart are from a private container registry, you need to have access to the container registry registry.jadice.com or access to a proxy of the same registry.

For details see image pull secrets.


Installing the Chart

To install the chart with the release name my-release from levigo helm repository:

$ helm repo add levigo https://artifacts.jadice.com/repository/helm-charts/ --username <username> --password <password>
$ helm install --namespace my-namespace --values my-values.yaml my-release levigo/fusion-output-organizer

The command deploys fusion-output-organizer on the Kubernetes cluster in the default configuration. The configuration section lists the parameters that can be configured during installation.

Uninstalling the Chart

To uninstall/delete the my-release deployment:

$ helm delete my-release

The command removes all the Kubernetes components associated with the chart and deletes the release.


Configuration

The following tables lists the configurable parameters of the fusion-output-organizer chart and their default values.

Universal service settings

Let's start with universal settings for Kubernetes. These can be applied to every service in the values file. The <service>placeholder has to be replaced with a deployed kubernetes service alias like organizer, viewer, etc. these Aliases can be found in the chart.yaml and as prefix in the values file.

ParameterDescription
<service>.resources.requests.cpuCPU units for the service to be allocated initially.
<service>.resources.requests.memoryMemory size for the service to be allocated initially.
<service>.resources.limits.cpuMaximum CPU units that can be used by the service.
<service>.resources.limits.memoryMaximum Memory size that can be used by the service.
<service>.ingress.enabledEnable / Disable the ingress for a service. In order for this service to work, user access is needed, hence some kind of access for an operator has to be provided.
<service>.ingress.annotationsAdditional annotations for configuring the ingress.
<service>.ingress.hostsThe hostname of the service and eventual path rewrites.
<service>.ingress.tlsFor configuring the corresponding TLS secrets of the previously defined hostnames.
<service>.ingress.ingressClassNameThe ingress class name.
<service>.management.endpoints.web.exposure.includeSet which endpoints are exposed.
<service>.management.prometheus.metrics.export.enabledExport prometheus metrics.
<service>.management.jmx.metrics.export.enabledExport JMX metrics.
<service>.startupProbe.initialDelaySecondsInitial delay of the startup probe in seconds.
<service>.startupProbe.periodSecondsTime between requests for the startup probe in seconds.
<service>.startupProbe.timeoutSecondsMaximum response time for the startup probe in seconds.
<service>.startupProbe.successThresholdHow often a startup probe has to succeed for the pod to be considered healthy.
<service>.startupProbe.failureThresholdHow often a startup probe is allowed to fail before the pod is considered unhealthy.
<service>.livenessProbe.initialDelaySecondsInitial delay of the liveness probe in seconds.
<service>.livenessProbe.periodSecondsTime between requests for the liveness probe in seconds.
<service>.livenessProbe.timeoutSecondsMaximum response time for the liveness probe in seconds.
<service>.livenessProbe.successThresholdHow often a liveness probe has to succeed for the pod to be considered healthy.
<service>.livenessProbe.failureThresholdHow often a liveness probe is allowed to fail before the pod is considered unhealthy.
<service>.readinessProbe.initialDelaySecondsInitial delay of the readiness probe in seconds.
<service>.readinessProbe.periodSecondsTime between requests for the readiness probe in seconds.
<service>.readinessProbe.timeoutSecondsMaximum response time for the readiness probe in seconds.
<service>.readinessProbe.successThresholdHow often a readiness probe has to succeed for the pod to be considered healthy.
<service>.readinessProbe.failureThresholdHow often a readiness probe is allowed to fail before the pod is considered unhealthy.
<service>.securityContextContains general security information for an individual pod depending on your environment5
<service>.podSecurityContextContains security information for an individual pod depending on your environment5
<service>.affinityConfiguration for service pod affinity6
<service>.nodeSelectorConfiguration for service pod node selection6
<service>.tolerationsConfiguration for service pod tolerations6

Secrets

The chart also supports the use of Sealed Secrets instead of regular Kubernetes secrets. Sealed Secret values can also be specified directly in the Helm values.yaml. Simply set secrets.useSealedSecrets to true and use the encrypted values for all parameters in the section "secrets". For further information on how to encrypt secrets see table in the Sealed Secrets section.

Image pull secrets

To access the container registry you have the following three options:

  1. Provide the name of an existing Kubernetes registry-secret via global.imagePullSecrets.

    For instructions on how to create a Kubernetes docker-registry secret check out the Documentation or the output of kubectl create secret docker-registry --help

  2. Provide the credentials to the registry via the following parameters:

    ParameterDescriptionDefault
    secrets.imageRegistry.serverServer of the container registryregistry.jadice.com
    secrets.imageRegistry.usernameUsername for the container registrynil
    secrets.imageRegistry.passwordPassword for the container registrynil
  3. For sealed secrets, you can encrypt the content of a ~/.docker/config.json file as a String and provide this as the value for the parameter secrets.imageRegistry.dockerconfigjson.

    To create this String you could run the following command

    kubectl create secret docker-registry registry-secret \
    --docker-username=<user> \
    --docker-password=<password> \
    --docker-server=registry.jadice.com \
    --dry-run=client -o json | jq -r '.data[".dockerconfigjson"]' | base64 -d | kubeseal --raw --from-file=/dev/stdin --namespace <namespace> --name registry-secret

    Note:

    • Requires jq and kubeseal
    • Replace <user>, <password>, <namespace> with the respective values.

Global Parameters

These values can be defined globally, overwriting the values defined for each component, including MariaDB.

ParameterDescriptionDefault
global.imageRegistryGlobal Docker image registrynil
global.imagePullSecretsGlobal Docker registry secret names as an array["registry-secret"]
global.storageClassGlobal storage class for dynamic provisioningnil
global.urls.fusion.externalUrlExternal url for the fusion backend configured by ingressnil
global.urls.fusion.serviceUrlKubernetes service url fot accessing the fusion service cluster internallyhttp://fusion-output-organizer
global.urls.viewer.externalUrlExternal url for the viewer backend configured by ingressnil
global.config.annotationProfileAnnotation configuration profile used by all Fusion Service in the cluster see<Default Profile ...>

Output Organizer ("organizer")

The base configuration of output organizer includes all necessary configuration setting to run the fusion backend as is. If you like to customize your deployment the following configuration settings can be used:

ParameterDescriptionDefault
organizer.flow.export.enabledFlag to enable export.true
organizer.flow.export.jobTypeThe job type of the workerjf-single:fusion-export
organizer.flow.export.ui.showAnnotationCheckboxShow the annotations option in the export dialog.false
organizer.flow.export.ui.showFilenameFieldShow the filename option in the export dialog.false
organizer.flow.export.ui.showOptionsInResultMessageShow the options, like: Open File, Copy Link, Send Email in the result dialog.false
organizer.exportNotification.enabledFlag to enable export notificationfalse
organizer.exportNotification.urlThe url of the endpoint
organizer.exportNotification.auth.userAuth.enabledFlag to use user auth for the to be notified servicefalse
organizer.exportNotification.auth.basicAuthenticated.enabledFlag to enable Basic auth for the to be notified servicefalse
organizer.exportNotification.auth.bearerAuthenticated.enabledBearer auth for the to be notified servicefalse
organizer.config.collectionTypeDefinitionsConfiguration property contains a list of custom collection type definition files see.
organizer.config.collectionTypeNamesLists the corresponding collection type names to the definitions defined in 'collectionTypeDefinitions'. The name must be the same as the ID defined in the collection definition json. The order of elements has to match its counterpart in 'collectionTypeDefinitions' see.
organizer.config.policyDefinitionsConfiguration property contains a list of custom access policy definition files see.
organizer.config.policyValidityDateLists the corresponding validity date of the access policies defined in 'policyDefinitions'. The date has to follow the date schema "yyyyMMdd-HHmmss-SSS". The active policy is always the policy with the newest validity that is not set in the future. The order of elements has to match its counterpart in 'policyDefinitions' see.
organizer.config.stylesConfiguration property contains a css to modify the frontend appearance see.
organizer.config.logosConfiguration property allows the replacement of the default application logo see.
organizer.config.faviconConfiguration property allows the replacement of the default application favicon see.
organizer.config.zoomAutoFitConfigures the default zoom behaviour. 'true' adjusts zoom automatically depending on the size of the document, 'false' simply sets the zoom level to 100%.true
organizer.config.xframeOptionsConfigures the X-Frame-Options header. Possible values: 'deny', 'sameorigin', 'disable'.deny
organizer.config.supportedMimeTypesFile formats that are supported for import. Note: Configuring this parameter is not possible in Output Organizer Basic.['image/bmp', 'image/gif', 'image/jpeg', 'application/pdf', 'image/png', 'image/tiff', 'application/vnd.afpc.afplinedata', 'application/vnd.afpc.modca', 'application/vnd.ibm.afplinedata', 'application/vnd.ibm.modca']
organizer.config.showOriginalBranchConfigures the documents tree to show or hide the "Original documents" branch.
organizer.loaders.localHostRedirectIf your storage source for documents uses the same host address but is not reachable as localhost form the fusion application server, you can turn off this redirect. (This redirect removes the need for an ingress routing to locally stored documents and therefore improves performance.)true
organizer.loaders.basicAuthenticatedStore.enabledToggle to enable basic authentication for document content loading.false
organizer.loaders.basicAuthenticatedStore.baseUrlBase url for documents to be secured with basic auth.nil
organizer.loaders.bearerAuthenticatedStore.enabledToggle to enable bearer authentication for document content loading.false
organizer.loaders.bearerAuthenticatedStore.baseUrlBase url for documents to be secured with bearerAuth, e.g. https://example.com for document URLs https://example.com/path/to/document/.nil
organizer.logging.patternAllows you to define a custom logging pattern (see)
organizer.logging.level.*Allows you to configure logging levels on a package or class basis (see)
organizer.db.jdbcURLDatabase JDBC-URLjdbc:h2:mem:fusiondb
organizer.db.driverClassNameDatabase Driver nameorg.h2.Driver
organizer.db.databasePlatformDatabase language dialectorg.hibernate.dialect.H2Dialect
organizer.storage.directoryCustom Data directory for uploaded documents and temporary data/home/nonroot/data
organizer.storage.sizeLimitLocal container size limit for uploaded documents and temporary data in mb20480
organizer.storage.ehcache.enabledEnable EHCache storage (disable other storage solutions)true
organizer.storage.ehcache.pagingFileSizeLimitDisc cache size in mb (has to be smaller that organizer.storage.sizeLimit)18432
organizer.storage.ehcache.heapEntriesHeap cache size in number of entities500
organizer.storage.ehcache.expiryTimeMinutesCache expiry time for cache data to be cleaned up after.1440
organizer.storage.s3.enabledEnable s3 storage (disable other storage solutions)false
organizer.truststore.enabledEnable a custom truststore for the container.false
organizer.truststore.cacertsTruststore with custom (root) certificatessee.
organizer.truststore.fileNameConfigurable key name, allowing users to specify a different key name instead of the default cacerts.cacerts
organizer.jadice.licenseConfiguration.licenseThe license field contains the necessary license information
organizer.jadice.licenseConfiguration.fingerprintThe unique fingerprint associated with your license
organizer.jadice.licenseConfiguration.publicKeyThe public key that corresponds to the license. The public key is necessary for validating the authenticity of the license.

Recommendation: Note that pod replication is automatically set to 1 when H2 is used. Since H2 is an in-memory database, it may not be suitable for high load scenarios. Therefore, consider using MariaDB instead of H2 for better scalability and multiple instances. If scalability is an issue, switch to MariaDB and adjust the configuration accordingly.

Recommendation: Note that pod replication is automatically set to 1 when H2 is used. Since H2 is an in-memory database, it may not be suitable for high load scenarios. Therefore, consider using MariaDB instead of H2 for better scalability and multiple instances. If scalability is an issue, switch to MariaDB and adjust the configuration accordingly.

Jadice web viewer ("viewer")

Jadice web viewer provides the document viewer to display most file formats in the browser frontend. Here are the configuration settings for the jadice web viewer:

ParameterDescriptionDefault
viewer.contextPathAllows you to configure the context path of the application (e.g. /foobar.mycompany.de/levigo/viewer)/
viewer.serverConnectionConnection type for communication between the viewer client and its backend server. Possible values: WebSocket, LongPoll, ServerSentEventsWebSocket

Jadice Flow controller ("controller")

Jadice flow controller manages and coordinates export jobs initiated by the users. All jobs are started by requesting their execution at the controller, the controller then redirects them to a worker responsible for the export.

ParameterDescriptionDefault
controller.workersConfiguration property allows the replacement of the default worker configuration see.<Default Configuration ...>
controller.jobtemplatesConfiguration property allows the replacement of the default job template configuration see.<Default Configuration ...>

Jadice Flow export worker ("worker-topdf")

Jadice Flow worker-topdf combines collection documents to create the desired export document stream.
For settings see

Sealed Secrets

To encrypt sealed secrets you need to provide the cluster namespace, secret name, secret key and a secret value. The namespace can be chosen freely, the rest can be filled according to the following table. (All placeholders in the value fields have to be replaced with the actual values.)

secret-namesecret-keysecret-value
registry-secret.dockerconfigjson{'auths':{'registry.jadice.com':{'username':'[USER]','password':'[PASSWORD]','email':'[EMAIL]','auth':'[TOKEN]'}}}
database-secretpassword[PASSWORD]
database-secretusername[USERNAME]
loader-auth-secretloader-password[PASSWORD]
loader-auth-secretloader-user[USER]
loader-auth-secretloader-password[PASSWORD]
loader-auth-secretloader-token[TOKEN]
oauth-secretapp-id-uriapi://[APP_ID]
oauth-secretclient-id[APP_ID]
oauth-secretissuer[ISSUER_URL]
oauth-secretscope[SCOPE]
s3-secrets3-access-key[KEY]
s3-secrets3-bucket[NAME]
s3-secrets3-endpoint[URL]
s3-secrets3-secret-key[KEY]
sba-secretsba-password[PASSWORD]
sba-secretsba-user[USER]
export-notification-auth-secretexport-notification-username[USERNAME]
export-notification-auth-secretexport-notification-password[PASSWORD]
export-notification-auth-secretexport-notification-bearer-token[BEARER_TOKEN]
save-notification-auth-secretsave-notification-username[USERNAME]
save-notification-auth-secretsave-notification-password[PASSWORD]
save-notification-auth-secretsave-notification-bearer-token[BEARER_TOKEN]