Skip to content

Docmost

Deploy Docmost on Kubernetes — an open-source collaborative wiki and documentation platform. Supports bundled or external PostgreSQL and Redis, local PVC or S3 uploads storage, and scheduled pg_dump backups.

appUrl must be set explicitly in production

If docmost.appUrl is empty, Docmost auto-detects the URL from the Ingress host. In production, always set it explicitly (e.g. https://wiki.example.com). An incorrect appUrl causes password reset emails, invite links, and OAuth redirects to reference the wrong address.

Key Features

  • Collaborative wiki — real-time editing, spaces, pages, and permissions
  • PostgreSQL + Redis — bundled subcharts or external connections
  • Auto-bootstrapunaccent and pg_trgm extensions granted on first start
  • Storage modes — local PVC (single replica) or S3-compatible (scalable)
  • pg_dump backup — scheduled CronJob to S3; database-only (uploads separate)
  • JWT sessions — configurable jwtTokenExpiresIn with auto-generated app secret

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install docmost helmforge/docmost -f values.yaml

OCI registry:

helm install docmost oci://ghcr.io/helmforgedev/helm/docmost -f values.yaml

Deployment Examples

# values.yaml — Docmost with bundled PostgreSQL and Redis
docmost:
  appUrl: 'https://wiki.example.com'
  appSecret: 'generate-with-openssl-rand-hex-32'

postgresql:
  enabled: true
  auth:
    database: docmost
    username: docmost
    password: 'strong-db-password'
  standalone:
    persistence:
      enabled: true
      size: 8Gi

redis:
  enabled: true
  standalone:
    persistence:
      enabled: true
      size: 1Gi

storage:
  mode: local
  local:
    enabled: true
    size: 20Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: wiki.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Docmost with external PostgreSQL and Redis
# IMPORTANT: On the external PostgreSQL instance, run before installing:
#   GRANT CREATE ON DATABASE docmost TO docmost;
#   \connect docmost
#   CREATE EXTENSION IF NOT EXISTS unaccent;
#   CREATE EXTENSION IF NOT EXISTS pg_trgm;
docmost:
  appUrl: 'https://wiki.example.com'
  appSecret: 'generate-with-openssl-rand-hex-32'

postgresql:
  enabled: false

database:
  mode: external
  external:
    host: postgres.database.svc.cluster.local
    port: 5432
    name: docmost
    username: docmost
    existingSecret: docmost-db-credentials
    existingSecretPasswordKey: database-password

redis:
  enabled: false
  external:
    host: redis.cache.svc.cluster.local
    port: 6379
    existingSecret: docmost-redis-credentials
    existingSecretPasswordKey: redis-password

storage:
  mode: local
  local:
    enabled: true
    size: 20Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: wiki.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Docmost with S3 uploads (enables horizontal scaling)
docmost:
  appUrl: 'https://wiki.example.com'
  appSecret: 'generate-with-openssl-rand-hex-32'

postgresql:
  enabled: true
  auth:
    password: 'strong-db-password'

redis:
  enabled: true

storage:
  mode: s3 # no local PVC created; allows replicaCount > 1
  s3:
    region: us-east-1
    bucket: docmost-uploads
    endpoint: https://s3.amazonaws.com # or MinIO endpoint
    forcePathStyle: true # required for MinIO and most S3-compatible providers
    existingSecret: docmost-s3-credentials
    existingSecretAccessKeyKey: access-key
    existingSecretSecretKeyKey: secret-key

replicaCount: 2 # safe to scale with S3 storage
# values.yaml — Full production Docmost with backup and TLS
docmost:
  appUrl: 'https://wiki.example.com'
  appSecret: 'generate-with-openssl-rand-hex-32'
  jwtTokenExpiresIn: 30d

postgresql:
  enabled: true
  auth:
    database: docmost
    username: docmost
    password: 'strong-db-password'
    postgresPassword: 'strong-superuser-password'
  standalone:
    persistence:
      enabled: true
      size: 20Gi

redis:
  enabled: true
  auth:
    enabled: true
    password: 'strong-redis-password'
  standalone:
    persistence:
      enabled: true
      size: 1Gi

storage:
  mode: local
  local:
    enabled: true
    size: 50Gi

backup:
  enabled: true
  schedule: '0 3 * * *'
  s3:
    endpoint: https://s3.amazonaws.com
    bucket: docmost-backups
    existingSecret: docmost-backup-s3-credentials

resources:
  requests:
    memory: 256Mi
    cpu: 200m
  limits:
    memory: 1Gi

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: wiki.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: docmost-tls
      hosts:
        - wiki.example.com

Configuration Reference

Core

ParameterTypeDefaultDescription
replicaCountinteger1Pod replicas. Safe to increase only with storage.mode: s3.
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.
commonLabelsobject{}Extra labels added to all resources.

Image

ParameterTypeDefaultDescription
image.repositorystringdocker.io/docmost/docmostDocmost image.
image.tagstring"0.70.3"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.

Docmost Configuration

ParameterTypeDefaultDescription
docmost.appUrlstring""Full public URL. Auto-detected from first Ingress host if empty. Set explicitly in production.
docmost.appSecretstring""Application secret key. Auto-generated if empty. Store in a stable secret for production.
docmost.jwtTokenExpiresInstring30dJWT token expiration for user sessions.
docmost.extraEnvarray[]Extra environment variables for the container.

Database

Auto-detection precedence (database.mode: auto):

  1. database.external.host or database.external.existingSecret → external PostgreSQL
  2. postgresql.enabled: true → bundled PostgreSQL subchart
ParameterTypeDefaultDescription
database.modestringautoDatabase mode: auto, external, or postgresql.
database.external.hoststring""External PostgreSQL hostname.
database.external.portinteger5432External PostgreSQL port.
database.external.namestringdocmostDatabase name.
database.external.usernamestringdocmostDatabase username.
database.external.existingSecretstring""Existing secret with the database password.
database.external.existingSecretPasswordKeystringdatabase-passwordKey for the password in the existing secret.
External PostgreSQL requires manual extension setup

When using an external PostgreSQL, the bundled bootstrap scripts do not run. Before installing Docmost, manually execute on the target database:

GRANT CREATE ON DATABASE docmost TO docmost;
\connect docmost
CREATE EXTENSION IF NOT EXISTS unaccent;
CREATE EXTENSION IF NOT EXISTS pg_trgm;

PostgreSQL Subchart

ParameterTypeDefaultDescription
postgresql.enabledbooleantrueDeploy the bundled PostgreSQL subchart.
postgresql.auth.databasestringdocmostDatabase name.
postgresql.auth.usernamestringdocmostDatabase username.
postgresql.auth.passwordstring""Database password. Auto-generated if empty.
postgresql.auth.postgresPasswordstring""Superuser password. Auto-generated if empty.
postgresql.standalone.persistence.sizestring8GiPVC size for PostgreSQL.

Redis Subchart / External

ParameterTypeDefaultDescription
redis.enabledbooleantrueDeploy the bundled Redis subchart.
redis.auth.enabledbooleantrueEnable Redis password authentication.
redis.auth.passwordstring""Redis password. Auto-generated if empty.
redis.standalone.persistence.sizestring1GiPVC size for Redis.
redis.external.hoststring""External Redis hostname.
redis.external.existingSecretstring""Existing secret with external Redis password.

Storage

local storage limits replicaCount to 1

With storage.mode: local, the uploads PVC uses ReadWriteOnce. Only one pod can mount it at a time — setting replicaCount > 1 will leave extra pods in Pending state. Switch to storage.mode: s3 to enable horizontal scaling.

ParameterTypeDefaultDescription
storage.modestringlocalStorage mode: local (PVC) or s3.
storage.local.enabledbooleantrueCreate a local PVC for uploads.
storage.local.sizestring10GiUploads PVC size.
storage.local.storageClassstring""StorageClass for the uploads PVC.
storage.local.existingClaimstring""Use an existing PVC for uploads.
storage.s3.regionstringus-east-1S3 region.
storage.s3.bucketstring""S3 bucket name.
storage.s3.endpointstring""S3-compatible endpoint URL.
storage.s3.forcePathStylebooleantrueForce path-style requests. Required for MinIO.
storage.s3.existingSecretstring""Existing secret with S3 credentials.
storage.s3.existingSecretAccessKeyKeystringaccess-keyKey for the S3 access key.
storage.s3.existingSecretSecretKeyKeystringsecret-keyKey for the S3 secret key.

Backup

The backup CronJob runs pg_dump and uploads the result to S3. Upload files are not included.

ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled pg_dump S3 backup.
backup.schedulestring"0 3 * * *"Cron schedule.
backup.archivePrefixstringdocmostPrefix for backup archive filenames.
backup.images.postgresqlstringpostgres:18-alpineImage providing pg_dump.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.existingSecretstring""Existing secret with S3 credentials.

Service and Ingress

ParameterTypeDefaultDescription
service.typestringClusterIPService type.
service.portinteger80Service port.
ingress.enabledbooleanfalseEnable an Ingress resource.
ingress.ingressClassNamestring""Ingress class name.
ingress.annotationsobject{}Ingress annotations (e.g. cert-manager).
ingress.hostsarray[]Host and path rules.
ingress.tlsarray[]TLS configuration.

Probes

All probes use /api/health as the HTTP path.

ParameterTypeDefaultDescription
startupProbe.enabledbooleantrueEnable startup probe.
startupProbe.failureThresholdinteger30Startup probe failure threshold.
livenessProbe.enabledbooleantrueEnable liveness probe.
readinessProbe.enabledbooleantrueEnable readiness probe.

Resources and Scheduling

ParameterTypeDefaultDescription
resourcesobject{}CPU and memory requests/limits.
terminationGracePeriodSecondsinteger30Termination grace period.
nodeSelectorobject{}Node selector for scheduling.
tolerationsarray[]Tolerations for scheduling.
extraVolumesarray[]Extra volumes.
extraVolumeMountsarray[]Extra volume mounts.
extraManifestsarray[]Extra Kubernetes manifests.

More Information