Skip to content

Commit 6c610fe

Browse files
authored
✨(openproject) Add OpenProject (MinBZK#96)
Add OpenProject integration to mijn-bureau infrastructure
1 parent cacd4db commit 6c610fe

17 files changed

+312
-3
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ MijnBureau already offers a rich set of features, with a strong focus on collabo
4444
- Team chat
4545
- Self-hosted AI language models
4646
- Integrated identity management
47+
- Project management
4748

4849
We are actively expanding the suite and plan to add even more capabilities, including:
4950

@@ -91,6 +92,7 @@ It currently includes the following open-source components
9192
| File sharing | Nextcloud | [v32.0.1](https://github.com/nextcloud/server/tree/v32.0.1) | [documentation](https://nextcloud.com/) | AGPL-3.0 |
9293
| AI LLM | Ollama | [v0.12.9](https://github.com/ollama/ollama/tree/v0.12.9) | [documentation](https://ollama.com/) | MIT |
9394
| Spreadsheet | Grist | [v1.7.5](https://github.com/gristlabs/grist-core/tree/v1.7.5) | [documentation](https://support.getgrist.com/self-managed/) | Apache-2.0 |
95+
| Project Management | OpenProject | [16.6.0](https://github.com/opf/openproject/releases/tag/v16.6.0). | [documentation](https://www.openproject.org/docs/) | GPL-3.0 |
9496
| Office | Collabora | [v25.04.6.2.1](https://github.com/CollaboraOnline/online/releases/tag/cp-25.04.6-1) | [documentation](https://sdk.collaboraonline.com/docs/installation/index.html) | MPL-2.0 |
9597
| Notes | Docs | [v3.8.21](https://github.com/suitenumerique/docs/releases/tag/v3.8.21) | [documentation](https://github.com/suitenumerique/docs/tree/main/docs/installation) | MIT |
9698
| Video backend | Livekit | [v1.9.3](https://github.com/livekit/livekit/releases/tag/v1.9.3) | [documentation](https://livekit.io/) | Apache-2.0 |
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
sidebar_position: 10
3+
---
4+
5+
# OpenProject
6+
7+
Project management system for MijnBureau.
8+
9+
## Quick Start
10+
11+
```bash
12+
# Deploy OpenProject
13+
export MIJNBUREAU_MASTER_PASSWORD="demo-password"
14+
export MIJNBUREAU_CREATE_NAMESPACES=true
15+
helmfile -e demo -l name=openproject apply
16+
```
17+
18+
## Access
19+
20+
- **URL**: `http://openproject.mb.test/`
21+
- **Login**: `admin@example.com` / `admin123`
22+
23+
## Features
24+
25+
- Project planning with Gantt charts
26+
- Task management and time tracking
27+
- Team collaboration and file sharing
28+
- Project reporting and analytics
29+
30+
## Troubleshooting
31+
32+
```bash
33+
# Check status
34+
kubectl get pods -n mijn-bureau | grep openproject
35+
36+
# Check logs
37+
kubectl logs -n mijn-bureau -l app.kubernetes.io/name=openproject
38+
39+
# Restart if needed
40+
kubectl rollout restart deployment/openproject-web -n mijn-bureau
41+
```

docs/docs/features/openproject.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Project Management
2+
3+
Project management with OpenProject: Gantt charts, task tracking, and team collaboration.
4+
5+
---

helmfile.yaml.gotmpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ helmfiles:
3535
values: *appvalues
3636
- path: "helmfile/apps/nextcloud/helmfile-child.yaml.gotmpl"
3737
values: *appvalues
38+
- path: "helmfile/apps/openproject/helmfile-child.yaml.gotmpl"
39+
values: *appvalues
3840
- path: "helmfile/apps/livekit/helmfile-child.yaml.gotmpl"
3941
values: *appvalues
4042
- path: "helmfile/apps/conversations/helmfile-child.yaml.gotmpl"
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# OpenProject Application
2+
3+
OpenProject is a web-based project management system for MijnBureau infrastructure.
4+
5+
## Quick Start
6+
7+
### Demo Environment
8+
9+
```bash
10+
# Deploy OpenProject
11+
helmfile -e demo -l name=openproject apply
12+
13+
# Access: http://openproject.mb.test/
14+
# Login: admin@example.com / admin123
15+
```
16+
17+
### Production Environment
18+
19+
```bash
20+
# Deploy OpenProject
21+
helmfile -e production -l name=openproject apply
22+
23+
# Access: https://openproject.yourdomain.com/
24+
# Authentication: OIDC/SSO via Keycloak
25+
```
26+
27+
## Configuration
28+
29+
### Environment Variables
30+
31+
```bash
32+
export MIJNBUREAU_MASTER_PASSWORD="your-secure-password"
33+
export MIJNBUREAU_CREATE_NAMESPACES=true
34+
```
35+
36+
### Key Settings
37+
38+
| Environment | Database | TLS | SMTP | Resources |
39+
| ----------- | ------------------- | -------- | -------- | ----------- |
40+
| Demo | Bundled PostgreSQL | Disabled | Disabled | 4 CPU / 4Gi |
41+
| Production | External PostgreSQL | Enabled | Enabled | 8 CPU / 8Gi |
42+
43+
## Files
44+
45+
- `values.yaml.gotmpl` - Main OpenProject configuration
46+
- `helmfile-child.yaml.gotmpl` - Helmfile deployment configuration
47+
48+
## Troubleshooting
49+
50+
```bash
51+
# Check pod status
52+
kubectl get pods -n mijn-bureau | grep openproject
53+
54+
# Check logs
55+
kubectl logs -n mijn-bureau -l app.kubernetes.io/name=openproject
56+
```
57+
58+
## Documentation
59+
60+
- [OpenProject Official Docs](https://www.openproject.org/docs/)
61+
- [OpenProject Helm Chart](https://github.com/opf/helm-charts)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
bases:
2+
- "../../bases/default.yaml.gotmpl"
3+
4+
repositories:
5+
- name: openproject
6+
url: https://charts.openproject.org
7+
8+
releases:
9+
- name: openproject
10+
chart: openproject/openproject
11+
version: "11.3.3"
12+
condition: application.openproject.enabled
13+
namespace: {{ .Values.application.openproject.namespace }}
14+
values:
15+
- "values.yaml.gotmpl"
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
# OpenProject Configuration
2+
# Production-ready configuration with demo optimizations
3+
4+
global:
5+
security:
6+
allowInsecureImages: false
7+
8+
imagePullSecrets:
9+
- name: {{ (coalesce .Values.container.openproject.imagePullSecret .Values.container.default.imagePullSecret) | quote }}
10+
11+
image:
12+
registry: {{ (coalesce .Values.container.openproject.registry .Values.container.default.registry) | quote }}
13+
repository: {{ .Values.container.openproject.repository | quote }}
14+
tag: {{ .Values.container.openproject.tag | quote }}
15+
16+
openproject:
17+
https: {{ .Values.openproject.ingress.tls | default true }}
18+
admin_user:
19+
password: {{ .Values.openproject.admin_user.password | quote }}
20+
password_reset: {{ .Values.openproject.admin_user.password_reset | default true }}
21+
name: {{ .Values.openproject.admin_user.name | quote }}
22+
mail: {{ .Values.openproject.admin_user.mail | quote }}
23+
seed_locale: {{ .Values.openproject.seed_locale | default "en" }}
24+
useTmpVolumes: {{ .Values.openproject.useTmpVolumes | default false }}
25+
26+
ingress:
27+
enabled: true
28+
host: {{ .Values.global.hostname.openproject }}.{{ .Values.global.domain }}
29+
ingressClassName: {{ .Values.cluster.ingress.className | quote }}
30+
tls:
31+
enabled: {{ .Values.global.tls.enabled | default true }}
32+
secretName: {{ .Values.openproject.ingress.secretName | default "openproject-tls" }}
33+
annotations:
34+
{{- if .Values.cluster.ingress.annotations }}
35+
{{ .Values.cluster.ingress.annotations | toYaml | nindent 4 }}
36+
{{- end }}
37+
{{- if eq .Values.cluster.ingress.type "nginx" }}
38+
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
39+
{{- end }}
40+
41+
# PostgreSQL configuration
42+
postgresql:
43+
bundled: {{ eq .Environment.Name "demo" }}
44+
image:
45+
registry: "registry-1.docker.io"
46+
repository: "bitnamilegacy/postgresql"
47+
tag: "17-debian-12"
48+
auth:
49+
postgresPassword: {{ .Values.secret.openproject.postgresPassword | quote }}
50+
username: "openproject"
51+
password: {{ .Values.secret.openproject.postgresPassword | quote }}
52+
database: "openproject"
53+
connection:
54+
host: {{ .Values.database.openproject.host }}
55+
port: {{ .Values.database.openproject.port }}
56+
database: {{ .Values.database.openproject.name }}
57+
username: {{ .Values.database.openproject.user }}
58+
password: {{ .Values.database.openproject.password }}
59+
60+
# Cache configuration
61+
# Use memcached for demo, Redis for production
62+
memcached:
63+
bundled: {{ eq .Environment.Name "demo" }}
64+
image:
65+
repository: bitnami/memcached
66+
tag: "latest"
67+
68+
# OIDC configuration
69+
oidc:
70+
enabled: {{ .Values.authentication.oidc | default true }}
71+
provider:
72+
name: "Keycloak"
73+
host: {{ .Values.global.hostname.keycloak }}.{{ .Values.global.domain }}
74+
identifier: {{ .Values.authentication.client.openproject.client_id }}
75+
secret: {{ .Values.authentication.client.openproject.client_secret }}
76+
authorization_endpoint: "{{ .Values.authentication.oidc.authorization_endpoint }}"
77+
token_endpoint: "{{ .Values.authentication.oidc.token_endpoint }}"
78+
userinfo_endpoint: "{{ .Values.authentication.oidc.userinfo_endpoint }}"
79+
jwks_uri: "{{ .Values.authentication.oidc.jwks_endpoint }}"
80+
scope: ["openid", "profile", "email"]
81+
82+
# Init container resources
83+
appInit:
84+
resources:
85+
limits:
86+
memory: {{ .Values.openproject.appInit.resources.limits.memory | default "2Gi" | quote }}
87+
requests:
88+
memory: {{ .Values.openproject.appInit.resources.requests.memory | default "1Gi" | quote }}
89+
90+
dbInit:
91+
resources:
92+
limits:
93+
memory: {{ .Values.openproject.dbInit.resources.limits.memory | default "1Gi" | quote }}
94+
requests:
95+
memory: {{ .Values.openproject.dbInit.resources.requests.memory | default "512Mi" | quote }}
96+
97+
# Persistence configuration
98+
persistence:
99+
# main data volume (used by OpenProject for assets/uploads, etc.)
100+
enabled: {{ .Values.openproject.persistence.enabled | default true }}
101+
size: {{ .Values.openproject.persistence.size | default "8Gi" | quote }}
102+
accessModes:
103+
{{- if .Values.openproject.persistence.accessModes }}
104+
{{- range .Values.openproject.persistence.accessModes }}
105+
- {{ . | quote }}
106+
{{- end }}
107+
{{- else }}
108+
- "ReadWriteOnce"
109+
{{- end }}
110+
{{- if .Values.openproject.persistence.storageClass }}
111+
storageClass: {{ .Values.openproject.persistence.storageClass | quote }}
112+
{{- end }}
113+
114+
# control the optional separate assets PVC from the upstream chart
115+
assets:
116+
enabled: {{ ne .Environment.Name "demo" }}
117+
118+
# Security context configuration (optional)
119+
{{- if and .Values.openproject (hasKey .Values.openproject "securityContext") }}
120+
securityContext: {{ .Values.openproject.securityContext | toYaml | nindent 2 }}
121+
{{- end }}
122+
123+
{{- if and .Values.openproject (hasKey .Values.openproject "containerSecurityContext") }}
124+
containerSecurityContext: {{ .Values.openproject.containerSecurityContext | toYaml | nindent 2 }}
125+
{{- end }}
126+
127+
# Autoscaling configuration
128+
{{- if .Values.autoscaling.horizontal.openproject }}
129+
autoscaling:
130+
hpa: {{ .Values.autoscaling.horizontal.openproject | toYaml | nindent 4 }}
131+
{{- end }}

helmfile/environments/default/application.yaml.gotmpl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ application:
4646
enabled: true
4747
namespace: ~
4848

49+
# OpenProject is a web-based project management system
50+
openproject:
51+
enabled: true
52+
namespace: ~
53+
4954
# livekit is a video conferencing backend system
5055
livekit:
5156
enabled: true

helmfile/environments/default/authentication.yaml.gotmpl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ authentication:
3131
client_secret: {{ derivePassword 1 "long" ( requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "synapse_client_secret" | sha1sum | quote }}
3232
nextcloud:
3333
client_id: "nextcloud"
34-
client_secret: {{ derivePassword 1 "long" ( requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "nextcloud_client_secret" | sha1sum | quote }}
34+
client_secret: {{ derivePassword 1 "long" ( requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "nextcloud_client_secret" | sha1sum | quote}}
35+
openproject:
36+
client_id: "openproject"
37+
client_secret: {{ derivePassword 1 "long" ( requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "openproject_client_secret" | sha1sum | quote}}
3538
conversations:
3639
client_id: "conversations"
37-
client_secret: {{ derivePassword 1 "long" (requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "conversations_client_secret" | sha1sum | quote}}
40+
client_secret: {{ derivePassword 1 "long" ( requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "conversations_client_secret" | sha1sum | quote}}
3841
docs:
3942
client_id: "docs"
4043
client_secret: {{ derivePassword 1 "long" ( requiredEnv "MIJNBUREAU_MASTER_PASSWORD" ) "keycloak" "docs_client_secret" | sha1sum | quote }}

helmfile/environments/default/autoscaling.yaml.gotmpl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ autoscaling:
4242
maxReplicas: 3
4343
targetCPU: 75
4444
targetMemory: ""
45+
openproject:
46+
enabled: true
47+
minReplicas: 1
48+
maxReplicas: 3
49+
targetCPU: 75
50+
targetMemory: ""
4551
meet:
4652
enabled: true
4753
minReplicas: 1

0 commit comments

Comments
 (0)