A web application for requesting university chair resources. Provides structured, validated forms for VM provisioning, VM access, Artemis developer accounts, and TUM guest accounts.
client/ React 19 + Vite + TypeScript + shadcn/ui
server/ FastAPI + SQLAlchemy + Alembic
e2e/ Playwright E2E Test Setup
deploy/
client/ Dockerfile (nginx)
server/ Dockerfile (uvicorn)
helm/ Kubernetes Helm chart
- Node.js 22+
- Python 3.12+ with uv
- PostgreSQL 16+
- Docker (for deployment)
cd client
cp .env.example .env # configure Keycloak + API URL
npm install
npm run dev # http://localhost:5174cd server
cp .env.example .env # configure database + Keycloak
uv sync
uv run alembic upgrade head # run migrations
uv run uvicorn request_server.main:app --reload # http://localhost:8000 cd server
docker compose up -d # starts PostgreSQL on :5432
uv run alembic upgrade head| Form | Route | Auth Required | Description |
|---|---|---|---|
| VM Request | /request/vm |
Yes | Provision a new virtual machine |
| VM Access | /request/vm-access |
Yes | Request access to an existing VM |
| Artemis Developer | /request/artemis |
No | Artemis developer account setup |
| TUM Guest Account | /request/tum-guest |
No | Guest account for external users |
| Support Request | /request/support |
No | General support request |
| External Links Admin | /admin/external-links |
Admin | Manage external link sections |
The application ships as a Helm chart deploying client, server, and PostgreSQL to Kubernetes.
cd deploy/helm/aet-request
helm dependency update
helm upgrade --install aet-request . \
--namespace aet-request --create-namespace \
-f /path/to/values-env.yamlThe default values.yaml contains safe, generic defaults. Environment-specific configuration (hostnames, TLS, secrets) should be provided via a separate values file. See values-itg.example.yaml for a template.
- cert-manager TLS via
letsencrypt-productionClusterIssuer - Database migrations as a Helm pre-install/pre-upgrade Job
- ConfigMap checksum annotations for automatic pod restarts on config changes
- Startup/liveness/readiness probes
- Pod Disruption Budgets and optional HPA
- Network policies for ingress/egress restriction
Images are built and pushed to GHCR via GitHub Actions:
ghcr.io/<owner>/request-client:<version>
ghcr.io/<owner>/request-server:<version>
End-to-end tests use Playwright and run against a test database (PostgreSQL on port 5433).
cd e2e
npx playwright install # first time only
npx playwright test # run all testsTests auto-start the client (port 5715) and server (port 8001) with AUTH_BYPASS=true and TICKET_SYSTEM=debug. Additional scripts:
npx playwright test --headed # watch in browser
npx playwright test --ui # interactive UI mode
npx playwright test --debug # step-through debugger# Client lint + format
cd client && npm run lint
# Server lint + format
cd server && uv run ruff check . && uv run ruff format .
# Type checking
cd client && npm run typecheck
cd server && uv run ty check .