Compare commits
15 Commits
dac969fb31
...
jconde/deb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c880567e0 | ||
|
|
935a56bea0 | ||
|
|
67162e05f8 | ||
|
|
e1d816051d | ||
|
|
c982b483de | ||
|
|
e3b6a28993 | ||
|
|
3f70629ad9 | ||
|
|
420cd1640f | ||
|
|
2be44ac055 | ||
|
|
62c72aa8f6 | ||
|
|
cdfca526ed | ||
|
|
af94d28b6a | ||
|
|
50315d78ee | ||
|
|
9faa326350 | ||
|
|
c1c6b40b76 |
@@ -83,8 +83,12 @@ variables:
|
||||
FLUSH_EXTERNAL_SERVICES_TYPE:
|
||||
description: >
|
||||
Select the type of external services (e.g. "RUN", or "STACKIT"), as they require different
|
||||
cleanup strategies. Requires `FLUSH_EXTERNAL_SERVICES_BEFORE=yes`.
|
||||
value: "RUN"
|
||||
cleanup strategies. Requires `FLUSH_EXTERNAL_SERVICES_BEFORE=yes` and `ENV_STOP_BEFORE=yes`.
|
||||
value: "CHANGE ME"
|
||||
options:
|
||||
- "RUN"
|
||||
- "STACKIT"
|
||||
- "CHANGE ME"
|
||||
DEBUG_ENABLED:
|
||||
description: >
|
||||
Allows to set `debug.enabled` to true for a deployment, needs to be supported by stage specific
|
||||
@@ -292,12 +296,16 @@ db-cleanup:
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
# First: Gather all files that contain the "database:" keyword in the default environment
|
||||
- |
|
||||
export FILES=(
|
||||
"${CI_PROJECT_DIR}/helmfile/environments/default/database.yaml.gotmpl"
|
||||
"${CI_PROJECT_DIR}/helmfile/environments/dev/values.yaml.gotmpl"
|
||||
"${CI_PROJECT_DIR}/helmfile/environments/dev/write-over-values-for-environment.yaml.gotmpl"
|
||||
)
|
||||
export FILES="$(grep -r 'databases:' "${CI_PROJECT_DIR}/helmfile/environments/default" |
|
||||
awk -F ':' '{print $1}')"
|
||||
# Second: Gather all files that contain the "database:" keyword in the dev environment
|
||||
# where the adjustments from opendesk-env are placed
|
||||
- |
|
||||
export FILES="${FILES} $(grep -r 'databases:' "${CI_PROJECT_DIR}/helmfile/environments/dev" |
|
||||
awk -F ':' '{print $1}')"
|
||||
- "echo \"${FILES[@]}\""
|
||||
# Cleanup MariaDB
|
||||
- "export MARIADB_HOST=\"\""
|
||||
- "export MARIADB_PORT=\"\""
|
||||
@@ -305,11 +313,11 @@ db-cleanup:
|
||||
- "export MARIADB_PASSWORD=\"\""
|
||||
- "export ENV_DATABASE=\"oxAppSuite\""
|
||||
|
||||
# Parse cluster values
|
||||
# Parse cluster values
|
||||
- |
|
||||
for FILE in ${FILES[@]}; do
|
||||
if [ -f ${FILE} ]; then
|
||||
if [[ $(tail -n +1 $FILE | grep -v '{{' | yq '.databases.[env(ENV_DATABASE)]') != "null" ]]; then
|
||||
if [ -f "${FILE}" ]; then
|
||||
if [[ $(tail -n +1 "${FILE}" | grep -v '{{' | yq '.databases.[env(ENV_DATABASE)]') != "null" ]]; then
|
||||
MARIADB_DATABASE=$(tail -n +1 $FILE | grep -v '{{' | yq '.databases.[env(ENV_DATABASE)].name')
|
||||
MARIADB_USERNAME=$(tail -n +1 $FILE | grep -v '{{' | yq '.databases.[env(ENV_DATABASE)].username')
|
||||
MARIADB_PASSWORD=$(tail -n +1 $FILE | grep -v '{{' | yq '.databases.[env(ENV_DATABASE)].password')
|
||||
@@ -379,7 +387,7 @@ db-cleanup:
|
||||
echo "[psql] [${ENV_DATABASE}] DROP OWNED BY ${PGUSER} in ${POSTGRES_DATABASE} on ${PGHOST}"
|
||||
psql -c "DROP OWNED BY ${PGUSER}" || true;
|
||||
;;
|
||||
*)
|
||||
"RUN")
|
||||
# Usually, e.g. in "RUN" cluster, databases can simply be dropped and recreated
|
||||
echo "[psql] [${ENV_DATABASE}] DROP ${POSTGRES_DATABASE} on ${PGHOST}"
|
||||
psql -c "DROP DATABASE ${POSTGRES_DATABASE}" || true;
|
||||
|
||||
179
README-EE.md
@@ -6,11 +6,9 @@ SPDX-License-Identifier: Apache-2.0
|
||||
<h1>openDesk Enterprise Edition</h1>
|
||||
|
||||
<!-- TOC -->
|
||||
* [Enabling the Enterprise deployment](#enabling-the-enterprise-deployment)
|
||||
* [Configuring the oD EE deployment for self-hosted installations](#configuring-the-od-ee-deployment-for-self-hosted-installations)
|
||||
* [Registry access](#registry-access)
|
||||
* [License keys](#license-keys)
|
||||
* [Component overview](#component-overview)
|
||||
* [Overview](#overview)
|
||||
* [Enterprise Features](#enterprise-features)
|
||||
* [CE vs. EE](#ce-vs-ee)
|
||||
* [CE Components](#ce-components)
|
||||
* [EE Components](#ee-components)
|
||||
* [Collabora](#collabora)
|
||||
@@ -19,14 +17,117 @@ SPDX-License-Identifier: Apache-2.0
|
||||
* [Open-Xchange](#open-xchange)
|
||||
* [OX App Suite](#ox-app-suite)
|
||||
* [OX Dovecot](#ox-dovecot)
|
||||
* [Enabling the Enterprise deployment](#enabling-the-enterprise-deployment)
|
||||
* [Configuring the oD EE deployment for self-hosted installations](#configuring-the-od-ee-deployment-for-self-hosted-installations)
|
||||
* [Registry access](#registry-access)
|
||||
* [License keys](#license-keys)
|
||||
<!-- TOC -->
|
||||
|
||||
openDesk Enterprise Edition is recommended for production use. It receives support and patches from ZenDiS and the suppliers of the components due to the included product subscriptions.
|
||||
# Overview
|
||||
|
||||
openDesk Enterprise Edition is recommended for production use. It receives support and patches from ZenDiS and the suppliers of the components due to the product subscriptions included.
|
||||
|
||||
This document refers to the openDesk Community Edition as "oD CE" and the openDesk Enterprise Edition as "oD EE".
|
||||
|
||||
Please contact [ZenDiS](mailto:opendesk@zendis.de) to get openDesk Enterprise, either as a SaaS offering or for your on-premises installation.
|
||||
|
||||
# Enterprise Features
|
||||
|
||||
oD EE ships the following features for Enterprise use that are not available in oD CE.
|
||||
|
||||
| Component | Enterprise-only Features |
|
||||
| -------------------- | ----------------------------------------------------------------------------------------------------------------- |
|
||||
| **Collabora** | Branding |
|
||||
| | [Automatic load scaling](https://www.collaboraonline.com/collabora-online-controller/) |
|
||||
| **Element** | [AdminBot](https://ems-docs.element.io/books/element-cloud-documentation/page/admin-bot) |
|
||||
| | [GroupSync](https://ems-docs.element.io/books/element-server-suite-classic-documentation-lts-2504/page/setting-up-group-sync-with-the-installer#bkmrk-what-is-group-sync?) |
|
||||
| | [Admin Console](https://ems-docs.element.io/books/element-server-suite-classic-documentation-lts-2504/page/using-the-admin-console) |
|
||||
| **Nextcloud** | Enterprise security patches |
|
||||
| | [Guard app](https://nextcloud.com/features/#guard) |
|
||||
| **Open‑Xchange** | S3 storage |
|
||||
| | Central orchestration of cluster topology, health checks, and configuration |
|
||||
| | Advanced Full-Text Search (FTS) functionality for mailboxes |
|
||||
| **OpenProject**. | [Enterprise addons](https://www.openproject.org/docs/enterprise-guide/) (*Corporate Plan*) |
|
||||
| **XWiki** | [XWiki Pro apps](https://xwiki.com/en/offerings/products/xwiki-pro) |
|
||||
|
||||
# CE vs. EE
|
||||
|
||||
The following table summarizes the differences between oD CE and oD EE.
|
||||
|
||||
| Aspect | Community Edition (CE) | Enterprise Edition (EE) |
|
||||
| -------------------------------- | --------------------------------------- | -------------------------------------------------------------------------- |
|
||||
| **Licensing of core components** | OSS (Apache‑2.0 / GPL, etc.) | Same OSS licenses |
|
||||
| **Closed‑source modules** | None | Collabora (branding), Element (admin tools), Nextcloud (guard app), OX Pro, Dovecot Pro |
|
||||
| **Technical enablement** | Fully public images/charts via openCode | EE‑only registry, license file (`enterprise.yaml`) |
|
||||
| **Support & updates** | Community via openCode, no SLA | SLA‑backed support, patches, 2nd/3rd level |
|
||||
| **Access to source code** | All CE code on openCode | Proprietary modules NOT on openCode |
|
||||
|
||||
|
||||
## CE Components
|
||||
|
||||
The following components are using the same codebase and artifacts for their Community and Enterprise offering:
|
||||
|
||||
- Cryptpad
|
||||
- Jitsi
|
||||
- Notes
|
||||
- Nubus
|
||||
- OpenProject
|
||||
- XWiki
|
||||
|
||||
## EE Components
|
||||
|
||||
This section provides information about the components that have - at least partially - Enterprise-specific artifacts.
|
||||
|
||||
If you want to check in detail which artifacts are specific to openDesk Enterprise and thereby may contain proprietary code, please check the `repository:`
|
||||
values in the image ([1](./helmfile/environments/default/images.yaml.gotmpl) / [2](./helmfile/environments/default-enterprise-overrides/images.yaml.gotmpl))
|
||||
and chart ([1](./helmfile/environments/default/charts.yaml.gotmpl) / [2](./helmfile/environments/default-enterprise-overrides/charts.yaml.gotmpl)) definitions.
|
||||
When a repository path starts with `/zendis`, the artifact is only available in an openDesk Enterprise deployment.
|
||||
|
||||
### 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.
|
||||
|
||||
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.
|
||||
|
||||
### Element
|
||||
|
||||
- AdminBot and GroupSync container image: 100% closed source
|
||||
- Admin Console container image: 100% closed source, though ~65% of the total runtime code is from the [matrix-bot-sdk](https://github.com/turt2live/matrix-bot-sdk/)
|
||||
|
||||
### Nextcloud
|
||||
|
||||
- Nextcloud Enterprise: openDesk uses the Nextcloud Enterprise to the build Nextcloud container image for oD EE. The Nextcloud EE codebase might contain EE exclusive (longterm support) security patches, plus the Guard app, that is not publicly available, while it is AGPL-3.0 licensed.
|
||||
|
||||
openDesk updates the Nextcloud images for openDesk CE and EE in parallel, therefore we will not upgrade to a new major Nextcloud release before the related Nextcloud Enterprise release is available. When patches are released exclusively for Nextcloud Enterprise, they are made available also exclusively in oD EE.
|
||||
|
||||
### Open-Xchange
|
||||
|
||||
#### OX App Suite
|
||||
|
||||
- OX App Suite Core Middleware container image: The amount of code, that is not open source and has a proprietary license, is <10%.
|
||||
- OX App Suite Pro Helm chart: It is not publicly available, though it is "just" an umbrella chart re-using the publicly available charts referencing the EE images, so it has <10% prorietary content.
|
||||
|
||||
openDesk updates OX App Suite in oD CE and EE always to the same release version. Only the App Suíte Pro Helm chart has the same versioning as the actual App Suite release, the chart used in oD CE has a different versioning scheme.
|
||||
|
||||
#### OX Dovecot
|
||||
|
||||
- Dovecot Pro container image: Dovecot Pro is based on the open source components Dovecot and Pigeonhole but extended by modules providing additional functionality like obox2, cluster, cluster controller and dovecot fts. The additional modules make up about 15% of the overall Dovecot Pro code and are subject to a closed source license.
|
||||
|
||||
openDesk aims to keep Dovecot's shared codebases in sync between oD CE and EE, though the versioning between the releases differs (CE: 2.x, EE: 3.y).
|
||||
|
||||
Dovecot Pro requires two additional environment variables:
|
||||
|
||||
- `DOVECOT_CRYPT_PRIVATE_KEY`
|
||||
- `DOVECOT_CRYPT_PUBLIC_KEY`
|
||||
|
||||
These variables must contain the base64 encoded strings of the private and public
|
||||
key. These keys can be generated with the following commands:
|
||||
|
||||
- Private Key: `openssl genpkey -algorithm X25519 -out private.pem && cat private.pem | base64 -w0`
|
||||
- Public Key: `openssl pkey -in private.pem -out public.pem -pubout && cat public.pem | base64 -w0`
|
||||
|
||||
|
||||
# Enabling the Enterprise deployment
|
||||
|
||||
To enable the oD EE deployment you must set the environment variable `OPENDESK_ENTERPRISE` to any value that does not evaluate to boolean *false* for [Helm flow control](https://helm.sh/docs/chart_template_guide/control_structures/#ifelse), e.g. `"true"`, `"yes"` or `"1"`:
|
||||
@@ -95,69 +196,3 @@ Details regarding the scope/limitation of the component's licenses:
|
||||
- Nextcloud: Enterprise license to enable [Nextcloud Enterprise](https://nextcloud.com/de/enterprise/) specific features, can be used across multiple installations until the licensed number of users is reached.
|
||||
- OpenProject: Domain specific enterprise license to enable [OpenProject's Enterprise feature set](https://www.openproject.org/enterprise-edition/), domain matching can use regular expressions.
|
||||
- XWiki: Deployment specific enterprise license (key pair) to activate the [XWiki Pro](https://xwiki.com/en/offerings/products/xwiki-pro) apps. *Caution! XWiki needs these license keys as one-line strings. Multi-line strings result in installation failure*
|
||||
|
||||
# Component overview
|
||||
|
||||
## CE Components
|
||||
|
||||
The following components are using the same codebase and artifacts for their Enterprise and Community offering:
|
||||
|
||||
- Cryptpad
|
||||
- Jitsi
|
||||
- Notes
|
||||
- Nubus
|
||||
- OpenProject
|
||||
- XWiki
|
||||
|
||||
## EE Components
|
||||
|
||||
This section provides information about the components that have - at least partially - Enterprise specific artifacts.
|
||||
|
||||
If you want to check in detail which artifacts are specific to openDesk Enterprise and thereby may contain proprietary code, please check the `repository:`
|
||||
values in the image ([1](./helmfile/environments/default/images.yaml.gotmpl) / [2](./helmfile/environments/default-enterprise-overrides/images.yaml.gotmpl))
|
||||
and chart ([1](./helmfile/environments/default/charts.yaml.gotmpl) / [2](./helmfile/environments/default-enterprise-overrides/charts.yaml.gotmpl)) definitions.
|
||||
When a repository path starts with `/zendis`, the artifact is only available in an openDesk Enterprise deployment.
|
||||
|
||||
### 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.
|
||||
|
||||
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.
|
||||
|
||||
### Element
|
||||
|
||||
- AdminBot and GroupSync container image: 100% closed source
|
||||
- Admin Console container image: 100% closed source, though ~65% of the total runtime code is from the [matrix-bot-sdk](https://github.com/turt2live/matrix-bot-sdk/)
|
||||
|
||||
### Nextcloud
|
||||
|
||||
- Nextcloud Enterprise: openDesk uses the Nextcloud Enterprise to the build Nextcloud container image for oD EE. The Nextcloud EE codebase might contain EE exclusive (longterm support) security patches, plus the Guard app, that is not publicly available, while it is AGPL-3.0 licensed.
|
||||
|
||||
openDesk updates the Nextcloud images for openDesk CE and EE in parallel, therefore we will not upgrade to a new major Nextcloud release before the related Nextcloud Enterprise release is available. When patches are released exclusively for Nextcloud Enterprise, they are made available also exclusively in oD EE.
|
||||
|
||||
### Open-Xchange
|
||||
|
||||
#### OX App Suite
|
||||
|
||||
- OX App Suite Core Middleware container image: The amount of code, that is not open source and has a proprietary license, is <10%.
|
||||
- OX App Suite Pro Helm chart: It is not publicly available, though it is "just" an umbrella chart re-using the publicly available charts referencing the EE images, so it has <10% prorietary content.
|
||||
|
||||
openDesk updates OX App Suite in od CE and EE always to the same release version. Only the App Suíte Pro Helm chart has the same versioning as the actual App Suite release, the chart used in oD CE has a different versioning scheme.
|
||||
|
||||
#### OX Dovecot
|
||||
|
||||
- Dovecot Pro container image: Dovecot Pro is based on the open source components Dovecot and Pigeonhole but extended by modules providing additional functionality like obox2, cluster, cluster controller and dovecot fts. The additional modules make up about 15% of the overall Dovecot Pro code and are subject to a closed source license.
|
||||
|
||||
openDesk aims to keep Dovecot's shared codebases in sync between oD CE and EE, though the versioning between the releases differs (CE: 2.x, EE: 3.y).
|
||||
|
||||
Dovecot Pro requires two additional environment variables:
|
||||
|
||||
- `DOVECOT_CRYPT_PRIVATE_KEY`
|
||||
- `DOVECOT_CRYPT_PUBLIC_KEY`
|
||||
|
||||
These variables must contain the base64 encoded strings of the private and public
|
||||
key. These keys can be generated with the following commands:
|
||||
|
||||
- Private Key: `openssl genpkey -algorithm X25519 -out private.pem && cat private.pem | base64 -w0`
|
||||
- Public Key: `openssl pkey -in private.pem -out public.pem -pubout && cat public.pem | base64 -w0`
|
||||
|
||||
26
README.md
@@ -32,18 +32,18 @@ For production use, the [openDesk Enterprise Edition](./README-EE.md) is recomme
|
||||
|
||||
openDesk currently features the following functional main components:
|
||||
|
||||
| Function | Functional Component | Component<br/>Version | Upstream Documentation |
|
||||
|----------------------|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Chat & collaboration | Element ft. Nordeck widgets | [1.11.89](https://github.com/element-hq/element-desktop/releases/tag/v1.11.89) | [For the most recent release](https://element.io/user-guide) |
|
||||
| Collaborative notes | Notes (aka Docs) | [3.2.1](https://github.com/suitenumerique/docs/releases/tag/v3.2.1) | Online documentation/welcome document available in installed application |
|
||||
| Diagram editor | CryptPad ft. diagrams.net | [2024.9.0](https://github.com/cryptpad/cryptpad/releases/tag/2024.9.0) | [For the most recent release](https://docs.cryptpad.org/en/) |
|
||||
| File management | Nextcloud | [31.0.6](https://nextcloud.com/de/changelog/#31-0-6) | [Nextcloud 31](https://docs.nextcloud.com/) |
|
||||
| Groupware | OX App Suite | [8.38](https://documentation.open-xchange.com/appsuite/releases/8.38/) | Online documentation available from within the installed application; [Additional resources](https://documentation.open-xchange.com/) |
|
||||
| Knowledge management | XWiki | [16.10.5](https://www.xwiki.org/xwiki/bin/view/ReleaseNotes/Data/XWiki/16.10.5/) | [For the most recent release](https://www.xwiki.org/xwiki/bin/view/Documentation) |
|
||||
| Portal & IAM | Nubus | [1.11.2](https://docs.software-univention.de/nubus-kubernetes-release-notes/1.x/en/changelog.html#version-1-11-2-2025-07-10) | [Univention's documentation website](https://docs.software-univention.de/n/en/nubus.html) |
|
||||
| Project management | OpenProject | [16.1.1](https://www.openproject.org/docs/release-notes/16-1-1/) | [For the most recent release](https://www.openproject.org/docs/user-guide/) |
|
||||
| Videoconferencing | Jitsi | [2.0.9955](https://github.com/jitsi/jitsi-meet/releases/tag/stable%2Fjitsi-meet_9955) | [For the most recent release](https://jitsi.github.io/handbook/docs/category/user-guide/) |
|
||||
| Weboffice | Collabora | [25.04.2](https://www.collaboraoffice.com/code-25-04-release-notes/) | Online documentation available from within the installed application; [Additional resources](https://sdk.collaboraonline.com/) |
|
||||
| Function | Functional Component | License | Component<br/>Version | Upstream Documentation |
|
||||
|----------------------|-----------------------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Chat & collaboration | Element ft. Nordeck widgets | AGPL-3.0-or-later (Element Web), AGPL-3.0-only (Synapse), Apache-2.0 (Nordeck widgets) | [1.11.89](https://github.com/element-hq/element-web/releases/tag/v1.11.89) | [For the most recent release](https://element.io/user-guide) |
|
||||
| Collaborative notes | Notes (aka Docs) | MIT | [3.2.1](https://github.com/suitenumerique/docs/releases/tag/v3.2.1) | Online documentation/welcome document available in installed application |
|
||||
| Diagram editor | CryptPad ft. diagrams.net | AGPL-3.0-only | [2024.9.0](https://github.com/cryptpad/cryptpad/releases/tag/2024.9.0) | [For the most recent release](https://docs.cryptpad.org/en/) |
|
||||
| File management | Nextcloud | AGPL-3.0-or-later | [31.0.6](https://nextcloud.com/de/changelog/#31-0-6) | [Nextcloud 31](https://docs.nextcloud.com/) |
|
||||
| Groupware | OX App Suite | GPL-2.0-only (backend), AGPL-3.0-or-later (frontend) | [8.38](https://documentation.open-xchange.com/appsuite/releases/8.38/) | Online documentation available from within the installed application; [Additional resources](https://documentation.open-xchange.com/) |
|
||||
| Knowledge management | XWiki | LGPL-2.1-or-later | [16.10.5](https://www.xwiki.org/xwiki/bin/view/ReleaseNotes/Data/XWiki/16.10.5/) | [For the most recent release](https://www.xwiki.org/xwiki/bin/view/Documentation) |
|
||||
| Portal & IAM | Nubus | AGPL-3.0-or-later | [1.11.2](https://docs.software-univention.de/nubus-kubernetes-release-notes/1.x/en/changelog.html#version-1-11-2-2025-07-10) | [Univention's documentation website](https://docs.software-univention.de/n/en/nubus.html) |
|
||||
| Project management | OpenProject | GPL-3.0-only | [16.2.0](https://www.openproject.org/docs/release-notes/16-2-0/) | [For the most recent release](https://www.openproject.org/docs/user-guide/) |
|
||||
| Videoconferencing | Jitsi | Apache-2.0 | [2.0.9955](https://github.com/jitsi/jitsi-meet/releases/tag/stable%2Fjitsi-meet_9955) | [For the most recent release](https://jitsi.github.io/handbook/docs/category/user-guide/) |
|
||||
| Weboffice | Collabora | MPL-2.0 | [25.04.2](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
|
||||
align the applications with best practices regarding container design and operations.
|
||||
@@ -93,6 +93,8 @@ Find out more about the permission system in the [roles & permissions concept](.
|
||||
|
||||
# Releases
|
||||
|
||||
openDesk implements a defined [release and patch management process](./docs/releases.md) to ensure stability and security.
|
||||
|
||||
All technical releases are created using [Semantic Versioning](https://semver.org/).
|
||||
|
||||
Gitlab provides an
|
||||
|
||||
@@ -103,12 +103,12 @@ To upgrade existing deployments, you cannot skip any version mentioned in the co
|
||||
|
||||
| Mandatory version |
|
||||
| ----------------- |
|
||||
<!-- | 1.x.x | add the entry to the table as soon as we get new migration requiring that the former migration was executed -->
|
||||
| v1.5.0 |
|
||||
| v1.1.x |
|
||||
| v1.0.0 |
|
||||
| v0.9.0 |
|
||||
| v0.8.1 |
|
||||
<!-- | 1.x.x | add the entry to the table as soon as we get new migration requiring that the former migration was executed -->
|
||||
|
||||
> **Note**<br>
|
||||
> Be sure to check out the table in the release version you are going to install, and not the currently installed version.
|
||||
|
||||
122
docs/releases.md
Normal file
@@ -0,0 +1,122 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2025 Zentrum für Digitale Souveränität der Öffentlichen Verwaltung (ZenDiS) GmbH
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
-->
|
||||
|
||||
<h1>Release Management</h1>
|
||||
|
||||
This document outlines the release and patch management strategy for **openDesk**, ensuring that all updates, patches, and new releases are systematically **planned, tested, documented**, and **reliably deployed** into production. The process is designed to align with operational planning requirements and maintain system stability and security.
|
||||
|
||||
<!-- TOC -->
|
||||
* [Release Cycle](#release-cycle)
|
||||
* [Release Types](#release-types)
|
||||
* [Release Schedule](#release-schedule)
|
||||
* [Upgrades](#upgrades)
|
||||
* [Patch Management Process](#application-administration)
|
||||
* [Patch Identification & Prioritization](#patch-identification-prioritization)
|
||||
* [Patch Workflow](#patch-workflow)
|
||||
* [Communication Plan](#communication-plan)
|
||||
* [Announcement Channels](#announcement-channels)
|
||||
* [Timing of Communications](#timing-of-communications)
|
||||
* [Documentation Requirements](#documentation-requirements)
|
||||
* [Compliance & Review](#compliance-review)
|
||||
<!-- TOC -->
|
||||
|
||||
# Release Cycle
|
||||
|
||||
openDesk follows a structured release cycle to ensure predictability and reliability:
|
||||
|
||||
## Release Types
|
||||
|
||||
| Type | Frequency | Content |
|
||||
|----------------|---------------|---------------------------------------------------------------|
|
||||
| **Major** | Annually (Q3) | Large feature sets, architecture changes, breaking changes |
|
||||
| **Minor** | Monthly | New features, enhancements, may contain breaking changes or refactors (clearly flagged in the notes) |
|
||||
| **Patch** | On demand | Bug fixes, security updates, minor improvements, no intended breaking changes |
|
||||
|
||||
> **Note:** openDesk does **not** guarantee that minor releases are 100% backward‑compatible. When a breaking change is unavoidable it is announced in the release notes under a dedicated header **“Breaking Changes”** and a migration guide is provided.
|
||||
|
||||
## Release Schedule
|
||||
|
||||
- **Major releases** are scheduled for **Q3 each year**, with planning beginning in Q1.
|
||||
- **Minor releases** occur **monthly on Mondays**, typically **around 10:00 AM** local time.
|
||||
- Each minor release follows a **4-week cycle**.
|
||||
- **Week 1–3**: Active development of new features and improvements.
|
||||
- **End of Week 3**: **Feature freeze** is enforced to allow stabilization and testing.
|
||||
- **Week 4**: Final testing, approvals, and preparation for release.
|
||||
- At the **end of Week 4**, a new minor version is released, and a new cycle begins.
|
||||
- **Patch releases** are created **on demand**, based on criticality and urgency.
|
||||
|
||||
## Upgrades
|
||||
|
||||
- openDesk does not guarantee an in‑place upgrade between two major versions. Always consult the release notes and plan appropriate migration efforts.
|
||||
- Even within the same major line, skipping multiple monthly minor versions is not guaranteed to work without intermediate upgrade steps.
|
||||
- All breaking changes, including those in monthly minor releases, are highlighted in the release notes under Breaking Changes.
|
||||
- Additional, non‑binding migration hints are collected in `migrations.md`
|
||||
|
||||
# Patch Management Process
|
||||
|
||||
A standardized process ensures patches are developed, prioritized, and deployed efficiently.
|
||||
|
||||
## Patch Identification & Prioritization
|
||||
|
||||
Patches are categorized by severity and urgency:
|
||||
|
||||
| Priority Level | Criteria |
|
||||
|----------------|--------------------------------------------------------------------------|
|
||||
| **Critical** | Security vulnerabilities, system outages, data loss risks |
|
||||
| **High** | Major bugs affecting multiple users, performance degradation |
|
||||
| **Medium** | Functional bugs with workarounds, minor usability issues |
|
||||
| **Low** | Cosmetic issues, documentation updates |
|
||||
|
||||
## Patch Workflow
|
||||
|
||||
The following steps define the patch workflow from issue identification to post-deployment review. This process ensures consistent quality and minimal disruption to users:
|
||||
|
||||
1. **Identification**: Potential issues are detected through automated monitoring, internal testing, audits, or user reports submitted via the support ticketing system.
|
||||
2. **Assessment**: The product and engineering teams triage the issue, determine severity based on business and user impact, and prioritize it within the patch queue.
|
||||
3. **Development**: A fix is implemented on a dedicated feature or hotfix branch, adhering to coding standards and version control protocols.
|
||||
4. **Testing**: All patches undergo automated unit and integration tests, as well as manual QA validation in a staging environment that closely mirrors production.
|
||||
5. **Approval**: Once tested, the patch must be approved by the product owner or a designated release manager, with proper documentation and change control entries.
|
||||
6. **Deployment**: The patch is rolled out using CI/CD pipelines during predefined deployment windows or as soon as possible for critical issues.
|
||||
7. **Post-deployment review**: After deployment, the fix is verified in production, and monitoring tools are used to detect regressions or unintended side effects.
|
||||
|
||||
This workflow ensures that patches are handled with the same level of discipline as planned releases, supporting both reliability and agility.
|
||||
|
||||
# Communication Plan
|
||||
|
||||
A lightweight approach reduces manual effort while maintaining transparency.
|
||||
|
||||
## Announcement Channels
|
||||
|
||||
| Channel | Audience | Purpose | Owner |
|
||||
|---------|----------|---------|-------|
|
||||
| **openCode Changelog** | Community & EE | Primary source of truth for every release | DevOps |
|
||||
| **Account‑Manager Mail / Ticket** | Enterprise customers | Targeted information & upgrade advice | Customer Success |
|
||||
|
||||
## Timing of Communications
|
||||
|
||||
| Release Type | What | When |
|
||||
|--------------|------|------|
|
||||
| **Major** | Roadmap entry + migration highlights | 4 weeks before release |
|
||||
| | Final confirmation | 1 week before release |
|
||||
| **Minor** | Changelog entry (draft) | Immediately after feature freeze (end of week 3) |
|
||||
| | EE mail/ticket | 2 business days before deployment |
|
||||
| **Patch** | Changelog entry | Right after production deploy |
|
||||
| | EE mail/ticket (only if impacted) | Within 1 business day |
|
||||
|
||||
Community users consume information via openCode; Enterprise customers get an additional nudge via their account manager – **no mass mailings are sent manually**.
|
||||
|
||||
# Documentation Requirements
|
||||
|
||||
Each release (major, minor, or patch) must include:
|
||||
|
||||
- **Release notes** outlining new features, fixes, and known issues
|
||||
- **Change logs** with commit references and affected components
|
||||
- **Test reports** confirming QA coverage and results
|
||||
- **Deployment checklist** reviewed and approved by the product owner
|
||||
|
||||
# Compliance & Review
|
||||
|
||||
- The release process is reviewed **bi-annually** to incorporate feedback and evolving requirements
|
||||
- Emergency patches (e.g., zero-day security issues) may bypass the standard schedule but must be documented post-deployment
|
||||
@@ -20,11 +20,6 @@ Please review the default configuration that is applied to understand your custo
|
||||
|
||||
You can just update the files in [helmfile/files/theme](../helmfile/files/theme) to change logos, favicons etc. Note that the `.svg` versions of the favicons are also used for the portal tiles.
|
||||
|
||||
> **Note**<br>
|
||||
> Theming focuses on colors, iconography and imagery. If you like to adapt the default links in the portal pointing to external
|
||||
> resources (like "Support", "Legal Notice") please check the `functional.portal` section
|
||||
> in [`functional.yaml.gotmpl`](../helmfile/environments/default/functional.yaml.gotmpl)
|
||||
|
||||
# Known limitations
|
||||
|
||||
- Portal and Keycloak screen styles, especially colors, must be applied in the [`portalStylesheets.css`](../helmfile/files/theme/portalStylesheet.css),
|
||||
|
||||
@@ -232,6 +232,33 @@ serviceAccount:
|
||||
{{ .Values.annotations.nextcloudNextcloudMgmt.serviceAccount | toYaml | nindent 4 }}
|
||||
|
||||
theme:
|
||||
{{ .Values.theme | toYaml | nindent 2 }}
|
||||
background:
|
||||
# Static color background
|
||||
# NOTE: Not available yet because of a bug in Nextcloud 31.X
|
||||
# Ref: https://github.com/nextcloud/server/commit/da51459022d21a569ab8271c5456f69c9316cdad
|
||||
color: {{ .Values.theme.colors.primary | quote }}
|
||||
# PNG or JPEG image background. Overwrites `theme.background.color`
|
||||
imgBase64: {{ .Values.theme.imagery.files.backgroudImg | quote }}
|
||||
|
||||
colors:
|
||||
primary: {{ .Values.theme.colors.primary | quote }}
|
||||
|
||||
favicon:
|
||||
pngBase64: {{ .Values.theme.imagery.files.faviconPng | quote }}
|
||||
|
||||
logo:
|
||||
svgBase64: {{ .Values.theme.imagery.logoHeaderSvgB64 | quote }}
|
||||
|
||||
# Overwrites the header color of Nextcloud with the value set in the `integration_swp` app
|
||||
# This can *intentionally* only be adjusted via customizing
|
||||
swpOverrideHeaderColor: true
|
||||
|
||||
texts:
|
||||
slogan: {{ .Values.theme.texts.slogan | quote }}
|
||||
productName: {{ .Values.theme.texts.productName | quote }}
|
||||
|
||||
urls:
|
||||
imprint: {{ .Values.functional.portal.linkLegalNotice | quote }}
|
||||
privacy: {{ .Values.functional.portal.linkPrivacyStatement | quote }}
|
||||
main: {{ printf "%s.%s" .Values.global.hosts.nubus .Values.global.domain }}
|
||||
...
|
||||
|
||||
@@ -407,12 +407,8 @@ nubusPortalFrontend:
|
||||
portalFrontend:
|
||||
branding:
|
||||
css: {{ .Values.theme.styles.portal.main | toJson }}
|
||||
# Requires .ico, .svg does not work.
|
||||
favicon: {{ .Values.theme.imagery.portal.faviconIco | toJson }}
|
||||
faviconSvg: {{ .Values.theme.imagery.portal.faviconSvg | toJson }}
|
||||
favicon96Png: {{ .Values.theme.imagery.portal.favicon96Png | toJson }}
|
||||
appleTouchIcon: {{ .Values.theme.imagery.portal.appleTouchIcon | toJson }}
|
||||
webManifestIcon192: {{ .Values.theme.imagery.portal.webManifestIcon192 | toJson }}
|
||||
webManifestIcon512: {{ .Values.theme.imagery.portal.webManifestIcon512 | toJson }}
|
||||
# The actual `logo` is set in customizing image, the logo down here is for waiting spinner.
|
||||
logo: {{ .Values.theme.imagery.portal.waitingSpinnerSvg | toJson }}
|
||||
backgroundImage: {{ .Values.theme.imagery.portal.backgroundSvg | toJson }}
|
||||
@@ -682,6 +678,7 @@ nubusPortalServer:
|
||||
{{- with .Values.annotations.nubusPortalServer.ingress }}
|
||||
{{ . | toYaml | nindent 8 }}
|
||||
{{- end }}
|
||||
|
||||
certManager:
|
||||
enabled: false
|
||||
tls:
|
||||
@@ -705,25 +702,6 @@ nubusPortalServer:
|
||||
sharedSecret: {{ .Values.secrets.centralnavigation.apiKey | quote }}
|
||||
featureToggles:
|
||||
notifications_api: false
|
||||
centered_layout: true
|
||||
newsfeed: {{ and .Values.apps.xwiki.enabled .Values.functional.portal.newsfeed.enabled }}
|
||||
umc_session_refresh: true
|
||||
welcome_message: {{ .Values.functional.portal.welcomeMessage.enabled }}
|
||||
newsfeed:
|
||||
feedType: "xwiki"
|
||||
feedUrl:
|
||||
en_US: {{ printf "https://%s.%s/wiki/bin/get/Blog/BlogRss?xpage=plain&blog=openDesk.Newsfeed.WebHome" .Values.global.hosts.intercomService .Values.global.domain }}
|
||||
de_DE: {{ printf "https://%s.%s/wiki/bin/get/Blog/BlogRss?xpage=plain&blog=openDesk.Newsfeed.WebHome" .Values.global.hosts.intercomService .Values.global.domain }}
|
||||
homeUrl:
|
||||
en_US: {{ printf "https://%s.%s/bin/view/openDesk/Newsfeed/" .Values.global.hosts.xwiki .Values.global.domain }}
|
||||
de_DE: {{ printf "https://%s.%s/bin/view/openDesk/Newsfeed/" .Values.global.hosts.xwiki .Values.global.domain }}
|
||||
icsSilentLoginUrl: {{ printf "https://%s.%s/silent" .Values.global.hosts.intercomService .Values.global.domain }}
|
||||
objectStorageEndpoint: {{ printf "https://%s" (.Values.objectstores.nubus.endpoint | default (printf "%s.%s" .Values.global.hosts.minioApi .Values.global.domain)) | quote }}
|
||||
objectStorageBucket: {{ .Values.objectstores.nubus.bucket | quote }}
|
||||
objectStorageCredentialSecret:
|
||||
name: "ums-portal-server-minio-opendesk-credentials"
|
||||
accessKeyKey: "access-key-id"
|
||||
secretKeyKey: "secret-key-id"
|
||||
replicaCount: {{ .Values.replicas.umsPortalServer }}
|
||||
resources:
|
||||
{{ .Values.resources.umsPortalServer | toYaml | nindent 4 }}
|
||||
|
||||
@@ -527,7 +527,10 @@ config:
|
||||
publicClient: false
|
||||
authorizationServicesEnabled: false
|
||||
attributes:
|
||||
use.refresh.tokens: true
|
||||
backchannel.logout.session.required: true
|
||||
standard.token.exchange.enabled: true
|
||||
standard.token.exchange.enableRefreshRequestedTokenType: "SAME_SESSION"
|
||||
backchannel.logout.revoke.offline.tokens: true
|
||||
backchannel.logout.url: "https://{{ .Values.global.hosts.intercomService }}.{{ .Values.global.domain }}/backchannel-logout"
|
||||
protocolMappers:
|
||||
|
||||
@@ -120,6 +120,9 @@ appsuite:
|
||||
annotations:
|
||||
{{ .Values.annotations.openxchangeAppsuiteIngress.trailslash | toYaml | nindent 10 }}
|
||||
rest-routes-admin:
|
||||
{{- if .Values.technical.oxAppSuite.provisioning.dedicatedCoreMwPod }}
|
||||
enabled: false
|
||||
{{- end }}
|
||||
annotations:
|
||||
{{ .Values.annotations.openxchangeAppsuiteIngress.restRoutesAdmin | toYaml | nindent 10 }}
|
||||
rest-routes-advertisement:
|
||||
@@ -215,6 +218,43 @@ appsuite:
|
||||
productName: {{ .Values.theme.texts.productName | quote }}
|
||||
oidcLogin: true
|
||||
oidcPath: "/oidc/"
|
||||
defaultScaling:
|
||||
nodes:
|
||||
default:
|
||||
roles:
|
||||
- http-api
|
||||
- sync
|
||||
- admin
|
||||
- businessmobility
|
||||
- request-analyzer
|
||||
roles:
|
||||
admin:
|
||||
values:
|
||||
features:
|
||||
status:
|
||||
admin: "enabled"
|
||||
packages:
|
||||
status:
|
||||
open-xchange-admin-contextrestore: "enabled"
|
||||
open-xchange-admin-oauth-provider: "enabled"
|
||||
open-xchange-admin-soap: "enabled"
|
||||
open-xchange-admin-soap-usercopy: "enabled"
|
||||
open-xchange-admin-user-copy: "enabled"
|
||||
{{- if .Values.technical.oxAppSuite.provisioning.dedicatedCoreMwPod }}
|
||||
scaling:
|
||||
nodes:
|
||||
groupware:
|
||||
replicas: {{ .Values.replicas.openxchangeCoreMW }}
|
||||
roles:
|
||||
- "http-api"
|
||||
- "sync"
|
||||
- "businessmobility"
|
||||
- "request-analyzer"
|
||||
admin:
|
||||
replicas: 1
|
||||
roles:
|
||||
- "admin"
|
||||
{{- end }}
|
||||
masterAdmin: "admin"
|
||||
masterPassword: {{ .Values.secrets.oxAppSuite.adminPassword | quote }}
|
||||
hzGroupName: "hzgroup"
|
||||
@@ -236,6 +276,10 @@ appsuite:
|
||||
# admin: enabled
|
||||
documents: "disabled"
|
||||
guard: "enabled"
|
||||
# disabling admin role breaks webmail
|
||||
# {{- if .Values.technical.oxAppSuite.provisioning.dedicatedCoreMwPod }}
|
||||
# admin: "disabled"
|
||||
# {{- end }}
|
||||
gotenberg:
|
||||
enabled: true
|
||||
imagePullSecrets:
|
||||
@@ -295,6 +339,14 @@ appsuite:
|
||||
open-xchange-hostname-config-cascade: "enabled"
|
||||
# Enable s3 storage
|
||||
open-xchange-filestore-s3: "enabled"
|
||||
{{- if .Values.technical.oxAppSuite.provisioning.dedicatedCoreMwPod }}
|
||||
# disabling admin feature breaks webmail, so only sub packages are disabled:
|
||||
open-xchange-admin-contextrestore: "disabled"
|
||||
open-xchange-admin-oauth-provider: "disabled"
|
||||
open-xchange-admin-soap: "disabled"
|
||||
open-xchange-admin-soap-usercopy: "disabled"
|
||||
open-xchange-admin-user-copy: "disabled"
|
||||
{{- end }}
|
||||
properties:
|
||||
com.openexchange.hostname: {{ printf "%s.%s" .Values.global.hosts.openxchange .Values.global.domain }}
|
||||
com.openexchange.UIWebPath: "/appsuite/"
|
||||
|
||||
@@ -49,7 +49,7 @@ oxConnector:
|
||||
oxMasterAdmin: "admin"
|
||||
oxMasterPassword: {{ .Values.secrets.oxAppSuite.adminPassword | quote }}
|
||||
oxSmtpServer: "smtp://127.0.0.1:587"
|
||||
oxSoapServer: "https://{{ .Values.global.hosts.openxchange }}.{{ .Values.global.domain }}"
|
||||
oxSoapServer: "http://open-xchange-core-mw-admin"
|
||||
|
||||
provisioningApi:
|
||||
connection:
|
||||
|
||||
@@ -13,7 +13,7 @@ images:
|
||||
nextcloud:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "zendis/opendesk-enterprise/components/supplier/nextcloud/images/opendesk-nextcloud"
|
||||
tag: "31.0.6@sha256:eb1fd84f39a9ff36bd1251ef4bc00b2a838bc2f9fb6df2b18b1a70ae72fac022"
|
||||
tag: "31.0.6@sha256:12e5009019a072ee9bf6c9a69f4ecbf00a0590f6a2f10155ab56a1a61b43baf9"
|
||||
openxchangeCoreMW:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "zendis/opendesk-enterprise/components/supplier/open-xchange/images-mirror/middleware-public-sector-pro"
|
||||
|
||||
@@ -24,7 +24,7 @@ charts:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/charts/opendesk-certificates"
|
||||
name: "opendesk-certificates"
|
||||
version: "3.1.1"
|
||||
version: "3.1.2"
|
||||
verify: true
|
||||
clamav:
|
||||
# providerCategory: "Platform"
|
||||
@@ -251,7 +251,7 @@ charts:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/charts/opendesk-nextcloud"
|
||||
name: "opendesk-nextcloud"
|
||||
version: "4.2.0"
|
||||
version: "4.3.1"
|
||||
verify: true
|
||||
nextcloudManagement:
|
||||
# providerCategory: "Platform"
|
||||
@@ -261,7 +261,7 @@ charts:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/charts/opendesk-nextcloud"
|
||||
name: "opendesk-nextcloud-management"
|
||||
version: "4.2.0"
|
||||
version: "4.3.1"
|
||||
verify: true
|
||||
nextcloudNotifyPush:
|
||||
# providerCategory: "Platform"
|
||||
@@ -271,7 +271,7 @@ charts:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/charts/opendesk-nextcloud"
|
||||
name: "opendesk-nextcloud-notifypush"
|
||||
version: "4.2.0"
|
||||
version: "4.3.1"
|
||||
verify: true
|
||||
nginx:
|
||||
# providerCategory: "Community"
|
||||
@@ -407,7 +407,7 @@ charts:
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/charts/opendesk-open-xchange-bootstrap"
|
||||
name: "opendesk-open-xchange-bootstrap"
|
||||
version: "3.0.1"
|
||||
version: "4.0.1"
|
||||
verify: true
|
||||
oxConnector:
|
||||
# providerCategory: "Supplier"
|
||||
|
||||
@@ -320,7 +320,7 @@ images:
|
||||
# upstreamRepository: "bmi/opendesk/components/platform-development/images/opendesk-nextcloud"
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/images/opendesk-nextcloud"
|
||||
tag: "31.0.6@sha256:760d0f1ff724d53faa757987e7068d09df0c603e3ac4fbb8aefe1bf13270c615"
|
||||
tag: "31.0.6@sha256:f881cde15c41df21177a1edf3cc08ed5abe88627a5a44fdb42caacdcfe25de19"
|
||||
nextcloudExporter:
|
||||
# providerCategory: "Platform"
|
||||
# providerResponsible: "openDesk"
|
||||
@@ -550,7 +550,7 @@ images:
|
||||
# upstreamRepository: "bmi/opendesk/components/platform-development/images/opendesk-nubus"
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/platform-development/images/opendesk-nubus"
|
||||
tag: "1.14.9@sha256:a2c7a5e302ed5cc52445fd1b18b277de4a3d45b2a2940f1a3970447dc13eb16c"
|
||||
tag: "1.14.4@sha256:cf0e22c1eef138a413a90a60c5405126dc769195dd4dd37229a27afaa82ef3b3"
|
||||
nubusOpendeskExtensionA2gMapper:
|
||||
# providerCategory: "Platform"
|
||||
# providerResponsible: "openDesk"
|
||||
@@ -604,11 +604,9 @@ images:
|
||||
# providerResponsible: "Univention"
|
||||
# upstreamRegistry: "https://artifacts.software-univention.de"
|
||||
# upstreamRepository: "nubus/images/portal-frontend"
|
||||
# upstreamMirrorTagFilterRegEx: '^(\d+)\.(\d+)\.(\d+)$'
|
||||
# upstreamMirrorStartFrom: ["0", "67", "0"]
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/supplier/univention/images-mirror/portal-frontend"
|
||||
tag: "0.70.0@sha256:9e0826c954e99b36b3c7b9ce6dfa1f567a3432158fb78af13337760197f94997"
|
||||
repository: "bmi/opendesk/components/platform-development/images/opendesk-nubus-portal-update"
|
||||
tag: "1.10.14@sha256:fbdec057958fd7e728431cf96896b8453c2f5b390ce3d2f169a7766f49926b1b"
|
||||
nubusPortalServer:
|
||||
# providerCategory: "Supplier"
|
||||
# providerResponsible: "Univention"
|
||||
@@ -752,7 +750,7 @@ images:
|
||||
# upstreamMirrorStartFrom: ["13", "1", "1"]
|
||||
registry: "registry.opencode.de"
|
||||
repository: "bmi/opendesk/components/supplier/openproject/images-mirror/open_desk"
|
||||
tag: "16.1.1@sha256:2fe8a7d1cab42611b01f4ca20ce7179a0637477f2882364b4a1cfdebde9ecd6f"
|
||||
tag: "16.2.0@sha256:e4d50068411a7d5afbaf245211df9b7d18f622fed4b6c3c634bc7f88a3149419"
|
||||
openprojectBootstrap:
|
||||
# providerCategory: "Platform"
|
||||
# providerResponsible: "openDesk"
|
||||
|
||||
@@ -6,4 +6,12 @@ technical:
|
||||
collabora:
|
||||
# Defines the value for the start parameter `-o:num_prespawn_children`
|
||||
numPrespawnChildren: 4
|
||||
# Groupware related technical settings
|
||||
oxAppSuite:
|
||||
provisioning:
|
||||
# In environments with a large number of users and groups, we offer the option to enable a
|
||||
# dedicated Pod for the OX App Suite Core Middleware, exclusively handling provisioning tasks.
|
||||
# This approach ensures that heavy provisioning workloads do not negatively impact the user
|
||||
# experience, such as by slowing down pods that serve end-user sessions.
|
||||
dedicatedCoreMwPod: false
|
||||
...
|
||||
|
||||
@@ -11,6 +11,7 @@ theme:
|
||||
#
|
||||
texts:
|
||||
productName: "openDesk"
|
||||
slogan: "Souverän gedacht. Flexibel gemacht."
|
||||
|
||||
## Define colors
|
||||
#
|
||||
@@ -48,6 +49,9 @@ theme:
|
||||
files:
|
||||
faviconIco: {{ readFile "./../../files/theme/files/favicon.ico" | b64enc | quote }}
|
||||
faviconPng: {{ readFile "./../../files/theme/files/favicon.png" | b64enc | quote }}
|
||||
# A base64 encoded background image that overwrites the solid color background from `theme.colors.primary`
|
||||
# We tested the following file formats: PNG, JPEG and SVG
|
||||
backgroudImg: ~
|
||||
|
||||
login:
|
||||
faviconIco: {{ readFile "./../../files/theme/login/favicon.ico" | b64enc | quote }}
|
||||
@@ -66,14 +70,8 @@ theme:
|
||||
faviconIco: {{ readFile "./../../files/theme/notes/favicon.ico" | b64enc | quote }}
|
||||
|
||||
portal:
|
||||
faviconIco: {{ readFile "./../../files/theme/portal/favicon/favicon.ico" | b64enc | quote }}
|
||||
faviconSvg: {{ readFile "./../../files/theme/portal/favicon/favicon.svg" | b64enc | quote }}
|
||||
favicon96Png: {{ readFile "./../../files/theme/portal/favicon/favicon-96x96.png" | b64enc | quote }}
|
||||
appleTouchIcon: {{ readFile "./../../files/theme/portal/favicon/apple-touch-icon.png" | b64enc | quote }}
|
||||
webManifestIcon192: {{ readFile "./../../files/theme/portal/favicon/web-app-manifest-192x192.png" | b64enc | quote }}
|
||||
webManifestIcon512: {{ readFile "./../../files/theme/portal/favicon/web-app-manifest-512x512.png" | b64enc | quote }}
|
||||
|
||||
waitingSpinnerSvg: {{ readFile "./../../files/theme/portal/waiting-spinner.svg" | b64enc | quote }}
|
||||
faviconIco: {{ readFile "./../../files/theme/portal/favicon.ico" | b64enc | quote }}
|
||||
waitingSpinnerSvg: {{ readFile "./../../files/theme/portal/waiting-spinner.svg" | b64enc }}
|
||||
backgroundSvg: {{ readFile "./../../files/theme/portal/background.svg" | b64enc | quote }}
|
||||
portalTiles:
|
||||
adminAnnouncement: {{ readFile "./../../files/theme/admin_announcements/favicon.svg" | b64enc | quote }}
|
||||
@@ -95,10 +93,6 @@ theme:
|
||||
notes: {{ readFile "./../../files/theme/notes/favicon.svg" | b64enc | quote }}
|
||||
realtimeCollaboration: {{ readFile "./../../files/theme/chat/favicon.svg" | b64enc | quote }}
|
||||
realtimeVideoconference: {{ readFile "./../../files/theme/videoconference/favicon.svg" | b64enc | quote }}
|
||||
# links
|
||||
documentation: {{ readFile "./../../files/theme/link_documentation/favicon.svg" | b64enc | quote }}
|
||||
feedback: {{ readFile "./../../files/theme/link_feedback/favicon.svg" | b64enc | quote }}
|
||||
support: {{ readFile "./../../files/theme/link_support/favicon.svg" | b64enc | quote }}
|
||||
# empty.svg
|
||||
empty: {{ readFile "./../../files/theme/_dev/empty.svg" | b64enc | quote }}
|
||||
fileshareActivity: {{ readFile "./../../files/theme/_dev/empty.svg" | b64enc | quote }}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" class="portal-help__icon"><mask id="mask0_406_2939" maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20" style="mask-type: alpha;"><rect width="20" height="20" fill="#D9D9D9"></rect></mask><g mask="url(#mask0_406_2939)"><path d="M9.9987 16.666C9.33203 16.1382 8.60981 15.7285 7.83203 15.4368C7.05425 15.1452 6.2487 14.9993 5.41536 14.9993C4.83203 14.9993 4.25911 15.0757 3.69661 15.2285C3.13411 15.3813 2.59592 15.5966 2.08203 15.8743C1.79036 16.0271 1.50911 16.0202 1.23828 15.8535C0.967448 15.6868 0.832031 15.4438 0.832031 15.1243V5.08268C0.832031 4.9299 0.870226 4.78407 0.946615 4.64518C1.023 4.50629 1.13759 4.40213 1.29036 4.33268C1.92925 3.99935 2.59592 3.74935 3.29036 3.58268C3.98481 3.41602 4.69314 3.33268 5.41536 3.33268C6.22092 3.33268 7.00912 3.43685 7.77995 3.64518C8.55078 3.85352 9.29037 4.16602 9.9987 4.58268V14.666C10.707 14.2216 11.4501 13.8882 12.2279 13.666C13.0056 13.4438 13.7904 13.3327 14.582 13.3327C15.082 13.3327 15.5716 13.3743 16.0508 13.4577C16.5299 13.541 17.0126 13.666 17.4987 13.8327V3.83268C17.707 3.90213 17.9119 3.97504 18.1133 4.05143C18.3147 4.12782 18.5126 4.22157 18.707 4.33268C18.8598 4.40213 18.9744 4.50629 19.0508 4.64518C19.1272 4.78407 19.1654 4.9299 19.1654 5.08268V15.1243C19.1654 15.4438 19.0299 15.6868 18.7591 15.8535C18.4883 16.0202 18.207 16.0271 17.9154 15.8743C17.4015 15.5966 16.8633 15.3813 16.3008 15.2285C15.7383 15.0757 15.1654 14.9993 14.582 14.9993C13.7487 14.9993 12.9431 15.1452 12.1654 15.4368C11.3876 15.7285 10.6654 16.1382 9.9987 16.666ZM11.6654 12.4993V4.58268L15.832 0.416016V8.74935L11.6654 12.4993ZM8.33203 13.8535V5.60352C7.8737 5.40907 7.398 5.25977 6.90495 5.1556C6.41189 5.05143 5.91536 4.99935 5.41536 4.99935C4.90148 4.99935 4.40148 5.04796 3.91536 5.14518C3.42925 5.2424 2.95703 5.38824 2.4987 5.58268V13.8535C2.98481 13.673 3.46745 13.541 3.94661 13.4577C4.42578 13.3743 4.91536 13.3327 5.41536 13.3327C5.91536 13.3327 6.40495 13.3743 6.88412 13.4577C7.36328 13.541 7.84592 13.673 8.33203 13.8535Z" fill="white"></path></g></svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="21" height="20" viewBox="0 0 21 20" fill="none" class="portal-help__icon"><mask id="mask0_592_612" maskUnits="userSpaceOnUse" x="0" y="0" width="21" height="20" style="mask-type: alpha;"><rect x="0.644531" width="20" height="20" fill="#D9D9D9"></rect></mask><g mask="url(#mask0_592_612)"><path d="M18.9792 18.3337L15.6458 15.0003H3.97917C3.52083 15.0003 3.12847 14.8371 2.80208 14.5107C2.47569 14.1844 2.3125 13.792 2.3125 13.3337V3.33366C2.3125 2.87533 2.47569 2.48296 2.80208 2.15658C3.12847 1.83019 3.52083 1.66699 3.97917 1.66699H17.3125C17.7708 1.66699 18.1632 1.83019 18.4896 2.15658C18.816 2.48296 18.9792 2.87533 18.9792 3.33366V18.3337ZM3.97917 13.3337H16.3542L17.3125 14.2712V3.33366H3.97917V13.3337Z" fill="white"></path></g></svg>
|
||||
|
Before Width: | Height: | Size: 789 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none" class="portal-help__icon"><mask id="mask0_406_2944" maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20" style="mask-type: alpha;"><rect width="20" height="20" fill="#D9D9D9"></rect></mask><g mask="url(#mask0_406_2944)"><path d="M10 18.3327L9.79167 15.8327H9.58333C7.61111 15.8327 5.9375 15.1452 4.5625 13.7702C3.1875 12.3952 2.5 10.7216 2.5 8.74935C2.5 6.77713 3.1875 5.10352 4.5625 3.72852C5.9375 2.35352 7.61111 1.66602 9.58333 1.66602C10.5694 1.66602 11.4896 1.85004 12.3438 2.2181C13.1979 2.58615 13.9479 3.0931 14.5938 3.73893C15.2396 4.38477 15.7465 5.13477 16.1146 5.98893C16.4826 6.8431 16.6667 7.76324 16.6667 8.74935C16.6667 9.79102 16.4965 10.791 16.1563 11.7493C15.816 12.7077 15.3507 13.5966 14.7604 14.416C14.1701 15.2355 13.4688 15.9785 12.6563 16.6452C11.8438 17.3118 10.9583 17.8743 10 18.3327ZM11.6667 15.291C12.6528 14.4577 13.4549 13.482 14.0729 12.3639C14.691 11.2459 15 10.041 15 8.74935C15 7.23546 14.4757 5.95421 13.4271 4.9056C12.3785 3.85699 11.0972 3.33268 9.58333 3.33268C8.06944 3.33268 6.78819 3.85699 5.73958 4.9056C4.69097 5.95421 4.16667 7.23546 4.16667 8.74935C4.16667 10.2632 4.69097 11.5445 5.73958 12.5931C6.78819 13.6417 8.06944 14.166 9.58333 14.166H11.6667V15.291ZM9.5625 13.3118C9.79861 13.3118 10 13.2285 10.1667 13.0618C10.3333 12.8952 10.4167 12.6938 10.4167 12.4577C10.4167 12.2216 10.3333 12.0202 10.1667 11.8535C10 11.6868 9.79861 11.6035 9.5625 11.6035C9.32639 11.6035 9.125 11.6868 8.95833 11.8535C8.79167 12.0202 8.70833 12.2216 8.70833 12.4577C8.70833 12.6938 8.79167 12.8952 8.95833 13.0618C9.125 13.2285 9.32639 13.3118 9.5625 13.3118ZM8.95833 10.666H10.2083C10.2083 10.2493 10.25 9.95768 10.3333 9.79102C10.4167 9.62435 10.6806 9.31879 11.125 8.87435C11.375 8.62435 11.5833 8.35352 11.75 8.06185C11.9167 7.77018 12 7.45768 12 7.12435C12 6.41602 11.7604 5.88477 11.2813 5.5306C10.8021 5.17643 10.2361 4.99935 9.58333 4.99935C8.97222 4.99935 8.45833 5.16949 8.04167 5.50977C7.625 5.85004 7.33333 6.26324 7.16667 6.74935L8.33333 7.20768C8.40278 6.97157 8.53472 6.73893 8.72917 6.50977C8.92361 6.2806 9.20833 6.16602 9.58333 6.16602C9.95833 6.16602 10.2396 6.27018 10.4271 6.47852C10.6146 6.68685 10.7083 6.91602 10.7083 7.16602C10.7083 7.40213 10.6389 7.61393 10.5 7.80143C10.3611 7.98893 10.1944 8.1799 10 8.37435C9.51389 8.79102 9.21875 9.12088 9.11458 9.36393C9.01042 9.60699 8.95833 10.041 8.95833 10.666Z" fill="white"></path></g></svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
BIN
helmfile/files/theme/portal/favicon.ico
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
helmfile/files/theme/portal/favicon.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
5
helmfile/files/theme/portal/favicon.svg
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg width="111" height="111" viewBox="0 0 111 111" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="0.5" y="0.5" width="110" height="110" rx="20" fill="white"/>
|
||||
<path d="M68.6778 80.1145V81.6565C68.6778 88.1647 63.4498 93.4567 57.0203 93.4567H29.6574C23.2279 93.4567 17.9999 88.1647 17.9999 81.6565V53.9586C17.9999 47.4503 23.2279 42.1583 29.6574 42.1583H31.1807V80.1218H68.6849L68.6778 80.1145Z" fill="#8E75FA"/>
|
||||
<path d="M69.1856 70.877H40.2993V38.553C40.2993 27.5202 49.1676 18.5433 60.067 18.5433H69.1927C81.7656 18.5433 91.9999 28.9029 91.9999 41.6298V47.7833C91.9999 60.5102 81.7656 70.8697 69.1927 70.8697L69.1856 70.877ZM53.473 57.5348H69.1856C74.4922 57.5348 78.8119 53.1622 78.8119 47.7905V41.637C78.8119 36.2654 74.4922 31.8928 69.1856 31.8928H60.0598C56.4267 31.8928 53.473 34.8827 53.473 38.5603V57.542V57.5348Z" fill="#571EFA"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 859 B |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -97,19 +97,6 @@
|
||||
--login-logo: url("/static-files/login/logo.svg") no-repeat center;
|
||||
}
|
||||
|
||||
button {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
button.button--primary {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Speed of flyout mennu */
|
||||
.flyout-wrapper, .flyout-wrapper--isVisible {
|
||||
transition: transform .5s cubic-bezier(0,0,.2,1);
|
||||
}
|
||||
|
||||
/* Keycloak user screens begin */
|
||||
#kc-login,
|
||||
#kc-logout,
|
||||
@@ -505,174 +492,4 @@ textarea {
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* openDesk customization for nubus-frontend below */
|
||||
|
||||
.portal-quick-draft {
|
||||
background-color: var(--color-accent);
|
||||
color: #fff;
|
||||
border: 1px solid #d3d7de;
|
||||
}
|
||||
|
||||
.portal-quick-draft__img {
|
||||
filter: grayscale(1) invert(1);
|
||||
}
|
||||
|
||||
.portal-quick-draft:hover,
|
||||
.portal-quick-draft__toggle:hover {
|
||||
background-color: #4519c2;
|
||||
}
|
||||
|
||||
.portal-quick-draft:focus-within {
|
||||
box-shadow: 0px 0px 0px 3px #c8b9fd;
|
||||
}
|
||||
|
||||
.portal-quick-draft--open:focus-within {
|
||||
box-shadow: unset;
|
||||
}
|
||||
|
||||
.portal-quick-draft__toggle:focus {
|
||||
border-color: var(--color-focus);
|
||||
}
|
||||
|
||||
.portal-quick-draft--open,
|
||||
.portal-quick-draft--open:hover,
|
||||
.portal-quick-draft--open .portal-quick-draft__toggle:hover {
|
||||
background-color: #341291;
|
||||
}
|
||||
|
||||
.portal-quick-draft__item {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.portal-quick-draft__item:hover,
|
||||
.portal-quick-draft__item:focus-visible {
|
||||
color: hsla(0,0%,100%,.7);
|
||||
}
|
||||
|
||||
.portal-category__title {
|
||||
margin-bottom: calc(var(--layout-spacing-unit) * 2);
|
||||
font-size: var(--font-size-3);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.portal-category .portal-category__tiles {
|
||||
--app-tile-side-length: 5.5rem;
|
||||
--border-radius-apptile: var(--layout-spacing-unit);
|
||||
grid-gap: calc(var(--layout-spacing-unit) * 2.5) calc(var(--layout-spacing-unit) * 4.5);
|
||||
}
|
||||
|
||||
.portal-tile__box {
|
||||
box-shadow: none;
|
||||
border: 1px solid #d9d9d9;
|
||||
margin-bottom: calc(var(--layout-spacing-unit) * 1);
|
||||
}
|
||||
|
||||
.portal-tile__box--with-scaling-hover:hover {
|
||||
scale: 1;
|
||||
}
|
||||
|
||||
.portal-tile:hover .portal-tile__box {
|
||||
border-color: #99a1b2;
|
||||
}
|
||||
|
||||
.portal-tile:focus .portal-tile__box {
|
||||
border-color: #99a1b2;
|
||||
box-shadow: 0 0 0 3px #c8b9fd;
|
||||
}
|
||||
|
||||
.portal-corner__inner {
|
||||
background-color: #203257;
|
||||
}
|
||||
|
||||
.portal-corner__link {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.portal-corner__link:focus-visible,
|
||||
.portal-corner__link:hover {
|
||||
color: hsla(0, 0%, 100%, .7);
|
||||
outline: none;
|
||||
outline-offset: none;
|
||||
}
|
||||
|
||||
.portal-corner__item:after {
|
||||
color: hsla(0,0%,100%,.5);
|
||||
}
|
||||
|
||||
.newsfeed-meta__btn {
|
||||
border: 1px solid var(--bgc-announcements-info);
|
||||
color: var(--color-accent);
|
||||
background-color: var(--color-opendesk-white);
|
||||
}
|
||||
|
||||
.newsfeed-meta__btn:focus,
|
||||
.newsfeed-meta__btn:hover {
|
||||
border-color: var(--newsfeed-link-hover-color);
|
||||
}
|
||||
|
||||
#header-button-menu {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.portal-header__right .header-button[data-test=searchbutton] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.portal-sidebar__flyout {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.portal-sidenavigation__login-header {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.portal-sidenavigation__login-header + .divider {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.portal-sidenavigation__user-row {
|
||||
display: block;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.portal-sidenavigation__user-text-content {
|
||||
display: block;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.portal-sidenavigation--username {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.portal-sidenavigation__logout-link {
|
||||
padding: 1em 0 1em 20px;
|
||||
cursor: pointer;
|
||||
height: auto;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
font-size: var(--font-size-4);
|
||||
color: var(--font-color-contrast-high);
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
margin: 0;
|
||||
scale: 1;
|
||||
display: block;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.portal-sidenavigation__logout-link:hover {
|
||||
background-color: #f5f5f5;
|
||||
transition: all var(--portal-transition-duration);
|
||||
}
|
||||
|
||||
.portal-category__title::before {
|
||||
display: block;
|
||||
content: "";
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0ibm9uZSIgeG1sbnM6dj0iaHR0cHM6Ly92ZWN0YS5pby9uYW5vIj48cGF0aCBkPSJNNS45MzggNC42ODhhMS4yNSAxLjI1IDAgMCAxLS43NzIgMS4xNTUgMS4yNSAxLjI1IDAgMCAxLTEuMzYyLS4yNzEgMS4yNSAxLjI1IDAgMCAxLS4yNzEtMS4zNjIgMS4yNSAxLjI1IDAgMCAxIDEuMTU1LS43NzIgMS4yNSAxLjI1IDAgMCAxIDEuMjUgMS4yNXpNMTAgMy40MzhhMS4yNSAxLjI1IDAgMCAwLTEuMTU1Ljc3MiAxLjI1IDEuMjUgMCAwIDAgLjI3MSAxLjM2MiAxLjI1IDEuMjUgMCAwIDAgMS4zNjIuMjcxIDEuMjUgMS4yNSAwIDAgMCAuNzcyLTEuMTU1QTEuMjUgMS4yNSAwIDAgMCAxMCAzLjQzOHptNS4zMTMgMi41YTEuMjUgMS4yNSAwIDAgMCAxLjE1NS0uNzcyIDEuMjUgMS4yNSAwIDAgMC0uMjcxLTEuMzYyIDEuMjUgMS4yNSAwIDAgMC0xLjM2Mi0uMjcxIDEuMjUgMS4yNSAwIDAgMC0uNzcyIDEuMTU1IDEuMjUgMS4yNSAwIDAgMCAxLjI1IDEuMjV6TTQuNjg4IDguNzVhMS4yNSAxLjI1IDAgMCAwLTEuMTU1Ljc3MiAxLjI1IDEuMjUgMCAwIDAgLjI3MSAxLjM2MiAxLjI1IDEuMjUgMCAwIDAgMS4zNjIuMjcxQTEuMjUgMS4yNSAwIDAgMCA1LjkzOCAxMGExLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1em01LjMxMyAwYTEuMjUgMS4yNSAwIDAgMC0xLjE1NS43NzIgMS4yNSAxLjI1IDAgMCAwIC4yNzEgMS4zNjIgMS4yNSAxLjI1IDAgMCAwIDEuMzYyLjI3MUExLjI1IDEuMjUgMCAwIDAgMTEuMjUgMTAgMS4yNSAxLjI1IDAgMCAwIDEwIDguNzV6bTUuMzEzIDBhMS4yNSAxLjI1IDAgMCAwLTEuMTU1Ljc3MiAxLjI1IDEuMjUgMCAwIDAgLjI3MSAxLjM2MiAxLjI1IDEuMjUgMCAwIDAgMS4zNjIuMjcxQTEuMjUgMS4yNSAwIDAgMCAxNi41NjMgMTBhMS4yNSAxLjI1IDAgMCAwLTEuMjUtMS4yNXpNNC42ODggMTQuMDYzYTEuMjUgMS4yNSAwIDAgMC0xLjE1NS43NzIgMS4yNSAxLjI1IDAgMCAwIC4yNzEgMS4zNjIgMS4yNSAxLjI1IDAgMCAwIDEuMzYyLjI3MSAxLjI1IDEuMjUgMCAwIDAgLjc3Mi0xLjE1NSAxLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1em01LjMxMyAwYTEuMjUgMS4yNSAwIDAgMC0xLjE1NS43NzIgMS4yNSAxLjI1IDAgMCAwIC4yNzEgMS4zNjIgMS4yNSAxLjI1IDAgMCAwIDEuMzYyLjI3MSAxLjI1IDEuMjUgMCAwIDAgLjc3Mi0xLjE1NSAxLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1em01LjMxMyAwYTEuMjUgMS4yNSAwIDAgMC0xLjE1NS43NzIgMS4yNSAxLjI1IDAgMCAwIC4yNzEgMS4zNjIgMS4yNSAxLjI1IDAgMCAwIDEuMzYyLjI3MSAxLjI1IDEuMjUgMCAwIDAgLjc3Mi0xLjE1NSAxLjI1IDEuMjUgMCAwIDAtMS4yNS0xLjI1eiIgZmlsbD0iIzAwMCIvPjwvc3ZnPg==');
|
||||
}
|
||||