Skip to content

feat: configure the eduide cluster and its two environments for parma - #129

Merged
Mtze merged 1 commit into
mainfrom
feat/eduide-cluster-and-envs
Aug 28, 2026
Merged

feat: configure the eduide cluster and its two environments for parma#129
Mtze merged 1 commit into
mainfrom
feat/eduide-cluster-and-envs

Conversation

@Mtze

@Mtze Mtze commented Aug 28, 2026

Copy link
Copy Markdown
Member

clusters/eduide.yaml was written before parma existed and said so. Everything below was checked against the live cluster.

What was wrong

Was Actually
storageClassName local local-path - every PVC would have stayed unbound
acmeHttp false true - nothing would have issued the landing, service or instance certificates
acmeEmail absent required once acmeHttp is true
GatewayClass assumed envoy exists none exists; the chart creates eduide

The cluster has no load balancer

k3s runs without servicelb (no DaemonSets in kube-system) and there is no MetalLB, so a LoadBalancer Service would sit pending for ever. It is a single node and DNS points at that node, so Envoy binds the host ports directly:

useListenerPortAsContainerPort: true    # else Envoy shifts 80/443 to 10080/10443
envoyDeployment:
  container: { securityContext: { capabilities: { add: ["NET_BIND_SERVICE"] } } }
  patch: { type: StrategicMerge, value: { spec: { template: { spec: { hostNetwork: true, ... } } } } }

All three are needed together: host networking alone still lands on 10080, and binding :80 as the non-root envoy user fails without the capability.

Environments

Bonn offers Javascript, Mannheim the TH Mannheim Java 25 image. The other seven are removed rather than hidden, so nothing is rendered, preloaded or offered for them. Verified by rendering:

bonn      app javascript-latest   ghcr.io/eduide/eduide/javascript:1.2.0
          preloaded: [eduide-landing-page:1.2.1, javascript:1.2.0]
mannheim  app thm-java-25-latest  ghcr.io/eduide/eduide/thm-java-25:pr-170-905dd87
          preloaded: [eduide-landing-page:1.2.1, thm-java-25:pr-170-905dd87]

Workspace persistence on both: landingPage.ephemeralStorage: false. The chart-wide default in _base.yaml is true, which would discard the volume with the session - so persistence needs saying, it is not the default. Retention is 14 days for Bonn and 150 days for Mannheim via WORKSPACE_TTL.

Monitoring stated explicitly on both. parma already has cattle-monitoring-system, cattle-dashboards and the PodMonitor CRD.

The duplicate-key check earned its place

Both files already had a landingPage: block. My first version appended a second one, which YAML resolves last-wins - silently dropping infoTitle and footerLinks. test-deploy-logic.sh failed on it immediately. Merged into the existing block; infoTitle and footerLinks confirmed preserved.

Done outside this PR

cert-manager on parma had no Gateway API support - no --enable-gateway-api, no config - so every Gateway-solved HTTP-01 challenge would have hung while the Gateway reported healthy. Enabled in place (enableGatewayAPI: true is live and the controller restarted onto it), and the ansible playbook at playbooks/k8s/parma/platform/00-helmcharts.yaml updated so a rebuild keeps it.

Still blocked

Mannheim's image exists only as pr-170 until EduIDE#170 merges, so its deploy passes ide_tag explicitly. Bonn deploys without authentication by decision; it must not be advertised until its realm is settled.

test-deploy-logic.sh ALL PASS, both cluster manifests validate.

Summary by CodeRabbit

  • New Features

    • Provisioned the eduide environment with single-node k3s networking and secure ACME certificate support.
    • Added JavaScript and Java 25 workspace options for the Bonn and Mannheim environments.
    • Configured environment-specific landing pages and disabled unused bundled applications.
    • Enabled persistent workspaces, monitoring, and automatic cleanup of inactive workspaces.
  • Bug Fixes

    • Corrected storage and gateway configuration for the eduide environment.

Everything here was checked against the live cluster rather than assumed. The
manifest said as much about itself: it was written speculatively before parma
existed.

clusters/eduide.yaml

  storageClassName was `local`; the only class on the node is `local-path`, so
  every PVC would have stayed unbound.

  acmeHttp was false, which meant nothing would have issued the landing,
  service and instance certificates at all. Now true, with the contact address
  the other clusters use.

  The cluster has NO load balancer: k3s runs without servicelb and there is no
  MetalLB, so a Service of type LoadBalancer sits pending for ever. Since it is
  a single node and DNS points at that node, Envoy binds the host's :80 and
  :443 directly - hostNetwork, useListenerPortAsContainerPort so the ports are
  not shifted to 10080/10443, and NET_BIND_SERVICE because the container runs
  as non-root.

  Nothing else owns a GatewayClass here, so the chart creates one named
  `eduide` along with its EnvoyProxy.

environments

  Bonn offers Javascript, Mannheim the TH Mannheim Java 25 image, and the other
  seven apps are removed rather than hidden so nothing is rendered, preloaded or
  offered for them.

  Both persist workspaces: `landingPage.ephemeralStorage: false`, because the
  chart-wide default is true and would discard the volume with the session.
  Retention is 14 days for Bonn and 150 for Mannheim.

  Monitoring is stated explicitly on both. parma already has
  cattle-monitoring-system, cattle-dashboards and the PodMonitor CRD.

Mannheim's image only exists as pr-170 until EduIDE#170 merges, so its deploy
passes ide_tag until then.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019qeiQRFu8xAMRYWPdZewjG
Copilot AI lite review requested due to automatic review settings August 28, 2026 13:56

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0c1dd6dd-c7c0-4cc2-bf89-1ccde3d0d838

📥 Commits

Reviewing files that changed from the base of the PR and between d60ab8a and 612c428.

📒 Files selected for processing (3)
  • clusters/eduide.yaml
  • environments/bonn.eduide.aet.cit.tum.de/values.yaml
  • environments/mannheim.eduide.aet.cit.tum.de/values.yaml

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The change provisions the EduIDE cluster with local storage, ACME TLS, Gateway API, and host-networked Envoy settings. Bonn and Mannheim now define persistent workspaces, environment-specific applications, workspace garbage collection, and monitoring.

Changes

EduIDE provisioning

Layer / File(s) Summary
Cluster networking and TLS
clusters/eduide.yaml
The cluster uses local-path storage and the eduide GatewayClass. ACME HTTP-01 is enabled. A host-networked Envoy proxy binds ports 80 and 443 directly.
Bonn environment applications
environments/bonn.eduide.aet.cit.tum.de/values.yaml
Bonn uses persistent workspaces and the javascript-latest application. Other bundled applications are disabled. Workspace garbage collection and monitoring are enabled.
Mannheim environment applications
environments/mannheim.eduide.aet.cit.tum.de/values.yaml
Mannheim uses persistent workspaces and the custom thm-java-25-latest application. Bundled applications are disabled. Workspace garbage collection and monitoring are enabled.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to 612c4

The PR configures the cluster and its two environments without any actionable merge-blocking risk remaining; it is merge-ready after normal checks and review.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main changes: configuring the EduIDE cluster and its two Parma environments.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0 files. (3 skipped: 3 unsupported.)

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/eduide-cluster-and-envs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Mtze
Mtze merged commit 442b689 into main Aug 28, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants