Skip to main content

Overview

Documenso is an open-source e-signature platform, a DocuSign alternative: upload a PDF, place signature fields, send it to recipients, and get back a PDF digitally signed with your own certificate plus an audit trail. This template deploys the Documenso server (UI, REST API, signing pages, and background jobs on port 3000) with a bundled PostgreSQL, single-instance by default and highly available behind one flag. Documents are stored in the database or in an S3 bucket you own. Documenso runs in exactly one location of your GVC.
This template deploys into an existing GVC that you already have — it does not create or manage a GVC. The location you set must already be one of that GVC’s locations; if it is not, Documenso starts nothing in the GVC.

What Gets Created

Your signing certificate, application keys, and database credentials are not created by the template — see Prerequisites.

Prerequisites

Three secrets must exist before installing, and the GVC should have one location (see the last step). The values never pass through Helm values.
1

Create the signing certificate secret

An opaque secret holding the base64 text of a PKCS#12 (.p12) file. Documenso signs every completed PDF with it. Use the default openssl pkcs12 -export. Reading the passphrase into a variable keeps it out of your shell history:
Set signing.certificateSecretName to this name. Use a certificate from your own CA instead of the self-signed one above if signers must see a trusted signature.
2

Create the application keys secret

A dictionary secret with four keys. signingPassphrase is the certificate’s password from the previous step:
Set secrets.name to this name. Back the keys up outside Control Plane and never replace encryptionKey: it protects two-factor secrets and API tokens.
3

Create the database credentials secret

The bundled PostgreSQL initializes with these values and Documenso connects with them:
Set postgres.config.credentialsSecretName to this name (postgresHA.config.credentialsSecretName in highly available mode). Secret names are org-wide, so give each release its own secrets. The three values are part of Documenso’s connection URL, so use letters, digits, - and _ only.
4

Use a GVC with one location

Documenso runs only in the location named by location, which must already be a location of your GVC. The bundled PostgreSQL starts in every location of the GVC, so a GVC with a single location keeps one Documenso against one database.
Create all three secrets before installing. Installing without one reports success, but the deployment never becomes ready and cpln logs stays empty; status.versions[].message from the command below names the missing secret:
Create the secret and the deployment recovers on its own (cpln workload force-redeployment RELEASE_NAME-documenso --gvc GVC_NAME skips the wait); see Troubleshooting.
Optional features need their own setup first: an S3 bucket for documents (see Storage Setup), a backup bucket (see Backing Up), and an SMTP relay (see Email).

Installation

Once your three secrets exist, install from the marketplace registry, pointing the keys at them and location at a location of your GVC:
Other ways to install and manage the template:

UI

Browse, install, and manage templates visually

CLI

Manage templates from your terminal

Terraform

Declare templates in your Terraform configurations

Pulumi

Declare templates in your Pulumi programs

Configuration

Location

Use a bare location name such as aws-us-east-1. A link form (//location/aws-us-east-1), a list, or a comma-separated value is refused at render time.

Documenso Server

Prerequisite Secrets

Both must exist before install — see Prerequisites. The database credentials secret is set under Database.

Sign-up

Document Storage

With database, every PDF grows the PostgreSQL volume, so raise postgres.volumeset.capacity for heavy use. With s3, complete Storage Setup first.

Storage Setup

Only for storage.type: s3. Both paths set storage.s3.bucket and storage.s3.region. AWS S3 (keyless) — create the bucket and a Control Plane cloud account for the AWS account, and set storage.s3.cloudAccountName. Create this IAM policy (replace YOUR_BUCKET_NAME), set storage.s3.policyName to its name, and leave storage.s3.auth.secretName empty.
S3-compatible server (such as MinIO) — create the bucket, set storage.s3.endpoint with its scheme and fully qualified host (http://MINIO_WORKLOAD_NAME.GVC_NAME.cpln.local:9000), set storage.s3.forcePathStyle: true, then create the keys secret and set storage.s3.auth.secretName to its name:

Email

With SMTP off no mail is sent: verification and signature-request emails fail, so copy each signing link out of the UI and send it yourself. fromAddress and fromName are required even when SMTP is off. For an authenticated relay, create the dictionary and set smtp.auth.secretName:

Telemetry

Access

A change to either access knob takes a couple of minutes to take effect after the upgrade reports success.

Database

Highly available mode runs three Patroni replicas, three etcd members, and an HAProxy leader endpoint. Enable exactly one of postgres and postgresHA:
The postgres.backup and postgresHA.backup blocks pass straight through to the underlying templates — see Backing Up.

Connecting

Verify the install, including the signing certificate, through a tunnel:
The response must be {"isAvailable":true}. {"isAvailable":false} means the certificate cannot be opened with signingPassphrase.

First Run

Documenso has no admin bootstrap and requires a verified email before the first sign-in; without SMTP no verification mail is sent. Register on the public endpoint, then verify yourself and become an admin (use your credentials secret’s username and database):
In HA mode run the same psql in RELEASE_NAME-postgres-ha, container patroni-postgres, adding -h RELEASE_NAME-postgres-ha-proxy.GVC_NAME.cpln.local. Then sign in and close sign-up by setting signup.disabled: true or signup.allowedDomains.

Operations

Backing Up

Database backups are off by default. Enable postgres.backup.enabled: true (or postgresHA.backup.enabled: true) and choose a provider of aws, gcp, or minio; the bucket, cloud account, and IAM setup are described in Backing Up for the single-instance database and Backing Up for highly available mode, and the backup blocks of values.yaml use the same keys. With storage.type: s3 a database backup holds only object keys, so protect the bucket too with versioning or replication.

Restoring a Backup

Restore steps belong to the underlying database templates: Restoring a Backup and Restoring a Backup.

Rotating a Secret

Rotating a referenced secret does not restart Documenso. After changing a value, redeploy:

Scaling and Availability

documenso.replicas is a real knob: the app tier is stateless, and with two or more replicas the UI stays up through a rolling restart. For database availability, set postgresHA.enabled: true and postgres.enabled: false at install; a single-instance PostgreSQL can briefly restart, and Documenso with it, on the first helm upgrade.

Troubleshooting

Symptom: cpln helm install reported success, cpln logs returns nothing, and cpln workload get-deployments RELEASE_NAME-documenso --gvc GVC_NAME -o yaml shows The secret SECRET_NAME no longer exists. Workload updates are paused until the secret is added or the reference to the secret removed. under status.versions[].message.Cause: A prerequisite secret does not exist: the application keys, the signing certificate, or the database credentials. The message names the missing one.Fix: Create it (see Prerequisites). The deployment recovers on its own once the secret exists; cpln workload force-redeployment RELEASE_NAME-documenso --gvc GVC_NAME skips the wait.
Symptom: The deployment message reads This workload location is deactivated because maxScale is set to 0.Cause: location is not one of the GVC’s locations. The default is aws-us-east-1.Fix: Set location to a location your GVC already has, and run cpln helm upgrade.
Symptom: After registering you land on the unverified-account page and cannot sign in.Cause: Email verification is mandatory and, without SMTP, no verification mail is sent.Fix: Run the SQL in First Run, or configure Email.
Symptom: /api/certificate-status returns {"isAvailable":false} and /api/health reports status: warning.Cause: The .p12 cannot be opened with the signingPassphrase in the application keys secret, or the secret does not hold the base64 text of a valid .p12.Fix: Recreate the certificate secret from Prerequisites and make sure signingPassphrase matches its password, then run cpln workload force-redeployment RELEASE_NAME-documenso --gvc GVC_NAME. The boot line Certificate not found or not readable refers to a certificate file and can be ignored.
Symptom: cpln helm install fails with a message beginning documenso:, such as `location` must be a bare location NAME or enable exactly one database.Cause: A value is missing or invalid: a link-form or list location, an unknown storage.type, storage.s3 without credentials, or both or neither of postgres.enabled and postgresHA.enabled.Fix: Correct the value the message names and reinstall.
Symptom: A PDF larger than a few megabytes is rejected on upload.Cause: storage.documentSizeLimitMb defaults to 5.Fix: Raise storage.documentSizeLimitMb and run cpln helm upgrade.

Important Notes

  • Close sign-up as soon as your account exists: set signup.disabled: true or signup.allowedDomains.
  • Check the certificate after installing: /api/certificate-status must return {"isAvailable":true}.
  • Never replace encryptionKey: two-factor secrets and API tokens become unreadable.
  • Install into a GVC with one location and set location to it; the bundled PostgreSQL starts in every GVC location.
  • Switching from keyless S3 to static keys on an existing release leaves the AWS binding on the identity; reinstall to clear it.
  • Without SMTP no mail is sent: send each signing link yourself.

External References

Documenso Self-Hosting Guide

Upstream guide to running and configuring Documenso

Environment Variables

Every setting the server reads

Signing Certificate

How the signing certificate is built and used

Documenso on GitHub

Source code and issue tracker