Getting Started
This documentation lets you create an openDesk evaluation instance on your Kubernetes cluster.
Thanks for looking into the openDesk Getting Started guide. This document covers essential configuration steps to deploy openDesk onto your Kubernetes infrastructure.
Requirements
Detailed system requirements are covered on the requirements page.
Customize environment
Before deploying openDesk, you must configure the deployment to fit your environment.
To keep your deployment up to date, we recommend customizing in dev
, test
, or prod
and not in default
environment
files.
All configuration options and their default values can be found in files at
helmfile/environments/default/
For the following guide, we will use dev
as environment where variables can be set in
helmfile/environments/dev/values.yaml.gotmpl
.
DNS
The deployment is designed to deploy each application/service under a dedicated subdomain.
For your convenience, we recommend creating a *.domain.tld
A-Record to your cluster ingress controller; otherwise, you must create an A-Record for each subdomain.
Record name | Type | Value | Additional information |
---|---|---|---|
*.domain.tld | A | IPv4 address of your Ingress Controller | |
*.domain.tld | AAAA | IPv6 address of your Ingress Controller | |
mail.domain.tld | A | IPv4 address of your postfix NodePort/LoadBalancer | Optional mail should directly be delivered to openDesk’s Postfix |
mail.domain.tld | AAAA | IPv6 address of your postfix NodePort/LoadBalancer | Optional mail should directly be delivered to openDesk’s Postfix |
domain.tld | MX | 10 mail.domain.tld |
|
domain.tld | TXT | v=spf1 +a +mx +a:mail.domain.tld ~all |
Optional, use proper MTA record if present |
_dmarc.domain.tld | TXT | v=DMARC1; p=quarantine |
Optional |
default._domainkey.domain.tld | TXT | v=DKIM1; k=rsa; h=sha256; ... |
Optional DKIM settings |
Domain
A list of all subdomains can be found in helmfile/environments/default/global.gotmpl
.
All subdomains can be customized. For example, Nextcloud can be changed to files.domain.tld
in dev
environment:
global: hosts: nextcloud: "files"
The domain has to be set either via dev
environment
global: domain: "domain.tld"
or via environment variable
export DOMAIN=domain.tld
Apps
All available apps and their default value are in helmfile/environments/default/opendesk_main.gotmpl
.
Component | Name | Default | Description |
---|---|---|---|
Certificates | certificates.enabled |
true |
TLS certificates |
ClamAV (Distributed) | clamavDistributed.enabled |
false |
Antivirus engine |
ClamAV (Simple) | clamavSimple.enabled |
true |
Antivirus engine |
Collabora | collabora.enabled |
true |
Weboffice |
CryptPad | cryptpad.enabled |
true |
Weboffice |
dkimpy | dkimpy.enabled |
false |
Postfix milter for DKIM |
Dovecot | dovecot.enabled |
true |
Mail backend |
Element | element.enabled |
true |
Secure communications platform |
Home | home.enabled |
true |
Base domain portal redirect |
Jitsi | jitsi.enabled |
true |
Videoconferencing |
MariaDB | mariadb.enabled |
true |
Database |
Memcached | memcached.enabled |
true |
Cache Database |
MinIO | minio.enabled |
true |
Object Storage |
Nextcloud | nextcloud.enabled |
true |
File share |
Nubus | nubus.enabled |
true |
Identity Management & Portal |
OpenProject | openproject.enabled |
true |
Project management |
OX App Suite | oxAppSuite.enabled |
true |
Groupware |
Postfix | postfix.enabled |
true |
MTA |
PostgreSQL | postgresql.enabled |
true |
Database |
Redis | redis.enabled |
true |
Cache Database |
XWiki | xwiki.enabled |
true |
Knowledge management |
Exemplary, Jitsi can be disabled like:
jitsi: enabled: false
Private registries
By default, Helm charts and container images are fetched from OCI registries. These registries can be found in most cases in the openDesk/component section on Open CoDE.
For untouched upstream artifacts that do not belong to a functional component's core, we use upstream registries like Docker Hub.
Doing a test deployment will be fine with this setup. In case you want to deploy multiple times a day and fetch from the same IP address, you might run into rate limits at Docker Hub. In that case and in cases you prefer the use of a private image registry, you can configure such for your target environment by setting
global.imageRegistry
for a private image registry andglobal.helmRegistry
for a private Helm chart registry.
global: imageRegistry: "my_private_registry.domain.tld"
alternatively, you can use an environment variable:
export PRIVATE_IMAGE_REGISTRY_URL=my_private_registry.domain.tld
or control repository override fine-granular per registry:
repositories: image: dockerHub: "my_private_registry.domain.tld/docker.io/" registryOpencodeDe: "my_private_registry.domain.tld/registry.opencode.de/"
If authentication is required, you can reference imagePullSecrets
as follows:
global: imagePullSecrets: - "external-registry"
Cluster capabilities
Service
Some apps, like Jitsi or Dovecot, require HTTP and external TCP connections.
These apps create a Kubernetes service object.
You can configure whether NodePort
(for on-premise), LoadBalancer
(for cloud), or ClusterIP
(to disable) should be
used:
cluster: service: type: "NodePort"
Networking
If your cluster has not the default cluster.local
domain configured, you need to provide the domain via:
cluster: networking: domain: "acme.internal"
If your cluster has not the default 10.0.0.0/8
CIDR configured, you need to provide the CIDR via the following:
cluster: networking: cidr: - "127.0.0.0/8"
If your load balancer / reverse proxy IPs are not already covered by the above cidr
you need to
explicitly configure the related IPs or IP ranges:
cluster: networking: incomingCIDR: - "172.16.0.0/12"
Ingress
By default, the ingressClassName
is empty to select your default ingress controller. You may want to customize it by
setting the following attribute to the name of the currently only supported ingress controller ingress-nginx
(see
requirements.md) for reference) within your deployment if that is not the cluster’s default ingress.
ingress: ingressClassName: "name-of-my-nginx-ingress"
Container runtime
Some apps require specific configurations for the container runtime. You can set your container runtime like cri-o
,
containerd
or docker
by:
cluster: container: engine: "containerd"
Volumes
The StorageClass must be set by:
persistence: storageClassNames: RWX: "my-read-write-many-class" RWO: "my-read-write-once-class"
RWX
is optional and requires that your cluster has a ReadWriteMany
volume provisioner. If you can make use
of it it benefits the distribution or scaling of apps. By default, only ReadWriteOnce
is enabled.
To enable ReadWriteMany
you have to set:
cluster: persistence: readWriteMany: true
Connectivity
Ports
Note: If you use NodePort
for service exposure, you must check your deployment for the actual ports.
Web-based user interface
To use the openDesk functionality with its web-based user interface, you need to expose the following ports publicly:
Component | Description | Port | Type |
---|---|---|---|
openDesk | Kubernetes Ingress | 80 | TCP |
openDesk | Kubernetes Ingress | 443 | TCP |
Jitsi Video Bridge | ICE Port for video data | 10000 | UDP |
Mail clients
To connect with mail clients like Thunderbird, the following ports need public exposure:
Component | Description | Port | Type |
---|---|---|---|
Dovecot | IMAPS | 993 | TCP |
POP3S | 995 | TCP | |
Postfix | SMTP | 25 | TCP |
SMTPS | 587 | TCP |
Mail/SMTP configuration
To use the full potential of the openDesk, you need to set up an SMTP relay that allows sending emails from the whole subdomain.
smtp: host: "mail.open.desk" username: "openDesk" password: "secret"
Enabling DKIM signing of emails helps to reduce spam and increases trust. openDesk ships dkimpy-milter as Postfix milter for signing emails.
dkimpy: enable: true dkim: key: value: "HzZs08QF1O7UiAkcM9T3U7rePPECtSFvWZIvyKqdg8E=" selector: "default" useED25519: true # when false, RSA is used
TURN configuration
Some components (Jitsi, Element) use a TURN server for direct communication. You can configure your own TURN server with these options:
turn: transport: "udp" # or tcp credentials: "secret" server: host: "turn.open.desk" port: "3478" tls: host: "turns.open.desk" port: "5349"
Certificate issuer
As mentioned in requirements, you can provide your own valid certificate. A TLS
secret named opendesk-certificates-tls
must be present in the application namespace. For deployment, you can
turn off Certificate
resource creation by:
certificates: enabled: false
If you want to leverage the cert-manager.io
to handle certificates, like Let's encrypt
, you need to provide the
configured cluster issuer:
certificate: issuerRef: name: "letsencrypt-prod"
Additionally, it is possible to request wildcard certificates by:
certificate: wildcard: true
Password seed
All secrets are generated from a master password via Master Password (algorithm). To prevent others from using your openDesk instance, you must set your individual master password via:
export MASTER_PASSWORD="your_individual_master_password"
Install
After setting your environment-specific values in dev
environment, you can start deployment by:
helmfile apply -e dev -n[-l
Arguments:
-e <env>
: Environment name out ofdefault
,dev
,test
,prod
-n <namespace>
: Kubernetes namespace-l <label>
: Label selector--suppress-diff
: Disable diff printing
Install single app
You can also install or upgrade only a single app like Collabora, either by label selector:
helmfile apply -e dev -n-l component=collabora
or by switching into the apps' directory (faster):
cd helmfile/apps/collabora helmfile apply -e dev -n
Install single release/chart
Instead of iteration through all services, you can also deploy a single release like mariadb
by:
helmfile apply -e dev -n-l name=mariadb
Access deployment
When all apps are successfully deployed, and their Pod's status is Running
or Succeeded
, you can navigate to
https://portal.domain.tld
If you change the subdomain of nubus
, you must replace portal
with the specified subdomain.
Credentials:
openDesk deploys with the standard user account Administrator
, which password you get retrieved as follows:
## Set your namespace NAMESPACE=## Get password for IAM "Administrator" account kubectl -n ${NAMESPACE} get secret ums-nubus-credentials -o jsonpath='{.data.administrator_password}' | base64 -d
Using the aforementioned account, you can either create new accounts manually or make use of the openDesk User Importer script or container.
For example you get a default
and default-admin
account by running the following snippet, after settings the
appropriate values in the first three lines.
ADMINISTRATOR_PASSWORD=DOMAIN= DEFAULT_USERS_PASSWORD= docker run --rm registry.opencode.de/bmi/opendesk/components/platform-development/images/user-import:3.0.0 \ ./user_import_udm_rest_api.py \ --import_domain ${DOMAIN} \ --udm_api_password ${ADMINISTRATOR_PASSWORD} \ --set_default_password ${DEFAULT_USERS_PASSWORD} \ --import_filename template.ods \ --create_admin_accounts True
Using from external repository
Referring to ./helmfile_generic.yaml.gotmpl
from an external
directory or repository is possible. The helmfile.yaml.gotmpl
that refers to
./helmfile_generic.yaml.gotmpl
may define custom environments. These custom
environments may overwrite specific configuration values. These
configuration values are:
global.domain
global.helmRegistry
global.master_password
Uninstall
You can uninstall the deployment by:
helmfile destroy -n
Note
Not all Jobs, PersistentVolumeClaims, or Certificates are deleted; you have to delete them manually
'Sledgehammer destroy' - for fast development turn-around times (at your own risk):
NAMESPACE=your-namespace ## Uninstall all Helm charts for OPENDESK_RELEASE in $(helm ls -n ${NAMESPACE} -aq); do helm uninstall -n ${NAMESPACE} ${OPENDESK_RELEASE}; done ## Delete leftover resources kubectl delete pvc --all --namespace ${NAMESPACE}; kubectl delete jobs --all --namespace ${NAMESPACE}; kubectl delete configmaps --all --namespace ${NAMESPACE};
Warning
Without specifying or empty--namespace
flag, cluster-wide components get deleted!