Skip to content

Commit 38b185e

Browse files
authored
Merge pull request opf#18325 from opf/merge-release/15.4-20250317034137
Merge release/15.4 into dev
2 parents 693648c + 158e7c6 commit 38b185e

File tree

144 files changed

+1157
-457
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+1157
-457
lines changed

Gemfile

+3-3
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,6 @@ gemfiles.each do |file|
410410
send(:eval_gemfile, file) if File.readable?(file)
411411
end
412412

413-
gem "openproject-octicons", "~>19.21.0 "
414-
gem "openproject-octicons_helper", "~>19.21.0 "
415-
gem "openproject-primer_view_components", "~>0.56.0"
413+
gem "openproject-octicons", "~>19.22.3 "
414+
gem "openproject-octicons_helper", "~>19.22.3"
415+
gem "openproject-primer_view_components", "~>0.56.1"

Gemfile.lock

+10-10
Original file line numberDiff line numberDiff line change
@@ -851,12 +851,12 @@ GEM
851851
validate_email
852852
validate_url
853853
webfinger (~> 2.0)
854-
openproject-octicons (19.21.0)
855-
openproject-octicons_helper (19.21.0)
854+
openproject-octicons (19.22.3)
855+
openproject-octicons_helper (19.22.3)
856856
actionview
857-
openproject-octicons (= 19.21.0)
857+
openproject-octicons (= 19.22.3)
858858
railties
859-
openproject-primer_view_components (0.56.0)
859+
openproject-primer_view_components (0.56.1)
860860
actionview (>= 5.0.0)
861861
activesupport (>= 5.0.0)
862862
openproject-octicons (>= 19.20.0)
@@ -1384,10 +1384,10 @@ DEPENDENCIES
13841384
openproject-job_status!
13851385
openproject-ldap_groups!
13861386
openproject-meeting!
1387-
openproject-octicons (~> 19.21.0)
1388-
openproject-octicons_helper (~> 19.21.0)
1387+
openproject-octicons (~> 19.22.3)
1388+
openproject-octicons_helper (~> 19.22.3)
13891389
openproject-openid_connect!
1390-
openproject-primer_view_components (~> 0.56.0)
1390+
openproject-primer_view_components (~> 0.56.1)
13911391
openproject-recaptcha!
13921392
openproject-reporting!
13931393
openproject-storages!
@@ -1749,10 +1749,10 @@ CHECKSUMS
17491749
openproject-job_status (1.0.0)
17501750
openproject-ldap_groups (1.0.0)
17511751
openproject-meeting (1.0.0)
1752-
openproject-octicons (19.21.0) sha256=8eccc93943f37589ebdb531e1b9ad9cfd344e84c102bd3d422b45ab5c390e2ae
1753-
openproject-octicons_helper (19.21.0) sha256=7dea0e4a3fb45f71f087e2dab518aa2f9914fcde193baf7ab200450b14bdb474
1752+
openproject-octicons (19.22.3) sha256=f7f83b00b9fa31cdaeadf89fa602add8d5db902b1db03c15bbeb400ed5bb938b
1753+
openproject-octicons_helper (19.22.3) sha256=6c1eef13f28816b127d88df99ae950d36ae56261fc7c5b2d0810a60d060c21c4
17541754
openproject-openid_connect (1.0.0)
1755-
openproject-primer_view_components (0.56.0) sha256=a54603c33cb154bdbe6f24e8cbad9ce99a4f12be6f5526196bb5df73bb68eb1e
1755+
openproject-primer_view_components (0.56.1) sha256=34e10a2ed6b852961ca92c51b73b33c15ecfe8b70f45a1fda620673728b12c5d
17561756
openproject-recaptcha (1.0.0)
17571757
openproject-reporting (1.0.0)
17581758
openproject-storages (1.0.0)

app/components/work_package_relations_tab/relation_component.html.erb

+1-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@
5757
color: :default,
5858
underline: false,
5959
font_size: :normal,
60-
font_weight: :bold,
61-
target: "_blank"
60+
font_weight: :bold
6261
)
6362
) { related_work_package.subject }
6463
end

app/components/work_package_relations_tab/work_package_relation_form_component.rb

+1-3
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ def related_work_package
5757
def displayable_field_value
5858
return nil if related_work_package.nil?
5959

60-
if relation_to_matches_wp?
61-
"#{related_work_package.type.name.upcase} ##{related_work_package.id} - #{related_work_package.subject}"
62-
end
60+
"#{related_work_package.type.name.upcase} ##{related_work_package.id} - #{related_work_package.subject}"
6361
end
6462

6563
def direction

app/components/work_packages/date_picker/date_form_component.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
Primer::ButtonComponent.new(
88
tag: :a,
99
href: single_date_field_button_link("start_date"),
10-
data: { turbo_stream: true },
10+
data: { turbo_frame: "wp-datepicker-dialog--content", morph: true },
1111
classes: "wp-datepicker-dialog-date-form--add-button",
1212
test_selector: "wp-datepicker--show-start-date"
1313
)
@@ -34,7 +34,7 @@
3434
Primer::ButtonComponent.new(
3535
tag: :a,
3636
href: single_date_field_button_link("due_date"),
37-
data: { turbo_stream: true },
37+
data: { turbo_frame: "wp-datepicker-dialog--content", morph: true },
3838
classes: "wp-datepicker-dialog-date-form--add-button",
3939
test_selector: "wp-datepicker--show-due-date"
4040
)

app/components/work_packages/date_picker/dialog_content_component.sass

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
$body-height: 490px
2-
2+
.wp-datepicker-dialog--content
3+
background-color: var(--bgColor-default)
34
@media screen and (min-width: $breakpoint-sm)
45
.wp-datepicker-dialog
56
&--content

app/components/work_packages/date_picker/form_component.html.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
)
3333
control.with_item(
3434
tag: :a,
35-
icon: 'op-auto-date',
35+
icon: "op-auto-date",
3636
href: work_package_datepicker_dialog_content_path(params.merge(schedule_manually: false).permit!),
3737
data: {
3838
turbo_stream: true,

app/controllers/work_packages/date_picker_controller.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class WorkPackages::DatePickerController < ApplicationController
4343
attr_accessor :work_package
4444

4545
def show
46+
set_date_attributes_to_work_package
47+
4648
respond_to do |format|
4749
format.html do
4850
render :show,
@@ -51,8 +53,6 @@ def show
5153
end
5254

5355
format.turbo_stream do
54-
set_date_attributes_to_work_package
55-
5656
replace_via_turbo_stream(
5757
component: datepicker_modal_component
5858
)

app/views/work_packages/date_picker/show.html.erb

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
WorkPackages::DatePicker::DialogContentComponent.new(
44
work_package:,
55
schedule_manually:,
6-
focused_field: params[:field].underscore.to_sym,
6+
focused_field: (params[:focused_field] || params[:field]).underscore.to_sym,
77
date_mode: params[:date_mode]
88
)
99
)

config/locales/crowdin/js-da.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ da:
102102
button_save: "Gem"
103103
button_settings: "Indstillinger"
104104
button_uncheck_all: "Fjern alle markeringer"
105-
button_update: "Opdater"
105+
button_update: "Opdatér"
106106
button_export-atom: "Download Atom"
107107
button_generate_pdf: "Generate PDF"
108108
button_create: "Opret"

docs/api/apiv3/openapi-spec.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ info:
88
99
## Introduction
1010
11-
The documentation for the APIv3 is written according to the [OpenAPI 3.0 Specification](https://swagger.io/specification/).
11+
The documentation for the APIv3 is written according to the [OpenAPI 3.1 Specification](https://swagger.io/specification/).
1212
You can either view the static version of this documentation on the [website](https://www.openproject.org/docs/api/introduction/)
1313
or the interactive version, rendered with [OpenAPI Explorer](https://github.com/Rhosys/openapi-explorer/blob/main/README.md),
1414
in your OpenProject installation under `/api/docs`.

docs/installation-and-operations/operation/control/README.md

-38
Original file line numberDiff line numberDiff line change
@@ -48,45 +48,7 @@ sudo openproject run ruby -v
4848
# if using docker-compose: docker-compose run --rm web ruby -v
4949
```
5050

51-
### Scaling the number of web workers
5251

53-
Note: Depending on your free RAM on your system, we recommend you raise the default number of web processes. The default from 9.0.3 onwards is 4 web processes. Each worker will take roughly 300-400MB RAM.
54-
55-
We recommend at least 4 web processes. Please check your current web processes count with:
56-
57-
```shell
58-
sudo openproject config:get OPENPROJECT_WEB_WORKERS
59-
```
60-
61-
If it returns nothing, the default process count of `4` applies. To increase or decrease the process count, call
62-
63-
```shell
64-
sudo openproject config:set OPENPROJECT_WEB_WORKERS=number
65-
```
66-
67-
Where `number` is a positive number between 1 and `round(AVAILABLE_RAM * 1.5)`.
68-
69-
After changing these values, simply restart the web process:
70-
71-
```shell
72-
sudo openproject restart web
73-
```
74-
75-
### Scaling the number of background workers
76-
77-
Note: Depending on your free RAM on your system, we recommend you raise the default number of background processes. By default, one background worker is spawned. Background workers are responsible for delivering mails, copying projects, performing backups and deleting resources.
78-
79-
We recommend to have two background worker processes. Please check your current web processes count with:
80-
81-
To set the desired process count, call
82-
83-
```shell
84-
sudo openproject scale worker=number
85-
```
86-
87-
Where `number` is a positive number between 1 and `round(AVAILABLE_RAM * 1.5)`.
88-
89-
The respective systemd services are automatically created or removed. If you were already at the entered value, it will output `Nothing to do.`
9052

9153
## All-in-one Docker-based installation
9254

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
---
2+
sidebar_navigation:
3+
title: Scaling
4+
priority: 5
5+
6+
---
7+
8+
# Scaling your OpenProject installation
9+
10+
The following environment variables are relevant for performance.
11+
12+
- `OPENPROJECT_WEB_WORKERS`: Number of web workers handling HTTP requests. Note that in Kubernetes deployments, this value is applied using replicas of the services.
13+
- `OPENPROJECT_WEB_TIMEOUT`: Maximum request processing time in seconds.
14+
- `OPENPROJECT_WEB_WAIT__TIMEOUT`: Timeout for waiting requests in seconds.
15+
- `OPENPROJECT_WEB_MIN__THREADS`: Minimum number of threads per web worker.
16+
- `OPENPROJECT_WEB_MAX__THREADS`: Maximum number of threads per web worker.
17+
- `OPENPROJECT_GOOD__JOB__MAX_THREADS`: Maximum number of threads for background workers.
18+
19+
## Packaged installation
20+
21+
Note: Depending on your free RAM on your system, we recommend you raise the default number of web processes. The default from 9.0.3 onwards is 4 web processes. Each worker will take roughly 300-400MB RAM.
22+
23+
We recommend at least 4 web processes. Please check your current web processes count with:
24+
25+
```shell
26+
sudo openproject config:get OPENPROJECT_WEB_WORKERS
27+
```
28+
29+
If it returns nothing, the default process count of `4` applies. To increase or decrease the process count, call
30+
31+
```shell
32+
sudo openproject config:set OPENPROJECT_WEB_WORKERS=number
33+
```
34+
35+
Where `number` is a positive number between 1 and `round(AVAILABLE_RAM * 1.5)`.
36+
37+
After changing these values, simply restart the web process:
38+
39+
```shell
40+
sudo openproject restart web
41+
```
42+
43+
### Scaling the number of background workers
44+
45+
Note: Depending on your free RAM on your system, we recommend you raise the default number of background processes. By default, one background worker is spawned. Background workers are responsible for delivering mails, copying projects, performing backups and deleting resources.
46+
47+
We recommend to have two background worker processes. Please check your current web processes count with:
48+
49+
To set the desired process count, call
50+
51+
```shell
52+
sudo openproject scale worker=number
53+
```
54+
55+
Where `number` is a positive number between 1 and `round(AVAILABLE_RAM * 1.5)`.
56+
57+
The respective systemd services are automatically created or removed. If you were already at the entered value, it will output `Nothing to do.`
58+
59+
## All-in-one Docker-based installation
60+
61+
There is no way to scale the all-in-one docker installation. We recommend to use a docker compose or Kubernetes deployment to provide full flexibility in scaling your installation.
62+
63+
## docker-compose based installation
64+
65+
To scale your docker compose installation, update your `.env` and upgrade the worker definitions from above. For example:
66+
67+
```shell
68+
OPENPROJECT_WEB_WORKERS=number
69+
```
70+
71+
Where `number` is a positive number between 1 and `round(AVAILABLE_RAM * 1.5)`.
72+
73+
> [!NOTE]
74+
>
75+
> Docker compose is not horizontally scalable on multiple instances without additional tools
76+
77+
## Kubernetes and Helm-Charts
78+
79+
To scale your OpenProject Helm chart / kubernetes deployment, you need to adjust the values in your values.yaml file, specifically:
80+
81+
- **Increase replicaCount**: This controls the number of OpenProject web instances.
82+
- **Increase backgroundReplicaCount**: This controls the number of background worker instances.
83+
- **Adjust worker replicas**: In the workers section, increase replicas for different types of workers.
84+
- **Ensure adequate resource allocation**: Scale up CPU and memory limits accordingly.
85+
86+
For example:
87+
88+
```yaml
89+
# Web deployment containers replicas
90+
replicaCount: 2
91+
92+
# Web deployment resources
93+
resources:
94+
requests:
95+
memory: "512Mi"
96+
cpu: "250m"
97+
limits:
98+
memory: "4Gi"
99+
cpu: "4"
100+
101+
# Worker deployment
102+
workers:
103+
default:
104+
replicas: 1 # Keep 1 worker
105+
resources:
106+
requests:
107+
memory: "512Mi"
108+
cpu: "250m"
109+
limits:
110+
memory: "4Gi"
111+
cpu: "4"
112+
```
113+

0 commit comments

Comments
 (0)