mirror of
https://gitlab.opencode.de/bmi/opendesk/deployment/opendesk.git
synced 2025-12-06 15:31:38 +01:00
Compare commits
6 Commits
v1.8.0
...
nic/feat/Z
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8fbd3d4e1 | ||
|
|
ae9de0a83e | ||
|
|
306c4e295d | ||
|
|
97cb914f18 | ||
|
|
0c92d1681c | ||
|
|
f6aeffb189 |
@@ -29,7 +29,7 @@ include:
|
|||||||
rules:
|
rules:
|
||||||
- if: >
|
- if: >
|
||||||
$JOB_OPENDESK_LINTER_ENABLED == 'false' ||
|
$JOB_OPENDESK_LINTER_ENABLED == 'false' ||
|
||||||
$CI_PIPELINE_SOURCE =~ 'tags|merge_request_event|web|trigger|api|schedules'
|
$CI_PIPELINE_SOURCE =~ 'tags|merge_request_event|web|trigger|api'
|
||||||
when: "never"
|
when: "never"
|
||||||
- when: "always"
|
- when: "always"
|
||||||
|
|
||||||
|
|||||||
@@ -433,6 +433,10 @@ In openDesk, OX App Suite is used for email, calendar, address book and personal
|
|||||||
|
|
||||||
[XWiki](https://www.xwiki.org) is an open-source wiki platform for knowledge management and collaboration.
|
[XWiki](https://www.xwiki.org) is an open-source wiki platform for knowledge management and collaboration.
|
||||||
|
|
||||||
|
## Jitsi Phone Dial-in
|
||||||
|
|
||||||
|
[Dial-in architecture notes](phone-dial-in/notes.md) describes the infrastructure to integrate an ability to participate in Jitsi calls.
|
||||||
|
|
||||||
# Application specific user accounts
|
# Application specific user accounts
|
||||||
|
|
||||||
While the IAM managed users centrally, some applications come with local accounts for administrative purposes.
|
While the IAM managed users centrally, some applications come with local accounts for administrative purposes.
|
||||||
|
|||||||
BIN
docs/phone-dial-in/architcture.drawio.png
Normal file
BIN
docs/phone-dial-in/architcture.drawio.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 207 KiB |
200
docs/phone-dial-in/notes.md
Normal file
200
docs/phone-dial-in/notes.md
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
# Phone dial in
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Dial-in related jitsi configs
|
||||||
|
|
||||||
|
https://gitlab.opencode.de/bmi/opendesk/components/platform-development/charts/opendesk-jitsi/-/blob/main/charts/opendesk-jitsi/values.yaml?ref_type=heads#L226-230
|
||||||
|
|
||||||
|
`values.yaml`
|
||||||
|
```yaml
|
||||||
|
extraConfig:
|
||||||
|
doNotStoreRoom: false
|
||||||
|
dialinCountryCode: "DE"
|
||||||
|
# e.g. "+49 1111 22233344"
|
||||||
|
dialinPhoneNumbers: ""
|
||||||
|
extraEnvs:
|
||||||
|
COLIBRI_WEBSOCKET_REGEX: "[a-z0-9._-]+"
|
||||||
|
# This value will be replace with internal conference mapper later when
|
||||||
|
# it is ready.
|
||||||
|
CONFCODE_URL: "https://jitsi-api.jitsi.net/conferenceMapper"
|
||||||
|
DIALIN_NUMBERS_URL: "/static/dialin-phone-numbers.json"
|
||||||
|
```
|
||||||
|
|
||||||
|
The template to generate the `dial-phone-numbers.json`
|
||||||
|
https://gitlab.opencode.de/bmi/opendesk/components/platform-development/charts/opendesk-jitsi/-/blob/main/charts/opendesk-jitsi/files/web/dialin-phone-numbers.json?ref_type=heads
|
||||||
|
|
||||||
|
|
||||||
|
### Frontend and the k8s NGINX ingress
|
||||||
|
|
||||||
|
The frontend uses large cookies, the default "4k" for the nginx proxy is not enough.
|
||||||
|
|
||||||
|
Modify the value in the ingress annotations
|
||||||
|
```
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/proxy-buffer-size: "8k"
|
||||||
|
```
|
||||||
|
|
||||||
|
Reference https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md#proxy-buffer-size
|
||||||
|
|
||||||
|
|
||||||
|
## 1. ovc-frontent -> opendesk
|
||||||
|
|
||||||
|
ovc-frontend env
|
||||||
|
```properties
|
||||||
|
NEXT_PUBLIC_ICS_DOMAIN=https://ics.nightly.opendesk.qa
|
||||||
|
NEXT_PUBLIC_PORTAL_DOMAIN=https://portal.nightly.opendesk.qa
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. ovc-frontend -> jitsi
|
||||||
|
|
||||||
|
ovc-frontend env
|
||||||
|
```properties
|
||||||
|
NEXT_PUBLIC_JITSI_LINK=https://jitsi.opendesk.qa
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. ovc-frontend -> keycloak
|
||||||
|
|
||||||
|
[NEXTAUTH_SECRET](https://next-auth.js.org/configuration/options#nextauth_secret)
|
||||||
|
|
||||||
|
client_id and client_secret provided by keycloak.
|
||||||
|
end_session and refresh urls can be found in keycloak `keycloak.com/realms/{realm}/.well-known` page.
|
||||||
|
|
||||||
|
|
||||||
|
ovc-frontend env
|
||||||
|
```properties
|
||||||
|
KEYCLOAK_CLIENT_ID=ovc-client
|
||||||
|
KEYCLOAK_CLIENT_SECRET=clientSecret
|
||||||
|
NEXTAUTH_SECRET=clientSecret
|
||||||
|
KEYCLOAK_ISSUER=https://KEYCLOAK.io/realms/opendesk
|
||||||
|
END_SESSION_URL=https://KEYCLOAK.io/realms/opendesk/protocol/openid-connect/logout
|
||||||
|
REFRESH_TOKEN_URL=https://KEYCLOAK.io/realms/opendesk/protocol/openid-connect/token
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. ovc-frontend -> ovc-backend
|
||||||
|
|
||||||
|
ovc-frontend env
|
||||||
|
```properties
|
||||||
|
NEXT_PUBLIC_BACKEND_BASE_URL=https://api.opendesk.qa
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. ovc-frontend <-> ovc-videotest
|
||||||
|
|
||||||
|
OPTIONAL, can be disabled and th videotest button will be hidden.
|
||||||
|
|
||||||
|
ovc-frontend env
|
||||||
|
```properties
|
||||||
|
NEXT_PUBLIC_VIDEO_TEST_ENABLED=true
|
||||||
|
NEXT_PUBLIC_VIDEO_TEST_LINK=https://videotest.opendesk.qa
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 6. ovc-backend -> postgres
|
||||||
|
|
||||||
|
backend env vars
|
||||||
|
```
|
||||||
|
spring.datasource.password=secret
|
||||||
|
spring.datasource.url=jdbc:postgresql://{{ $dbService }}:5432/{{ db.name }}
|
||||||
|
spring.datasource.username=user
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. ovc-backend -> keycloak
|
||||||
|
|
||||||
|
```
|
||||||
|
spring.security.oauth2.resourceserver.jwt.issuer-uri={{ .Values.settings.keycloak.url }}/realms/{{ .Values.settings.keycloak.realm }}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. JITSI -> ovc-backend
|
||||||
|
|
||||||
|
#### Conference mapper for dial-in
|
||||||
|
|
||||||
|
|
||||||
|
Phone line users that use a regular phone to attend a jitsi meeting can only enter numbers after they have dialed in a phone number. For Jitsi and the SIP server to know which conference they are calling into a mapping is created `conference name <-> pin number (conference code)`. A conference mapper api allows an external system to find a conference name by pin number or a pin number from a conference name.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Jitsi uses `CONFCODE_URL` env param that "conference mapper" conference search api, it will use the `search pin by conference` functionality to present a dialog with a PIN number if a dial-in user wishes to know it.
|
||||||
|
|
||||||
|
In the dial-in backend the endpoint has this template
|
||||||
|
`/api/v1.0/conference-mapper/jigasi/by-meeting-id?conference=`
|
||||||
|
|
||||||
|
jitsi-meet configuration environment can be set like this
|
||||||
|
```
|
||||||
|
CONFCODE_URL=https://backend.domain/api/v1.0/conference-mapper/jigasi/by-meeting-id
|
||||||
|
```
|
||||||
|
|
||||||
|
SIP server may use a `search conference id by pin` functionality api from the dial-in backend conference mapper.
|
||||||
|
`/api/v1.0/conference-mapper/jigasi/by-pin?id={pin}`
|
||||||
|
|
||||||
|
|
||||||
|
> The way a SIP server communicates with the dial-in backend conference mapper and JIGASI (Jitsi component) depends on the SIP server vendor, this is outside the scope of this document.
|
||||||
|
|
||||||
|
|
||||||
|
Jitsi implementation of the conference mapper API is described in
|
||||||
|
https://github.com/jitsi/jitsi-meet/blob/master/resources/cloud-api.swagger
|
||||||
|
They support a `/conferenceMapper` api endpoint that can search by `id` (pin) or `conference`. So both Jitsi and the SIP server can connect to a sigle endpoint. In the ovc-backend it's separated into 2 endpoints.
|
||||||
|
|
||||||
|
|
||||||
|
## ovc-backend SIP config
|
||||||
|
|
||||||
|
Used in "Copy Info" button functionality.
|
||||||
|
```properties
|
||||||
|
sip.phone.number=+49 40 3003 5005
|
||||||
|
```
|
||||||
|
|
||||||
|
## ovc-backend JWT token api
|
||||||
|
|
||||||
|
OPTIONAL, may be needed if jitsi requires a JWT token.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
## this is part of Spring Boot application.yaml, can also be provided as env vars
|
||||||
|
jitsi:
|
||||||
|
domain: https://jitsi.opendesk.domain
|
||||||
|
jwt:
|
||||||
|
secret: oeRaYY7
|
||||||
|
expiration-in-minutes: 60 # how much longer after meeting end time the token is valid
|
||||||
|
expiration-for-rooms-in-minutes: 180 # same as above, but for rooms and instant meetings
|
||||||
|
not-before-in-minutes: 30 # how many minutes earlier the meeting can be opened
|
||||||
|
```
|
||||||
|
|
||||||
|
## ovc-videotest
|
||||||
|
|
||||||
|
Optional component, phone dial-in can function without it.
|
||||||
|
|
||||||
|
It's a frontend only and doesn't require a backend to function. Configured by mounting a file in `/app/build/config/config.js`
|
||||||
|
|
||||||
|
`config.js` example
|
||||||
|
```js
|
||||||
|
window.customConfig = {
|
||||||
|
// jitsi host
|
||||||
|
"REACT_APP_JITSI_FQDN": "meet.jit.si",
|
||||||
|
|
||||||
|
// If jitsi requires a JWT, point it to a running ovc-videotest-backend api that
|
||||||
|
// will return a token for a specific room. {roomName} is a special hardcoded placeholder that will be replaced by the real room name when the api is being called (to make the api call flexible).
|
||||||
|
// "REACT_APP_JWT_ENDPOINT_URL": "http://localhost:8081/{roomName}",
|
||||||
|
|
||||||
|
// prefix for videotest rooms. If a backend is used it may reject generating a JWT token if a room name doesn't have this prefix
|
||||||
|
"REACT_APP_ROOM_PREFIX":"videotest",
|
||||||
|
|
||||||
|
// if no callback parameter is provided, should be the ovc-frontend url
|
||||||
|
"REACT_APP_DEFAULT_CALLBACK_URL":"http://localhost:8080",
|
||||||
|
|
||||||
|
// to improve security only URLS in the list are allowed as callbacks
|
||||||
|
// if the list is empty any callback url is allowed
|
||||||
|
"REACT_APP_ALLOWED_CALLBACK_URLS":"http://localhost:3000,https://localhost:3000",
|
||||||
|
|
||||||
|
// If you don't have a backend and jitsi requires a JWT token, for debugging purposes put the entire JWT here.
|
||||||
|
"REACT_APP_DEBUG_JITSI_JWT": ""
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -25,6 +25,7 @@ controller:
|
|||||||
image:
|
image:
|
||||||
repository: "{{ coalesce .Values.repositories.image.registryOpencodeDeEnterprise .Values.global.imageRegistry .Values.images.collaboraController.registry }}/{{ .Values.images.collaboraController.repository }}"
|
repository: "{{ coalesce .Values.repositories.image.registryOpencodeDeEnterprise .Values.global.imageRegistry .Values.images.collaboraController.registry }}/{{ .Values.images.collaboraController.repository }}"
|
||||||
tag: {{ .Values.images.collaboraController.tag | quote }}
|
tag: {{ .Values.images.collaboraController.tag | quote }}
|
||||||
|
pullPolicy: {{ .Values.global.imagePullPolicy | quote }}
|
||||||
imagePullSecrets:
|
imagePullSecrets:
|
||||||
{{- range .Values.global.imagePullSecrets }}
|
{{- range .Values.global.imagePullSecrets }}
|
||||||
- name: {{ . | quote }}
|
- name: {{ . | quote }}
|
||||||
@@ -38,6 +39,10 @@ ingress:
|
|||||||
paths:
|
paths:
|
||||||
- path: "/controller"
|
- path: "/controller"
|
||||||
pathType: "Prefix"
|
pathType: "Prefix"
|
||||||
|
tls:
|
||||||
|
- secretName: {{ .Values.ingress.tls.secretName | quote }}
|
||||||
|
hosts:
|
||||||
|
- "{{ .Values.global.hosts.collabora }}.{{ .Values.global.domain }}"
|
||||||
|
|
||||||
podAnnotations: {}
|
podAnnotations: {}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ charts:
|
|||||||
registry: "registry.opencode.de"
|
registry: "registry.opencode.de"
|
||||||
repository: "zendis/opendesk-enterprise/components/product-development/charts/opendesk-dovecot-pro"
|
repository: "zendis/opendesk-enterprise/components/product-development/charts/opendesk-dovecot-pro"
|
||||||
name: "dovecot"
|
name: "dovecot"
|
||||||
version: "2.0.1"
|
version: "2.0.2"
|
||||||
verify: true
|
verify: true
|
||||||
oxAppSuite:
|
oxAppSuite:
|
||||||
registry: "registry.opencode.de"
|
registry: "registry.opencode.de"
|
||||||
|
|||||||
@@ -517,6 +517,6 @@ charts:
|
|||||||
registry: "registry.opencode.de"
|
registry: "registry.opencode.de"
|
||||||
repository: "bmi/opendesk/components/supplier/xwiki/charts-mirror"
|
repository: "bmi/opendesk/components/supplier/xwiki/charts-mirror"
|
||||||
name: "xwiki"
|
name: "xwiki"
|
||||||
version: "1.4.3"
|
version: "1.4.4"
|
||||||
verify: false
|
verify: false
|
||||||
...
|
...
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ repositories:
|
|||||||
image:
|
image:
|
||||||
dockerHub: ""
|
dockerHub: ""
|
||||||
registryOpencodeDe: ""
|
registryOpencodeDe: ""
|
||||||
registryOpencodeDeEnterprise: "registry.opencode.de"
|
registryOpencodeDeEnterprise: ""
|
||||||
# Fine-granular registry settings, useful when you can't use virtual (Artifactory) or group (Nexus) repositories.
|
# Fine-granular registry settings, useful when you can't use virtual (Artifactory) or group (Nexus) repositories.
|
||||||
# Higher precedence than `global.imageRegistry`
|
# Higher precedence than `global.imageRegistry`
|
||||||
helm:
|
helm:
|
||||||
|
|||||||
@@ -36,9 +36,6 @@ secrets:
|
|||||||
ox: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_ox" | sha1sum | quote }}
|
ox: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_ox" | sha1sum | quote }}
|
||||||
openproject: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_openproject" | 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 }}
|
xwiki: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "ldapsearch_xwiki" | sha1sum | quote }}
|
||||||
defaultAccounts:
|
|
||||||
userPassword: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "default_accounts_user_password" | sha1sum | quote }}
|
|
||||||
adminPassword: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "default_accounts_user_admin" | sha1sum | quote }}
|
|
||||||
systemAccounts:
|
systemAccounts:
|
||||||
administratorPassword: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "Administrator" | sha1sum | quote }}
|
administratorPassword: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "Administrator" | sha1sum | quote }}
|
||||||
sysIdpUserPassword: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "sysIdpUser" | sha1sum | quote }}
|
sysIdpUserPassword: {{ derivePassword 1 "long" (env "MASTER_PASSWORD" | default "sovereign-workplace") "nubus" "sysIdpUser" | sha1sum | quote }}
|
||||||
|
|||||||
Reference in New Issue
Block a user