Web GUI (dataflow-web)
Web interface for managing DataFlow from the browser without using kubectl or editing YAML manually.
Overview
The GUI has two parts:
-
Backend (Go) — A server in the
dataflow-webcomponent that connects to the Kubernetes cluster (in-cluster or viaKUBECONFIG), serves a REST API under/api, and serves the built frontend static assets (SPA). -
Frontend (Vue 3 + Vite) — A single-page application that calls the backend at
/api, shows the dashboard, manifest list, logs, and metrics, and supports language switching (Russian/English) and theme (light/dark).
All API requests go through the same host as the UI. The backend talks to the Kubernetes API and returns JSON.
Capabilities
Dashboard
- Summary across namespaces: total DataFlow count and breakdown by phase (Running, Pending, Error, Stopped).
- List of namespaces with flow counts and quick links to manifests for each namespace.
Manifests (DataFlow)
- List of DataFlow resources in the selected namespace with name, status (phase), processed message count, and error count.
- Search by manifest name.
- Create a new DataFlow: "Create new" opens a modal with a YAML editor and a template (source, sink, transformations).
- Edit: view and change an existing DataFlow as YAML (saved via PUT to the API).
- Delete a DataFlow with confirmation.
Namespace can be changed via a dropdown; the URL may include ?namespace=....
Logs
- Choose namespace and a DataFlow from the list.
- Set the number of lines (tail lines) for a one-time load.
- Load logs — single API request, logs shown in a text area.
- Follow logs — stream via Server-Sent Events (SSE), live updates; "Stop following" closes the stream.
- Copy button to copy the current log text to the clipboard.
Logs are read from the DataFlow processor pod (container processor), using labels such as dataflow.dataflow.io/name or app=dataflow-processor when needed.
Metrics and Status
- Select namespace and DataFlow.
- Status for the flow: phase, message, processed count, error count, last processed time.
- Data comes from the DataFlow resource
statusand from the/api/statusendpoint (and optionally/api/metrics).
Other
- Namespace switching — on the dashboard, manifests, logs, and metrics pages you can pick a namespace; the list is loaded from
/api/namespaces. - Localization — UI in Russian and English (vue-i18n).
- Theme — light and dark (toggle in the UI).
Configuration
GUI is configured via Helm values when deploying with the dataflow-operator chart. Key parameters:
| Parameter | Description | Default |
|---|---|---|
gui.enabled |
Enable web GUI | false |
gui.image.repository |
Image for the GUI server (separate from operator) | ghcr.io/dataflow-operator/dataflow-web |
gui.image.tag |
Image tag | v0.2.3 |
gui.image.pullPolicy |
Image pull policy | IfNotPresent |
gui.replicaCount |
Number of GUI server replicas | 1 |
gui.port |
Bind port for the GUI server | 8080 |
gui.logLevel |
Log level: debug, info, warn, error |
(empty, uses default) |
gui.extraEnv |
Extra environment variables (e.g. KUBECONFIG, OPERATOR_METRICS_URL override) |
[] |
gui.resources |
Resource limits and requests | {} |
gui.serviceAccount.name |
Dedicated service account (if empty, uses operator SA) | "" |
Ingress
| Parameter | Description | Default |
|---|---|---|
gui.ingress.enabled |
Enable Ingress for GUI | false |
gui.ingress.className |
Ingress class name | "" |
gui.ingress.annotations |
Ingress annotations | {} |
gui.ingress.hosts |
Host and path configuration | [{ host: dataflow-gui.local, paths: [{ path: /, pathType: Prefix }] }] |
gui.ingress.tls |
TLS configuration | [] |
Metrics proxy
The GUI proxies Prometheus metrics from the operator when OPERATOR_METRICS_URL is set. In Helm, this is set automatically to the operator service in the same release. If the operator runs in a different namespace, override via gui.extraEnv:
gui:
extraEnv:
- name: OPERATOR_METRICS_URL
value: "http://dataflow-operator.dataflow-system:9090/metrics"
Deployment
In cluster (Helm)
Enable GUI when installing or upgrading the operator:
helm install dataflow-operator oci://ghcr.io/dataflow-operator/helm-charts/dataflow-operator \
--set gui.enabled=true
With Ingress (e.g. nginx):
# custom-values.yaml
gui:
enabled: true
ingress:
enabled: true
className: nginx
hosts:
- host: dataflow.example.com
paths:
- path: /
pathType: Prefix
helm install dataflow-operator oci://ghcr.io/dataflow-operator/helm-charts/dataflow-operator -f custom-values.yaml
Access the GUI via the Service (port-forward) or Ingress URL.
Port-forward (quick access)
Without Ingress, use port-forward:
kubectl port-forward svc/dataflow-operator-gui 8080:8080 -n <namespace>
Open http://localhost:8080 in a browser.
Local development
Run backend and frontend separately from the dataflow-web directory:
- Backend:
go run ./cmd/server --bind-address=:8080(setKUBECONFIGif needed). - Frontend: in
dataflow-web/webrunnpm install && npm run dev; the app runs at http://localhost:5173 with API requests proxied to the backend (port 8080).
For build and frontend structure details see dataflow-web/README.md.
Backend API
All endpoints return JSON except logs (plain text or SSE) and metrics (Prometheus text format when operator URL is configured).
| Method | Path | Description |
|---|---|---|
| GET | /api/namespaces |
List cluster namespaces |
| GET | /api/dataflows?namespace=<ns> |
List DataFlow resources in namespace |
| GET | /api/dataflows/<name>?namespace=<ns> |
Single DataFlow |
| POST | /api/dataflows?namespace=<ns> |
Create DataFlow (body: JSON manifest) |
| PUT | /api/dataflows/<name>?namespace=<ns> |
Update DataFlow spec |
| DELETE | /api/dataflows/<name>?namespace=<ns> |
Delete DataFlow |
| GET | /api/logs?namespace=&name=&tailLines=&follow=true\|false |
Processor pod logs (text or SSE when follow=true) |
| GET | /api/status?namespace=&name= |
DataFlow status (phase, message, processedCount, errorCount, lastProcessedTime) |
| GET | /api/metrics?namespace=&name= |
Prometheus metrics (proxied from operator when OPERATOR_METRICS_URL is set) |
CORS headers are set so the API can be used from a different port during local development.