Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
0d2f070
update
cloudcarver Nov 28, 2025
3f92263
update
cloudcarver Dec 9, 2025
610cf65
udpate
cloudcarver Dec 11, 2025
58ed38a
update
cloudcarver Dec 12, 2025
307ea70
merge
cloudcarver Jan 13, 2026
06bf129
update
cloudcarver Jan 15, 2026
a66de2d
update
cloudcarver Jan 15, 2026
456b00e
feat: add cert-manager lifecycle and kube smoke coverage
cloudcarver Jan 16, 2026
c528ff3
add managed log store and VictoriaLogs support
cloudcarver Jan 20, 2026
97d3c37
update
cloudcarver Jan 27, 2026
53ecc0f
update
cloudcarver Jan 28, 2026
12d494f
update
cloudcarver Feb 3, 2026
296aef7
update
cloudcarver Feb 3, 2026
f673a96
delete env
cloudcarver Feb 4, 2026
6be6e19
update
cloudcarver Feb 6, 2026
46a6eef
feat: add inspection methods
cloudcarver Feb 8, 2026
2cd29ab
update
cloudcarver Feb 11, 2026
2890aab
feat: modify grafana dashboard upload logic
cloudcarver Feb 11, 2026
39f6c11
grafana sync
cloudcarver Feb 13, 2026
367f552
one click install API and acceptance test
cloudcarver Feb 15, 2026
2ddef22
Update env UI for lifecycle status
cloudcarver Feb 18, 2026
c849e87
Add logging and tighter timeout to env e2e
cloudcarver Feb 18, 2026
e8b9a56
Fix env detail URL wait in e2e
cloudcarver Feb 18, 2026
91e4e8a
Expand env e2e coverage
cloudcarver Feb 18, 2026
ba63f22
Guard against empty auth tokens in storage
cloudcarver Feb 18, 2026
f5f9061
Revert "Guard against empty auth tokens in storage"
cloudcarver Feb 18, 2026
4728f17
Read stored APP_ENDPOINT before default base
cloudcarver Feb 18, 2026
8d85d3e
Document APP_ENDPOINT precedence and dev console
cloudcarver Feb 18, 2026
ca29a0f
Update operator readiness inspections
cloudcarver Feb 18, 2026
9607a98
update
cloudcarver Feb 20, 2026
dbc8db2
update
cloudcarver Feb 21, 2026
97e7a64
udpate
cloudcarver Feb 24, 2026
827ae63
rbac
cloudcarver Feb 25, 2026
d5a32ca
update
cloudcarver Feb 26, 2026
e957021
update
cloudcarver Feb 26, 2026
7239d6c
fix
cloudcarver Feb 26, 2026
1a49556
update
cloudcarver Feb 27, 2026
39b3c5b
update
cloudcarver Feb 27, 2026
ffefc59
update
cloudcarver Feb 27, 2026
90c60b1
udpate
cloudcarver Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ profile
.anclax/*
.anchor/*
.tmp/*
dev/helm-charts-cache/
FEATURE-DEVELOPMENT.md
prompt.md
web/test-results/
7 changes: 7 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"gopls": {
"build.buildFlags": [
"-tags=smoke"
]
}
}
29 changes: 29 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Agents Guide

- Use the `anclax-develop-feature` skill for backend development.
- The frontend lives in `web/` (see `web/AGENTS.md` for frontend-specific guidance).

## k0s dev environment

### Start the local k0s stack

```bash
make kstart
```

This boots the k0s container, waits for the cluster to be ready, and applies `dev/k0s.yaml`.

### Run kubectl via Docker

```bash
docker exec -i risingwave-console-k0s k0s kubectl get pods -A
```

### Run Smoke Tests

The smoke tests can only run inside the k0s container, ksmoke already sets this up.

```bash
make ksmoke
```

34 changes: 24 additions & 10 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,41 @@ RisingWave Console's documentation is partially generated from templates located

This ensures documentation stays consistent and up-to-date across the project.

## Development Setup
## Kubernetes

1. Install Anclax CLI and toolchains (only for first time setup)
A local Kubernetes devpod can be setup by running:

```shell
go install github.com/cloudcarver/anclax@latest
anclax install --config dev/anclax.yaml .
make kstart
```

2. Generate Code
A k0s cluster will be started in a container with all state persisted in docker volumes. So next time you start the devpod, it will pick up where you left off.

Check `dev/k0s.yaml` for the manifest of all resources, like how does the devpod work.

You can use the following alias to interact with the Kubernetes cluster:

```shell
make gen
alias k='docker exec -i risingwave-console-k0s k0s kubectl'
k get po -A
```

3. Build the web page
The devpod mounts the current directory as the workspace, so your code changes will be reflected in the devpod immediately. You can run `make kreload` to restart the devpod to rerun `go run` command to apply the code changes. This makes the development experience much smoother without the need to rebuild the docker image every time.

### Reset everything

Run the following command to reset the Kubernetes cluster and also the database:

```shell
make build-web
make kreset
```

## Code Style Guidelines
### Port Forwarding

Since `k` is run inside the devpod, to use port forwarding in the host machine, you need to forward to the reserved ports in the `docker-compose-kubernetes.yaml` file. For example:

```shell
k port-forward svc/grafana 3021:3000 --address=0.0.0.0
```

[TODO]
Remember `0.0.0.0` is also needed to allow access from the host machine.
54 changes: 0 additions & 54 deletions DEVELOPING.md

This file was deleted.

89 changes: 78 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ SHELL := /bin/zsh
PROJECT_DIR=$(shell pwd)
ANCLAX_BIN="$(PROJECT_DIR)/.anclax/bin/anclax"

.PHONY: dev
.PHONY: dev test-external

gen-frontend-client:
cd web && pnpm run gen
Expand All @@ -11,7 +11,7 @@ install-toolchains:
$(ANCLAX_BIN) install --config dev/anclax.yaml .

anclax-gen: install-toolchains
$(ANCLAX_BIN) gen --config dev/anclax.yaml .
anclax gen --config dev/anclax.yaml .

###################################################
### Common
Expand Down Expand Up @@ -58,27 +58,27 @@ db:
### Build
###################################################

VERSION=v0.5.2
VERSION=v0.6.0-alpha.1

build-web:
@cd web && pnpm install && pnpm run build

build-binary:
@rm -rf upload
@CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Darwin/x86_64/risingwave-console cmd/risingwave-console/main.go
@CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Darwin/arm64/risingwave-console cmd/risingwave-console/main.go
@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Linux/x86_64/risingwave-console cmd/risingwave-console/main.go
@CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Linux/i386/risingwave-console cmd/risingwave-console/main.go
@CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Linux/arm64/risingwave-console cmd/risingwave-console/main.go
@CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Darwin/x86_64/risingwave-console cmd/server/main.go
@CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Darwin/arm64/risingwave-console cmd/server/main.go
@CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Linux/x86_64/risingwave-console cmd/server/main.go
@CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Linux/i386/risingwave-console cmd/server/main.go
@CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-X 'github.com/risingwavelabs/risingwave-console/internal/utils.CurrentVersion=$(VERSION)'" -o upload/Linux/arm64/risingwave-console cmd/server/main.go

push-binary:
@cp scripts/download.sh upload/download.sh
@cp dev/scripts/download.sh upload/download.sh
@echo 'latest version: $(VERSION)' > upload/metadata.txt
@aws s3 cp --recursive upload/ s3://risingwave-console/

build-server:
GOOS=linux GOARCH=amd64 go build -o ./bin/risingwave-console-server-amd64 cmd/risingwave-console/main.go
GOOS=linux GOARCH=arm64 go build -o ./bin/risingwave-console-server-arm64 cmd/risingwave-console/main.go
GOOS=linux GOARCH=amd64 go build -o ./bin/risingwave-console-server-amd64 cmd/server/main.go
GOOS=linux GOARCH=arm64 go build -o ./bin/risingwave-console-server-arm64 cmd/server/main.go

IMG_TAG=$(VERSION)
DOCKER_REPO=risingwavelabs/risingwave-console
Expand All @@ -98,6 +98,9 @@ ut:
@go tool cover -func=coverage.filtered | fgrep total | awk '{print "Coverage:", $$3}'
@go tool cover -html=coverage.filtered -o coverage.html

test-external:
@go test -tags external ./...

prepare-test:
cd test && uv sync
cd test && uv run openapi-python-client generate --path ../api/v1.yaml --output-path oapi --overwrite
Expand All @@ -108,3 +111,67 @@ test: prepare-test
# https://pkg.go.dev/net/http/pprof#hdr-Usage_examples
pprof:
go tool pprof http://localhost:8777/debug/pprof/$(ARG)

###################################################
### K0S Dev environment
###################################################

K0S_KUBECTL=docker exec -ti risingwave-console-k0s k0s kubectl
K0S_KUBECTL_NO_TTY=docker exec -i risingwave-console-k0s k0s kubectl
K0S_CODEBASE_DIR=/opt/risingwave-console-dev/codebase
K0S_HELM_CHART_DIR=$(PROJECT_DIR)/dev/helm-charts-cache
K0S_NAMESPACE=risingwave-console

kstart:
docker compose -f docker-compose-kubernetes.yaml up -d
$(PROJECT_DIR)/dev/scripts/k_init.sh
$(K0S_KUBECTL_NO_TTY) apply -f $(K0S_CODEBASE_DIR)/dev/k0s.yaml

kcharts:
$(PROJECT_DIR)/dev/scripts/k_download_charts.sh $(K0S_HELM_CHART_DIR)

kstop:
docker compose -f docker-compose-kubernetes.yaml down

kapply:
$(K0S_KUBECTL) apply -f $(K0S_CODEBASE_DIR)/dev/k0s.yaml

kdelete:
$(K0S_KUBECTL) delete -f $(K0S_CODEBASE_DIR)/dev/k0s.yaml

kreload:
$(K0S_KUBECTL_NO_TTY) rollout restart statefulset/risingwave-console -n $(K0S_NAMESPACE)
$(K0S_KUBECTL_NO_TTY) rollout status statefulset/risingwave-console -n $(K0S_NAMESPACE) --timeout=5m

klog:
$(K0S_KUBECTL) logs -n $(K0S_NAMESPACE) -l app=risingwave-console --follow

ksmoke-ut: kcharts
$(K0S_KUBECTL_NO_TTY) exec -n $(K0S_NAMESPACE) -i risingwave-console-0 -- go test -tags=smoke ./pkg/service -v -count=1

ksmoke-cleanup:
$(K0S_KUBECTL_NO_TTY) exec -n $(K0S_NAMESPACE) -i risingwave-console-0 -- go test -tags=smoke ./pkg/service -run TestEnvServiceE2ESmokeCleanup -v -count=1

ksmoke-cleanup-all:
$(K0S_KUBECTL_NO_TTY) exec -n $(K0S_NAMESPACE) -i risingwave-console-0 -- env RCONSOLE_SMOKE_CLEAN_ALL=true go test -tags=smoke ./pkg/service -run TestEnvServiceE2ESmokeCleanup -v -count=1

ksmoke: kreload ksmoke-cleanup kcharts
$(K0S_KUBECTL_NO_TTY) exec -n $(K0S_NAMESPACE) -i risingwave-console-0 -- go test -tags=smoke ./pkg/service -run TestEnvServiceE2ESmokeOnline -v -timeout=10m -count=1

kclean-db:
$(PROJECT_DIR)/dev/scripts/k_clean_db.sh
$(MAKE) kreload

kdb:
psql "postgresql://postgres:postgres@localhost:5432/postgres?sslmode=disable"

kreset:
$(K0S_KUBECTL_NO_TTY) delete validatingwebhookconfiguration risingwave-operator --ignore-not-found=true
$(K0S_KUBECTL_NO_TTY) delete mutatingwebhookconfiguration risingwave-operator --ignore-not-found=true
$(K0S_KUBECTL_NO_TTY) delete ns victoria-metrics victoria-logs risingwave risingwave-operator-system cert-manager --ignore-not-found=true
$(K0S_KUBECTL_NO_TTY) delete pods -A -l app.kubernetes.io/name=cert-manager --ignore-not-found=true
$(K0S_KUBECTL_NO_TTY) delete pods -A -l app=risingwave-operator --ignore-not-found=true
$(K0S_KUBECTL_NO_TTY) delete all,configmap,secret,pvc -A -l rconsole-env --ignore-not-found=true
$(K0S_KUBECTL_NO_TTY) delete ns -l rconsole-env --ignore-not-found=true
$(MAKE) kclean-db
$(K0S_KUBECTL_NO_TTY) apply -f $(K0S_CODEBASE_DIR)/dev/k0s.yaml
28 changes: 25 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ A web-based interface to connect to, monitor, and manage your RisingWave cluster

> **Note:** You need a running RisingWave cluster to use RisingWave Console.

On Kubernetes, RisingWave Console supports **one-click install** to bootstrap Postgres, MinIO, VictoriaMetrics, VictoriaLogs, and Grafana, plus install cert-manager and the RisingWave Operator when they are missing.

## Installation

| Method | Description | Use Case |
Expand All @@ -23,7 +25,7 @@ A web-based interface to connect to, monitor, and manage your RisingWave cluster
| [**Docker (Ephemeral)**](#docker-ephemeral) | Quick testing without persistence | Development/Testing |
| [**Standalone Binary**](#standalone-binary) | Download binary and run with your own PostgreSQL | Custom deployment |
| [**Docker Compose**](#docker-compose) | Manage with Docker Compose | Production with self-managed PG |
| [**Kubernetes**](#kubernetes) | Deploy on Kubernetes cluster | Cloud-native environments |
| [**Kubernetes**](#kubernetes) | Deploy on Kubernetes cluster with one-click install for dependencies | Cloud-native environments |

### Docker (Persistent) - Recommended

Expand Down Expand Up @@ -67,12 +69,32 @@ Use Docker Compose to manage RisingWave Console and (optionally) a dedicated Pos

### Kubernetes

Use Kubernetes to deploy RisingWave Console and all dependencies. See [docker-compose-kubernetes.yaml](docker-compose-kubernetes.yaml) and [k0s.yaml](dev/k0s.yaml) for a full example.
Use Kubernetes to deploy RisingWave Console and all dependencies. See [docker-compose-kubernetes.yaml](docker-compose-kubernetes.yaml) and [k0s.yaml](dev/k0s.yaml) for a full example.

#### Sample deployment manifest

Apply the sample manifest and update the Postgres DSN + root password before deploying:

```shell
kubectl apply -f docs/kubernetes/console.yaml
```

> **Note:** Apply `docs/kubernetes/console-rbac-cluster-installer.yaml` only if you want the console
> to install cert-manager or the RisingWave operator. See [docs/kubernetes/console-rbac.md](docs/kubernetes/console-rbac.md).

#### One-click install (Kubernetes)

RisingWave Console can provision the environment dependencies from the UI:

1. Go to **Environments** → **Create Environment** → **Install (recommended)** to queue a one-click install. You can also open an environment and click **One-click install** again later.
2. The task installs **Postgres**, **MinIO**, **VictoriaMetrics**, **VictoriaLogs**, and **Grafana** for the environment.
3. If **cert-manager** or the **RisingWave Operator** are missing, the environment overview shows an **Install operator** button. Click it to queue installation of both global components.
4. Watch the status badges in the environment overview or run the **Acceptance Test** to confirm everything is ready.


## Using RisingWave Console

1. **Import Cluster:** Go to "Clusters" → "Import" → Enter connection details (Host, SQL Port, Meta Node Port, HTTP Port, Version)
1. **Connect Cluster:** Go to "Clusters" → "Connect" → Enter connection details (Host, SQL Port, Meta Node Port, HTTP Port, Version)

2. **Explore Cluster:** Click on a cluster to view details, execute `risectl` commands, manage snapshots, and collect diagnostics

Expand Down
Loading