The Maykin Objecttypen (S-18a) and Objecten (S-18b) images run their web under uWSGI with 4 processes × 4 threads by default (UWSGI_PROCESSES:-4). Two web services × 4 idle Django workers (~200 MB each) sat idle during the e2e step and starved the single shared self-hosted runner — Keycloak and the portals stopped responding (the login #username never appeared) and Chromium hit Target crashed. The runner margin was already thin; the second chain tipped it over (main green through run 2159, red from 2177).
Fix
Cap UWSGI_PROCESSES: "1" + UWSGI_THREADS: "2" on both objecten and objecttypen in both compose files. These APIs only serve single-request smoke checks and are idle during e2e, so 1 worker is plenty — it frees ~1–1.5 GB. The -init containers ignore it (they run setup_configuration, not uwsgi).
Verified locally
Brought the objecten chain up with the cap: both services reach healthy, worker count drops from 6 (master + http + 4 workers) to 3 (master + http + 1 worker) per service, and make verify-objecten / make verify-objecttypen both still → OK — no-auth 401, token 200. docker compose config clean on both files.
## What & why
**P0 — red `main`.** Fixes #144: `verify-stack` fails on the Playwright e2e step (main runs 2177 after #142, 2190 after #143), while the PR runs passed.
Closes #144
### Root cause
The Maykin **Objecttypen** (S-18a) and **Objecten** (S-18b) images run their `web` under uWSGI with **4 processes × 4 threads by default** (`UWSGI_PROCESSES:-4`). Two web services × 4 idle Django workers (~200 MB each) sat idle during the e2e step and starved the single shared self-hosted runner — Keycloak and the portals stopped responding (the login `#username` never appeared) and Chromium hit `Target crashed`. The runner margin was already thin; the second chain tipped it over (main green through run 2159, red from 2177).
### Fix
Cap `UWSGI_PROCESSES: "1"` + `UWSGI_THREADS: "2"` on both `objecten` and `objecttypen` in both compose files. These APIs only serve single-request smoke checks and are idle during e2e, so 1 worker is plenty — it frees ~1–1.5 GB. The `-init` containers ignore it (they run `setup_configuration`, not uwsgi).
## Verified locally
Brought the objecten chain up with the cap: both services reach healthy, worker count drops from 6 (master + http + 4 workers) to 3 (master + http + 1 worker) per service, and `make verify-objecten` / `make verify-objecttypen` both still → **OK — no-auth 401, token 200**. `docker compose config` clean on both files.
## Definition of Done
- [x] Linked issue (#144).
- [x] Conventional Commit referencing #144.
- [x] Verified locally (both APIs healthy + smoke green with 1 worker).
- [x] Closed by the merging PR (`closes #144`).
No ADR: config-only tuning of existing services — no boundary, dependency, or coupling change.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The Maykin images run uWSGI with 4 processes × 4 threads by default. Two
web services × 4 idle Django workers (~200 MB each) sat idle during the
Playwright e2e step and starved the single shared CI runner, so Keycloak
and the portals stopped responding (login never loaded) and Chromium
crashed — main verify-stack went red from run 2177 (post-#142) onward
while the PR runs passed on a less loaded runner.
These APIs only serve single-request smoke checks and are idle during
e2e, so 1 worker is plenty. Verified locally: both services healthy with
UWSGI_PROCESSES=1 and make verify-objecten / verify-objecttypen still green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What & why
P0 — red
main. Fixes #144:verify-stackfails on the Playwright e2e step (main runs 2177 after #142, 2190 after #143), while the PR runs passed.Closes #144
Root cause
The Maykin Objecttypen (S-18a) and Objecten (S-18b) images run their
webunder uWSGI with 4 processes × 4 threads by default (UWSGI_PROCESSES:-4). Two web services × 4 idle Django workers (~200 MB each) sat idle during the e2e step and starved the single shared self-hosted runner — Keycloak and the portals stopped responding (the login#usernamenever appeared) and Chromium hitTarget crashed. The runner margin was already thin; the second chain tipped it over (main green through run 2159, red from 2177).Fix
Cap
UWSGI_PROCESSES: "1"+UWSGI_THREADS: "2"on bothobjectenandobjecttypenin both compose files. These APIs only serve single-request smoke checks and are idle during e2e, so 1 worker is plenty — it frees ~1–1.5 GB. The-initcontainers ignore it (they runsetup_configuration, not uwsgi).Verified locally
Brought the objecten chain up with the cap: both services reach healthy, worker count drops from 6 (master + http + 4 workers) to 3 (master + http + 1 worker) per service, and
make verify-objecten/make verify-objecttypenboth still → OK — no-auth 401, token 200.docker compose configclean on both files.Definition of Done
closes #144).No ADR: config-only tuning of existing services — no boundary, dependency, or coupling change.
🤖 Generated with Claude Code