Getting started

This documentation should enable you to create your own evaluation instance of openDesk on your Kubernetes cluster. * [Requirements](#requirements) * [Customize environment](#customize-environment) * [DNS](#dns) * [Domain](#domain) * [Apps](#apps) * [Private registries](#private-registries) * [Cluster capabilities](#cluster-capabilities) * [Service](#service) * [Networking](#networking) * [Ingress](#ingress) * [Container runtime](#container-runtime) * [Volumes](#volumes) * [Connectivity](#connectivity) * [Ports](#ports) * [Web based user interface](#web-based-user-interface) * [Mail clients](#mail-clients) * [Mail/SMTP configuration](#mailsmtp-configuration) * [TURN configuration](#turn-configuration) * [Certificate issuer](#certificate-issuer) * [Password seed](#password-seed) * [Install](#install) * [Install single app](#install-single-app) * [Install single release/chart](#install-single-releasechart) * [Access deployment](#access-deployment) * [Using from external repository](#using-from-external-repository) * [Uninstall](#uninstall) Thanks for looking into the openDesk Getting started guide. This documents covers essentials configuration steps to deploy openDesk onto your kubernetes infrastructure. # Requirements Detailed system requirements are covered on [requirements](requirements.md) page. # Customize environment Before deploying openDesk, you have to configure the deployment to suit 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 to create a `*.domain.tld` A-Record to your cluster ingress controller, otherwise you need to 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.yaml`. All subdomains can be customized. For example, _Nextcloud_ can be changed to `files.domain.tld` in `dev` environment: ```yaml global: hosts: nextcloud: "files" ``` The domain have to be set either via `dev` environment ```yaml global: domain: "domain.tld" ``` or via environment variable ```shell export DOMAIN=domain.tld ``` ### Apps All available apps and their default value can be found in `helmfile/environments/default/workplace.yaml`. | 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 | | Dovecot | `dovecot.enabled` | `true` | Mail backend | | Element | `element.enabled` | `true` | Secure communications platform | | Intercom Service | `intercom.enabled` | `true` | Cross service data exchange | | 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 Appsuite | `oxAppsuite.enabled` | `true` | Groupware | | Provisioning | `oxConnector.enabled` | `true` | Backend provisioning | | 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: ```yaml jitsi: enabled: false ``` ## Private registries By default Helm charts and container images are fetched from OCI registries. These registries can be found for most cases in the [openDesk/component section on Open CoDE](https://gitlab.opencode.de/bmi/opendesk/components). 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 most likely 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 anyway you can configure such for [your target environment](./../helmfile/environments/dev/values.yaml.gotmpl.sample) by setting - `global.imageRegistry` for a private image registry and - `global.helmRegistry` for a private Helm chart registry. ```yaml global: imageRegistry: "my_private_registry.domain.tld" ``` alternatively you can use an environment variable: ```shell export PRIVATE_IMAGE_REGISTRY_URL=my_private_registry.domain.tld ``` If authentication is required, you can reference imagePullSecrets as following: ```yaml 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: ```yaml cluster: service: type: "NodePort" ``` ### Networking If your cluster has not the default `cluster.local` domain configured, you need to provide the domain via: ```yaml 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: ```yaml 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: ```yaml cluster: networking: incomingCIDR: - "172.16.0.0/12" ``` ### Ingress By default, the `ingressClassName` is empty to choose 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](./requirements.md)) for reference) within your deployment if that is not the clusters default ingress. ```yaml ingress: ingressClassName: "name-of-my-nginx-ingress" ``` ### Container runtime Some apps require specific configuration for the container runtime. You can set your container runtime like `cri-o`, `containerd` or `docker` by: ```yaml cluster: container: engine: "containerd" ``` ### Volumes When your cluster has a `ReadWriteMany` volume provisioner, you can benefit from distributed or scaling of apps. By default, only `ReadWriteOnce` is enabled. To enable `ReadWriteMany` you can set: ```yaml cluster: persistence: readWriteMany: true ``` The **StorageClass** can be set by: ```yaml persistence: storageClassNames: RWX: "my-read-write-many-class" RWO: "my-read-write-once-class" ``` ## Connectivity ### Ports **Note:** If you use `NodePort` for service exposure, you need to 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 publicly expose the following ports: | 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](https://www.thunderbird.net/), 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 which allows sending emails from the whole subdomain. ```yaml 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 mails. ```yaml dkimpy: enable: true dkim: key: value: | HzZs08QF1O7UiAkcM9T3U7rePPECtSFvWZIvyKqdg8E= selector: "default" useED25519: true # when false, RSA is used ``` ### TURN configuration Some components (Jitsi, Element) use for direct communication a TURN server. You can configure your own TURN server with these options: ```yaml 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](requirements.md#certificate-management) you can provide your own valid certificate. A TLS secret with name `opendesk-certificates-tls` needs to be present in application namespace. For deployment, you can disable `Certificate` resource creation by: ```yaml 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: ```yaml certificate: issuerRef: name: "letsencrypt-prod" ``` Additionally, it is possible to request wildcard certificates by: ```yaml certificate: wildcard: true ``` ## Password seed All secrets are generated from a single master password via Master Password (algorithm). To prevent others from using your openDesk instance, we highly recommend setting an individual master password via: ```shell export MASTER_PASSWORD="openDesk" ``` ## Install After setting your environment specific values in `dev` environment, you can start deployment by: ```shell helmfile apply -e dev -n [-l