Installing Collabora Online
This section provides step-by-step instructions for installing HCL Enterprise Edition Collabora Online with HCL Connections 8.0 CR15 or later.
The process includes preparing the Kubernetes namespace and secrets, customizing the Helm values file, installing the chart, configuring IBM HTTP Server and load balancer for WebSocket traffic, and enabling Collabora in the HCL Connections Files service.
The collabora-online-umbrella Helm chart deploys two components into your Kubernetes cluster:
collabora-online— thecoolwsddocument editor server that renders.docx,.xlsx,.pptx, and other files in the browser and handles the WebSocket collaboration channel.cool-controller— the routing and metrics controller that assigns document sessions tocoolwsdpods and exposes the/controller/routeTokenindirection endpoint used by Files.
Prerequisites
Before you begin, ensure the following:
- You have a running HCL Connections 8.0 CR15 or later environment, ready for Collabora Online installation or upgrade.
- Helm v3.0 or later and
kubectlare installed on the deployment machine. Verify the versions withhelm versionandkubectl version. - You have access to the required Helm chart:
collabora-online-umbrellaHelm chart (provided by HCL) from the HCL Harbor repository.
- Sufficient cluster resources are available. See the Collabora Online Resource Allocation & Sizing Guide and Sizing the Kubernetes cluster topic for guidance.
- Harbor pull credentials are configured as a Kubernetes secret. See Log in to a Harbor OCI registry.
- A Traefik ingress controller is installed and running in the target namespace. See Set up community ingress.
- If TLS is enabled on the ingress, the
cnx-tls-secretTLS secret must exist in the target namespace. This is generated automatically by the bootstrap installation. See Enabling secure traffic to the ingress controller for more information.
Installation procedure
Infrastructure Preparation
-
Create the namespace.
You can install Collabora Online in the same namespace as HCL Connections or in a separate, dedicated namespace:
-
Option 1: Same namespace — Use the existing
connectionsnamespace for the Collabora Online deployment. -
Option 2: Dedicated namespace — Create a separate namespace to isolate the Collabora Online resources:
kubectl create namespace collabora
Important
If you choose a dedicated namespace (for example,
collabora), ensure the following are in place before continuing:-
Traefik ingress controller — A Traefik ingress controller must be installed in the dedicated namespace. See Set up community ingress.
-
Pod Security Standards — Must be applied to the dedicated namespace. Handled in step 2 of this procedure.
-
Image pull secret — The
myregkeyimage pull secret must exist in the dedicated namespace. Follow Log in to a Harbor OCI registry and substitute your namespace name in place ofconnections. -
(If TLS is enabled) TLS secret — The
cnx-tls-secretreferenced in the Helm values must also exist in the dedicated namespace. Run the bootstrap installation to generate it automatically. For more information on manual certificate management, see Enabling secure traffic to the ingress controller.
-
-
Apply Pod Security standards.
-
If you use the
connectionsnamespace for Collabora Online, the required Pod Security standards are already applied as part of the main Component Pack installation. You can skip this step. -
If you use a dedicated namespace for Collabora Online (for example,
collabora), apply the same Pod Security standards used by Component Pack:kubectl label --overwrite ns <<namespace>> \ pod-security.kubernetes.io/enforce=baseline pod-security.kubernetes.io/enforce-version=latest \ pod-security.kubernetes.io/warn=baseline pod-security.kubernetes.io/warn-version=latest \ pod-security.kubernetes.io/audit=baseline pod-security.kubernetes.io/audit-version=latestReplace
<<namespace>>with your Collabora namespace name (for example,collabora).
This keeps the Collabora namespace aligned with the same Pod Security configuration used for Component Pack.
-
-
Secrets and Certificate Management
Secrets are required to secure Collabora Online admin access and enable TLS for the Collabora routes. These steps help protect the Collabora deployment and ensure encrypted traffic between clients and the document editor.
For more information, see the Kubernetes Secrets documentation.
Follow these steps to create the required secrets and import the TLS certificate:
-
Create Collabora Online Administrator Secret
Create a Kubernetes secret to store the admin credentials for the Collabora Online administrator console.
Use strong, unique passwords and store them securely. Rotate passwords regularly as part of your security policy.
The secret name (
collabora-admin-secret) must match the value referenced in your custom values file.Where:kubectl create secret generic collabora-admin-secret \ --from-literal=admin-username='<<collabora-admin-username>>' \ --from-literal=admin-password='<<collabora-admin-password>>' \ -n <<namespace>><<collabora-admin-username>>is the administrator user name (for example,admin).<<collabora-admin-password>>is a strong, unique administrator password.<<namespace>>is the namespace where Collabora Online is installed (for example,connectionsorcollabora).
-
Create or Update TLS Secret for Collabora Routes
-
Use the default secret
cnx-tls-secretgenerated from the bootstrap chart installation to enable TLS for HTTPS as required by the Collabora Helm chart. If you are using a dedicated namespace for Collabora Online, ensure thecnx-tls-secretis present in that namespace. Run the bootstrap installation to generate it automatically and refer to Enabling secure traffic to the ingress controller for manual certificate management. -
Verify that the secret name (
cnx-tls-secret) matches the value referenced in your custom values filecollabora-values.yamlused in the Install Collabora Online using Helm section for bothcollabora-onlineandcool-controlleringress TLS configuration.
-
-
Import the Certificate into IBM HTTP Server (IHS)
- Refer to Import the Certificate into IBM HTTP Server (IHS) for details.
-
-
Create the IngressClass
Note
When Traefik community ingress is enabled, the
nginxIngressClass is typically created automatically. In that case, this step is not required. If the class does not exist in your cluster, create it manually as shown below.Create a file named
ingress-class.yamlwith the following content:apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: nginx spec: controller: k8s.io/ingress-nginxApply it:
kubectl apply -f ingress-class.yaml
Installing Collabora Online Enterprise Edition using Helm
Complete the following steps to install the Collabora Online Helm chart:
-
Get the
collabora-online-umbrellachart version and the Collabora Online image tag that are available on Harbor OCI by running the following commands.Get the chart version:
helm show chart <<oci_registry_url>>/collabora-online-umbrella --devel | grep "^version:" Example Output: `version: "1.4.0"`Where
<<oci_registry_url>>is the Harbor OCI container registry URI, that is,oci://hclcr.io/cnx-collabora. This applies to other instances of<<oci_registry_url>>in the Collabora Online install steps. -
Prepare the Collabora Online custom values file.
Complete the following steps to prepare the custom values file for the Collabora Online Helm chart:
-
Download the
collabora-values.yaml.j2template from the HCL Connections deployment automation Git repository and update it to match your environment. -
Rename the file to
collabora-values.yamland open it. -
Replace all variables enclosed in double curly braces
{{ }}with the values that are appropriate for your cluster configuration.
For guidance on substitutions, refer to the following example. This example is based on the internal HCL Connections environment and is provided for reference only. It does not define specific values or available override variables. The values you define in
collabora-values.yamlmust match your own environment.Note
Use the
imagePullSecretscreated in the Add Harbor credentials as Kubernetes secret step to pull images from the HCL Harbor repository. The example below usesmyregkeyas the pull secret name.The
existingSecretblock undercollabora-online.collaboramust reference the secret name (collabora-admin-secret) and keys (admin-username,admin-password) that you created in step 3 under "Secrets and Certificate Management". Update these values if you used a different secret name.collabora-online: image: repository: "hclcr.io/cnx-collabora/collabora-online" imagePullSecrets: - name: myregkey collabora: server_name: "connections.example.com" # --- TLS Termination at Ingress --- extra_params: >- --o:ssl.enable=false --o:ssl.termination=true --o:ssl.ssl_verification=false --o:indirection_endpoint.url=https://connections.example.com/controller/routeToken --o:monitors.monitor[0]=ws://collabora-online-cool-controller.<<namespace>>.svc.cluster.local:9000/controller/ws --o:monitors.monitor[0][@retryInterval]=5 --o:num_prespawn_children=2 --o:per_document.limit_load_secs=300 --o:per_document.idle_timeout_secs=300 # --- Uncomment for End-to-End TLS --- # extra_params: >- # --o:ssl.enable=true # --o:ssl.termination=false # --o:ssl.cert_file_path=/etc/coolwsd/certs/tls.crt # --o:ssl.key_file_path=/etc/coolwsd/certs/tls.key # --o:ssl.ca_file_path=/etc/coolwsd/certs/tls.crt # --o:ssl.ssl_verification=false # --o:indirection_endpoint.url=https://connections.example.com/controller/routeToken # --o:monitors.monitor[0]=ws://collabora-online-cool-controller.<<namespace>>.svc.cluster.local:9000/controller/ws # --o:monitors.monitor[0][@retryInternal]=5 # --o:num_prespawn_children=2 # --o:per_document.limit_load_secs=300 # --o:per_document.idle_timeout_secs=300 existingSecret: enabled: true secretName: "collabora-admin-secret" usernameKey: admin-username passwordKey: admin-password env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name # --- Uncomment for End-to-End TLS --- # extraVolumes: # - name: certs-volume # secret: # secretName: "cnx-tls-secret" # extraVolumeMounts: # - name: certs-volume # mountPath: /etc/coolwsd/certs # readOnly: true # probes: # scheme: HTTPS ingress: enabled: true className: nginx annotations: nginx.ingress.kubernetes.io/upstream-hash-by: "$arg_RouteToken" nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" nginx.ingress.kubernetes.io/ssl-redirect: "false" # --- Uncomment for End-to-End TLS --- # nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" # nginx.ingress.kubernetes.io/proxy-ssl-verify: "off" hosts: - host: "*.internal.example.com" paths: - path: /cool/ pathType: Prefix - path: /browser/ pathType: Prefix - path: /hosting/ pathType: Prefix - host: "*.example.com" paths: - path: /cool/ pathType: Prefix - path: /browser/ pathType: Prefix - path: /hosting/ pathType: Prefix tls: - secretName: "cnx-tls-secret" hosts: - "*.internal.example.com" - "*.example.com" autoscaling: enabled: true targetMemoryUtilizationPercentage: 60 targetCPUUtilizationPercentage: 80 resources: limits: cpu: "8000m" memory: "8000M" requests: cpu: "4000m" memory: "6000M" cool-controller: replicaCount: 1 image: repository: "hclcr.io/cnx-collabora/cool-controller" imagePullSecrets: - name: myregkey ingress: enabled: true className: nginx annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" nginx.ingress.kubernetes.io/ssl-redirect: "false" hosts: - host: "*.internal.example.com" paths: - path: "/controller" pathType: Prefix - host: "*.example.com" paths: - path: "/controller" pathType: Prefix tls: - secretName: "cnx-tls-secret" hosts: - "*.internal.example.com" - "*.example.com" controller: watchNamespace: <<namespace>> #e.g. connections or collabora resourceName: "collabora-online" ingressUrl: "https://connections.example.com" ingressHostname: "connections.example.com" skipTLSVerification: true expectedDocumentMemory: 115M statsInterval: 2000 documentMigrator: enabled: true coolMemoryUtilization: 60 coolMemoryLimit: "8000M" -
-
Install or upgrade the
collabora-online-umbrellachart using your custom values file by running the following command:helm upgrade collabora-online <<oci_registry_url>>/collabora-online-umbrella -i \ --version <<version from step 1>> --namespace <<namespace>> \ -f collabora-values.yaml --waitNote
If you are deploying on OpenShift, see Installing Component Pack on OpenShift for important platform-specific instructions.
Where:
<<oci_registry_url>>is the Harbor OCI container registry URI (oci://hclcr.io/cnx-collabora).<<version from step 1>>is the chart version that you retrieved in step 1 (for example,1.4.0).<<namespace>>is the namespace where Collabora Online is installed (for example,connectionsorcollabora).
Configuring the HTTP server
After Collabora Online is installed, add proxy rules to httpd.conf for your IBM HTTP Servers. For the proxy rules, see Configuring the HTTP server.
Configure local redirect for Files
Configure local redirect for the Files application so that the Files content directory can be streamed efficiently through IBM HTTP Server. This requires the mod_ibm_local_redirect module to be loaded.
If the module is not already loaded, follow Configuring web servers for downloading files before continuing with the configuration below.
Add the following Files local redirect configuration to httpd.conf. Replace <FILES_CONTENT_DIR> with the actual path of your Files content directory (the value of the FILES_CONTENT_DIR WebSphere variable, for example /opt/IBM/SharedArea/files/upload):
# BEGIN FILES LOCAL REDIRECT CONFIG
alias /files_content <FILES_CONTENT_DIR>
<Directory "<FILES_CONTENT_DIR>">
Require env REDIRECT_FILES_CONTENT
</Directory>
<Location /files>
IBMLocalRedirect On
IBMLocalRedirectKeepHeaders X-LConn-Auth,Cache-Control,Content-Type,Content-Disposition,Last-Modified,ETag,Content-Language,Set-Cookie,Title,X-UA-Compatible
SetEnv FILES_CONTENT true
</Location>
# END FILES LOCAL REDIRECT CONFIG
After you update httpd.conf, restart the IBM HTTP Server.
Configuring NGINX as a WebSocket proxy
Note
This section is applicable only if you are using nginx as your load balancer.
Collabora Online uses WebSocket connections for real-time collaboration. The HTTP paths (/browser, /hosting, /cool) are served through IBM HTTP Server. NGINX only needs to proxy the WebSocket traffic (/cool/... and /controller/... upgrade paths) to the ingress controller.
In the snippet that follows, substitute the placeholders with values from your environment, using the same conventions as in Configuring the HTTP server:
SSH to the NGINX server and edit the Nginx configuration file, eg. /etc/nginx/nginx.conf. Make a backup of the file before you change it.
Add the following location block inside both the existing listen 443 ssl and listen 80 server blocks:
# BEGIN COLLABORA WEBSOCKET PROXY
location ~ ^/(cool|controller)/(adminws|ws|.+/ws)$ {
proxy_pass http://cpmaster.internal.example.com:32080;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_read_timeout 600s;
}
# END COLLABORA WEBSOCKET PROXY
Note
If TLS is enabled, change the proxy_pass upstream to https://cpmaster.internal.example.com:32443. For more details on the supported proxy patterns, see Proxy settings in the Collabora Online SDK documentation.
Validate and reload NGINX:
sudo nginx -t && sudo systemctl reload nginx
Alternative load balancer configurations
If your deployment does not use NGINX as the WebSocket proxy, refer to the appropriate subsection below based on your load balancer type.
1. Layer 7 load balancer (for example, AWS ALB)
A Layer 7 (Application) load balancer understands HTTP and natively supports the WebSocket upgrade handshake. WebSocket routing to Collabora is handled by dedicated target groups and listener rules instead of an NGINX location block — no additional workaround is needed.
- To set up a new ALB, see Setting up an Application Load Balancer.
- To migrate from an AWS CLB to an ALB, see Migrating from Classic Load Balancer to Application Load Balancer.
2. Layer 4 load balancer (for example, CLB)
A Layer 4 (Network) load balancer such as the AWS Classic Load Balancer (CLB) does not support the WebSocket upgrade handshake on its default HTTP or HTTPS listeners, which causes Collabora connections to be dropped. If migrating to a Layer 7 load balancer is not practical, you can work around this limitation by configuring a dedicated TCP listener on a separate port.
A TCP listener forwards raw byte streams without inspecting HTTP content, so the WebSocket upgrade handshake and all subsequent frames pass through transparently. The trade-off is that TCP listeners cannot perform path-based routing, which is why a separate port is needed — it ensures all traffic on that port goes to the Collabora backend only.
Setting up the back-channel port:
-
Add a TCP listener on a dedicated port (for example,
8443) on the load balancer. Point it at the ingress controller endpoint (typically32080for HTTP or32443for HTTPS). -
Update the Collabora Helm values so that the editor's WebSocket URLs use the dedicated port. Adjust the relevant parameters in
collabora.extra_paramsandcollabora.server_namewithincollabora-values.yaml. -
Open firewall and security group rules for the dedicated port.
-
Increase the idle timeout for the dedicated listener to at least 300–600 seconds to avoid premature disconnects during editing sessions.
The resulting traffic flow:
Browser ──HTTPS :443──▶ Layer 4 LB ──TCP──▶ IHS ──▶ Connections / Collabora HTTP paths
Browser ──WSS :8443──▶ Layer 4 LB ──TCP──▶ K8s Ingress (Traefik) ──▶ Collabora pods
Note
For details on configuring TCP and SSL listeners on a CLB, see Listeners for your Classic Load Balancer in the AWS documentation.
For additional load balancer configuration, see Load balancing examples in the Collabora Online SDK documentation.
Configuring Collabora in HCL Connections
For administrator procedures to enable and secure the Collabora integration, see Configuring Collabora Online.
Post-installation tasks
Validation checklist
After installation, verify the following:
-
Confirm that all pods are in
RunningorCompletedstatus by running the following command:kubectl get pods -n <<namespace>> # e.g. connections or collaboraExample output:
NAME READY STATUS RESTARTS AGE cnx-ingress-traefik-5f47854cfd-cwmgr 1/1 Running 0 6h2m collabora-online-78dd5d6856-9fcfw 1/1 Running 0 6h1m collabora-online-78dd5d6856-h589k 1/1 Running 0 6h1m collabora-online-cool-controller-67ddb49bd8-kshrz 1/1 Running 0 6h1m -
Verify that the Collabora Online admin console is accessible at the configured domain:
https://<<your-domain>>/browser/dist/admin/admin.html https://<<your-domain>>/browser/dist/admin/adminClusterOverview.htmlLog in with the credentials defined in the
collabora-admin-secret(the values of$COLLABORA_ADMIN_USERNAMEand$COLLABORA_ADMIN_PASSWORD). -
Verify that the WOPI discovery endpoint is accessible at
https://<<your-domain>>/hosting/discovery. -
End-to-end test — Sign in to HCL Connections, open the Files application, and open a
.docx,.xlsx, or.pptxfile that you have edit access to. Confirm that:- The Collabora editor loads in the browser without a WebSocket error.
- You can make a change and save it, and the change is visible when you reopen the file.
Troubleshooting
Pods are not starting
Inspect the pod state and logs:
- Run:
kubectl get pods -n <<namespace>>andkubectl describe pod <<pod-name>> -n <<namespace>>. - Check logs using:
kubectl logs <<pod-name>> -n <<namespace>>.
Image pull failures
Verify that the image pull secret is present and correct:
kubectl get secrets -n <<namespace>>
kubectl describe secret myregkey -n <<namespace>>
WebSocket connection issues
Check the load balancer logs. For nginx:
tail -f /var/log/nginx/error.log
HTTP Server configuration errors
Validate the httpd.conf syntax and inspect the error log:
/opt/IBM/HTTPServer/bin/apachectl configtest
tail -f /opt/IBM/HTTPServer/logs/error_log
Collabora editor fails to load from Files
If a document opens in HCL Connections Files but the Collabora editor shows a load error, the WOPI wiring between Files and Collabora is incorrect:
-
Confirm that the WOPI discovery endpoint returns XML (not an HTML error page):
curl -k https://<<your-domain>>/hosting/discovery -
In
collabora-values.yaml, verify thatcollabora.extra_paramssets--o:indirection_endpoint.urlto the correcthttps://<<your-domain>>/controller/routeTokenURL, and thatserver_namematches the browser-facing FQDN. - Confirm that the Collabora configuration in HCL Connections (see Configuring Collabora in HCL Connections) has been completed and the Files service was restarted after the change.
Editor loads but changes cannot be saved
If the editor opens but save fails or the document reverts on reload:
- Verify that the
mod_ibm_local_redirectmodule is loaded in IBM HTTP Server and that the Files local redirect configuration inhttpd.confis present and points to the correctFILES_CONTENT_DIR. See Configuring the HTTP server. - Check the Files service logs (
SystemOut.logon the Files server) for403or401responses on the WOPIPutFileendpoint, which indicate a permissions or authentication issue on the Files side.
Admin console returns 401 or 403
If https://<<your-domain>>/browser/dist/admin/admin.html returns a 401 or 403 error:
-
Confirm that the
collabora-admin-secretexists in the Collabora namespace and that itsadmin-usernameandadmin-passwordkeys hold the credentials you are typing:kubectl get secret collabora-admin-secret -n <<namespace>> -o jsonpath='{.data.admin-username}' | base64 -d -
If you rotated the secret after the initial deployment, restart the
collabora-onlinepods so that the new credentials are picked up:kubectl rollout restart deployment collabora-online -n <<namespace>>
Parent Topic: Installing and Configuring Collabora Online