This document introduces a guide to setting up ThinkfreeOffice HelmChart which allows clients to modify container environments in various ways through configuration files.
1. Common
key | default value | explanation |
|---|---|---|
|
| The product name that serves as the basis for the resource name. |
|
| Replace the entire prefix above with this value. |
|
| The namespace where resources will be created. |
|
| The default number of Pods for all components. |
|
| During installation or upgrade , verify in advance whether the PVCs (mongodb, redis, and WAS persistence) created by the chart |
|
| A registry/account prefix prepended to all component images. |
|
| Image tag for all components. |
|
| Image pull policy. |
|
| A list of existing imagePullSecret names. |
|
| chart |
|
| Registry server address. |
|
| Registry account. |
|
| Utility image for initContainer waiting for other services to start (was → document-word/show, filter → broker-0). |
|
| Whether to create a Service Account per component. |
|
| ServiceAccount annotation. |
|
| Whether to automatically mount the ServiceAccount token to the Pod. |
|
| Creates the Role/RoleBinding required for document-word / document-show to find members of the same Service (refer to pods/endpoints/services/endpointslices). |
global:
image:
registry: docker.io/<account>
tag: "" # empty chart appVersion
registryCredentials:
enabled: true
username: <account>
password: <token>2. startup
It is responsible for account creation, MongoDB ReplicaSet configuration, Redis replication/Sentinel registration, HancomAdmin.SETTINGlogging ADAPTER, and recording completion markers.
All app Pods wait-for-initrun the same image as the initContainer and wait for the completion marker.
key | default value | Corresponding environment variables | explanation |
|---|---|---|---|
|
|
| Overwrite startup image name and global value. |
|
|
| Total job timeout (seconds). |
|
|
| DB CLI single call timeout (seconds). |
|
|
|
|
|
|
| Number of retries on job failure. |
|
|
| Time (in seconds) until a completed job is automatically deleted. |
|
|
| Job metadata. |
|
|
| Job Pod annotation. |
| requests 100m / 256Mi |
| Job container resources. |
|
|
| Job Pod deployment. |
|
|
|
|
|
|
| The provider settings for the AI relay |
| hostStorage |
| List of storage adapters. |
|
|
| Whether to use the hostStorage type adapter. |
|
|
| License file contents (base64). |
|
|
| The existing Secret name containing the license. |
|
|
| The key where the license file is stored within that Secret. |
|
|
| A list of environment variables added to the Job and all initContainers. |
startup:
initTimeout: 600
settings:
wasURI: "https://office.example.com" # replace with external address
someFlag: "true"
aiProviderConfig:
aiProvider: openai
model: gpt-4o
endpoint: https://api.openai.com/v1
apiKey: "e$..."
adapters: # Since the entire list is replaced, be sure to include the default local adapter as well.
- type: hostStorage
name: local
params:
HOST_STORAGE_NAME: docs
HOST_STORAGE_ROOT: /home/thinkfree/docs
- type: s3
name: bucket
params:
S3_ACCESS_KEY: "AKIA..."
S3_SECRET_ACCESS_KEY: "..."
S3_REGION: ap-northeast-2
S3_BUCKET: my-bucket
S3_PREFIX: office/
license:
existingSecret: tfo-license # kubectl create secret generic tfo-license --from-file=thinkfree.licenseWhen entering the license directly as a value:
helm upgrade thinkfree ./thinkfree-office -n thinkfree -f my-values.yaml \ --set startup.license.base64="$(base64 -w0 thinkfree.license)"
3. was
key | default value | explanation |
|---|---|---|
| (global) | Pod count. |
|
| Overwrite image name and global value. |
|
| Service Type. |
|
| Service port. |
|
|
|
|
| Service annotation. |
|
| The default URL that the WAS calls the relay-server ( |
|
| Asynchronous request timeout (ms |
|
| Stream thread pool default/max size ( |
|
| Stream thread pool queue capacity ( |
|
| Pod Deployment · Metadata. |
|
| Since the Pod container runs as non-root (uid/gid 1000), |
| enabled, 30/10/5/1/5 | Tomcat Port (8080) TCP Check. |
|
| liveness HTTP path (port 8070). |
| enabled, 60/10/5/1/5 | For reference , the order of the values is |
| requests 500m / 3Gi | Container resource requests (limits if necessary). |
|
| HPA creation. |
|
| HPA scaling rate (autoscaling/v2 |
|
| Create Ingress. |
|
|
|
|
| An existing PVC name. |
|
| StorageClass, size, and annotations to create a PVC |
|
| PVC access mode. |
|
|
|
|
| Mount location inside the container. |
|
|
|
|
| Additional environment variables. |
was:
replicaCount: 2
autoscaling:
enabled: false
service:
type: ClusterIP
port: 80
relayAccess:
asyncRequestTimeoutMs: 600000
streamCorePoolSize: 32
streamMaxPoolSize: 64
streamQueueCapacity: 0
resources:
requests: { cpu: "1", memory: 3Gi }
limits: { memory: 4Gi }
ingress:
enabled: true
ingressClassName: alb
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/healthcheck-path: /cloud-office/hc.jsp
hosts: [office.example.com]
paths: ["/"]
pathType: Prefix
tls:
- hosts: [office.example.com]
secretName: office-tls
persistence:
enabled: true
storageClass: efs-sc # EFS: Shared by WAS Pods across multiple nodes and AZs
accessMode: ReadWriteMany
size: 50Gi
mountPath: /home/thinkfree/docs # hostStorage adapter HOST_STORAGE_ROOT
# When using an existing PVC (e.g., a static PV that attaches an S3 bucket via the Mountpoint CSI driver):
# persistence: { enabled: true, existingClaim: office-docs, mountPath: /home/thinkfree/docs }4. broker
Only 1 or 2replicaCount are allowed for the Active/Standby structure (otherwise installation fails). pod-0 is the master (8888 listen), and pod-1 is the standby.
key | default value | explanation |
|---|---|---|
| (global) | Number of Pods. |
|
| Overwrite image name and global value. |
|
| Pod Deployment · Metadata. |
| 10/10/5/1/5, 60/10/5/1/5 | Pod-0 is checked for port 8888. Since |
| requests 200m / 512Mi | Container resources. |
|
| Additional environment variables. |
broker:
replicaCount: 2
resources:
requests: { cpu: 500m, memory: 1Gi }5. filter
key | default value | explanation |
|---|---|---|
| (global) | Number of Pods. Ignored when using |
|
| Overwrite image name and global value. |
|
| Pod Deployment · Metadata. |
| requests 500m / 1Gi | Container resources. |
| disabled, 1/3, 50/80, behavior | HPA settings. |
|
| Additional volumes and environment variables. |
filter:
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 6
targetCPU: "60"
targetMemory: "" #Exclude the metric if the value is empty6. document (word / show)
document.word.*and document.show.*have the same key.
key | default value | explanation |
|---|---|---|
| (global) | Number of Pods. Ignored when using |
|
| Overwrite image name and global value. |
|
| Hazelcast cluster mode ( |
|
| Pod Deployment · Metadata. |
| 20/10/5/1/5, 60/10/5/1/5 | HTTP inspection. |
| requests 500m / 2560Mi | Container resources. |
| disabled, 1/3, 50/80 | HPA settings ( |
|
| Read directly by the JVM |
|
| Pod termination grace period (seconds). |
|
| Additional environment variables. |
document:
word:
replicaCount: 3
autoscaling: { enabled: false }
resources:
requests: { cpu: "1", memory: 2500Mi }
show:
replicaCount: 3
autoscaling: { enabled: false }7. relay
The provider configuration startup.aiProviderConfigreads from the relay.server.*`/ / /` written by the startup job. It corresponds one-to-one with the container's environment variables, and only keys with values are passed (empty values retain the built-in default).relay.sse.*relay.async.*relay.jvmOptsRELAY_*""
key | default value | Corresponding environment variables | explanation |
|---|---|---|---|
|
|
| Whether to use relay. |
| (global) |
| Number of Pods. Ignored when using |
|
|
| Overwrite image name and global value. |
|
|
| Bind address. |
|
|
| Receive port. |
|
|
| Relay endpoint default path. |
|
|
| Health check path. |
|
|
| CORS allowed origin. |
|
|
| Request body size limit (bytes). |
|
|
| Maximum number of concurrent SSE streams. |
|
|
| Asynchronous request timeout (ms). |
|
|
| JVM options. Replaces the entire |
|
|
| ClusterIP Service port and annotation. |
|
|
| Pod Deployment · Metadata. |
|
|
| Readiness test path. |
| 20/10/5/1/5, 60/10/5/1/5 |
| HTTP GET health path inspection. |
| requests 200m / 768Mi |
| Container resources. |
| disabled, 1/3, 50/80, behavior |
| HPA settings. |
|
|
| Additional volumes and environment variables. |
relay:
server:
path: /ai-agent/relay
corsOrigin: "*"
bodyLimitBytes: 209715200
sse:
maxConcurrentStreams: 64
async:
requestTimeoutMs: 600000
autoscaling:
enabled: false
resources:
requests: { cpu: 200m, memory: 768Mi }8. redis
The embedded Redis launches the official image as a StatefulSet and uses the / valkey/valkeyincluded in the chart . If so, it uses external Redis.valkey.confsentinel.confenabled: false
key | default value | Corresponding environment variables | explanation |
|---|---|---|---|
|
|
| Whether to use embedded Redis. If so, it uses the external Redis |
|
|
| External Redis |
|
|
| External Sentinel |
| (global) |
| Number of members. |
|
|
|
|
|
|
| headless Service port. |
|
|
| Service annotation. |
|
|
| Pod Deployment · Metadata. |
| 5/10/5/1/5, 30/10/10/1/6 |
|
|
| requests 100m / 256Mi |
| Container resources. |
|
|
| Stores RDB snapshots in member-specific PVCs . The default is emptyDir : used for session and cache purposes; if replica + Sentinel is enabled, recreated Pods are synchronized back from the master. Enable this if you are on a single node or want to retain data even after a full restart (pod-0's snapshot serves as the reference during a full restart). Only data remains in the PVC , and configuration files are newly created at every startup. |
|
|
| StorageClass, access mode, size, and annotation to create the PVC |
|
|
| PVC handling method during scale-in |
|
|
| Additional volumes and environment variables. |
| (Unspecified → |
| Redis password (built-in requirepass, external Redis authentication). |
redis:
replicaCount: 3
auth:
password: "Str0ngPass"
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
labelSelector:
matchLabels: { app: thinkfree-office-redis }9. redisSentinel
redis.enabled: trueIt is created only when... If Sentinel is present, the app attaches to Redis in Sentinel mode.
key | default value | Corresponding environment variables | explanation |
|---|---|---|---|
|
|
| Whether to use Sentinel. |
| (global) |
| Sentinel count. |
| (redis.image) |
| Sentinel image. |
|
|
| Headless Service Ports and Annotations |
|
|
| Number of Sentinels required for failover consensus. |
|
|
| Pod Deployment · Metadata. |
| 5/10/5/1/5, 30/10/10/1/6 |
|
|
| requests 50m / 64Mi, |
| Container resources and additional volumes/environment variables. |
| (Unspecified → |
| The master name managed by Sentinel. |
redisSentinel: replicaCount: 3 quorum: "2"
10. mongodb
The embedded MongoDB is an official mongoimage StatefulSet, and all members appear as ReplicaSet members. replicaCount: 1It is configured as a single-member ReplicaSet, and when expanded, the next startup Job( helm upgrade) joins the new member (shrinking is done rs.removemanually afterwards). enabled: falseIf so, use external MongoDB.
key | default value | Corresponding environment variables | explanation |
|---|---|---|---|
|
|
| Whether to use embedded MongoDB. If so, use external MongoDB |
|
|
| External MongoDB |
|
|
| External ReplicaSet name. |
| (global) |
| Number of members. |
|
|
|
|
|
|
| Headless Service Ports and Annotations |
|
|
| Pod Deployment · Metadata. |
| 10/10/5/1/6, 60/20/10/1/6 |
| 27017 Port TCP Check. |
| requests 250m / 1Gi |
| Container resources. |
|
|
| MongoDB data storage method. |
|
|
| The StorageClass name to create the volume ( |
|
|
| PVC access mode, size, and annotations. |
|
|
| PVC handling method during scale-in |
|
|
| Additional volumes and environment variables. |
|
|
| Root account. |
|
|
| Management DB account (dbOwner). |
|
|
| Accounts by product. |
|
|
| Accounts by product. |
|
|
| Accounts by product. |
|
|
| File storage (GridFS) account. |
|
|
| Built-in ReplicaSet name. |
|
|
| Contents of the keyFile for member-to-member authentication. |
|
|
| The name of an existing Secret containing the keyFile. |
|
|
| The key where the keyFile is stored within that Secret. |
|
|
| Allowed IPs for administrator page access. |
mongodb:
replicaCount: 3
persistence:
enabled: true # Operation: Required (defaults to an emptyDir test installation)
storageClass: gp3
size: 100Gi
auth:
rootPassword: "R00tPass"
adminPassword: "Adm1nPass"
replicaSet:
existingSecret: tfo-mongodb-keyfile
adminIps: "10.0.0.0/8"Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article