Helm Chart¶
Deploy DocShare on Kubernetes using the official Helm chart.
Prerequisites¶
- Kubernetes 1.26+
- Helm 3.12+
- AWS S3 bucket (or S3-compatible storage)
Installation¶
From OCI Registry (GHCR)¶
helm install docshare oci://ghcr.io/hayward-solutions/charts/docshare \
--namespace docshare \
--create-namespace
From Source¶
git clone https://github.com/hayward-solutions/docshare.git
cd docshare
helm dependency update charts/docshare
helm install docshare charts/docshare \
--namespace docshare \
--create-namespace
Quick Start¶
Install with default settings (bundled PostgreSQL and Gotenberg, AWS S3 for storage):
helm install docshare oci://ghcr.io/hayward-solutions/charts/docshare \
--namespace docshare \
--create-namespace \
--set api.env.jwtSecret=my-secret-change-me \
--set s3.bucket=your-s3-bucket-name
Access the application:
# Port-forward the web
kubectl port-forward svc/docshare-web 3001:3000 -n docshare
# Port-forward the API
kubectl port-forward svc/docshare-api 8080:8080 -n docshare
Then open http://localhost:3001 and create your first account.
Configuration¶
Minimal Production Example¶
# production-values.yaml
api:
replicaCount: 2
env:
jwtSecret: "generate-with-openssl-rand-hex-32"
web:
replicaCount: 2
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/proxy-body-size: "100m"
hosts:
- host: docshare.example.com
paths:
- path: /
pathType: Prefix
service: web
- path: /api
pathType: Prefix
service: api
tls:
- secretName: docshare-tls
hosts:
- docshare.example.com
postgresql:
auth:
password: "generate-a-strong-password"
s3:
region: "us-east-1"
bucket: "docshare-prod"
helm install docshare oci://ghcr.io/hayward-solutions/charts/docshare \
--namespace docshare \
--create-namespace \
-f production-values.yaml
Using External PostgreSQL¶
Disable the bundled PostgreSQL and point to your existing database:
postgresql:
enabled: false
externalDatabase:
host: postgres.example.com
port: 5432
user: docshare
password: "your-password"
database: docshare
sslmode: require
Or reference an existing Kubernetes secret:
postgresql:
enabled: false
externalDatabase:
host: postgres.example.com
port: 5432
user: docshare
database: docshare
sslmode: require
existingSecret: my-db-secret
existingSecretPasswordKey: password
S3 Configuration¶
Using IAM Roles (Recommended for EKS)¶
For EKS with IRSA (IAM Roles for Service Accounts):
api:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/docshare-s3-role
s3:
region: "us-east-1"
bucket: docshare-prod
No access keys needed - IAM role handles authentication automatically.
Using Static Credentials¶
s3:
region: "us-west-2"
accessKey: "your-access-key"
secretKey: "your-secret-key"
bucket: docshare-prod
Custom S3-Compatible Storage¶
For MinIO, Wasabi, or other S3-compatible storage:
s3:
endpoint: "minio.example.com:9000"
publicEndpoint: "s3.example.com"
region: "us-east-1"
accessKey: "your-access-key"
secretKey: "your-secret-key"
bucket: docshare
useSsl: "true"
Disabling Gotenberg¶
If you don't need document preview/conversion:
Values Reference¶
Backend¶
| Key | Type | Default | Description |
|---|---|---|---|
api.replicaCount |
int | 1 |
Number of api replicas |
api.image.repository |
string | ghcr.io/hayward-solutions/docshare/api |
Backend image repository |
api.image.tag |
string | latest |
Backend image tag |
api.image.pullPolicy |
string | IfNotPresent |
Image pull policy |
api.service.type |
string | ClusterIP |
Service type |
api.service.port |
int | 8080 |
Service port |
api.resources |
object | {} |
CPU/memory resource requests/limits |
api.env.dbSslmode |
string | disable |
PostgreSQL SSL mode |
api.env.s3Bucket |
string | docshare |
S3 bucket name |
api.env.s3UseSsl |
string | "true" |
Use SSL for S3 connection |
api.env.jwtSecret |
string | "" |
JWT signing secret (auto-generated if empty) |
api.env.jwtExpirationHours |
string | "24" |
JWT token lifetime |
api.env.serverPort |
string | "8080" |
Backend server port |
api.env.gotenbergUrl |
string | "" |
Gotenberg URL (auto-configured if gotenberg.enabled) |
api.env.webUrl |
string | "" |
Frontend URL (deprecated: use globals.webUrl) |
api.env.apiUrl |
string | "" |
Backend URL (deprecated: use globals.apiUrl) |
api.existingSecret |
string | "" |
Use existing secret for sensitive values |
Global¶
| Key | Type | Default | Description |
|---|---|---|---|
globals.webUrl |
string | "" |
Public frontend URL (e.g., https://docshare.example.com). Auto-configured from ingress if enabled. |
globals.apiUrl |
string | "" |
Public API URL (e.g., https://docshare.example.com/api). Auto-configured from ingress if enabled. |
Note: Use globals.webUrl and globals.apiUrl when using an external ingress. These values are automatically passed to both the API and web containers. See external ingress example for a complete configuration.
Frontend¶
| Key | Type | Default | Description |
|---|---|---|---|
web.replicaCount |
int | 1 |
Number of web replicas |
web.image.repository |
string | ghcr.io/hayward-solutions/docshare/web |
Frontend image repository |
web.image.tag |
string | latest |
Frontend image tag |
web.image.pullPolicy |
string | IfNotPresent |
Image pull policy |
web.service.type |
string | ClusterIP |
Service type |
web.service.port |
int | 3000 |
Service port |
web.resources |
object | {} |
CPU/memory resource requests/limits |
Note: The web receives API_URL and WEB_URL from the Helm chart (auto-derived from ingress config, globals, or api.env values), which are passed as environment variables at runtime.
Gotenberg¶
| Key | Type | Default | Description |
|---|---|---|---|
gotenberg.enabled |
bool | true |
Enable Gotenberg document conversion |
gotenberg.replicaCount |
int | 1 |
Number of replicas |
gotenberg.image.repository |
string | gotenberg/gotenberg |
Image repository |
gotenberg.image.tag |
string | "8" |
Image tag |
gotenberg.service.port |
int | 3000 |
Service port |
gotenberg.resources |
object | {} |
CPU/memory resource requests/limits |
Ingress¶
| Key | Type | Default | Description |
|---|---|---|---|
ingress.enabled |
bool | false |
Enable ingress |
ingress.className |
string | "" |
Ingress class name |
ingress.annotations |
object | {} |
Ingress annotations |
ingress.hosts |
list | See values.yaml | Ingress host configuration |
ingress.tls |
list | [] |
TLS configuration |
PostgreSQL (Bundled)¶
Uses the Bitnami PostgreSQL chart. See the upstream chart for all available values.
| Key | Type | Default | Description |
|---|---|---|---|
postgresql.enabled |
bool | true |
Deploy bundled PostgreSQL |
postgresql.auth.username |
string | docshare |
Database username |
postgresql.auth.password |
string | docshare_secret |
Database password |
postgresql.auth.database |
string | docshare |
Database name |
S3 Configuration¶
| Key | Type | Default | Description |
|---|---|---|---|
s3.region |
string | us-east-1 |
AWS region |
s3.endpoint |
string | "" |
Custom endpoint (auto: s3.$region.amazonaws.com) |
s3.publicEndpoint |
string | "" |
Public endpoint for presigned URLs |
s3.accessKey |
string | "" |
Access key (empty = IAM role) |
s3.secretKey |
string | "" |
Secret key (empty = IAM role) |
s3.bucket |
string | docshare |
Bucket name |
s3.useSsl |
string | "true" |
Use SSL |
s3.existingSecret |
string | "" |
Existing secret name |
s3.existingSecretAccessKeyKey |
string | access-key |
Key for access key in secret |
s3.existingSecretSecretKeyKey |
string | secret-key |
Key for secret key in secret |
External Database¶
| Key | Type | Default | Description |
|---|---|---|---|
externalDatabase.host |
string | "" |
External PostgreSQL host |
externalDatabase.port |
int | 5432 |
External PostgreSQL port |
externalDatabase.user |
string | docshare |
Database user |
externalDatabase.password |
string | "" |
Database password |
externalDatabase.database |
string | docshare |
Database name |
externalDatabase.sslmode |
string | disable |
SSL mode |
externalDatabase.existingSecret |
string | "" |
Existing secret name |
externalDatabase.existingSecretPasswordKey |
string | password |
Key in existing secret |
Upgrading¶
helm upgrade docshare oci://ghcr.io/hayward-solutions/charts/docshare \
--namespace docshare \
-f production-values.yaml
Uninstalling¶
Note: The auto-generated secrets are annotated with helm.sh/resource-policy: keep and will not be deleted on uninstall. Delete them manually if needed:
PersistentVolumeClaims created by PostgreSQL are also retained. Delete them manually: