diff --git a/docs/developer/projects/eduide-shared-cache.md b/docs/developer/projects/eduide-shared-cache.md index 1c8ed4f..0d60dc6 100644 --- a/docs/developer/projects/eduide-shared-cache.md +++ b/docs/developer/projects/eduide-shared-cache.md @@ -12,26 +12,39 @@ The **EduIDE Shared Cache** repository provides a high-performance, Kubernetes-n ## Key Features - **Gradle Compatibility**: Fully implements the Gradle HTTP Build Cache protocol for seamless integration. -- **Persistent Storage**: Utilizes MinIO (S3-compatible object storage) for reliable and scalable storage of cache artifacts. -- **Access Control**: Features HTTP Basic Authentication to ensure secure access to the cache. +- **In-Memory Storage**: Uses Redis for fast cache lookups and storage of build artifacts. +- **Role-Based Authentication**: HTTP Basic Authentication with separate reader and writer roles for fine-grained access control. - **Kubernetes-Native**: Designed with containerization in mind, including production-ready Helm charts for easy deployment. -- **Observability**: Built-in support for Prometheus metrics and structured JSON logging for effective monitoring. -- **Resource Efficient**: Lightweight implementation with a minimal CPU and memory footprint. +- **Observability**: Built-in Prometheus metrics, pre-built Grafana dashboard, Redis exporter sidecar, and structured JSON logging. +- **Dependency Proxy**: Optional Reposilite integration for caching Maven/Gradle dependencies. +- **Health Checks**: Kubernetes-ready liveness (`/ping`) and readiness (`/health`) probes. +- **Resource Efficient**: Lightweight implementation with a minimal CPU and memory footprint (~256Mi RAM, ~100m CPU). ## Technical Details - **Language**: Go (Golang) - **Web Framework**: [Gin](https://github.com/gin-gonic/gin) -- **Storage Backend**: [MinIO](https://min.io/) +- **Storage Backend**: [Redis](https://redis.io/) 7 - **Deployment**: Docker, Kubernetes, Helm - **Key Dependencies**: - `github.com/gin-gonic/gin`: HTTP web framework. - - `github.com/minio/minio-go/v7`: Client for MinIO interaction. + - `github.com/redis/go-redis/v9`: Redis client for storage operations. - `github.com/prometheus/client_golang`: Prometheus metrics instrumentation. +## API Endpoints + +| Endpoint | Method | Auth | Description | +|----------|--------|------|-------------| +| `/ping` | GET | No | Health check (liveness probe) | +| `/health` | GET | No | Storage connectivity check (readiness probe) | +| `/metrics` | GET | No | Prometheus metrics | +| `/cache/:key` | GET | reader/writer | Retrieve cache entry | +| `/cache/:key` | HEAD | reader/writer | Check if cache entry exists | +| `/cache/:key` | PUT | writer only | Store cache entry | + ## Integration -In the EduIDE ecosystem, **EduIDE Shared Cache** is an essential tool for developer productivity and CI/CD efficiency. It is used to accelerate the build processes of various components, such as the Theia IDE blueprints and other microservices, by caching intermediate build results. This is particularly beneficial in monorepo structures or large multi-module projects common in the Artemis environment. +In the EduIDE ecosystem, **EduIDE Shared Cache** serves as a shared Gradle build cache for students working in cloud IDE sessions. When a student triggers a Gradle build, previously computed build outputs are served from the shared cache, significantly reducing build times. Since many students work on the same exercise templates, cache hit rates are high and redundant compilation work is avoided across sessions. ## Repository diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 0faa979..aa7a0da 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -90,13 +90,13 @@ const config: Config = { }, items: [ { - to: '/developer/intro', - label: 'Developer', + to: '/instructor/intro', + label: 'Instructor', position: 'left', }, { - to: '/instructor/intro', - label: 'Instructor', + to: '/student/intro', + label: 'Student', position: 'left', }, { @@ -105,8 +105,8 @@ const config: Config = { position: 'left', }, { - to: '/student/intro', - label: 'Student', + to: '/developer/intro', + label: 'Developer', position: 'left', }, { @@ -122,21 +122,21 @@ const config: Config = { { title: 'Sections', items: [ - { - label: 'Developer', - to: '/developer/intro', - }, { label: 'Instructor', to: '/instructor/intro', }, + { + label: 'Student', + to: '/student/intro', + }, { label: 'Admins', to: '/admins/intro', }, { - label: 'Student', - to: '/student/intro', + label: 'Developer', + to: '/developer/intro', }, ], }, diff --git a/src/css/custom.css b/src/css/custom.css index 9b15b29..008e42a 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -29,3 +29,13 @@ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); --ifm-background-color: #2a2a40; } + +[data-theme='dark'] .button.button--secondary:not(#_):not(#_) { + background-color: rgba(255, 255, 255, 0.08); + color: #e2e8f0; +} + +[data-theme='dark'] .button.button--secondary:not(#_):not(#_):hover { + background-color: rgba(255, 255, 255, 0.14); + color: #e2e8f0; +} diff --git a/src/pages/imprint.module.css b/src/pages/imprint.module.css index 5789be0..95391bc 100644 --- a/src/pages/imprint.module.css +++ b/src/pages/imprint.module.css @@ -166,6 +166,70 @@ } } +[data-theme='dark'] .page { + background: + radial-gradient(circle at top left, rgba(15, 99, 255, 0.18), transparent 28%), + radial-gradient(circle at top right, rgba(10, 184, 126, 0.12), transparent 24%), + linear-gradient(180deg, #1e1e2e 0%, #1a1a2e 54%, #2a2a40 100%); +} + +[data-theme='dark'] .heroCard, +[data-theme='dark'] .infoCard, +[data-theme='dark'] .sectionCard { + border-color: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.06); + box-shadow: 0 20px 45px rgba(0, 0, 0, 0.3); +} + +[data-theme='dark'] .eyebrow { + color: #8bb4ff; +} + +[data-theme='dark'] .heroCard h1 { + color: #e2e8f0; +} + +[data-theme='dark'] .heroLead { + color: #94a3b8; +} + +[data-theme='dark'] .secondaryAction { + border-color: rgba(255, 255, 255, 0.12); + color: #e2e8f0; +} + +[data-theme='dark'] .infoLabel { + color: #94a3b8; +} + +[data-theme='dark'] .infoCard strong { + color: #e2e8f0; +} + +[data-theme='dark'] .infoCard p { + color: #94a3b8; +} + +[data-theme='dark'] .sectionCard h2 { + color: #e2e8f0; +} + +[data-theme='dark'] .sectionCard h3 { + color: #e2e8f0; +} + +[data-theme='dark'] .sectionCard p { + color: #94a3b8; +} + +[data-theme='dark'] .detailRow dt { + color: #94a3b8; +} + +[data-theme='dark'] .detailRow dd { + color: #e2e8f0; +} + @media (max-width: 640px) { .actions { flex-direction: column; diff --git a/src/pages/imprint.tsx b/src/pages/imprint.tsx index af3bfaa..f035b7b 100644 --- a/src/pages/imprint.tsx +++ b/src/pages/imprint.tsx @@ -39,13 +39,6 @@ export default function Imprint() { Technical University of Munich

Arcisstrasse 21, 80333 Munich

-
- - Responsible for content - - Prof. Dr. Stephan Krusche -

Boltzmannstrasse 3, 85748 Garching

-
Applies to EduIDE Docs diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 805aaf2..8bc0fdf 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -169,6 +169,77 @@ } } +[data-theme='dark'] .page { + background: + radial-gradient(circle at top left, rgba(15, 99, 255, 0.18), transparent 28%), + radial-gradient(circle at top right, rgba(10, 184, 126, 0.12), transparent 24%), + linear-gradient(180deg, #1e1e2e 0%, #1a1a2e 54%, #2a2a40 100%); +} + +[data-theme='dark'] .heroGlow { + background: + radial-gradient(circle at 20% 15%, rgba(30, 30, 46, 0.8), transparent 26%), + radial-gradient(circle at 75% 30%, rgba(73, 123, 255, 0.12), transparent 22%); +} + +[data-theme='dark'] .kicker { + color: #8bb4ff; +} + +[data-theme='dark'] .heroContent h1 { + color: #e2e8f0; +} + +[data-theme='dark'] .lead { + color: #94a3b8; +} + +[data-theme='dark'] .secondaryAction { + border-color: rgba(255, 255, 255, 0.12); + color: #e2e8f0; +} + +[data-theme='dark'] .metricCard { + border-color: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.06); + box-shadow: 0 20px 45px rgba(0, 0, 0, 0.3); +} + +[data-theme='dark'] .metricCard span { + color: #94a3b8; +} + +[data-theme='dark'] .metricCard strong { + color: #e2e8f0; +} + +[data-theme='dark'] .sectionCard { + border-color: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.06); + box-shadow: 0 18px 40px rgba(0, 0, 0, 0.3); +} + +[data-theme='dark'] .sectionCard:hover { + border-color: rgba(139, 180, 255, 0.4); + box-shadow: 0 24px 55px rgba(139, 180, 255, 0.1); +} + +[data-theme='dark'] .sectionLabel { + color: #8bb4ff; +} + +[data-theme='dark'] .sectionCard h2 { + color: #e2e8f0; +} + +[data-theme='dark'] .sectionCard p { + color: #94a3b8; +} + +[data-theme='dark'] .sectionCta { + color: #e2e8f0; +} + @media (max-width: 640px) { .actions { flex-direction: column; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 0629b52..3a6dacc 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -5,25 +5,25 @@ import Link from '@docusaurus/Link'; import styles from './index.module.css'; const sections = [ - { - title: 'Developer', - description: 'API references, architecture decisions, integration guides, and implementation patterns.', - href: '/developer/intro', - }, { title: 'Instructor', description: 'Course delivery workflows, classroom playbooks, and content operations guidance.', href: '/instructor/intro', }, + { + title: 'Student', + description: 'Onboarding, workspace basics, assignment flow, and submission support.', + href: '/student/intro', + }, { title: 'Admins', description: 'Provisioning, permissions, platform operations, and incident handling documentation.', href: '/admins/intro', }, { - title: 'Student', - description: 'Onboarding, workspace basics, assignment flow, and submission support.', - href: '/student/intro', + title: 'Developer', + description: 'API references, architecture decisions, integration guides, and implementation patterns.', + href: '/developer/intro', }, ];