Compare commits

...

34 Commits

Author SHA1 Message Date
Franz Kuntke
4ceed617cf Merge branch 'kuntke/size-profiles' into 'develop'
Draft: feat(size-profiles): Add size profiles

See merge request bmi/opendesk/deployment/opendesk!1122
2025-12-05 16:15:34 +00:00
Franz Kuntke
10b1ab0cb6 feat(size-profiles): Size profile overrides via helmfile selectable 2025-12-05 17:11:32 +01:00
Franz Kuntke
8dc3cbfe17 docs(size-profiles): Add hardware requirements section 2025-12-05 12:05:28 +01:00
Franz Kuntke
549e2bb01a feat(size-profiles): Add size profiles 2025-12-05 10:06:23 +01:00
Daniel Gerber
8867d1b204 docs(getting-started.md): AAAA record on base domain is optional 2025-12-03 15:44:05 +00:00
Lilly Sell
cca755d4af docs(monitoring.md): Correct references and wordings in monitoring documentation 2025-12-03 15:56:36 +01:00
Thorsten Roßner
2423ac2de6 ci(import-default-accounts): Up to 5 retries with pause on failing account import 2025-12-03 08:36:44 +01:00
Thorsten Roßner
09a233511e docs(CHANGELOG.md): Fix wrong version number for OpenProject fix commit 2025-12-03 07:41:40 +01:00
Thorsten Roßner
7d101b18d7 docs(migrations.md): Update 1.10.0 info on Collabora Controller lease 2025-12-03 07:41:40 +01:00
Thorsten Roßner
10f1ced37d docs(requirements.md): Helm <v4 not supported 2025-12-03 07:41:40 +01:00
Thorsten Roßner
2ddbd91f3d feat(helmfile): [#205, #227] Allow separate annotations for external Dovecot, Postfix and Jitsi JVB service; review migrations.md for required upgrade steps 2025-11-27 08:17:46 +01:00
Thorsten Roßner
54277dabae chore(release): 1.10.0 [skip ci]
# [1.10.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/compare/v1.9.0...v1.10.0) (2025-11-24)

### Bug Fixes

* **collabora:** Update Controller to 1.1.6 incl. Helm chart update to 1.1.10 ([d25c95f](d25c95f06b))
* **collabora:** Update from 25.04.5 to 25.04.6 ([8de0f5d](8de0f5de72))
* **external-services:** Create `nubus_authsession` database ([ec72602](ec72602cdd))
* **helmfile:** Enable verification for XWiki Helm chart ([5104793](51047936de))
* **helmfile:** Streamline annotations ([7aa717c](7aa717c050))
* **nubus:** Remove legacy `UMC` Keycloak client that was used for SAML connection with the Nubus portal ([152221f](152221fa79))
* **open-xchange:** Only enable `smtpSASLAuthEnable` when `relayHost` is set ([70bbbf3](70bbbf311f))
* **open-xchange:** Optimize Dovecot Pro full-text search caches; review `migrations.md` for required upgrade steps ([f3f707c](f3f707c9ee))
* **open-xchange:** Template SASL security options ([684c6d4](684c6d4f29))
* **open-xchange:** Update Dovecot configuration based on supplier's best practise review ([850761e](850761e047))
* **opendesk-static-files:** [[#260](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/issues/260)] Fix doublette creation of configmap `data` keys when the same file is referenced multiple times for a component ([b5a76be](b5a76bea57))
* **openproject:** Update from 16.1.0 to 16.1.1 ([62fae99](62fae9976a))
* **xwiki:** Update XWiki from 17.4.4 to 17.4.7 ([02a3b77](02a3b77114))

### Features

* **jitsi:** Update from 2.0.10431 to 2.0.10590 ([f5aad1f](f5aad1fa47))
* **nubus:** Update from v1.14.0 to v1.15.2 ([12379d6](12379d67e0))
* **open-xchange:** Support for LDAP group based mailing lists ([cc94f0c](cc94f0c66d))
* **openproject:** Update OpenProject from 16.5.1 to 16.6.0 ([19438c0](19438c0281))
2025-11-24 15:32:49 +00:00
Thorsten Roßner
b32cb70678 chore(publiccode.yml): Update for v1.10.0 2025-11-24 16:16:57 +01:00
Thorsten Roßner
b7b9968245 chore(helmfile): Set JVB replica to 1 again 2025-11-24 11:03:30 +01:00
Thorsten Roßner
b830edf8da chore(helmfile): Remove doublette spaces in templating expression 2025-11-24 10:54:36 +01:00
emrah
f5aad1fa47 feat(jitsi): Update from 2.0.10431 to 2.0.10590 2025-11-21 13:36:44 +00:00
Thorsten Roßner
f2fe6f3026 docs(migrations.md): Streamlining content 2025-11-21 14:16:32 +01:00
Thorsten Roßner
1857dd961e docs(persistance.yaml.gotmpl): Streamline comment for dovecot PVC usage 2025-11-21 14:16:32 +01:00
Thorsten Roßner
0ab9979693 docs(gettings-started.md): Update section "Access deployment" 2025-11-21 14:16:32 +01:00
Thorsten Roßner
e0a6850a2d docs(global.yaml.gotmpl): Fix misleading comment for additionalMailDomains 2025-11-21 14:16:32 +01:00
Thorsten Roßner
7032205acf docs(security.md): Update non-verifiable charts table 2025-11-21 14:16:32 +01:00
Thorsten Roßner
51047936de fix(helmfile): Enable verification for XWiki Helm chart 2025-11-21 14:16:32 +01:00
Thorsten Roßner
a83ecd5c01 docs(gitops.md): [#206] Add warning about secrets in pre-rendered yaml files 2025-11-21 14:16:31 +01:00
Thorsten Roßner
080073119b docs(README-EE.md): Add link to COOL Controller release notes 2025-11-21 14:16:31 +01:00
Thorsten Roßner
ec72602cdd fix(external-services): Create nubus_authsession database 2025-11-21 14:16:31 +01:00
Thorsten Roßner
9387168e89 docs(data-storage.md): Streamline with current application state 2025-11-21 14:16:31 +01:00
Thorsten Roßner
b5a76bea57 fix(opendesk-static-files): [#260] Fix doublette creation of configmap data keys when the same file is referenced multiple times for a component 2025-11-21 14:16:31 +01:00
Thorsten Roßner
bdcfb977e0 docs(migrations.md): Add v1.10.0 section to overview table 2025-11-21 14:16:28 +01:00
Thorsten Roßner
cb367775a6 docs(gettings-started.md): [#184] Add a comment about the maximum length of the openDesk domain 2025-11-21 14:14:02 +01:00
Philip Gaber
e37361790b docs(migrations.md): Update for Postfix SASL security options in v1.9.0 and new Postfix secret 2025-11-21 06:46:31 +00:00
Thorsten Roßner
70bbbf311f fix(open-xchange): Only enable smtpSASLAuthEnable when relayHost is set 2025-11-21 06:46:31 +00:00
Thomas Kaltenbrunner
cc94f0c66d feat(open-xchange): Support for LDAP group based mailing lists 2025-11-21 06:46:31 +00:00
Philip Gaber
684c6d4f29 fix(open-xchange): Template SASL security options 2025-11-21 06:46:31 +00:00
renovate
62fae9976a fix(openproject): Update from 16.1.0 to 16.1.1 2025-11-20 08:02:29 +01:00
47 changed files with 4337 additions and 151 deletions

View File

@@ -4,7 +4,7 @@
---
include:
- project: "${PROJECT_PATH_GITLAB_CONFIG_TOOLING}"
ref: "v2.4.10"
ref: "v2.4.17"
file:
- "ci/common/lint.yml"
- "ci/release-automation/semantic-release.yml"
@@ -767,17 +767,33 @@ import-default-accounts:
- "echo \"Starting default account import for ${DOMAIN}\""
- "cd /app"
- |
./user_import_udm_rest_api.py \
--import_domain ${DOMAIN} \
--udm_api_password ${DEFAULT_ADMINISTRATOR_PASSWORD} \
--set_default_password ${DEFAULT_ACCOUNTS_PASSWORD} \
--import_filename ./template.ods \
--admin_enable_fileshare True \
--admin_enable_knowledgemanagement True \
--admin_enable_projectmanagement True \
--create_admin_accounts True \
--create_maildomains True \
--verify_certificate False
set +e
success=0
for i in {1..5}; do
echo "Attempt $i/5..."
./user_import_udm_rest_api.py \
--import_domain ${DOMAIN} \
--udm_api_password ${DEFAULT_ADMINISTRATOR_PASSWORD} \
--set_default_password ${DEFAULT_ACCOUNTS_PASSWORD} \
--import_filename ./template.ods \
--admin_enable_fileshare True \
--admin_enable_knowledgemanagement True \
--admin_enable_projectmanagement True \
--create_admin_accounts True \
--create_maildomains True \
--verify_certificate False
if [ $? -eq 0 ]; then
echo "Script succeeded on attempt $i."
success=1
break
fi
echo "Script failed. Waiting 60 seconds before retry..."
sleep 60
done
if [ "$success" -ne 1 ]; then
echo "Script failed after 5 attempts."
exit 1
fi
run-tests:
stage: "post-execute"

View File

@@ -1,3 +1,30 @@
# [1.10.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/compare/v1.9.0...v1.10.0) (2025-11-24)
### Bug Fixes
* **collabora:** Update Controller to 1.1.6 incl. Helm chart update to 1.1.10 ([d25c95f](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/d25c95f06bc199d09aa6ea4dc09c10e95153de38))
* **collabora:** Update from 25.04.5 to 25.04.6 ([8de0f5d](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/8de0f5de7277ad726588d7de2d06cb3e9376c993))
* **external-services:** Create `nubus_authsession` database ([ec72602](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/ec72602cdd3207f73ff806a26bfe7b9fd32b8634))
* **helmfile:** Enable verification for XWiki Helm chart ([5104793](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/51047936de102c610adc00f4dff12d2eb8e945b0))
* **helmfile:** Streamline annotations ([7aa717c](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/7aa717c0509a731c060c58a1b5877e1d9899406f))
* **nubus:** Remove legacy `UMC` Keycloak client that was used for SAML connection with the Nubus portal ([152221f](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/152221fa7976bfa942d5e9e9b8f78cc8e65765c0))
* **open-xchange:** Only enable `smtpSASLAuthEnable` when `relayHost` is set ([70bbbf3](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/70bbbf311fcba57c31f535be7d0d453f4a945cee))
* **open-xchange:** Optimize Dovecot Pro full-text search caches; review `migrations.md` for required upgrade steps ([f3f707c](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/f3f707c9eee8edf3ad61834d87b5c059f31b0e26))
* **open-xchange:** Template SASL security options ([684c6d4](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/684c6d4f29dd447872ebe582eef43c04034896f7))
* **open-xchange:** Update Dovecot configuration based on supplier's best practise review ([850761e](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/850761e0475b2f281fb23f6972d5c74fbdaa3a61))
* **opendesk-static-files:** [[#260](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/issues/260)] Fix doublette creation of configmap `data` keys when the same file is referenced multiple times for a component ([b5a76be](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/b5a76bea57ef7b136c54d1bc95c40f0a0c3f9716))
* **openproject:** Update from 16.6.0 to 16.6.1 ([62fae99](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/62fae9976a731c00700d56ce8fab198bb2531d20))
* **xwiki:** Update XWiki from 17.4.4 to 17.4.7 ([02a3b77](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/02a3b7711490394690df70ca92bab58b253e34f5))
### Features
* **jitsi:** Update from 2.0.10431 to 2.0.10590 ([f5aad1f](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/f5aad1fa47559f0d3941c233c7d40029a9e83281))
* **nubus:** Update from v1.14.0 to v1.15.2 ([12379d6](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/12379d67e07936496fe31276b2052406e0137db6))
* **open-xchange:** Support for LDAP group based mailing lists ([cc94f0c](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/cc94f0c66df098d0a20f7f0d4a6af5e791557981))
* **openproject:** Update OpenProject from 16.5.1 to 16.6.0 ([19438c0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/commit/19438c02817875bd408c5d6cf423d7bfb61f907f))
# [1.9.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/compare/v1.8.0...v1.9.0) (2025-11-07)

View File

@@ -86,7 +86,7 @@ When a repository path starts with `/zendis`, the artifact is only available in
### Collabora
- Collabora Online (COOL) container image: Is build from the same public source code as Collabora Development Edition (CODE), only the build configurations might differ. COOL includes a brand package that is not public and its license is not open source.
- COOL Controller container image and Helm chart: Source code and chart are using Mozilla Public License Version 2.0, but the source code is not public. It is provided to customers upon request.
- [COOL Controller](https://www.collaboraonline.com/cool-controller-release-notes/) container image and Helm chart: Source code and chart are using Mozilla Public License Version 2.0, but the source code is not public. It is provided to customers upon request.
openDesk updates Collabora once a COOL image based on the version pattern `<major>.<minor>.<patch>.3+.<build>` was made available. This happens usually at the same time the CODE image with `<major>.<minor>.<patch>.2+.<build>` is made available.

View File

@@ -41,8 +41,8 @@ openDesk currently features the following functional main components:
| Groupware | OX App Suite | GPL-2.0-only (backend), AGPL-3.0-or-later (frontend) | [8.41](https://documentation.open-xchange.com/appsuite/releases/8.41/) | Online documentation available from within the installed application; [Additional resources](https://documentation.open-xchange.com/) |
| Knowledge management | XWiki | LGPL-2.1-or-later | [17.4.4](https://www.xwiki.org/xwiki/bin/view/ReleaseNotes/Data/XWiki/17.4.4/) | [For the most recent release](https://www.xwiki.org/xwiki/bin/view/Documentation) |
| Portal & IAM | Nubus | AGPL-3.0-or-later | [1.15.2](https://docs.software-univention.de/nubus-kubernetes-release-notes/1.x/en/1.15.html) | [Univention's documentation website](https://docs.software-univention.de/n/en/nubus.html) |
| Project management | OpenProject | GPL-3.0-only | [16.6.0](https://www.openproject.org/docs/release-notes/16-6-0/) | [For the most recent release](https://www.openproject.org/docs/user-guide/) |
| Videoconferencing | Jitsi | Apache-2.0 | [2.0.10431](https://github.com/jitsi/jitsi-meet/releases/tag/stable%2Fjitsi-meet_10431) | [For the most recent release](https://jitsi.github.io/handbook/docs/category/user-guide/) |
| Project management | OpenProject | GPL-3.0-only | [16.6.1](https://www.openproject.org/docs/release-notes/16-6-1/) | [For the most recent release](https://www.openproject.org/docs/user-guide/) |
| Videoconferencing | Jitsi | Apache-2.0 | [2.0.10590](https://github.com/jitsi/jitsi-meet/releases/tag/stable%2Fjitsi-meet_10590) | [For the most recent release](https://jitsi.github.io/handbook/docs/category/user-guide/) |
| Weboffice | Collabora | MPL-2.0 | [25.04.6](https://www.collaboraoffice.com/code-25-04-release-notes/) | Online documentation available from within the installed application; [Additional resources](https://sdk.collaboraonline.com/) |
While not all components are perfectly designed for the execution inside containers, one of the project's objectives is to

View File

@@ -31,8 +31,6 @@ sankey-beta
ClamAV,PersistentVolume,1
Dovecot,PersistentVolume,1
Element/Synapse,PostgreSQL,1
Element/Synapse,PersistentVolume,1
@@ -54,9 +52,15 @@ OpenProject,S3,1
OpenProject,PersistentVolume,1
OpenProject,Memcached,1
Open-Xchange,MariaDB,1
Open-Xchange,PersistentVolume,1
Open-Xchange,Redis,1
OX App Suite,MariaDB,1
OX App Suite,Redis,1
OX App Suite,S3,1
OX Connector,PersistentVolume,1
OX Dovecot,Cassandra,1
OX Dovecot,PersistentVolume,1
OX Dovecot,S3,1
Postfix,PersistentVolume,1
@@ -70,7 +74,7 @@ XWiki,PersistentVolume,1
| -------------------- | ------------ | -------- | --------------------------------------------------------------------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| **ClamAV** | PVC | No | ClamAV Database | `clamav-database-clamav-simple-0` | `/var/lib/clamav` |
| **Dovecot** | PVC | Yes | openDesk CE only: User mail directories | `dovecot` | `/srv/mail` |
| | PVC | No | openDesk EE only: Metacache directory | `var-lib-dovecot-dovecot-0` | `/var/lib/dovecot` |
| | PVC | Yes | openDesk EE only: Metacache directory | `var-lib-dovecot-dovecot-0` | `/var/lib/dovecot` |
| | S3 | Yes | openDesk EE only: User mail | `dovecot` | `dovecot` |
| | Cassandra | Yes | openDesk EE only: Metadata and ACLs | `dovecot_dictmap`, `dovecot_acl` | |
| **Element/Synapse** | PostgreSQL | Yes | Application's main database | `matrix` | |
@@ -85,8 +89,8 @@ XWiki,PersistentVolume,1
| | | Yes | Login actions and device-fingerprints | `keycloak_extensions` | |
| | | Optional | Store of the temporary password reset token | `selfservice` | |
| | | Optional | OIDC session storage | `umsAuthSession` | |
| | | No | Notification features are not used in openDesk 1.1 | `notificationsapi` | |
| | | No | Guardian features are currently not used in openDesk 1.1 | `guardianmanagementapi` | |
| | | No | At the moment the notification feature not enabled in openDesk | `notificationsapi` | |
| | | No | At the moment the Guardian features are currently not enabled in openDesk | `guardianmanagementapi` | |
| | S3 | No | Static files for Portal | `ums` | |
| | PVC | Yes | openLDAP database (primary R/W Pods), when restore select the one from the leader | `shared-data-ums-ldap-server-primary-0` | `/var/lib/univention-ldap` |
| | | Yes | openLDAP process data | `shared-run-ums-ldap-server-primary-0` | `/var/run/slapd` |
@@ -101,13 +105,17 @@ XWiki,PersistentVolume,1
| | Memcached | No | Cache | | |
| | PVC | No | PVC backed `emptyDir` as K8s cannot set the sticky bit on standard emptyDirs | `openproject-<web/worker>-*-tmp` | `/tmp` |
| | | No | PVC backed `emptyDir` as K8s cannot set the sticky bit on standard emptyDirs | `openproject-<web/worker>-app-*-tmp` | `/app/tmp` |
| **Open-Xchange** | MariaDB | Yes | Application's control database to coordiate dynamically created ones | `configdb` | |
| **OX App Suite** | MariaDB | Yes | Application's control database to coordiate dynamically created ones | `configdb` | |
| | | Yes | Dynamically creates databases of schema `PRIMARYDB_n`containing multiple contexts | `PRIMARYDB_*` | |
| | | Yes | OX Guard related settings | `oxguard*` | |
| | S3 | Yes | Attachments of meetings, contacts and tasks | `openxchange` | |
| | Redis | Optional | Cache, session related data, distributed maps | | |
| | PVC | Optional | OX Connector: Caching of OX object data | for backup | `/var/lib/univention-appcenter/apps/ox-connector` |
| **OX Connector** | PVC | Optional | OX Connector: Caching of OX object data | for backup | `/var/lib/univention-appcenter/apps/ox-connector` |
| | | Yes | OX Connector: OX SOAP API credentials | `ox-connector-ox-contexts-ox-connector-0` | `/etc/ox-secrets` |
| **OX Dovecot** | PVC | Yes | openDesk CE only: User mail directories | `dovecot` | `/srv/mail` |
| | PVC | Yes | openDesk EE only: Various meta data and caches | `var-lib-dovecot` | `/var/lib/dovecot` |
| | S3 | Yes | Dovecot Pro/openDesk EE only: User mail | `dovecot` | `dovecot` |
| | Cassandra | Yes | Dovecot Pro/openDesk EE only: Metadata and ACLs | `dovecot_dictmap`, `dovecot_acl` | |
| **Postfix** | PVC | Yes | Mail spool | `postfix` | `/var/spool/postfix` |
| **XWiki** | PostgreSQL | Yes | Application's main database | `xwiki` | |
| | PVC | Yes | Attachments | `xwiki-data-xwiki-0` | `/usr/local/xwiki/data` |

View File

@@ -31,6 +31,11 @@ There are two options to deploy openDesk via Argo CD described in the following
## Option 1: Use YAML manifests
> [!warning]
> Pre-rendering the YAML files will also embed all referenced secrets into the resulting outputs.
> You must ensure that these files are accessible solely to individuals who are expressly authorized
> to view the corresponding secrets, as well as the infrastructure and data protected by them.
This option requires a preprocessing step before using Argo CD. This step requires you to compile the Helmfile based
deployment into Kubernetes YAML manifest, to do so you need to execute the helmfile binary:

View File

@@ -32,8 +32,10 @@ This documentation lets you create an openDesk evaluation instance on your Kuber
* [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)
* [Access deployment](#access-deployment)
* [Login](#login)
* [Credentials](#credentials)
* [Uninstall](#uninstall)
<!-- TOC -->
@@ -63,7 +65,7 @@ For your convenience, we recommend creating a `*.domain.tld` A-Record for your c
| Record name | Type | Value | Additional information |
|-------------------------------|------|----------------------------------------------------|-------------------------------------------------------------------|
| *.domain.tld | A | IPv4 address of your Ingress Controller | |
| *.domain.tld | AAAA | IPv6 address of your Ingress Controller | |
| *.domain.tld | AAAA | IPv6 address of your Ingress Controller | Optional |
| 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` | |
@@ -77,6 +79,8 @@ For your convenience, we recommend creating a `*.domain.tld` A-Record for your c
## Domain
As example base domain for your deployment we use `domain.tld` in this document.
A list of all subdomains can be found in `helmfile/environments/default/global.yaml.gotmpl`.
All subdomains can be customized. For example, _Nextcloud_ can be changed to `files.domain.tld` in `dev` environment:
@@ -100,6 +104,11 @@ or alternatively via environment variable:
export DOMAIN=domain.tld
```
> [!warning]
> Due to a limitation caused by a [bug in the SSSD subcomponent](https://github.com/SSSD/sssd/issues/7246), there
> is an upper bound on the total domain length used by openDesk. To avoid issues, we recommend keeping the openDesk
> base domain length below 94 characters.
### Apps
Depending on your ideal openDesk deployment, you may wish to disable or enable certain apps.
@@ -441,17 +450,37 @@ Instead of iterating through all services, you can also deploy a single release
helmfile apply -e dev -n <NAMESPACE> -l name=mariadb
```
## 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`
# Access deployment
## Login
When all apps are successfully deployed, and their Pod status is `Running` or `Succeeded`, you can navigate to
```text
https://domain.tld
```
which will redirect you to the actual URL of the openDesk portal:
```text
https://portal.domain.tld
```
If you change the subdomain of `nubus`, you must replace the subdomain of `portal` with the same subdomain.
By default the portal will send you to openDesk's login screen.
**Credentials:**
## Credentials
openDesk deploys with the standard user account `Administrator`, the password for which can be retrieved as follows:
@@ -483,18 +512,6 @@ docker run --rm registry.opencode.de/bmi/opendesk/components/platform-developmen
--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 executing the following:

View File

@@ -10,13 +10,21 @@ SPDX-License-Identifier: Apache-2.0
* [Deprecation warnings](#deprecation-warnings)
* [Overview and mandatory upgrade path](#overview-and-mandatory-upgrade-path)
* [Manual checks/actions](#manual-checksactions)
* [Versions ≥ v1.11.0](#versions--v1110)
* [Pre-upgrade to versions ≥ v1.11.0](#pre-upgrade-to-versions--v1110)
* [Helmfile new option: Annotations for external services (Dovecot, Jitsi JVB, Postfix)](#helmfile-new-option-annotations-for-external-services-dovecot-jitsi-jvb-postfix)
* [Versions ≥ v1.10.0](#versions--v1100)
* [Pre-upgrade to versions ≥ v1.10.0](#pre-upgrade-to-versions--v1100)
* [Deployment cleanup: Collabora Controller](#deployment-cleanup-collabora-controller)
* [Helmfile new secret: `secrets.nubus.ldapSearch.postfix`](#helmfile-new-secret-secretsnubusldapsearchpostfix)
* [Helmfile new secret: `secrets.doveocot.sharedMailboxesMasterPassword`](#helmfile-new-secret-secretsdoveocotsharedmailboxesmasterpassword)
* [New Helmfile default: Nubus provisioning debug container no longer deployed](#new-helmfile-default-nubus-provisioning-debug-container-no-longer-deployed)
* [New Helmfile default: Postfix SMTP SASL security options](#new-helmfile-default-postfix-smtp-sasl-security-options)
* [Post-upgrade to versions ≥ v1.10.0](#post-upgrade-to-versions--v1100)
* [New application default: Dovecot full-text search index configuration](#new-application-default-dovecot-full-text-search-index-configuration)
* [Versions ≥ v1.9.0](#versions--v190)
* [Pre-upgrade to versions ≥ v1.9.0](#pre-upgrade-to-versions--v190)
* [New application default: Postfix SMTP SASL security option](#new-application-default-postfix-smtp-sasl-security-option)
* [Helmfile fix: Cassandra passwords read from `databases.*`](#helmfile-fix-cassandra-passwords-read-from-databases)
* [Helmfile new feature: `functional.groupware.externalClients.*`](#helmfile-new-feature-functionalgroupwareexternalclients)
* [Versions ≥ v1.8.0](#versions--v180)
@@ -148,20 +156,20 @@ matching that constraint, though our links always point to the newest patch rele
> 1. Upgrade to v1.7.1 → post steps for v1.6.0 to v1.7.1
<!-- IMPORTANT: Make sure to mark mandatory releases if an automatic migration requires a previous update to be installed -->
| Version | Mandatory | Pre-Upgrade | Post-Upgrade | Minimum Required Previous Version |
| ---------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------- | ---------------------------------------------------- |
| [v1.10.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.9.0) | -- | [Pre](#pre-upgrade-to-versions--v1100) | -- | ⬇ Install &GreaterEqual; v1.5.0 first |
| [v1.9.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.9.0) | -- | [Pre](#pre-upgrade-to-versions--v190) | -- | ⬇ Install &GreaterEqual; v1.5.0 first |
| [v1.8.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.8.0) | -- | [Pre](#pre-upgrade-to-versions--v180) | -- | ⬇ Install &GreaterEqual; v1.5.0 first |
| [v1.7.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.7.1) | -- | [Pre](#pre-upgrade-to-versions--v170) | [Post](#post-upgrade-to-versions--v170) | ⬇ Install &GreaterEqual; v1.5.0 first |
| [v1.6.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.6.0) | -- | [Pre](#pre-upgrade-to-versions--v160) | [Post](#post-upgrade-to-versions--v160) | [⚠ Install v1.5.0 first](#versions--v160-automated) |
| [v1.5.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.5.0) | **yes** | -- | -- | ⬇ Install &GreaterEqual; v1.1.x first |
| [v1.4.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.4.1) | -- | [Pre](#pre-upgrade-to-versions--v140) | -- | ⬇ Install &GreaterEqual; v1.1.x first |
| [v1.3.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.3.2) | -- | [Pre](#pre-upgrade-to-versions--v130) | -- | ⬇ Install &GreaterEqual; v1.1.x first |
| [v1.2.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.2.1) | -- | [Pre](#pre-upgrade-to-versions--v120) | -- | [⚠ Install v1.1.x first](#versions--v120-automated) |
| [v1.1.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.1.2) | **yes** | [Pre .0](#pre-upgrade-to-versions--v110) → [Pre .1](#pre-upgrade-to-versions--v111) → [Pre .2](#pre-upgrade-to-versions--v112) | [Post](#post-upgrade-to-versions--v110) | [⚠ Install v1.0.0 first](#versions--v110-automated) |
| [v1.0.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.0.0) | **yes** | [Pre](#pre-upgrade-to-versions--v100) | [Post](#post-upgrade-to-versions--v100) | [⚠ Install v0.9.0 first](#versions--v100-automated) |
| [v0.9.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v0.9.0) | **yes** | -- | -- | -- |
| Version | Mandatory | Pre-Upgrade | Post-Upgrade | Minimum Required Previous Version |
| ---------------------------------------------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- | ---------------------------------------------------- |
| [v1.10.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.9.0) | -- | [Pre](#pre-upgrade-to-versions--v1100) | [Post](#post-upgrade-to-versions--v1100) | ⬇ Install ≥ v1.5.0 first |
| [v1.9.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.9.0) | -- | [Pre](#pre-upgrade-to-versions--v190) | -- | ⬇ Install ≥ v1.5.0 first |
| [v1.8.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.8.0) | -- | [Pre](#pre-upgrade-to-versions--v180) | -- | ⬇ Install ≥ v1.5.0 first |
| [v1.7.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.7.1) | -- | [Pre](#pre-upgrade-to-versions--v170) | [Post](#post-upgrade-to-versions--v170) | ⬇ Install ≥ v1.5.0 first |
| [v1.6.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.6.0) | -- | [Pre](#pre-upgrade-to-versions--v160) | [Post](#post-upgrade-to-versions--v160) | [⚠ Install v1.5.0 first](#versions--v160-automated) |
| [v1.5.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.5.0) | **yes** | -- | -- | ⬇ Install ≥ v1.1.x first |
| [v1.4.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.4.1) | -- | [Pre](#pre-upgrade-to-versions--v140) | -- | ⬇ Install ≥ v1.1.x first |
| [v1.3.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.3.2) | -- | [Pre](#pre-upgrade-to-versions--v130) | -- | ⬇ Install ≥ v1.1.x first |
| [v1.2.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.2.1) | -- | [Pre](#pre-upgrade-to-versions--v120) | -- | [⚠ Install v1.1.x first](#versions--v120-automated) |
| [v1.1.x](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.1.2) | **yes** | [Pre .0](#pre-upgrade-to-versions--v110) → [Pre .1](#pre-upgrade-to-versions--v111) → [Pre .2](#pre-upgrade-to-versions--v112) | [Post](#post-upgrade-to-versions--v110) | [⚠ Install v1.0.0 first](#versions--v110-automated) |
| [v1.0.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v1.0.0) | **yes** | [Pre](#pre-upgrade-to-versions--v100) | [Post](#post-upgrade-to-versions--v100) | [⚠ Install v0.9.0 first](#versions--v100-automated) |
| [v0.9.0](https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk/-/releases/v0.9.0) | **yes** | -- | -- | -- |
> [!warning]
> Be sure to check out the table in the release version you are going to install, and not the currently installed version.
@@ -171,15 +179,85 @@ If you would like more details about the automated migrations, please read secti
# Manual checks/actions
> [!note]
> We **only** use the mathematical symbol &GreaterEqual; to denote for which versions manual steps must be
> applied. For example, "Versions &GreaterEqual; v1.7.0" refers to all openDesk versions (major, minor and
> We **only** use the mathematical symbol to denote for which versions manual steps must be
> applied. For example, "Versions v1.7.0" refers to all openDesk versions (major, minor and
> patch) starting from 1.7.0, e.g. 1.7.0, 1.7.1, 1.8.0, etc. Furthermore, if a version is not explicitly
> listed no extra manual steps are required when upgrading to that version, e.g. in the case of an update from
> version 1.7.0 to version 1.7.1.
## Versions &GreaterEqual; v1.10.0
## Versions v1.11.0
### Pre-upgrade to versions &GreaterEqual; v1.10.0
### Pre-upgrade to versions v1.11.0
#### Helmfile new option: Annotations for external services (Dovecot, Jitsi JVB, Postfix)
**Target group:** Existing deployments using `service` annotations.
The three non-HTTP external services support now explicit annotations.
See [`annotations.yaml.gomtpl`](../helmfile/environments/default/annotations.yaml.gotmpl) for reference.
**Jitsi JVB**
The already existing annotation key `annotations.jitsiJVB.service` has been renamed to
`annotations.jitsiJVB.serviceExternal` be in line with the newly added ones for Postfix and Dovecot.
If you make use of the JVB service annotation please rename the attribute to the new `serviceExternal` standard.
**Dovecot**
Setting service annotation by `annotations.openxchangeDovecot.service` applied the annotations to the internal
and external service. This key now only sets annotations for the internal service. If you want to set
annotations for the external service use the newly introduced key `annotations.openxchangeDovecot.serviceExternal`.
**Postfix**
Setting service annotation by `annotations.openxchangePostfix.service` applied the annotations to the internal
and external service. This key now only sets annotations for the internal service. If you want to set
annotations for the external service use the newly introduced key `annotations.openxchangePostfix.serviceExternal`.
## Versions ≥ v1.10.0
### Pre-upgrade to versions ≥ v1.10.0
#### Deployment cleanup: Collabora Controller
**Target group:** Existing openDesk Enterprise deployments using Collabora Controller. Actually only long running
deployments are affected, but following the instructions won't hurt.
As per upstream release notes for [Collabora Online Controller 1.1.4](https://www.collaboraonline.com/cool-controller-release-notes/)
you have to remove the existing leases of the Controller. You can do so by setting `<your_namespace>` and executing
the commands below.
```shell
export NAMESPACE=<your_namespace>
export COLLABORA_CONTROLLER_DEPLOYMENT_NAME=collabora-controller-cool-controller
kubectl -n ${NAMESPACE} scale deployment/${COLLABORA_CONTROLLER_DEPLOYMENT_NAME} --replicas=0
kubectl -n ${NAMESPACE} delete -n collabora leases.coordination.k8s.io collabora-online
```
> [!note]
> The Collabora Online Controller is not scaled up again, as this would happen as part of the upgrade deployment.
#### Helmfile new secret: `secrets.nubus.ldapSearch.postfix`
**Target group:** All existing deployments that use self-defined secrets.
The updated Postfix configuration supporting LDAP group based mailing list requires a new secret that is
declared in [`secrets.yaml.gotmpl`](../helmfile/environments/default/secrets.yaml.gotmpl) by the key
`secrets.nubus.ldapSearch.postfix`.
If you define your own secrets, please ensure that you provide a value for this secret, otherwise it will
be derived from the `MASTER_PASSWORD`.
#### Helmfile new secret: `secrets.doveocot.sharedMailboxesMasterPassword`
**Target group:** All existing deployments that have OX App Suite enabled and that use self-defined secrets.
The revised Dovecot configuration requires a new secret that is declared in
[`secrets.yaml.gotmpl`](../helmfile/environments/default/secrets.yaml.gotmpl) by the key
`secrets.doveocot.sharedMailboxesMasterPassword`.
If you define your own secrets, please ensure that you provide a value for this secret, otherwise it will
be derived from the `MASTER_PASSWORD`.
#### New Helmfile default: Nubus provisioning debug container no longer deployed
@@ -188,15 +266,57 @@ If you would like more details about the automated migrations, please read secti
The [nats-box](https://github.com/nats-io/nats-box), a handy tool when it comes to debugging the Nubus provisioning stack, is no longer enabled in openDesk by default.
To re-enable the nats-box for your deployment you have to set:
```
technical.nubus.provisioning.nats.natsBox.enabled: true
```yaml
technical:
nubus:
provisioning:
nats:
natsBox:
enabled: true
```
> [!note]
> The nats-box also gets enabled when setting `debug.enabled: true`, but that should only be used in non-production scenarios and enabled debug
> accross the whole deployment.
### Post-upgrade to versions &GreaterEqual; v1.10.0
#### New Helmfile default: Postfix SMTP SASL security options
**Target group:** All openDesk deployments using an external SMTP relay that does not support
[Postfix's default `smtpSASLSecurityOptions`](https://www.postfix.org/postconf.5.html#smtp_sasl_security_options).
Starting from openDesk v1.9.0, the SMTP SASL security options set within openDesk are aligned with the
recommended defaults. This might break currently working connections with external SMTP relays.
> [!warning]
> Please check your mail relays supported SASL security options and adjust your deployment accordingly to
> prevent the disruption of mail delivery.
To fall back to the behavior of openDesk < v1.9.0 (no security options at all) set the following in
`smtp.yaml.gotmpl`
``` yaml
smtp:
security:
smtpdSASLSecurityOptions: ~
smtpSASLSecurityOptions: ~
```
To set specific options consult the official Postfix documentation for
[smtpd](https://www.postfix.org/postconf.5.html#smtpd_sasl_security_options) or
[smtp](https://www.postfix.org/postconf.5.html#smtp_sasl_security_options) and set the string options via the
yaml array notation:
``` yaml
smtp:
security:
smtpdSASLSecurityOptions:
- "noanonymous"
smtpSASLSecurityOptions:
- "noanonymous"
- "noplaintext"
```
### Post-upgrade to versions ≥ v1.10.0
#### New application default: Dovecot full-text search index configuration
@@ -210,9 +330,21 @@ Run the following command inside the Dovecot container:
set -x; for d in /var/lib/dovecot/*/*; do uuid=$(basename "$d"); [[ $uuid =~ ^[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}$ ]] || continue; doveadm fts rescan -u "$uuid"; doveadm index -u "$uuid" -q '*'; done
```
## Versions &GreaterEqual; v1.9.0
## Versions v1.9.0
### Pre-upgrade to versions &GreaterEqual; v1.9.0
### Pre-upgrade to versions v1.9.0
#### New application default: Postfix SMTP SASL security option
**Target group:** All openDesk deployments using an external SMTP relay that does not support
[Postfix's default `smtpSASLSecurityOptions`](https://www.postfix.org/postconf.5.html#smtp_sasl_security_options).
Starting from openDesk v1.9.0, the SMTP SASL security options set within openDesk are aligned with the
recommended defaults. This might break currently working connections with external SMTP relays. To prevent
this you have to configure the supported options for your mail relay one of the following ways:
- Recommended: Directly upgrade to v1.10.0 and set SMTP SASL options through `smtp.security.*`.
- Configure a customization for `smtpSASLSecurityOptions`.
#### Helmfile fix: Cassandra passwords read from `databases.*`
@@ -250,9 +382,9 @@ Additionally, it is now possible to explicitly define the hostnames shown in the
If these values are not explicitly set, openDesk will use `.Values.global.domain` as in previous releases.
## Versions &GreaterEqual; v1.8.0
## Versions v1.8.0
### Pre-upgrade to versions &GreaterEqual; v1.8.0
### Pre-upgrade to versions v1.8.0
#### New application default: Default group for two-factor authentication is now "2FA Users"
@@ -407,9 +539,9 @@ Gravatar support is no longer enabled by default in Jitsi and OpenProject. In ca
OPENPROJECT_PLUGIN__OPENPROJECT__AVATARS: '{enable_gravatars: true, enable_local_avatars: true}'
```
## Versions &GreaterEqual; v1.7.0
## Versions v1.7.0
### Pre-upgrade to versions &GreaterEqual; v1.7.0
### Pre-upgrade to versions v1.7.0
#### Helmfile fix: Ensure enterprise overrides apply when deploying from project root
@@ -440,7 +572,7 @@ annotation:
notesYProvider: {}
```
### Post-upgrade to versions &GreaterEqual; v1.7.0
### Post-upgrade to versions v1.7.0
#### Upstream fix: Provisioning of functional mailboxes
@@ -467,9 +599,9 @@ kill ${PROVISIONING_PORT_FORWARD_PID}
rm ${TEMPORARY_CONSUMER_JSON}
```
## Versions &GreaterEqual; v1.6.0
## Versions v1.6.0
### Pre-upgrade to versions &GreaterEqual; v1.6.0
### Pre-upgrade to versions v1.6.0
#### Upstream constraint: Nubus' external secrets
@@ -488,7 +620,7 @@ Please ensure you read the [Nubus 1.10.0 "Migration steps" section](https://docs
For OX App Suite to access the object storage a new secret has been introduced.
It is declared in [`secrets.yaml.gotmpl`](../helmfile/environments/default/secrets.yaml.gotmpl) by the key: `secrets.minio.openxchangeUser`. If you define your own secrets, please ensure that you provide a value for this secret as well, otherwise the aforementioned secret will be derived from the `MASTER_PASSWORD`.
It is declared in [`secrets.yaml.gotmpl`](../helmfile/environments/default/secrets.yaml.gotmpl) by the key: `secrets.minio.openxchangeUser`. If you define your own secrets, please ensure that you provide a value for this secret as well, otherwise it will be derived from the `MASTER_PASSWORD`.
#### Helmfile new object storage: `objectstores.openxchange.*`
@@ -524,7 +656,7 @@ kubectl cp -n ${NAMESPACE} open-xchange-core-mw-default-0:/opt/open-xchange/ox-f
2. Run the upgrade.
3. Continue with the [related post-upgrade steps](#ox-app-suite-fix-up-using-s3-as-storage-for-non-mail-attachments-post-upgrade)
### Post-upgrade to versions &GreaterEqual; v1.6.0
### Post-upgrade to versions v1.6.0
#### OX App Suite fix-up: Using S3 as storage for non mail attachments (post-upgrade)
@@ -565,9 +697,9 @@ ID Type of Job Status Further Information
/opt/open-xchange/sbin/unregisterfilestore -A $MASTER_ADMIN_USER -P $MASTER_ADMIN_PW -i <your_old_filestore_id_from_step_3>
```
## Versions &GreaterEqual; v1.4.0
## Versions v1.4.0
### Pre-upgrade to versions &GreaterEqual; v1.4.0
### Pre-upgrade to versions v1.4.0
#### Helmfile cleanup: `global.additionalMailDomains` as list
@@ -591,9 +723,9 @@ global:
- "sub2.maildomain.de"
```
## Versions &GreaterEqual; v1.3.0
## Versions v1.3.0
### Pre-upgrade to versions &GreaterEqual; v1.3.0
### Pre-upgrade to versions v1.3.0
#### Helmfile new feature: `functional.authentication.ssoFederation`
@@ -601,9 +733,9 @@ global:
Please ensure to configure your IdP federation config details as part of `functional.authentication.ssoFederation`. You can find more details in the "Example configuration" section of [`idp-federation.md`](./enhanced-configuration/idp-federation.md).
## Versions &GreaterEqual; v1.2.0
## Versions v1.2.0
### Pre-upgrade to versions &GreaterEqual; v1.2.0
### Pre-upgrade to versions v1.2.0
#### Helmfile cleanup: Do not configure OX provisioning when no OX installed
@@ -664,9 +796,9 @@ In case you are planning to migrate an existing instance from MariaDB to Postgre
- https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/Backup#HUsingtheXWikiExportfeature
- https://www.xwiki.org/xwiki/bin/view/Documentation/AdminGuide/ImportExport
## Versions &GreaterEqual; v1.1.2
## Versions v1.1.2
### Pre-upgrade to versions &GreaterEqual; v1.1.2
### Pre-upgrade to versions v1.1.2
#### Helmfile feature update: App settings wrapped in `apps.` element
@@ -695,9 +827,9 @@ apps:
enabled: true
```
## Versions &GreaterEqual; v1.1.1
## Versions v1.1.1
### Pre-upgrade to versions &GreaterEqual; v1.1.1
### Pre-upgrade to versions v1.1.1
#### Helmfile feature update: Component specific `storageClassName`
@@ -750,9 +882,9 @@ persistence:
A not yet templated secret was discovered in the Nubus deployment. It is now declared in [`secrets.yaml.gotmpl`](../helmfile/environments/default/secrets.yaml.gotmpl) and can be defined using: `secrets.nubus.masterpassword`. If you define your own secrets, please be sure this new secret is set to the same value as the `MASTER_PASSWORD` environment variable used in your deployment.
## Versions &GreaterEqual; v1.1.0
## Versions v1.1.0
### Pre-upgrade to versions &GreaterEqual; v1.1.0
### Pre-upgrade to versions v1.1.0
#### Helmfile cleanup: Restructured `/helmfile/files/theme` folder
@@ -915,7 +1047,7 @@ The update from openDesk v1.0.0 contains Redis 7.4.1, like the other openDesk bu
Please ensure the Redis you are using is updated to at least version 7.4 to support the requirement of OX App Suite.
### Post-upgrade to versions &GreaterEqual; v1.1.0
### Post-upgrade to versions v1.1.0
#### XWiki fix-ups
@@ -941,9 +1073,9 @@ Unfortunately XWiki does not upgrade itself as expected. The bug has been report
You should have now a fully functional XWiki instance with single sign-on and full-text search.
## Versions &GreaterEqual; v1.0.0
## Versions v1.0.0
### Pre-upgrade to versions &GreaterEqual; v1.0.0
### Pre-upgrade to versions v1.0.0
#### Configuration Cleanup: Removal of unnecessary OX-Profiles in Nubus
@@ -1125,7 +1257,7 @@ The IAM admin account `Administrator` is the only member of this group by defaul
If you need other accounts to use the API, please assign them to the aforementioned group.
### Post-upgrade to versions &GreaterEqual; v1.0.0
### Post-upgrade to versions v1.0.0
#### Configuration Improvement: Separate user permission for using Video Conference component
@@ -1157,33 +1289,33 @@ kubectl -n ${NAMESPACE} delete pvc ox-connector-ox-contexts-ox-connector-0
# Automated migrations - Details
## Versions &GreaterEqual; v1.6.0 (automated)
## Versions v1.6.0 (automated)
> [!note]
> Details can be found in [run_5.py](https://gitlab.opencode.de/bmi/opendesk/components/platform-development/images/opendesk-migrations/-/blob/main/odmigs-python/odmigs_runs/run_5.py).
### Versions &GreaterEqual; v1.6.0 migrations-post
### Versions v1.6.0 migrations-post
- Automatically restarts the StatefulSets `ums-provisioning-nats` and `ox-connector` due to a workaround applied on the NATS secrets, see the "Notes" segment of the ["Password seed" heading in getting-started.md](./docs/getting-started.md#password-seed)
> [!note]
> This change aims to prevent authentication failures with NATS in some Pods, which can lead to errors such as: `wait-for-nats Unavailable, waiting 2 seconds. Error: nats: 'Authorization Violation'`.
## Versions &GreaterEqual; v1.2.0 (automated)
## Versions v1.2.0 (automated)
> [!note]
> Details can be found in [run_4.py](https://gitlab.opencode.de/bmi/opendesk/components/platform-development/images/opendesk-migrations/-/blob/main/odmigs-python/odmigs_runs/run_4.py).
### Versions &GreaterEqual; v1.2.0 migrations-pre
### Versions v1.2.0 migrations-pre
- Automatically deletes PVC `group-membership-cache-ums-portal-consumer-0`: With the upgrade the Nubus Portal Consumer no longer requires to be executed with root privileges. The PVC contains files that require root permission to access them, therefore the PVC gets deleted (and re-created) during the upgrade.
- Automatically deletes StatefulSet `ums-portal-consumer`: A bug was fixed in the templating of the Portal Consumer's PVC causing the values in `persistence.storages.nubusPortalConsumer.*` to be ignored. As these values are immutable, we had to delete the whole StatefulSet.
### Versions &GreaterEqual; v1.2.0 migrations-post
### Versions v1.2.0 migrations-post
- Automatically restarts the Deployment `ums-provisioning-udm-transformer` and StatefulSet `ums-provisioning-udm-listener` and deletes the Nubus Provisioning consumer `durable_name:incoming` on stream `stream:incoming`: Due to a bug in Nubus 1.7.0 the `incoming` stream was blocked after the upgrade, the aforementioned measures unblock the stream.
## Versions &GreaterEqual; v1.1.0 (automated)
## Versions v1.1.0 (automated)
With openDesk v1.1.0 the IAM stack supports HA LDAP primary as well as scalable LDAP secondary pods.
@@ -1194,7 +1326,7 @@ creating the config map with the mentioned label.
> [!note]
> Details can be found in [run_3.py](https://gitlab.opencode.de/bmi/opendesk/components/platform-development/images/opendesk-migrations/-/blob/main/odmigs-python/odmigs_runs/run_3.py).
## Versions &GreaterEqual; v1.0.0 (automated)
## Versions v1.0.0 (automated)
The `migrations-pre` and `migrations-post` jobs in the openDesk deployment address the automated migration tasks.

View File

@@ -23,8 +23,7 @@ openDesk includes integration with Prometheus-based monitoring.
Together with [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack), you can easily leverage the full potential of the open-source cloud-native observability stack.
Before enabling the following options, you need to install the respective custom resource definitions (CRDs) from the kube-prometheus-stack
repository or Prometheus operator.
Before enabling the following options, you need to install the respective custom resource definitions (CRDs) from the kube-prometheus-stack repository which should at least include the Prometheus Operator.
# Defaults
@@ -33,14 +32,16 @@ All configurable options and their defaults can be found in
# Metrics
To deploy `podMonitor` and `serviceMonitor` custom resources, enable it by:
To deploy `podMonitor` and `serviceMonitor` custom resources, enable them by:
```yaml
prometheus:
serviceMonitors:
enabled: true
podMonitors:
enabled: true
monitoring:
prometheus:
serviceMonitors:
enabled: true
podMonitors:
enabled: true
```
```
# Alerts
@@ -51,19 +52,23 @@ Some of these are created by our partners while others are defined in [opendesk-
All alert rules are deployed as [PrometheusRule](https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.PrometheusRule) and can be enabled like this:
```yaml
prometheus:
prometheusRules:
enabled: true
monitoring:
prometheus:
prometheusRules:
enabled: true
```
# Dashboards for Grafana
To deploy optional Grafana dashboards with ConfigMaps, enable the functionality with:
If your Grafana instance is deployed via kube-prometheus-stack, or you have deployed the [Sidecar for datasources](https://github.com/grafana/helm-charts/blob/main/charts/grafana/README.md#sidecar-for-datasources), openDesk can make dashboards available via ConfigMap resources.
Enable the functionality with the following snippet:
```yaml
grafana:
dashboards:
enabled: true
monitoring:
grafana:
dashboards:
enabled: true
```
Please find further details in the [related Helm chart](https://gitlab.opencode.de/bmi/opendesk/components/platform-development/charts/opendesk-dashboards).

View File

@@ -29,14 +29,14 @@ openDesk is a Kubernetes-only solution and requires an existing Kubernetes (K8s)
- K8s cluster >= v1.24, [CNCF Certified Kubernetes distribution](https://www.cncf.io/certification/software-conformance/)
- Domain and DNS Service
- Ingress controller (Ingress NGINX) >= [4.11.5/1.11.5](https://github.com/kubernetes/ingress-nginx/releases)
- [Helm](https://helm.sh/) >= v3.17.3, but not v3.18.0[^1]
- [Helm](https://helm.sh/) >= v3.17.3 (but not v3.18.0[^1]) and < v4[^2],
- [Helmfile](https://helmfile.readthedocs.io/en/latest/) >= v1.0.0
- [HelmDiff](https://github.com/databus23/helm-diff) >= v3.11.0
- Volume provisioner supporting RWO (read-write-once)[^2]
- Volume provisioner supporting RWO (read-write-once)[^3]
- Certificate handling with [cert-manager](https://cert-manager.io/)
**Additional openDesk Enterprise requirements**
- [OpenKruise](https://openkruise.io/)[^3] >= v1.6
- [OpenKruise](https://openkruise.io/)[^4] >= v1.6
# Hardware
@@ -138,8 +138,11 @@ Helmfile requires [HelmDiff](https://github.com/databus23/helm-diff) to compare
# Footnotes
[^1]: Due to a [Helm bug](https://github.com/helm/helm/issues/30890) Helm 3.18.0 is not supported.
[^1]: Due to a [Helm bug](https://github.com/helm/helm/issues/30890) Helm v3.18.0 is not supported.
[^2]: Due to [restrictions on Kubernetes `emptyDir`](https://github.com/kubernetes/kubernetes/pull/130277) you need a volume provisioner that has sticky bit support, otherwise the OpenProject seeder job will fail. E.g. the `local-path-provisioner` does not have sticky bit support.
[^2]: Helm v4 introduced stricter flag grouping that is not yet supported by the helmdiff plugin.
[^3]: Due to [restrictions on Kubernetes `emptyDir`](https://github.com/kubernetes/kubernetes/pull/130277) you need a volume provisioner that has sticky bit support, otherwise the OpenProject seeder job will fail. E.g. the `local-path-provisioner` does not have sticky bit support.
[^4]: Required for Dovecot Pro as part of openDesk Enterprise Edition.
[^3]: Required for Dovecot Pro as part of openDesk Enterprise Edition.

View File

@@ -7,6 +7,7 @@ SPDX-License-Identifier: Apache-2.0
<h1>Scaling</h1>
This document covers the possibilities to scale the applications in openDesk.
You may also want to review the prepared [size profiles](./size-profiles.md).
It provides rough benchmarks for configuring your own environment across various scale levels.
In production, resource demands are primarily driven by actual usage patterns and system load, especially the number of concurrently active users.
@@ -25,6 +26,7 @@ Consequently, we strongly recommend implementing monitoring and logging solution
[^1]: Nextcloud is configured for attachment storage as well.
# Upstream information
While scaling services horizontally is the ideal solution, information about vertical scaling is helpful

View File

@@ -21,9 +21,10 @@ For more details on Chart validation, please visit: https://helm.sh/docs/topics/
All charts except the ones mentioned below are verifiable:
| Repository | Verifiable |
|-------------------|:----------:|
| open-xchange-repo | no |
| Repository | Verifiable |
| ------------------------- | :--------: |
| collabora-controller-repo | no |
| open-xchange-repo | no |
# Kubernetes security enforcements

49
docs/size-profiles.md Normal file
View File

@@ -0,0 +1,49 @@
<!--
SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
SPDX-License-Identifier: Apache-2.0
-->
<h1>Size Profiles</h1>
This repository contains base profiles for the following maximum user counts:
- 500
- 5,000 (5k)
- 50,000 (50k)
- 100,000 (100k)
# Assumptions
These profiles were created with some assumptions in mind:
- Regular load without application-specific emphasis
- 10% concurrent user load at max on individual applications
As user profiles can vary significantly between different instances, you may want to adjust these values.
For information on adjusting values, refer to the [scaling](./scaling.md) documentation for openDesk.
# Hardware Requirements
The following table provides an overview of CPU and memory requirements, including [external services](./external-services.md).
The available memory in the cluster should be between the request and limit values. Actual memory utilization varies depending on usage patterns but will unlikely consume the complete setup limit.
| **Profile** | CPUs | Memory (Gi), request | Memory (Gi), limit |
|-------------|------|----------------------|--------------------|
| **500** | >25 | 32 | 141 |
| **5k** | >54 | 86 | 551 |
| **50k** | >206 | 422 | 2058 |
| **100k** | >336 | 711 | 3418 |
# Location
`/helmfile/environments/default-size-<max-user-profile>-overrides/`
# Deployment
Set the environment variable `SIZE_PROFILE` to `500`, `5k`, `50k`, or `100k` when using helmfile to use one profile.
# Notes
The size profiles contain resource definitions for [external services](./external-services.md) that can be used as guidance for production-grade service requirements.
Large and very large instances (50k and 100k) also require more allowed concurrent connections (`max_connections`) on the databases (especially PostgreSQL) than the default value (100).

View File

@@ -248,9 +248,9 @@ jitsi:
{{ .Values.resources.jvb | toYaml | nindent 6 }}
service:
type: {{ coalesce .Values.service.type.jitsiVideoBridge .Values.cluster.service.type | quote }}
{{- if .Values.annotations.jitsiJvb.service }}
{{- if .Values.annotations.jitsiJvb.serviceExternal }}
annotations:
{{ .Values.annotations.jitsiJvb.service | toYaml | nindent 8 }}
{{ .Values.annotations.jitsiJvb.serviceExternal | toYaml | nindent 8 }}
{{- end }}
securityContext:
allowPrivilegeEscalation: false

View File

@@ -140,6 +140,8 @@ service:
{{ .Values.annotations.openxchangeDovecot.service | toYaml | nindent 4 }}
external:
enabled: true
annotations:
{{ .Values.annotations.openxchangeDovecot.serviceExternal | toYaml | nindent 6 }}
type: {{ coalesce .Values.service.type.dovecot .Values.cluster.service.type | quote }}
{{- end }}

View File

@@ -64,11 +64,14 @@ postfix:
password:
value: {{ .Values.smtp.password }}
smtpSASLAuthEnable: "yes"
{{- else }}
smtpSASLAuthEnable: "no"
{{- end }}
allowRelayNets: false
smtpTLSSecurityLevel: "encrypt"
smtpdSASLAuthEnable: "yes"
smtpdSASLSecurityOptions: "noanonymous"
smtpdSASLSecurityOptions: {{ .Values.smtp.security.smtpdSASLSecurityOptions | join ", " | quote }}
smtpSASLSecurityOptions: {{ .Values.smtp.security.smtpSASLSecurityOptions | join ", " | quote }}
smtpdSASLType: "dovecot"
smtpdTLSSecurityLevel: "encrypt"
smtpdTLSCertFile: "/etc/tls/tls.crt"
@@ -78,6 +81,25 @@ postfix:
staticAuthDB:
enabled: false
ldapTransportMaps: []
ldapVirtualAliasMaps:
- host: "ums-ldap-server"
scheme: "ldap"
port: 389
baseDn: "{{ .Values.ldap.baseDn }}"
bindDn: "uid=ldapsearch_postfix,cn=users,{{ .Values.ldap.baseDn }}"
password:
value: {{ .Values.secrets.nubus.ldapSearch.postfix | quote }}
# ldap filter to find groups with mail address
queryFilter: "(&(|(objectClass=univentionMailList)(objectClass=posixGroup))(|(mailPrimaryAddress=%s)(mailAlternativeAddress=%s)))"
# -- use this attribute if the query already returns email addresses of members and no recursive lookup needs to be done
resultAttribute: ""
# -- do a recursive search on the specified attribute if found, should be a DN
specialResultAttribute: "uniqueMember"
# -- return the following attribute from all found leaves when a recursive search is done
leafResultAttribute: "mailPrimaryAddress"
{{- if .Values.antivirus.milter.host }}
smtpdMilters: "inet:{{ .Values.antivirus.milter.host }}:{{ .Values.antivirus.milter.port }}"
{{- else }}
@@ -107,6 +129,8 @@ service:
{{ .Values.annotations.openxchangePostfix.service | toYaml | nindent 4 }}
external:
enabled: true
annotations:
{{ .Values.annotations.openxchangePostfix.serviceExternal | toYaml | nindent 6 }}
type: {{ coalesce .Values.service.type.postfix .Values.cluster.service.type | quote }}
{{- end }}
...

View File

@@ -28,7 +28,7 @@ clamd:
podAnnotations:
intents.otterize.com/service-name: "clamav-distributed"
{{- with .Values.annotations.servicesExternalClamavDistributed.clamdPod }}
{{ . | toYaml | nindent 4 }}
{{ . | toYaml | nindent 4 }}
{{- end }}
podSecurityContext:
enabled: true

View File

@@ -46,7 +46,7 @@ persistence:
podAnnotations:
intents.otterize.com/service-name: "clamav-simple"
{{- with .Values.annotations.servicesExternalClamavSimple.pod }}
{{ . | toYaml | nindent 2 }}
{{ . | toYaml | nindent 2 }}
{{- end }}
podSecurityContext:

View File

@@ -32,7 +32,7 @@ image:
podAnnotations:
intents.otterize.com/service-name: "dkimpy-milter"
{{- with .Values.annotations.servicesExternalDkimpy.service }}
{{ . | toYaml | nindent 2 }}
{{ . | toYaml | nindent 2 }}
{{- end }}
podSecurityContext:

View File

@@ -36,7 +36,7 @@ image:
podAnnotations:
intents.otterize.com/service-name: "memcached"
{{- with .Values.annotations.servicesExternalMemcached.pod }}
{{ . | toYaml | nindent 2 }}
{{ . | toYaml | nindent 2 }}
{{- end}}
replicaCount: {{ .Values.replicas.memcached }}

View File

@@ -136,7 +136,7 @@ provisioning:
podAnnotations:
intents.otterize.com/service-name: "minio-provisioning"
{{- with .Values.annotations.servicesExternalMinio.provisioningPod }}
{{ . | toYaml | nindent 4}}
{{ . | toYaml | nindent 4}}
{{- end }}
policies:
- name: "migrations-bucket-policy"

View File

@@ -72,6 +72,8 @@ postfix:
password:
value: {{ .Values.smtp.password }}
smtpSASLAuthEnable: "yes"
{{- else }}
smtpSASLAuthEnable: "no"
{{- end }}
# Warning: This setting allows unauthenticated mail relay from relayNets!
allowRelayNets: true
@@ -80,7 +82,8 @@ postfix:
smtpdTLSMandatoryCiphers: "medium"
smtpTLSSecurityLevel: "encrypt"
smtpdSASLAuthEnable: "yes"
smtpdSASLSecurityOptions: "noanonymous"
smtpdSASLSecurityOptions: {{ .Values.smtp.security.smtpdSASLSecurityOptions | join ", " | quote }}
smtpSASLSecurityOptions: {{ .Values.smtp.security.smtpSASLSecurityOptions | join ", " | quote }}
smtpdSASLType: "cyrus"
smtpdTLSSecurityLevel: "may"
smtpdTLSCertFile: "/etc/tls/tls.crt"
@@ -94,6 +97,25 @@ postfix:
password:
value: {{ .Values.secrets.postfix.opendeskSystemPassword | quote }}
ldapTransportMaps: []
ldapVirtualAliasMaps:
- host: "ums-ldap-server"
scheme: "ldap"
port: 389
baseDn: "{{ .Values.ldap.baseDn }}"
bindDn: "uid=ldapsearch_postfix,cn=users,{{ .Values.ldap.baseDn }}"
password:
value: {{ .Values.secrets.nubus.ldapSearch.postfix | quote }}
# ldap filter to find groups with mail address
queryFilter: "(&(|(objectClass=univentionMailList)(objectClass=posixGroup))(|(mailPrimaryAddress=%s)(mailAlternativeAddress=%s)))"
# -- use this attribute if the query already returns email addresses of members and no recursive lookup needs to be done
resultAttribute: ""
# -- do a recursive search on the specified attribute if found, should be a DN
specialResultAttribute: "uniqueMember"
# -- return the following attribute from all found leaves when a recursive search is done
leafResultAttribute: "mailPrimaryAddress"
{{- if .Values.antivirus.milter.host }}
smtpdMilters: "inet:{{ .Values.antivirus.milter.host }}:{{ .Values.antivirus.milter.port }}"
{{- else }}

View File

@@ -67,6 +67,9 @@ job:
- username: {{ .Values.databases.umsGuardianManagementApi.username | quote }}
password: {{ .Values.secrets.postgresql.umsGuardianManagementApiUser | quote }}
connectionLimit: {{ .Values.databases.umsGuardianManagementApi.connectionLimit | default .Values.databases.defaults.userConnectionLimit }}
- username: {{ .Values.databases.umsAuthSession.username | quote }}
password: {{ .Values.secrets.postgresql.umsAuthSessionUser | quote }}
connectionLimit: {{ .Values.databases.umsAuthSession.connectionLimit | default .Values.databases.defaults.userConnectionLimit }}
- username: {{ .Values.databases.umsSelfservice.username | quote }}
password: {{ .Values.secrets.postgresql.umsSelfserviceUser | quote }}
connectionLimit: {{ .Values.databases.umsSelfservice.connectionLimit | default .Values.databases.defaults.userConnectionLimit }}
@@ -96,6 +99,8 @@ job:
user: {{ .Values.databases.umsGuardianManagementApi.username | quote }}
- name: {{ .Values.databases.umsNotificationsApi.name | quote }}
user: {{ .Values.databases.umsNotificationsApi.username | quote }}
- name: {{ .Values.databases.umsAuthSession.name | quote }}
user: {{ .Values.databases.umsAuthSession.username | quote }}
- name: {{ .Values.databases.umsSelfservice.name | quote }}
user: {{ .Values.databases.umsSelfservice.username | quote }}
{{ if or (eq .Values.databases.nextcloud.type "postgresql") (eq .Values.databases.nextcloud.type "psql") }}

View File

@@ -8,12 +8,30 @@ environments:
{{- if eq (env "OPENDESK_ENTERPRISE") "true" }}
- "../../environments/default-enterprise-overrides/*.yaml.gotmpl"
{{- end }}
{{- if eq (env "SIZE_PROFILE") "500" }}
- "../../environments/default-size-500-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "5k" }}
- "../../environments/default-size-5k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "50k" }}
- "../../environments/default-size-50k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "100k" }}
- "../../environments/default-size-100k-overrides/*.yaml.gotmpl"
{{- end }}
dev:
values:
- "../../environments/default/*.yaml.gotmpl"
{{- if eq (env "OPENDESK_ENTERPRISE") "true" }}
- "../../environments/default-enterprise-overrides/*.yaml.gotmpl"
{{- end }}
{{- if eq (env "SIZE_PROFILE") "500" }}
- "../../environments/default-size-500-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "5k" }}
- "../../environments/default-size-5k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "50k" }}
- "../../environments/default-size-50k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "100k" }}
- "../../environments/default-size-100k-overrides/*.yaml.gotmpl"
{{- end }}
- "../../environments/dev/*.yaml.gotmpl"
test:
values:
@@ -21,6 +39,15 @@ environments:
{{- if eq (env "OPENDESK_ENTERPRISE") "true" }}
- "../../environments/default-enterprise-overrides/*.yaml.gotmpl"
{{- end }}
{{- if eq (env "SIZE_PROFILE") "500" }}
- "../../environments/default-size-500-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "5k" }}
- "../../environments/default-size-5k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "50k" }}
- "../../environments/default-size-50k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "100k" }}
- "../../environments/default-size-100k-overrides/*.yaml.gotmpl"
{{- end }}
- "../../environments/test/*.yaml.gotmpl"
prod:
values:
@@ -28,5 +55,14 @@ environments:
{{- if eq (env "OPENDESK_ENTERPRISE") "true" }}
- "../../environments/default-enterprise-overrides/*.yaml.gotmpl"
{{- end }}
{{- if eq (env "SIZE_PROFILE") "500" }}
- "../../environments/default-size-500-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "5k" }}
- "../../environments/default-size-5k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "50k" }}
- "../../environments/default-size-50k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "100k" }}
- "../../environments/default-size-100k-overrides/*.yaml.gotmpl"
{{- end }}
- "../../environments/prod/*.yaml.gotmpl"
...

View File

@@ -6,7 +6,7 @@ charts:
registry: "registry.opencode.de"
repository: "zendis/opendesk-enterprise/components/product-development/charts/opendesk-dovecot-pro"
name: "dovecot"
version: "3.2.1"
version: "3.3.0"
verify: true
oxAppSuite:
registry: "registry.opencode.de"

View File

@@ -0,0 +1,69 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
persistence:
# Will be used as default if not otherwise define on the component level
storageClassNames:
RWX: ""
RWO: ""
storages:
cassandra:
size: "300Gi"
commitLogsize: "8Gi"
storageClassName: ~
clamav:
size: "1Gi"
storageClassName: ~
dovecot:
size: "1200Gi"
storageClassName: ~
mariadb:
size: "320Gi"
storageClassName: ~
matrixNeoDateFixBot:
size: "1Gi"
storageClassName: ~
minio:
size: "2500Gi" # Open-Xchange: "10000Gi", with just 100Mi per user + OpenProject: "4000Gi" + Nextcloud: "10000Gi", with just 100Mi per user + Nubus: "50Gi" + Notes: "50Gi"
storageClassName: ~
nubusLdapServerData:
size: "25Gi"
storageClassName: ~
nubusPortalConsumer:
size: "25Gi"
storageClassName: ~
nubusProvisioningNats:
size: "25Gi"
storageClassName: ~
# This option was introduced with openDesk 1.6. For now we want to use the Helm charts default empty string
# to avoid issues during the upgrade modifying an existing PV, as the migrations in 1.6 required a smooth
# Nubus deployment.
# In a later openDesk release we will advise in the migrations.md to explicitly set this on existing deployments
# to the default storage class.
nubusUdmListener:
size: "1Gi"
#storageClassName: ""
oxConnector:
size: "1Gi"
# This value is not passed on to the related Helm chart yet, but required for linting purposes.
storageClassName: ~
postfix:
size: "50Gi"
storageClassName: ~
postgresql:
size: "1000Gi"
storageClassName: ~
prosody:
size: "1Gi"
storageClassName: ~
redis:
size: "75Gi"
storageClassName: ~
synapse:
size: "10000Gi" # just 100Mi per user
storageClassName: ~
xwiki:
size: "50Gi"
storageClassName: ~
...

View File

@@ -0,0 +1,230 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
replicas:
## Note: Databases should be deployed separately
# -- component: Cassandra
# -- scalable: tbd
cassandra: 3
# -- component: Persistence Layer
# -- scalable: false
mariadb: 1
# -- scalable: false
memcached: 1
# -- scalable: true
minio: 1
# -- scalable: false
postgres: 1
# -- scalable: tbd
redis: 1
# ClamAV
# -- component: Antivirus (ClamAV)
# -- scalable: true
# -- comment: clamav-simple - supports `ReadWriteOnce` PVCs.
clamav: 3
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
clamd: 3
# -- scalable: true
# -- comment: clamav-distributed - You do not want to scale this service, as it just updates the signature files
# centrally an should be a singleton.
freshclam: 1
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
icap: 3
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
milter: 3
# IAM / Nubus
# -- component: IAM (Nubus)
# -- scalable: true
intercomService: 1
# -- scalable: true
keycloak: 5
# -- scalable: false
oxConnector: 1
# -- scalable: tbd
umsGuardianAuthorizationApi: 1
# -- scalable: tbd
umsGuardianManagementApi: 1
# -- scalable: tbd
umsGuardianManagementUi: 1
# -- scalable: tbd
umsGuardianOpenPolicyAgent: 1
# -- scalable: false
# -- comment: Should not be scaled, is an async process.
umsKeycloakExtensionsHandler: 1
# -- scalable: true
umsKeycloakExtensionsProxy: 1
# -- scalable: tbd
umsLdapNotifier: 1
# -- scalable: true
# -- comment: Please find details on the following `umsLdapServer*` entries in the upstream documentation:
# https://docs.software-univention.de/nubus-kubernetes-operation/latest/en/configuration/ldap.html#directory-service-high-availability-and-scalability
umsLdapServerPrimary: 2
# -- scalable: true
umsLdapServerSecondary: 8
# -- scalable: true
# -- comment: The LDAP proxy is only required in situations where there are clients outside of UDM writing into the
# LDAP like Samba. This is not a use case within openDesk so the LDAP Proxy's replica count should be kept at `0`
umsLdapServerProxy: 0
# -- scalable: tbd
umsNotificationsApi: 2
# -- scalable: true
umsPortalFrontend: 8
# -- scalable: false
umsPortalConsumer: 1
# -- scalable: true
umsPortalServer: 20
# -- scalable: tdb
umsProvisioningApi: 1
# -- scalable: false
umsProvisioningDispatcher: 1
# -- scalable: tdb
umsProvisioningNats: 1
# -- scalable: tdb
umsProvisioningPrefill: 1
# -- scalable: false
umsProvisioningUdmTransformer: 1
# -- scalable: tbd
umsSelfserviceConsumer: 1
# -- scalable: true
umsUdmListener: 1
# -- scalable: tbd
umsUdmRestApi: 8
# -- scalable: tbd
umsUmcGateway: 1
# -- scalable: tbd
umsUmcServer: 16
# -- scalable: tbd
umsUmcServerProxy: 1
# -- scalable: true
nginxS3Gateway: 1
# Nextcloud
# -- component: Filestore (Nextcloud)
# -- scalable: true
nextcloud: 12
# -- scalable: true
nextcloudNotifyPush: 1
# -- scalable: true
nextcloudExporter: 1
# Collabora:
# -- component: Weboffice (Collabora)
# -- scalable: true
# -- comment: If Collabora Controller is enabled, Collabora is autoscaling and the value below will be ignored.
# Please check `enterpriseFeatures.collabora.autoscaling` for autoscaling settings.
collabora: 50
# -- scalable: true
# -- comment: Load between Collabora Controller Pods is going to one Pod (the leader) only, therefore raise the number
# e.g. to `2` for high availability of the Collabora Controller.
collaboraController: 1
# Cryptpad
# -- component: Pad (CryptPad)
# -- scalable: false
cryptpad: 1
# OX App Suite
# -- component: Groupware (OX AppSuite, OX Dovecot etc.)
# -- scalable: false
# -- comment: Scalable in openDesk Enterprise only
dovecot: 1
# -- component: Groupware (OX App Suite)
# -- scalable: tbd
openxchangeCoreDocumentConverter: 1
# -- scalable: tbd
openxchangeCoreGuidedtours: 1
# -- scalable: tbd
openxchangeCoreImageConverter: 1
# -- scalable: tbd
openxchangeCoreMW: 17
# -- scalable: tbd
openxchangeCoreUI: 1
# -- scalable: tbd
openxchangeCoreUIMiddleware: 2
# -- scalable: tbd
openxchangeCoreUserGuide: 1
# -- scalable: tbd
openxchangeGotenberg: 1
# -- scalable: tbd
openxchangeGuardUI: 1
# -- scalable: tbd
openxchangeNextcloudIntegrationUI: 1
# -- scalable: tbd
openxchangePluginsUI: 1
# -- scalable: tbd
openxchangePublicSectorUI: 1
# -- component: Project management (OpenProject)
# -- scalable: true
openprojectWeb: 53 # max 10'000 active users / 1'500 active users per 8 web workers = ~53 web workers
# -- scalable: true
# -- comment: Async service working on processing queue content. Can work on queues in parallel (when needed). Check
# https://www.openproject.org/docs/installation-and-operations/installation/helm-chart/ for details, as e.g.
# dedicated workers for specific queues are possible with OpenProject.
openprojectWorker: 26 # max 10'000 active users / 1'500 active users per 4 background workers = ~26 web workers
# -- component: Knowledge management (XWiki)
# -- scalable: false
xwiki: 1 # currently just vertial scaling
# -- component: Chat (Element, Synapse)
# -- scalable: true
element: 9 # no information about that, but as it distributes the web client to the users' browsers, there should be some server running parallel
# -- scalable: tbd
matrixNeoBoardWidget: 1
# -- scalable: tbd
matrixNeoChoiceWidget: 1
# -- scalable: tbd
matrixNeoDateFixBot: 1
# -- scalable: tbd
matrixNeoDateFixWidget: 1
# -- scalable: tbd
matrixUserVerificationService: 1
# -- scalable: tbd
synapse: 24
# -- scalable: true
synapseWeb: 3 # no information about that, but as HAproxy, a redundant setup should be senseful in larger deployments
# -- scalable: true
wellKnown: 1
# -- component: Note taking (Notes) # No experience so far regarding heavy load (?), 10 replicas just a guess, atm
# -- scalable: true
notesBackend: 50
# -- scalable: true
notesFrontend: 10
# -- scalable: true
notesYProvider: 50
# Jitsi
# Current Helm Chart does only support one shard; shard can handle up to 1500 concurrent user
# -- component: Video conference (Jitsi)
# -- scalable: tbd
jibri: 1
# -- scalable: tbd
jicofo: 1
# -- scalable: tbd
jigasi: 1
# -- scalable: tbd
jitsi: 1
# -- scalable: tbd
jitsiKeycloakAdapter: 1
# -- scalable: tbd
jvb: 15 # 15 jvb maximum per shard; each jvb with up to 8Gi memory
# Jitsi
# 3 shards, each for up to 4000 concurrent users
...

View File

@@ -0,0 +1,655 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
resources:
cassandra:
limits:
cpu: 99
memory: "26Gi"
requests:
cpu: 1
memory: "1Gi"
clamd:
limits:
cpu: 99
memory: "16Gi"
requests:
cpu: 2
memory: "2Gi"
collabora:
# without autoscaling:
limits:
cpu: 99
memory: "26Gi"
requests:
cpu: 4
memory: "8Gi"
## with autoscaling:
#limits:
# cpu: 4
# memory: "8Gi"
#requests:
# cpu: 4
# memory: "8Gi"
collaboraController:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.5
memory: "256Mi"
cryptpad:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.1
memory: "512Mi"
dkimpy:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
dovecot:
limits:
cpu: 8
memory: "26Gi"
requests:
cpu: 1
memory: "1Gi"
element:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
freshclam:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.5
memory: "512Mi"
icap:
limits:
cpu: 8
memory: "512Mi"
requests:
cpu: 0.5
memory: "128Mi"
intercomService:
limits:
cpu: 2
memory: "1Gi"
requests:
cpu: 0.5
memory: "128Mi"
# The Jibri container requires 2Gi /dev/shm so we need a limit based on the expected memory consumption of the
# service plus the 2Gi /dev/shm
jibri:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "384Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jicofo:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jigasi:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
jitsi:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
jitsiKeycloakAdapter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.01
memory: "48Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jvb:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.5
memory: "1Gi"
mariadb:
limits:
cpu: 99
memory: "108Gi"
requests:
cpu: 1
memory: "4Gi"
matrixNeoBoardWidget:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoChoiceWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoDateFixBot:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "128Mi"
matrixNeoDateFixWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixUserVerificationService:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
memcached:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
milter:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.1
memory: "16Mi"
minio:
limits:
cpu: 8
memory: "8Gi"
requests:
cpu: 1.5
memory: "2Gi"
nextcloud:
limits:
cpu: 11
memory: "40Gi"
requests:
cpu: 2
memory: "8Gi"
nextcloudCron:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nextcloudExporter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
nextcloudNotifyPush:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nginxS3Gateway:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: "100m"
memory: "16Mi"
notesBackend:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "768Mi"
notesFrontend:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
notesYProvider:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "200Mi"
opendeskKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
opendeskStaticFiles:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: 0.01
memory: "16Mi"
openproject:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "768Mi"
openprojectDbInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectAppInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectSeederJob:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectWorkers:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.25
memory: "512Mi"
openxchangeCoreDocumentConverter:
limits:
cpu: 2
memory: "6Gi"
requests:
cpu: 0.25
memory: "1.25Gi"
openxchangeCoreGuidedtours:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreImageConverter:
limits:
cpu: 2
memory: "6Gi"
requests:
cpu: 0.5
memory: "1.25Gi"
openxchangeCoreMW:
limits:
cpu: 4
memory: "16Gi"
requests:
cpu: 1
memory: "1.25Gi"
openxchangeCoreUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreUIMiddleware:
limits:
cpu: 1
memory: "1536Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUIMiddlewareUpdater:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUserGuide:
limits:
cpu: 1
memory: "128Mi"
requests:
cpu: 0.02
memory: "32Mi"
openxchangeGotenberg:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangeGuardUI:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeNextcloudIntegrationUI:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangePluginsUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangePublicSectorUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
oxConnector:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.1
memory: "1Gi"
postfix:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "16Mi"
postgresql:
limits:
cpu: 99
memory: "1098Gi" # Element: "230Gi" + Nextcloud: "516Gi" + OpenProject: "96Gi" + XWiki: "256Gi"
requests:
cpu: 10
memory: "128Gi"
prosody:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
redis:
limits:
cpu: 16
memory: "63Gi"
requests:
cpu: 2
memory: "4Gi"
synapse:
limits:
cpu: 99
memory: "16Gi"
requests:
cpu: 1
memory: "2Gi"
synapseWeb:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "64Mi"
umsGuardianManagementApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianManagementUi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianAuthorizationApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloak:
limits:
cpu: 99
memory: "2Gi"
requests:
cpu: 0.1
memory: "512Mi"
umsKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloakExtensionHandler:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.2
memory: "250Mi"
umsKeycloakExtensionProxy:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.2
memory: "250Mi"
umsLdapNotifier:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsLdapServer:
limits:
cpu: 8
memory: "4Gi"
requests:
cpu: 3
memory: "2Gi"
umsNotificationsApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalFrontend:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumerDependencies:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalServer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "100Mi"
umsProvisioningDispatcher:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningPrefill:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningRegisterConsumers:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningUdmTransformer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningNats:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "128Mi"
umsSelfserviceConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsStackDataUms:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsOpenPolicyAgent:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmListener:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApiInit:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcGateway:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcServer:
limits:
cpu: 2
memory: "2Gi"
requests:
cpu: 0.3
memory: "500Mi"
wellKnown:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
xwiki:
limits:
cpu: 99
memory: "192Gi"
requests:
cpu: 20
memory: "34Gi"
...

View File

@@ -0,0 +1,69 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
persistence:
# Will be used as default if not otherwise define on the component level
storageClassNames:
RWX: ""
RWO: ""
storages:
cassandra:
size: "10Gi"
commitLogsize: "2560Mi"
storageClassName: ~
clamav:
size: "1Gi"
storageClassName: ~
dovecot:
size: "10Gi"
storageClassName: ~
mariadb:
size: "5Gi"
storageClassName: ~
matrixNeoDateFixBot:
size: "1Gi"
storageClassName: ~
minio:
size: "122Gi" # Open-Xchange: "50Gi", with just 100Mi per user + OpenProject: "20Gi" + Nextcloud: "50Gi", with just 100Mi per user + Nubus: "1Gi" + Notes: "1Gi"
storageClassName: ~
nubusLdapServerData:
size: "1Gi"
storageClassName: ~
nubusPortalConsumer:
size: "1Gi"
storageClassName: ~
nubusProvisioningNats:
size: "1Gi"
storageClassName: ~
# This option was introduced with openDesk 1.6. For now we want to use the Helm charts default empty string
# to avoid issues during the upgrade modifying an existing PV, as the migrations in 1.6 required a smooth
# Nubus deployment.
# In a later openDesk release we will advise in the migrations.md to explicitly set this on existing deployments
# to the default storage class.
nubusUdmListener:
size: "1Gi"
#storageClassName: ""
oxConnector:
size: "1Gi"
# This value is not passed on to the related Helm chart yet, but required for linting purposes.
storageClassName: ~
postfix:
size: "1Gi"
storageClassName: ~
postgresql:
size: "5Gi"
storageClassName: ~
prosody:
size: "1Gi"
storageClassName: ~
redis:
size: "1Gi"
storageClassName: ~
synapse:
size: "50Gi" # just 100Mi per user
storageClassName: ~
xwiki:
size: "5Gi"
storageClassName: ~
...

View File

@@ -0,0 +1,227 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
replicas:
## Note: Databases should be deployed separately
# -- component: Cassandra
# -- scalable: tbd
cassandra: 1
# -- component: Persistence Layer
# -- scalable: false
mariadb: 1
# -- scalable: false
memcached: 1
# -- scalable: true
minio: 1
# -- scalable: false
postgres: 1
# -- scalable: tbd
redis: 1
# ClamAV
# -- component: Antivirus (ClamAV)
# -- scalable: true
# -- comment: clamav-simple - supports `ReadWriteOnce` PVCs.
clamav: 1
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
clamd: 1
# -- scalable: true
# -- comment: clamav-distributed - You do not want to scale this service, as it just updates the signature files
# centrally an should be a singleton.
freshclam: 1
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
icap: 1
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
milter: 1
# IAM / Nubus
# -- component: IAM (Nubus)
# -- scalable: true
intercomService: 1
# -- scalable: true
keycloak: 1
# -- scalable: false
oxConnector: 1
# -- scalable: tbd
umsGuardianAuthorizationApi: 1
# -- scalable: tbd
umsGuardianManagementApi: 1
# -- scalable: tbd
umsGuardianManagementUi: 1
# -- scalable: tbd
umsGuardianOpenPolicyAgent: 1
# -- scalable: false
# -- comment: Should not be scaled, is an async process.
umsKeycloakExtensionsHandler: 1
# -- scalable: true
umsKeycloakExtensionsProxy: 1
# -- scalable: tbd
umsLdapNotifier: 1
# -- scalable: true
# -- comment: Please find details on the following `umsLdapServer*` entries in the upstream documentation:
# https://docs.software-univention.de/nubus-kubernetes-operation/latest/en/configuration/ldap.html#directory-service-high-availability-and-scalability
umsLdapServerPrimary: 1
# -- scalable: true
umsLdapServerSecondary: 1
# -- scalable: true
# -- comment: The LDAP proxy is only required in situations where there are clients outside of UDM writing into the
# LDAP like Samba. This is not a use case within openDesk so the LDAP Proxy's replica count should be kept at `0`
umsLdapServerProxy: 0
# -- scalable: tbd
umsNotificationsApi: 1
# -- scalable: true
umsPortalFrontend: 1
# -- scalable: false
umsPortalConsumer: 1
# -- scalable: true
umsPortalServer: 1
# -- scalable: tdb
umsProvisioningApi: 1
# -- scalable: false
umsProvisioningDispatcher: 1
# -- scalable: tdb
umsProvisioningNats: 1
# -- scalable: tdb
umsProvisioningPrefill: 1
# -- scalable: false
umsProvisioningUdmTransformer: 1
# -- scalable: tbd
umsSelfserviceConsumer: 1
# -- scalable: true
umsUdmListener: 1
# -- scalable: tbd
umsUdmRestApi: 1
# -- scalable: tbd
umsUmcGateway: 1
# -- scalable: tbd
umsUmcServer: 1
# -- scalable: tbd
umsUmcServerProxy: 1
# -- scalable: true
nginxS3Gateway: 1
# Nextcloud
# -- component: Filestore (Nextcloud)
# -- scalable: true
nextcloud: 1
# -- scalable: true
nextcloudNotifyPush: 1
# -- scalable: true
nextcloudExporter: 1
# Collabora:
# -- component: Weboffice (Collabora)
# -- scalable: true
# -- comment: If Collabora Controller is enabled, Collabora is autoscaling and the value below will be ignored.
# Please check `enterpriseFeatures.collabora.autoscaling` for autoscaling settings.
collabora: 1
# -- scalable: true
# -- comment: Load between Collabora Controller Pods is going to one Pod (the leader) only, therefore raise the number
# e.g. to `2` for high availability of the Collabora Controller.
collaboraController: 1
# Cryptpad
# -- component: Pad (CryptPad)
# -- scalable: false
cryptpad: 1
# OX App Suite
# -- component: Groupware (OX AppSuite, OX Dovecot etc.)
# -- scalable: false
# -- comment: Scalable in openDesk Enterprise only
dovecot: 1
# -- component: Groupware (OX App Suite)
# -- scalable: tbd
openxchangeCoreDocumentConverter: 1
# -- scalable: tbd
openxchangeCoreGuidedtours: 1
# -- scalable: tbd
openxchangeCoreImageConverter: 1
# -- scalable: tbd
openxchangeCoreMW: 1
# -- scalable: tbd
openxchangeCoreUI: 1
# -- scalable: tbd
openxchangeCoreUIMiddleware: 1
# -- scalable: tbd
openxchangeCoreUserGuide: 1
# -- scalable: tbd
openxchangeGotenberg: 1
# -- scalable: tbd
openxchangeGuardUI: 1
# -- scalable: tbd
openxchangeNextcloudIntegrationUI: 1
# -- scalable: tbd
openxchangePluginsUI: 1
# -- scalable: tbd
openxchangePublicSectorUI: 1
# -- component: Project management (OpenProject)
# -- scalable: true
openprojectWeb: 1 # max 50 active users
# -- scalable: true
# -- comment: Async service working on processing queue content. Can work on queues in parallel (when needed). Check
# https://www.openproject.org/docs/installation-and-operations/installation/helm-chart/ for details, as e.g.
# dedicated workers for specific queues are possible with OpenProject.
openprojectWorker: 1 # max 50 active users
# -- component: Knowledge management (XWiki)
# -- scalable: false
xwiki: 1 # currently just vertial scaling (resources)
# -- component: Chat (Element, Synapse)
# -- scalable: true
element: 1 # no information about that, but as it distributes the web client to the users' browsers, there should be some server running parallel
# -- scalable: tbd
matrixNeoBoardWidget: 1
# -- scalable: tbd
matrixNeoChoiceWidget: 1
# -- scalable: tbd
matrixNeoDateFixBot: 1
# -- scalable: tbd
matrixNeoDateFixWidget: 1
# -- scalable: tbd
matrixUserVerificationService: 1
# -- scalable: tbd
synapse: 1
# -- scalable: true
synapseWeb: 1 # no information about that, but as HAproxy, a redundant setup should be senseful in larger deployments
# -- scalable: true
wellKnown: 1
# -- component: Note taking (Notes) # No experience so far regarding heavy load (?), 10 replicas just a guess, atm
# -- scalable: true
notesBackend: 1
# -- scalable: true
notesFrontend: 1
# -- scalable: true
notesYProvider: 1
# Jitsi
# -- component: Video conference (Jitsi)
# -- scalable: tbd
jibri: 1
# -- scalable: tbd
jicofo: 1
# -- scalable: tbd
jigasi: 1
# -- scalable: tbd
jitsi: 1
# -- scalable: tbd
jitsiKeycloakAdapter: 1
# -- scalable: tbd
jvb: 1
...

View File

@@ -0,0 +1,655 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
resources:
cassandra:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 1
memory: "1Gi"
clamd:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 2
memory: "2Gi"
collabora:
# without autoscaling:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 4
memory: "8Gi"
## with autoscaling:
#limits:
# cpu: 4
# memory: "8Gi"
#requests:
# cpu: 4
# memory: "8Gi"
collaboraController:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.5
memory: "256Mi"
cryptpad:
limits:
cpu: 99
memory: "2Gi"
requests:
cpu: 0.1
memory: "512Mi"
dkimpy:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
dovecot:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 1
memory: "1Gi"
element:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
freshclam:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "96Mi"
icap:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "16Mi"
intercomService:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "64Mi"
# The Jibri container requires 2Gi /dev/shm so we need a limit based on the expected memory consumption of the
# service plus the 2Gi /dev/shm
jibri:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "384Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jicofo:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jigasi:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
jitsi:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
jitsiKeycloakAdapter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.01
memory: "48Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jvb:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.5
memory: "1Gi"
mariadb:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 1
memory: "1Gi"
matrixNeoBoardWidget:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoChoiceWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoDateFixBot:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "128Mi"
matrixNeoDateFixWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixUserVerificationService:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
memcached:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
milter:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.1
memory: "16Mi"
minio:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 1.5
memory: "512Mi"
nextcloud:
limits:
cpu: 1.5
memory: "8Gi"
requests:
cpu: 1
memory: "1Gi"
nextcloudCron:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nextcloudExporter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
nextcloudNotifyPush:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nginxS3Gateway:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: "100m"
memory: "16Mi"
notesBackend:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "512Mi"
notesFrontend:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
notesYProvider:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "128Mi"
opendeskKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
opendeskStaticFiles:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: 0.01
memory: "16Mi"
openproject:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectDbInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectAppInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectSeederJob:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectWorkers:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.25
memory: "512Mi"
openxchangeCoreDocumentConverter:
limits:
cpu: 99
memory: "6Gi"
requests:
cpu: 0.25
memory: "1.25Gi"
openxchangeCoreGuidedtours:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreImageConverter:
limits:
cpu: 99
memory: "6Gi"
requests:
cpu: 0.5
memory: "1.25Gi"
openxchangeCoreMW:
limits:
cpu: 99
memory: "15Gi"
requests:
cpu: 1
memory: "1.25Gi"
openxchangeCoreUI:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreUIMiddleware:
limits:
cpu: 1
memory: "1536Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUIMiddlewareUpdater:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUserGuide:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.02
memory: "32Mi"
openxchangeGotenberg:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangeGuardUI:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeNextcloudIntegrationUI:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangePluginsUI:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangePublicSectorUI:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.01
memory: "32Mi"
oxConnector:
limits:
cpu: 99
memory: "2Gi"
requests:
cpu: 0.1
memory: "256Mi"
postfix:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "16Mi"
postgresql:
limits:
cpu: 99
memory: "21Gi" # Element: "4Gi" + Nextcloud: "3Gi" + OpenProject: "8Gi" + XWiki: "6Gi"
requests:
cpu: 1
memory: "8Gi"
prosody:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
redis:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.5
memory: "128Mi"
synapse:
limits:
cpu: 99
memory: "11Gi"
requests:
cpu: 1
memory: "768Mi"
synapseWeb:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "64Mi"
umsGuardianManagementApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianManagementUi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianAuthorizationApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloak:
limits:
cpu: 99
memory: "2Gi"
requests:
cpu: 0.1
memory: "512Mi"
umsKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloakExtensionHandler:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
umsKeycloakExtensionProxy:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
umsLdapNotifier:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsLdapServer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsNotificationsApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalFrontend:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumerDependencies:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalServer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "100Mi"
umsProvisioningDispatcher:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningPrefill:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningRegisterConsumers:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningUdmTransformer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningNats:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "128Mi"
umsSelfserviceConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsStackDataUms:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsOpenPolicyAgent:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmListener:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApiInit:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcGateway:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcServer:
limits:
cpu: 2
memory: "2Gi"
requests:
cpu: 0.3
memory: "500Mi"
wellKnown:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
xwiki:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 4
memory: "2Gi"
...

View File

@@ -0,0 +1,69 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
persistence:
# Will be used as default if not otherwise define on the component level
storageClassNames:
RWX: ""
RWO: ""
storages:
cassandra:
size: "150Gi"
commitLogsize: "8Gi"
storageClassName: ~
clamav:
size: "1Gi"
storageClassName: ~
dovecot:
size: "600Gi"
storageClassName: ~
mariadb:
size: "160Gi"
storageClassName: ~
matrixNeoDateFixBot:
size: "1Gi"
storageClassName: ~
minio:
size: "12050Gi" # Open-Xchange: "5000Gi", with just 100Mi per user + OpenProject: "2000Gi" + Nextcloud: "5000Gi", with just 100Mi per user + Nubus: "25Gi" + Notes: "25Gi"
storageClassName: ~
nubusLdapServerData:
size: "12Gi"
storageClassName: ~
nubusPortalConsumer:
size: "12Gi"
storageClassName: ~
nubusProvisioningNats:
size: "12Gi"
storageClassName: ~
# This option was introduced with openDesk 1.6. For now we want to use the Helm charts default empty string
# to avoid issues during the upgrade modifying an existing PV, as the migrations in 1.6 required a smooth
# Nubus deployment.
# In a later openDesk release we will advise in the migrations.md to explicitly set this on existing deployments
# to the default storage class.
nubusUdmListener:
size: "1Gi"
#storageClassName: ""
oxConnector:
size: "1Gi"
# This value is not passed on to the related Helm chart yet, but required for linting purposes.
storageClassName: ~
postfix:
size: "25Gi"
storageClassName: ~
postgresql:
size: "500Gi"
storageClassName: ~
prosody:
size: "1Gi"
storageClassName: ~
redis:
size: "38Gi"
storageClassName: ~
synapse:
size: "5000Gi" # just 100Mi per user
storageClassName: ~
xwiki:
size: "40Gi"
storageClassName: ~
...

View File

@@ -0,0 +1,228 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
replicas:
## Note: Databases should be deployed separately
# -- component: Cassandra
# -- scalable: tbd
cassandra: 3
# -- component: Persistence Layer
# -- scalable: false
mariadb: 1
# -- scalable: false
memcached: 1
# -- scalable: true
minio: 1
# -- scalable: false
postgres: 1
# -- scalable: tbd
redis: 1
# ClamAV
# -- component: Antivirus (ClamAV)
# -- scalable: true
# -- comment: clamav-simple - supports `ReadWriteOnce` PVCs.
clamav: 3
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
clamd: 3
# -- scalable: true
# -- comment: clamav-distributed - You do not want to scale this service, as it just updates the signature files
# centrally an should be a singleton.
freshclam: 1
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
icap: 3
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
milter: 3
# IAM / Nubus
# -- component: IAM (Nubus)
# -- scalable: true
intercomService: 1
# -- scalable: true
keycloak: 3
# -- scalable: false
oxConnector: 1
# -- scalable: tbd
umsGuardianAuthorizationApi: 1
# -- scalable: tbd
umsGuardianManagementApi: 1
# -- scalable: tbd
umsGuardianManagementUi: 1
# -- scalable: tbd
umsGuardianOpenPolicyAgent: 1
# -- scalable: false
# -- comment: Should not be scaled, is an async process.
umsKeycloakExtensionsHandler: 1
# -- scalable: true
umsKeycloakExtensionsProxy: 1
# -- scalable: tbd
umsLdapNotifier: 1
# -- scalable: true
# -- comment: Please find details on the following `umsLdapServer*` entries in the upstream documentation:
# https://docs.software-univention.de/nubus-kubernetes-operation/latest/en/configuration/ldap.html#directory-service-high-availability-and-scalability
umsLdapServerPrimary: 2
# -- scalable: true
umsLdapServerSecondary: 4
# -- scalable: true
# -- comment: The LDAP proxy is only required in situations where there are clients outside of UDM writing into the
# LDAP like Samba. This is not a use case within openDesk so the LDAP Proxy's replica count should be kept at `0`
umsLdapServerProxy: 0
# -- scalable: tbd
umsNotificationsApi: 2
# -- scalable: true
umsPortalFrontend: 4
# -- scalable: false
umsPortalConsumer: 1
# -- scalable: true
umsPortalServer: 10
# -- scalable: tdb
umsProvisioningApi: 1
# -- scalable: false
umsProvisioningDispatcher: 1
# -- scalable: tdb
umsProvisioningNats: 1
# -- scalable: tdb
umsProvisioningPrefill: 1
# -- scalable: false
umsProvisioningUdmTransformer: 1
# -- scalable: tbd
umsSelfserviceConsumer: 1
# -- scalable: true
umsUdmListener: 1
# -- scalable: tbd
umsUdmRestApi: 4
# -- scalable: tbd
umsUmcGateway: 1
# -- scalable: tbd
umsUmcServer: 8
# -- scalable: tbd
umsUmcServerProxy: 1
# -- scalable: true
nginxS3Gateway: 1
# Nextcloud
# -- component: Filestore (Nextcloud)
# -- scalable: true
nextcloud: 8
# -- scalable: true
nextcloudNotifyPush: 1
# -- scalable: true
nextcloudExporter: 1
# Collabora:
# -- component: Weboffice (Collabora)
# -- scalable: true
# -- comment: If Collabora Controller is enabled, Collabora is autoscaling and the value below will be ignored.
# Please check `enterpriseFeatures.collabora.autoscaling` for autoscaling settings.
collabora: 25
# -- scalable: true
# -- comment: Load between Collabora Controller Pods is going to one Pod (the leader) only, therefore raise the number
# e.g. to `2` for high availability of the Collabora Controller.
collaboraController: 1
# Cryptpad
# -- component: Pad (CryptPad)
# -- scalable: false
cryptpad: 1
# OX App Suite
# -- component: Groupware (OX AppSuite, OX Dovecot etc.)
# -- scalable: false
# -- comment: Scalable in openDesk Enterprise only
dovecot: 1
# -- component: Groupware (OX App Suite)
# -- scalable: tbd
openxchangeCoreDocumentConverter: 1
# -- scalable: tbd
openxchangeCoreGuidedtours: 1
# -- scalable: tbd
openxchangeCoreImageConverter: 1
# -- scalable: tbd
openxchangeCoreMW: 17
# -- scalable: tbd
openxchangeCoreUI: 1
# -- scalable: tbd
openxchangeCoreUIMiddleware: 2
# -- scalable: tbd
openxchangeCoreUserGuide: 1
# -- scalable: tbd
openxchangeGotenberg: 1
# -- scalable: tbd
openxchangeGuardUI: 1
# -- scalable: tbd
openxchangeNextcloudIntegrationUI: 1
# -- scalable: tbd
openxchangePluginsUI: 1
# -- scalable: tbd
openxchangePublicSectorUI: 1
# -- component: Project management (OpenProject)
# -- scalable: true
openprojectWeb: 26 # max 5'000 active users / 1'500 active users per 8 web workers = ~26 web workers
# -- scalable: true
# -- comment: Async service working on processing queue content. Can work on queues in parallel (when needed). Check
# https://www.openproject.org/docs/installation-and-operations/installation/helm-chart/ for details, as e.g.
# dedicated workers for specific queues are possible with OpenProject.
openprojectWorker: 13 # max 5'000 active users / 1'500 active users per 4 background workers = ~13 web workers
# -- component: Knowledge management (XWiki)
# -- scalable: false
xwiki: 1 # currently just vertial scaling
# -- component: Chat (Element, Synapse)
# -- scalable: true
element: 5 # no information about that, but as it distributes the web client to the users' browsers, there should be some server running parallel
# -- scalable: tbd
matrixNeoBoardWidget: 1
# -- scalable: tbd
matrixNeoChoiceWidget: 1
# -- scalable: tbd
matrixNeoDateFixBot: 1
# -- scalable: tbd
matrixNeoDateFixWidget: 1
# -- scalable: tbd
matrixUserVerificationService: 1
# -- scalable: tbd
synapse: 12
# -- scalable: true
synapseWeb: 3 # no information about that, but as HAproxy, a redundant setup should be senseful in larger deployments
# -- scalable: true
wellKnown: 1
# -- component: Note taking (Notes)
# -- scalable: true
notesBackend: 25
# -- scalable: true
notesFrontend: 5
# -- scalable: true
notesYProvider: 25
# Jitsi
# Current Helm Chart does only support one shard; shard can handle up to 1500 concurrent user
# -- component: Video conference (Jitsi)
# -- scalable: tbd
jibri: 1
# -- scalable: tbd
jicofo: 1
# -- scalable: tbd
jigasi: 1
# -- scalable: tbd
jitsi: 1
# -- scalable: tbd
jitsiKeycloakAdapter: 1
# -- scalable: tbd
jvb: 15 # 15 jvb maximum per shard; each jvb with up to 8Gi memory
...

View File

@@ -0,0 +1,655 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
resources:
cassandra:
limits:
cpu: 99
memory: "26Gi"
requests:
cpu: 1
memory: "1Gi"
clamd:
limits:
cpu: 99
memory: "16Gi"
requests:
cpu: 2
memory: "2Gi"
collabora:
# without autoscaling:
limits:
cpu: 99
memory: "26Gi"
requests:
cpu: 4
memory: "8Gi"
## with autoscaling:
#limits:
# cpu: 4
# memory: "8Gi"
#requests:
# cpu: 4
# memory: "8Gi"
collaboraController:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.5
memory: "256Mi"
cryptpad:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.1
memory: "512Mi"
dkimpy:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
dovecot:
limits:
cpu: 8
memory: "26Gi"
requests:
cpu: 1
memory: "1Gi"
element:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
freshclam:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.5
memory: "512Mi"
icap:
limits:
cpu: 8
memory: "512Mi"
requests:
cpu: 0.5
memory: "128Mi"
intercomService:
limits:
cpu: 2
memory: "1Gi"
requests:
cpu: 0.5
memory: "128Mi"
# The Jibri container requires 2Gi /dev/shm so we need a limit based on the expected memory consumption of the
# service plus the 2Gi /dev/shm
jibri:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "384Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jicofo:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jigasi:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
jitsi:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
jitsiKeycloakAdapter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.01
memory: "48Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jvb:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.5
memory: "1Gi"
mariadb:
limits:
cpu: 99
memory: "54Gi"
requests:
cpu: 1
memory: "4Gi"
matrixNeoBoardWidget:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoChoiceWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoDateFixBot:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "128Mi"
matrixNeoDateFixWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixUserVerificationService:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
memcached:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
milter:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.1
memory: "16Mi"
minio:
limits:
cpu: 8
memory: "8Gi"
requests:
cpu: 1.5
memory: "2Gi"
nextcloud:
limits:
cpu: 9
memory: "31Gi"
requests:
cpu: 2
memory: "8Gi"
nextcloudCron:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nextcloudExporter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
nextcloudNotifyPush:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nginxS3Gateway:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: "100m"
memory: "16Mi"
notesBackend:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "768Mi"
notesFrontend:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
notesYProvider:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "200Mi"
opendeskKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
opendeskStaticFiles:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: 0.01
memory: "16Mi"
openproject:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "768Mi"
openprojectDbInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectAppInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectSeederJob:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectWorkers:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.25
memory: "512Mi"
openxchangeCoreDocumentConverter:
limits:
cpu: 2
memory: "6Gi"
requests:
cpu: 0.25
memory: "1.25Gi"
openxchangeCoreGuidedtours:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreImageConverter:
limits:
cpu: 2
memory: "6Gi"
requests:
cpu: 0.5
memory: "1.25Gi"
openxchangeCoreMW:
limits:
cpu: 4
memory: "16Gi"
requests:
cpu: 1
memory: "1.25Gi"
openxchangeCoreUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreUIMiddleware:
limits:
cpu: 1
memory: "1536Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUIMiddlewareUpdater:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUserGuide:
limits:
cpu: 1
memory: "128Mi"
requests:
cpu: 0.02
memory: "32Mi"
openxchangeGotenberg:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangeGuardUI:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeNextcloudIntegrationUI:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangePluginsUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangePublicSectorUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
oxConnector:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.1
memory: "1Gi"
postfix:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "16Mi"
postgresql:
limits:
cpu: 99
memory: "842Gi" # Element: "230Gi" + Nextcloud: "260Gi" + OpenProject: "96Gi" + XWiki: "256Gi"
requests:
cpu: 5
memory: "128Gi"
prosody:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
redis:
limits:
cpu: 16
memory: "63Gi"
requests:
cpu: 2
memory: "4Gi"
synapse:
limits:
cpu: 99
memory: "16Gi"
requests:
cpu: 1
memory: "2Gi"
synapseWeb:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "64Mi"
umsGuardianManagementApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianManagementUi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianAuthorizationApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloak:
limits:
cpu: 99
memory: "2Gi"
requests:
cpu: 0.1
memory: "512Mi"
umsKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloakExtensionHandler:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.2
memory: "250Mi"
umsKeycloakExtensionProxy:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.2
memory: "250Mi"
umsLdapNotifier:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsLdapServer:
limits:
cpu: 8
memory: "4Gi"
requests:
cpu: 3
memory: "2Gi"
umsNotificationsApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalFrontend:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumerDependencies:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalServer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "100Mi"
umsProvisioningDispatcher:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningPrefill:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningRegisterConsumers:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningUdmTransformer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningNats:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "128Mi"
umsSelfserviceConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsStackDataUms:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsOpenPolicyAgent:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmListener:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApiInit:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcGateway:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcServer:
limits:
cpu: 2
memory: "2Gi"
requests:
cpu: 0.3
memory: "500Mi"
wellKnown:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
xwiki:
limits:
cpu: 99
memory: "96Gi"
requests:
cpu: 20
memory: "34Gi"
...

View File

@@ -0,0 +1,69 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
persistence:
# Will be used as default if not otherwise define on the component level
storageClassNames:
RWX: ""
RWO: ""
storages:
cassandra:
size: "150Gi"
commitLogsize: "8Gi"
storageClassName: ~
clamav:
size: "1Gi"
storageClassName: ~
dovecot:
size: "600Gi"
storageClassName: ~
mariadb:
size: "160Gi"
storageClassName: ~
matrixNeoDateFixBot:
size: "1Gi"
storageClassName: ~
minio:
size: "12050Gi" # Open-Xchange: "5000Gi", with just 100Mi per user + OpenProject: "2000Gi" + Nextcloud: "5000Gi", with just 100Mi per user + Nubus: "25Gi" + Notes: "25Gi"
storageClassName: ~
nubusLdapServerData:
size: "12Gi"
storageClassName: ~
nubusPortalConsumer:
size: "12Gi"
storageClassName: ~
nubusProvisioningNats:
size: "12Gi"
storageClassName: ~
# This option was introduced with openDesk 1.6. For now we want to use the Helm charts default empty string
# to avoid issues during the upgrade modifying an existing PV, as the migrations in 1.6 required a smooth
# Nubus deployment.
# In a later openDesk release we will advise in the migrations.md to explicitly set this on existing deployments
# to the default storage class.
nubusUdmListener:
size: "1Gi"
#storageClassName: ""
oxConnector:
size: "1Gi"
# This value is not passed on to the related Helm chart yet, but required for linting purposes.
storageClassName: ~
postfix:
size: "25Gi"
storageClassName: ~
postgresql:
size: "50Gi"
storageClassName: ~
prosody:
size: "1Gi"
storageClassName: ~
redis:
size: "38Gi"
storageClassName: ~
synapse:
size: "5000Gi" # just 100Mi per user
storageClassName: ~
xwiki:
size: "40Gi"
storageClassName: ~
...

View File

@@ -0,0 +1,228 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
replicas:
## Note: Databases should be deployed separately
# -- component: Cassandra
# -- scalable: tbd
cassandra: 3
# -- component: Persistence Layer
# -- scalable: false
mariadb: 1
# -- scalable: false
memcached: 1
# -- scalable: true
minio: 1
# -- scalable: false
postgres: 1
# -- scalable: tbd
redis: 1
# ClamAV
# -- component: Antivirus (ClamAV)
# -- scalable: true
# -- comment: clamav-simple - supports `ReadWriteOnce` PVCs.
clamav: 3
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
clamd: 3
# -- scalable: true
# -- comment: clamav-distributed - You do not want to scale this service, as it just updates the signature files
# centrally an should be a singleton.
freshclam: 1
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
icap: 3
# -- scalable: true
# -- comment: clamav-distributed - requires `ReadWriteMany` PVCs.
milter: 3
# IAM / Nubus
# -- component: IAM (Nubus)
# -- scalable: true
intercomService: 1
# -- scalable: true
keycloak: 3
# -- scalable: false
oxConnector: 1
# -- scalable: tbd
umsGuardianAuthorizationApi: 1
# -- scalable: tbd
umsGuardianManagementApi: 1
# -- scalable: tbd
umsGuardianManagementUi: 1
# -- scalable: tbd
umsGuardianOpenPolicyAgent: 1
# -- scalable: false
# -- comment: Should not be scaled, is an async process.
umsKeycloakExtensionsHandler: 1
# -- scalable: true
umsKeycloakExtensionsProxy: 1
# -- scalable: tbd
umsLdapNotifier: 1
# -- scalable: true
# -- comment: Please find details on the following `umsLdapServer*` entries in the upstream documentation:
# https://docs.software-univention.de/nubus-kubernetes-operation/latest/en/configuration/ldap.html#directory-service-high-availability-and-scalability
umsLdapServerPrimary: 1
# -- scalable: true
umsLdapServerSecondary: 2
# -- scalable: true
# -- comment: The LDAP proxy is only required in situations where there are clients outside of UDM writing into the
# LDAP like Samba. This is not a use case within openDesk so the LDAP Proxy's replica count should be kept at `0`
umsLdapServerProxy: 0
# -- scalable: tbd
umsNotificationsApi: 2
# -- scalable: true
umsPortalFrontend: 2
# -- scalable: false
umsPortalConsumer: 1
# -- scalable: true
umsPortalServer: 2
# -- scalable: tdb
umsProvisioningApi: 1
# -- scalable: false
umsProvisioningDispatcher: 1
# -- scalable: tdb
umsProvisioningNats: 1
# -- scalable: tdb
umsProvisioningPrefill: 1
# -- scalable: false
umsProvisioningUdmTransformer: 1
# -- scalable: tbd
umsSelfserviceConsumer: 1
# -- scalable: true
umsUdmListener: 1
# -- scalable: tbd
umsUdmRestApi: 1
# -- scalable: tbd
umsUmcGateway: 1
# -- scalable: tbd
umsUmcServer: 2
# -- scalable: tbd
umsUmcServerProxy: 1
# -- scalable: true
nginxS3Gateway: 1
# Nextcloud
# -- component: Filestore (Nextcloud)
# -- scalable: true
nextcloud: 3
# -- scalable: true
nextcloudNotifyPush: 1
# -- scalable: true
nextcloudExporter: 1
# Collabora:
# -- component: Weboffice (Collabora)
# -- scalable: true
# -- comment: If Collabora Controller is enabled, Collabora is autoscaling and the value below will be ignored.
# Please check `enterpriseFeatures.collabora.autoscaling` for autoscaling settings.
collabora: 3
# -- scalable: true
# -- comment: Load between Collabora Controller Pods is going to one Pod (the leader) only, therefore raise the number
# e.g. to `2` for high availability of the Collabora Controller.
collaboraController: 1
# Cryptpad
# -- component: Pad (CryptPad)
# -- scalable: false
cryptpad: 1
# OX App Suite
# -- component: Groupware (OX AppSuite, OX Dovecot etc.)
# -- scalable: false
# -- comment: Scalable in openDesk Enterprise only
dovecot: 1
# -- component: Groupware (OX App Suite)
# -- scalable: tbd
openxchangeCoreDocumentConverter: 1
# -- scalable: tbd
openxchangeCoreGuidedtours: 1
# -- scalable: tbd
openxchangeCoreImageConverter: 1
# -- scalable: tbd
openxchangeCoreMW: 2
# -- scalable: tbd
openxchangeCoreUI: 1
# -- scalable: tbd
openxchangeCoreUIMiddleware: 2
# -- scalable: tbd
openxchangeCoreUserGuide: 1
# -- scalable: tbd
openxchangeGotenberg: 1
# -- scalable: tbd
openxchangeGuardUI: 1
# -- scalable: tbd
openxchangeNextcloudIntegrationUI: 1
# -- scalable: tbd
openxchangePluginsUI: 1
# -- scalable: tbd
openxchangePublicSectorUI: 1
# -- component: Project management (OpenProject)
# -- scalable: true
openprojectWeb: 4
# -- scalable: true
# -- comment: Async service working on processing queue content. Can work on queues in parallel (when needed). Check
# https://www.openproject.org/docs/installation-and-operations/installation/helm-chart/ for details, as e.g.
# dedicated workers for specific queues are possible with OpenProject.
openprojectWorker: 2
# -- component: Knowledge management (XWiki)
# -- scalable: false
xwiki: 1 # currently just vertial scaling
# -- component: Chat (Element, Synapse)
# -- scalable: true
element: 2 # no information about that, but as it distributes the web client to the users' browsers, there should be some server running parallel
# -- scalable: tbd
matrixNeoBoardWidget: 1
# -- scalable: tbd
matrixNeoChoiceWidget: 1
# -- scalable: tbd
matrixNeoDateFixBot: 1
# -- scalable: tbd
matrixNeoDateFixWidget: 1
# -- scalable: tbd
matrixUserVerificationService: 1
# -- scalable: tbd
synapse: 2
# -- scalable: true
synapseWeb: 1 # no information about that, but as HAproxy, a redundant setup should be senseful in larger deployments
# -- scalable: true
wellKnown: 1
# -- component: Note taking (Notes)
# -- scalable: true
notesBackend: 5
# -- scalable: true
notesFrontend: 2
# -- scalable: true
notesYProvider: 5
# Jitsi
# 3 shards, each for up to 4000 concurrent users
# -- component: Video conference (Jitsi)
# -- scalable: tbd
jibri: 1
# -- scalable: tbd
jicofo: 1
# -- scalable: tbd
jigasi: 1
# -- scalable: tbd
jitsi: 1
# -- scalable: tbd
jitsiKeycloakAdapter: 1
# -- scalable: tbd
jvb: 5
...

View File

@@ -0,0 +1,655 @@
# SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
# SPDX-License-Identifier: Apache-2.0
---
resources:
cassandra:
limits:
cpu: 99
memory: "26Gi"
requests:
cpu: 1
memory: "1Gi"
clamd:
limits:
cpu: 99
memory: "16Gi"
requests:
cpu: 2
memory: "2Gi"
collabora:
# without autoscaling:
limits:
cpu: 99
memory: "26Gi"
requests:
cpu: 4
memory: "8Gi"
## with autoscaling:
#limits:
# cpu: 4
# memory: "8Gi"
#requests:
# cpu: 4
# memory: "8Gi"
collaboraController:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.5
memory: "256Mi"
cryptpad:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.1
memory: "512Mi"
dkimpy:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
dovecot:
limits:
cpu: 8
memory: "16Gi"
requests:
cpu: 1
memory: "1Gi"
element:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
freshclam:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.5
memory: "512Mi"
icap:
limits:
cpu: 8
memory: "512Mi"
requests:
cpu: 0.5
memory: "128Mi"
intercomService:
limits:
cpu: 2
memory: "1Gi"
requests:
cpu: 0.5
memory: "128Mi"
# The Jibri container requires 2Gi /dev/shm so we need a limit based on the expected memory consumption of the
# service plus the 2Gi /dev/shm
jibri:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "384Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jicofo:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jigasi:
limits:
cpu: 99
memory: "3584Mi"
requests:
cpu: 0.1
memory: "256Mi"
jitsi:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
jitsiKeycloakAdapter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.01
memory: "48Mi"
# The jicofo, jvb and jigasi containers require 3GB memory for the Java process, so we limit it to 3.5Gi overall consumption.
jvb:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 0.5
memory: "1Gi"
mariadb:
limits:
cpu: 99
memory: "8Gi"
requests:
cpu: 1
memory: "4Gi"
matrixNeoBoardWidget:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoChoiceWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixNeoDateFixBot:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "128Mi"
matrixNeoDateFixWidget:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "48Mi"
matrixUserVerificationService:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "128Mi"
memcached:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
milter:
limits:
cpu: 99
memory: "96Mi"
requests:
cpu: 0.1
memory: "16Mi"
minio:
limits:
cpu: 8
memory: "8Gi"
requests:
cpu: 1.5
memory: "2Gi"
nextcloud:
limits:
cpu: 6
memory: "13Gi"
requests:
cpu: 2
memory: "2Gi"
nextcloudCron:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nextcloudExporter:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
nextcloudNotifyPush:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "512Mi"
nginxS3Gateway:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: "100m"
memory: "16Mi"
notesBackend:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "768Mi"
notesFrontend:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "32Mi"
notesYProvider:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "200Mi"
opendeskKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
opendeskStaticFiles:
limits:
cpu: 99
memory: "64Mi"
requests:
cpu: 0.01
memory: "16Mi"
openproject:
limits:
cpu: 99
memory: "3Gi"
requests:
cpu: 0.1
memory: "768Mi"
openprojectDbInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectAppInit:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectSeederJob:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.1
memory: "256Mi"
openprojectWorkers:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.25
memory: "512Mi"
openxchangeCoreDocumentConverter:
limits:
cpu: 2
memory: "6Gi"
requests:
cpu: 0.25
memory: "1.25Gi"
openxchangeCoreGuidedtours:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreImageConverter:
limits:
cpu: 2
memory: "6Gi"
requests:
cpu: 0.5
memory: "1.25Gi"
openxchangeCoreMW:
limits:
cpu: 4
memory: "16Gi"
requests:
cpu: 1
memory: "1.25Gi"
openxchangeCoreUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeCoreUIMiddleware:
limits:
cpu: 1
memory: "1536Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUIMiddlewareUpdater:
limits:
cpu: 99
memory: "768Mi"
requests:
cpu: 0.5
memory: "192Mi"
openxchangeCoreUserGuide:
limits:
cpu: 1
memory: "128Mi"
requests:
cpu: 0.02
memory: "32Mi"
openxchangeGotenberg:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangeGuardUI:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangeNextcloudIntegrationUI:
limits:
cpu: 1
memory: "512Mi"
requests:
cpu: 0.01
memory: "32Mi"
openxchangePluginsUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.05
memory: "32Mi"
openxchangePublicSectorUI:
limits:
cpu: 1
memory: "1Gi"
requests:
cpu: 0.01
memory: "32Mi"
oxConnector:
limits:
cpu: 99
memory: "4Gi"
requests:
cpu: 0.1
memory: "1Gi"
postfix:
limits:
cpu: 99
memory: "128Mi"
requests:
cpu: 0.1
memory: "16Mi"
postgresql:
limits:
cpu: 99
memory: "89Gi" # Element: "23Gi" + Nextcloud: "30Gi" + OpenProject: "10Gi" + XWiki: "26Gi"
requests:
cpu: 1
memory: "24Gi"
prosody:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "32Mi"
redis:
limits:
cpu: 16
memory: "63Gi"
requests:
cpu: 2
memory: "4Gi"
synapse:
limits:
cpu: 99
memory: "16Gi"
requests:
cpu: 1
memory: "2Gi"
synapseWeb:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "64Mi"
umsGuardianManagementApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianManagementUi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsGuardianAuthorizationApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloak:
limits:
cpu: 99
memory: "2Gi"
requests:
cpu: 0.1
memory: "512Mi"
umsKeycloakBootstrap:
limits:
cpu: 99
memory: "512Mi"
requests:
cpu: 0.1
memory: "256Mi"
umsKeycloakExtensionHandler:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.2
memory: "250Mi"
umsKeycloakExtensionProxy:
limits:
cpu: 8
memory: "1Gi"
requests:
cpu: 0.2
memory: "250Mi"
umsLdapNotifier:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsLdapServer:
limits:
cpu: 8
memory: "4Gi"
requests:
cpu: 3
memory: "2Gi"
umsNotificationsApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalFrontend:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalConsumerDependencies:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsPortalServer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "100Mi"
umsProvisioningDispatcher:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningPrefill:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsProvisioningRegisterConsumers:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningUdmTransformer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "64Mi"
umsProvisioningNats:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "128Mi"
umsSelfserviceConsumer:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsStackDataUms:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsOpenPolicyAgent:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmListener:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApi:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUdmRestApiInit:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcGateway:
limits:
cpu: 99
memory: "1Gi"
requests:
cpu: 0.1
memory: "256Mi"
umsUmcServer:
limits:
cpu: 2
memory: "2Gi"
requests:
cpu: 0.3
memory: "500Mi"
wellKnown:
limits:
cpu: 99
memory: "256Mi"
requests:
cpu: 0.1
memory: "32Mi"
xwiki:
limits:
cpu: 99
memory: "12Gi"
requests:
cpu: 4
memory: "6Gi"
...

View File

@@ -95,7 +95,7 @@ annotations:
serviceAccount: ~
jitsiJvb:
pod: ~
service: ~
serviceExternal: ~
metricsPrometheus: ~
metricsGrafana: ~
jitsiProsody:
@@ -360,6 +360,7 @@ annotations:
pod: ~
service: ~
serviceAccount: ~
serviceExternal: ~
openxchangeEnterpriseContactPicker:
appsuiteCoreMw:
appsuiteCoreMwPod: ~
@@ -369,6 +370,7 @@ annotations:
openxchangePostfix:
pod: ~
service: ~
serviceExternal: ~
openxchangePublicSectorUi:
pod: ~
servicesExternalClamavDistributed:

View File

@@ -97,7 +97,7 @@ charts:
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/platform-development/charts/opendesk-dovecot"
name: "dovecot"
version: "3.2.1"
version: "3.3.0"
verify: true
element:
# providerCategory: "Platform"
@@ -149,7 +149,7 @@ charts:
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/platform-development/charts/opendesk-jitsi"
name: "opendesk-jitsi"
version: "3.3.2"
version: "3.4.0"
verify: true
mariadb:
# providerCategory: "Platform"
@@ -361,7 +361,7 @@ charts:
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/platform-development/charts/opendesk-static-files"
name: "opendesk-static-files"
version: "4.1.0"
version: "4.1.1"
verify: true
openproject:
# providerCategory: "Supplier"
@@ -437,7 +437,7 @@ charts:
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/platform-development/charts/opendesk-postfix"
name: "postfix"
version: "5.0.1"
version: "5.1.0"
verify: true
postgresql:
# providerCategory: "Platform"
@@ -536,5 +536,5 @@ charts:
repository: "bmi/opendesk/components/supplier/xwiki/charts-mirror"
name: "xwiki"
version: "1.4.4"
verify: false
verify: true
...

View File

@@ -3,5 +3,5 @@
---
global:
systemInformation:
releaseVersion: "v1.9.0"
releaseVersion: "v1.10.0"
...

View File

@@ -15,7 +15,7 @@ global:
#
mailDomain: {{ env "MAIL_DOMAIN" | quote }}
## Define additional mail domains, comma separated, e.g. domain1.de,domain2.de
## Optional list of additional mail domains
#
additionalMailDomains: []

View File

@@ -168,7 +168,7 @@ images:
# upstreamMirrorStartFrom: ["8922"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/jibri"
tag: "stable-10431@sha256:21ae6f3e9139ca1beea630756060b66f1a6221005f45e35df35d4bf9f69a4cc3"
tag: "stable-10590@sha256:c6e10bc418084c2e1664e76bdddb525db34ba5f140af5a9fe9dd5c4f7637a492"
jicofo:
# providerCategory: "Supplier"
# providerResponsible: "Nordeck"
@@ -178,7 +178,7 @@ images:
# upstreamMirrorStartFrom: ["8922"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/jicofo"
tag: "stable-10431@sha256:6857b0cad627cde79f6e21c1c40843b14d70dd43e627537c60449d448ce14769"
tag: "stable-10590@sha256:a30e9e09fdc39d88bc8cc8a4e83a32bb6bf58914abfb44290439afaf4c72e4a8"
jigasi:
# providerCategory: "Supplier"
# providerResponsible: "Nordeck"
@@ -188,7 +188,7 @@ images:
# upstreamMirrorStartFrom: ["9955"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/jigasi"
tag: "stable-10431@sha256:9bcb35444296ab007b24a8ccecd6c1eacc0f01fccf4223e7f8ac340464f4a52e"
tag: "stable-10590@sha256:0596e603eb1b4909e8df97be00649848f2b1b85b7cbb7d5e3065ba482a231d49"
jitsi:
# providerCategory: "Supplier"
# providerResponsible: "Nordeck"
@@ -198,7 +198,7 @@ images:
# upstreamMirrorStartFrom: ["8922"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/web"
tag: "stable-10431@sha256:47f57fb67d95a2d3b5fa6edf93916b4922e1599278c0f9dd16cc30f432c75511"
tag: "stable-10590@sha256:ae90a61975f7f7d498051ce9e0d7310117ee3f869dcc8c947a005214b253582d"
jitsiKeycloakAdapter:
# providerCategory: "Supplier"
# providerResponsible: "Nordeck"
@@ -208,7 +208,7 @@ images:
# upstreamMirrorStartFrom: ["2023", "12", "14"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/jitsi-keycloak-adapter"
tag: "v20250911@sha256:716fb9ba2e866d74cbbd6241a8c75335e48ba25ec2d35f4678e83dd3156bc87c"
tag: "v20251119@sha256:2df703ff789be841f984142120e5a31dfd60cfe112a8d8d548ecc92e1401f005"
jitsiPatchJVB:
# providerCategory: "Community"
# providerResponsible: "openDesk"
@@ -228,7 +228,7 @@ images:
# upstreamMirrorStartFrom: ["8922"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/jvb"
tag: "stable-10431@sha256:64f8a368f593a30d5388d9643b1b0af7b4a09f03f6e585e50cdbff398b5f8918"
tag: "stable-10590@sha256:651021ddd4fe1ca29848d96d5813a1ea71b3dbf3587b14a13968ec0e62de2f0c"
mariadb:
# providerCategory: "Community"
# providerResponsible: "openDesk"
@@ -762,7 +762,7 @@ images:
# upstreamMirrorStartFrom: ["13", "1", "1"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/openproject/images-mirror/open_desk"
tag: "16.6.0@sha256:11fcbc357a5a4e724bb1164e43a93c713f73e5efb52212d75cfc845becbf64c0"
tag: "16.6.1@sha256:e3eb4ecdff5a94d2d2aaa0eacc9e747306d6ba6a06f308d2d16cc209516dd4e0"
openprojectBootstrap:
# providerCategory: "Platform"
# providerResponsible: "openDesk"
@@ -914,7 +914,7 @@ images:
# upstreamRepository: "bmi/opendesk/components/platform-development/images/postfix"
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/platform-development/images/postfix"
tag: "3.0.3@sha256:12bcebf57ddb53258c48eaa60e9c25b441f4319ee1b94b363c652ad0a992a875"
tag: "3.0.4@sha256:5b17c801283215b13e8305b0be1497d70c232e8ea8414f965cd1010333ae95ab"
postfixBootstrap:
# providerCategory: "Community"
# providerResponsible: "openDesk"
@@ -940,7 +940,7 @@ images:
# upstreamMirrorStartFrom: ["8922"]
registry: "registry.opencode.de"
repository: "bmi/opendesk/components/supplier/nordeck/images-mirror/prosody"
tag: "stable-10431@sha256:792618fff60c6e0eb4facb221e3477b2249cabeaf0479753ac7a6b98c075fd20"
tag: "stable-10590@sha256:86d43e743268fa89035663a5e29be7689b131b9c1fb435c01c94d2eeebbb058a"
redis:
# providerCategory: "Community"
# providerResponsible: "openDesk"

View File

@@ -16,8 +16,8 @@ persistence:
size: "1Gi"
storageClassName: ~
dovecot:
# With Dovecot CE this is used for the mail storage.
# Dovecot Pro (EE) uses this storage for the metacache,
# openDesk CE: Mail storage
# openDesk EE (with Dovecot Pro): Storage for metacache
size: "1Gi"
storageClassName: ~
mariadb:

View File

@@ -32,6 +32,7 @@ secrets:
dovecot: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_dovecot" | sha1sum | quote }}
element: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_element" | sha1sum | quote }}
ox: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_ox" | sha1sum | quote }}
postfix: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_postfix" | sha1sum | quote }}
openproject: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_openproject" | sha1sum | quote }}
xwiki: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_xwiki" | sha1sum | quote }}
systemAccounts:

View File

@@ -20,4 +20,15 @@ smtp:
key: ""
selector: "rsa"
useED25519: false
security:
# Postfix defaults
# Ref.: https://www.postfix.org/postconf.5.html#smtpd_sasl_security_options
smtpdSASLSecurityOptions:
- "noanonymous"
# Postfix defaults
# Ref.: https://www.postfix.org/postconf.5.html#smtp_sasl_security_options
smtpSASLSecurityOptions:
- "noanonymous"
- "noplaintext"
...

View File

@@ -13,6 +13,15 @@ helmfiles:
{{- if eq (env "OPENDESK_ENTERPRISE") "true" }}
- "helmfile/environments/default-enterprise-overrides/*.yaml.gotmpl"
{{- end }}
{{- if eq (env "SIZE_PROFILE") "500" }}
- "helmfile/environments/default-size-500-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "5k" }}
- "helmfile/environments/default-size-5k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "50k" }}
- "helmfile/environments/default-size-50k-overrides/*.yaml.gotmpl"
{{- else if eq (env "SIZE_PROFILE") "100k" }}
- "helmfile/environments/default-size-100k-overrides/*.yaml.gotmpl"
{{- end }}
- path: "helmfile/apps/opendesk-services/helmfile-child.yaml.gotmpl"
values: *values
- path: "helmfile/apps/services-external/helmfile-child.yaml.gotmpl"

View File

@@ -22,8 +22,8 @@ name: "openDesk"
platforms:
- "web"
developmentStatus: "stable"
softwareVersion: "1.9.0"
releaseDate: "2025-11-07"
softwareVersion: "1.10.0"
releaseDate: "2025-11-24"
softwareType: "standalone/web"
url: "https://gitlab.opencode.de/bmi/opendesk/"
logo: ".opencode/openDesk-logo-rgb-color.svg"