{"id":31392452,"url":"https://github.com/streamshub/console","last_synced_at":"2026-05-11T20:02:55.457Z","repository":{"id":181263293,"uuid":"644421005","full_name":"streamshub/console","owner":"streamshub","description":"Web console to interact with Apache Kafka® instances running in a Kubernetes cluster managed by Strimzi Cluster Operator","archived":false,"fork":false,"pushed_at":"2026-05-04T11:34:22.000Z","size":11505,"stargazers_count":26,"open_issues_count":33,"forks_count":27,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-05-04T13:31:42.226Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/streamshub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":"dco.txt","cla":null}},"created_at":"2023-05-23T13:34:34.000Z","updated_at":"2026-05-04T11:34:24.000Z","dependencies_parsed_at":"2026-02-12T14:11:51.009Z","dependency_job_id":null,"html_url":"https://github.com/streamshub/console","commit_stats":null,"previous_names":["eyefloaters/strimzi-ui","eyefloaters/console","streamshub/console"],"tags_count":79,"template":false,"template_full_name":null,"purl":"pkg:github/streamshub/console","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamshub%2Fconsole","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamshub%2Fconsole/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamshub%2Fconsole/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamshub%2Fconsole/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/streamshub","download_url":"https://codeload.github.com/streamshub/console/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/streamshub%2Fconsole/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32910635,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-11T17:09:15.040Z","status":"ssl_error","status_checked_at":"2026-05-11T17:08:45.420Z","response_time":120,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-09-29T04:01:34.076Z","updated_at":"2026-05-11T20:02:55.437Z","avatar_url":"https://github.com/streamshub.png","language":"Java","funding_links":[],"categories":["Uncategorized"],"sub_categories":["Uncategorized"],"readme":"# StreamsHub Console for Apache Kafka\u003csup\u003e®\u003c/sup\u003e\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=streamshub_console\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=streamshub_console) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=streamshub_console\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=streamshub_console)\nStreamsHub Console is a web application designed to facilitate interactions with Apache Kafka\u003csup\u003e®\u003c/sup\u003e instances, optionally leveraging the [Strimzi](https://strimzi.io) Cluster Operator for Kafka\u003csup\u003e®\u003c/sup\u003e instances running on Kubernetes.\nIt is composed of three main parts:\n- a [REST API](./api) backend developed with Java and [Quarkus](https://quarkus.io/)\n- a [user interface (UI)](./ui) built with [Next.js](https://nextjs.org/) and [PatternFly](https://patternfly.org)\n- a Kubernetes [operator](./operator) developed with Java and [Quarkus](https://quarkus.io/)\n\n## Features\n\n- Cluster overview\n\n  High-level cluster information, include storage, memory, and CPU utilization.\n  \u003ca href=\"./docs/resources/console-overview.png\"\u003e\n    \u003cimg src=\"./docs/resources/console-overview.png\" width=\"50%\"\u003e\n  \u003c/a\u003e\n\n- Topics\n\n  List Kafka topics \u0026 view messages, partition information, and configurations\n  \u003ca href=\"./docs/resources/console-topics.png\"\u003e\n    \u003cimg src=\"./docs/resources/console-topics.png\" width=\"50%\"\u003e\n  \u003c/a\u003e\n\n- Kafka nodes\n\n  See information on each node in the Kafka cluster, including support for KRaft (ZooKeeper-less Kafka)\n  \u003ca href=\"./docs/resources/console-nodes.png\"\u003e\n    \u003cimg src=\"./docs/resources/console-nodes.png\" width=\"50%\"\u003e\n  \u003c/a\u003e\n\n- Consumer groups\n\n  View, inspect, and alter committed offsets for consumer groups in the Kafka cluster\n  \u003ca href=\"./docs/resources/console-consumer-groups.png\"\u003e\n    \u003cimg src=\"./docs/resources/console-consumer-groups.png\" width=\"50%\"\u003e\n  \u003c/a\u003e\n\n## Roadmap / Goals\n\nThe future goals of this project are to provide a user interface to interact with and manage additional data streaming components such as:\n- [Apicurio Registry](https://www.apicur.io/registry/) for message serialization and de-serialization + validation\n- [Kroxylicious](https://kroxylicious.io/) for introducing additional behaviors to Kafka-based systems\n- [Apache Flink](https://flink.apache.org/) for processing real-time data streams and batch data sets\n\nContributions and discussions around use cases for these (and other relevant) components are both welcome and encouraged.\n\n## Deployment\nDeploy the console using one of the following methods:\n\n- Through its dedicated operator using the [Operator Lifecycle Manager](https://olm.operatorframework.io/) (OLM)\n- Using the operator with plain Kubernetes resources\n- Directly with Kubernetes resources, without the operator\n\nNote, if you are using [minikube](https://minikube.sigs.k8s.io/) with the `ingress` addon as your Kubernetes cluster, SSL pass-through must be enabled on the nginx controller:\n```shell\n# Enable TLS passthrough on the ingress deployment\nkubectl patch deployment -n ingress-nginx ingress-nginx-controller \\\n --type='json' \\\n -p='[{\"op\": \"add\", \"path\": \"/spec/template/spec/containers/0/args/-\", \"value\":\"--enable-ssl-passthrough\"}]'\n```\n\n### Prerequisites\n#### Apache Kafka®\nThe instructions below assume an existing Apache Kafka\u003csup\u003e®\u003c/sup\u003e cluster is available to use from the console. We recommend using [Strimzi](https://strimzi.io) to create and manage your Apache Kafka\u003csup\u003e®\u003c/sup\u003e clusters - plus the console provides additional features and insights for Strimzi Apache Kafka\u003csup\u003e®\u003c/sup\u003e clusters.\n\nIf you already have Strimzi installed but would like to create an Apache Kafka\u003csup\u003e®\u003c/sup\u003e cluster for use with the console, example deployment resources are available to get started.  The resources create an Apache Kafka\u003csup\u003e®\u003c/sup\u003e cluster in KRaft mode with SCRAM-SHA-512 authentication, a Strimzi `KafkaNodePool` resource to manage the cluster nodes, and a Strimzi `KafkaUser` resource that may be used to connect to the cluster.\n\nModify the `CLUSTER_DOMAIN` to match the base domain of your Kubernetes cluster (used for ingress configuration), use either `route` (OpenShift) or `ingress` (vanilla Kubernetes) for `LISTENER_TYPE`, and set `NAMESPACE` to be the namespace where the Apache Kafka\u003csup\u003e®\u003c/sup\u003e cluster will be created.\n```shell\nexport CLUSTER_DOMAIN=apps-crc.testing\nexport NAMESPACE=kafka\nexport LISTENER_TYPE=route\ncat examples/kafka/*.yaml | envsubst | kubectl apply -n ${NAMESPACE} -f -\n```\n##### Kafka Authorization\nTo ensure the console has the necessary access to function, a minimum level of authorization must be configured for the principal used in each Kafka cluster connection. The specific permissions may vary based on the authorization framework in use, such as ACLs, Keycloak authorization, OPA, or a custom solution. However, the minimum ACL types required are as follows:\n1. `DESCRIBE`, `DESCRIBE_CONFIGS` for the `CLUSTER` resource\n2. `READ`, `DESCRIBE`, `DESCRIBE_CONFIGS` for all `TOPIC` resources\n3. `READ`, `DESCRIBE` for all `GROUP` resources\n\n#### Prometheus\nPrometheus is an optional dependency of the console if cluster metrics are to be displayed. The console supports gathering metrics in several ways.\n\n- OpenShift-managed Prometheus instances. Monitoring of user-defined projects must be enabled in OpenShift.\n- User-supplied Prometheus instances\n- Private Prometheus instance for each `Console`. The operator creates a managed Prometheus deployment for use only by the console.\n\n#### OIDC Provider\nThe console may be configured to use an OpenID Connect (OIDC) provider for user authentication. An example using [dex](https://dexidp.io/) for OIDC with an OpenShift identity provider is available in [examples/dex-openshift](./examples/dex-openshift).\n\n### Deploy the operator with OLM\nThe preferred way to deploy the console is using the Operator Lifecycle Manager, or OLM - see [OLM releases](https://github.com/operator-framework/operator-lifecycle-manager/releases) for details on how to install it. Note, if you are using OpenShift, OLM is already installed.\n\nThe sample install files in `install/operator-olm` will install the operator with cluster-wide scope. This means that `Console` instances may be created in any namespace. If you wish to limit the scope of the operator, the `OperatorGroup` resource may be modified to specify only the namespace that should be watched by the operator.\n\nThis example will create the operator's OLM resources in the `default` namespace. Modify the `NAMESPACE` variable according to your needs.\n\n```shell\nexport NAMESPACE=default\ncat install/operator/olm/*.yaml | envsubst | kubectl apply -n ${NAMESPACE} -f -\n```\n\n#### Console Custom Resource Examples\nOnce the operator is ready, you may then create a `Console` resource in the namespace where the console should be deployed. This example `Console` is based on the example Apache Kafka\u003csup\u003e®\u003c/sup\u003e cluster deployed above in the [prerequisites section](#prerequisites). Also see [examples/console/010-Console-example.yaml](examples/console/010-Console-example.yaml).\n\n```yaml\napiVersion: console.streamshub.github.com/v1alpha1\nkind: Console\nmetadata:\n  name: example\nspec:\n  hostname: example-console.cloud.example.com # Hostname where the console will be accessed via HTTPS\n  metricsSources:\n    # A `standalone` Prometheus instance must already exist and be accessible from the console Pod\n    - name: custom-prometheus\n      type: standalone\n      url: https://custom-prometheus.cloud.example.com\n      # Prometheus API authentication may also be provided\n  kafkaClusters:\n    - name: console-kafka             # Name of the `Kafka` CR representing the cluster\n      namespace: kafka                # Namespace of the `Kafka` CR representing the cluster\n      listener: secure                # Listener on the `Kafka` CR to connect from the console\n      metricsSource: custom-prometheus\n      properties:\n        values: []                    # Array of name/value for properties to be used for connections\n                                      # made to this cluster\n        valuesFrom: []                # Array of references to ConfigMaps or Secrets with properties\n                                      # to be used for connections made to this cluster\n      credentials:\n        kafkaUser:\n          name: console-kafka-user1   # Name of the `KafkaUser` resource used to connect to Kafka\n                                      # This is optional if properties are used to configure the user\n```\n\nAdditional Console resource examples can be found at [examples/console/](examples/console/), including OpenShift monitoring metrics configuration and OIDC security configuration.\n\n### Deploy the operator directly\nDeploying the operator without the use of OLM requires applying the component Kubernetes resources for the operator directly. These resources are bundled and attached to each StreamsHub Console release. The latest release can be found [here](https://github.com/streamshub/console/releases/latest). The resource file is named `streamshub-console-operator.yaml`.\n\nThis example will create the operator's resources in the `default` namespace. Modify the `NAMESPACE` variable according to your needs and set `VERSION` to the [latest release](https://github.com/streamshub/console/releases/latest).\n```\nexport NAMESPACE=default\nexport VERSION=0.3.3\ncurl -sL https://github.com/streamshub/console/releases/download/${VERSION}/streamshub-console-operator.yaml \\\n  | envsubst \\\n  | kubectl apply -n ${NAMESPACE} -f -\n```\nNote: if you are not using the Prometheus operator you may see an error about a missing `ServiceMonitor` custom resource type. This error may be ignored.\n\nWith the operator resources created, you may create a `Console` resource like the one shown in [Console Custom Resource Examples](#console-custom-resource-examples).\n\n## Running locally\n\nRunning the console locally requires configuration of any Apache Kafka\u003csup\u003e®\u003c/sup\u003e clusters that will be accessed from the console and (optionally) the use of a Kubernetes cluster that hosts the Strimzi Kafka operator. To get started, you will need to provide a console configuration file and (optionally) credentials to connect to the Kubernetes cluster where Strimzi is operating.\n\n1. Using the [console-config.yaml](./examples/console-config.yaml) file as an example, create your own configuration\n   in a file `console-config.yaml` in the repository root. The `compose.yaml` file expects this location to be used and\n   any difference in name or location requires an adjustment to the compose file.\n2. Install the prerequisite software into the Kubernetes cluster.\n    * Install the [Strimzi operator](https://strimzi.io/docs/operators/latest/deploying#con-strimzi-installation-methods_str)\n    * Install the [Prometheus operator](https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/developer/getting-started.md) and create a `Prometheus` instance (_optional_, only if you want to see metrics in the console)\n    * Create an Apache Kafka\u003csup\u003e®\u003c/sup\u003e cluster. See the [example above](#apache-kafka) This step is only required if you do not already have an existing cluster you would like to use with the console.\n3. (_Skip this step if you are not using Kubernetes and Prometheus_) Provide the Prometheus endpoint, the API server endpoint, and the service account token that you would like to use to connect to the Kubernetes cluster. These may be placed in a `compose.env` file that will be detected when starting the console.\n   ```\n   CONSOLE_API_SERVICE_ACCOUNT_TOKEN=\u003cTOKEN\u003e\n   CONSOLE_API_KUBERNETES_API_SERVER_URL=https://my-kubernetes-api.example.com:6443\n   ```\n   The service account token may be obtained using the `kubectl create token` command. For example, to create a service account named \"console-server\" with the correct permissions and a token that expires in 1 year ([yq](https://github.com/mikefarah/yq/releases) required):\n   ```shell\n   export NAMESPACE=\u003cservice account namespace\u003e\n   kubectl apply -n ${NAMESPACE} -f ./install/operatorless/010-ServiceAccount-console-server.yaml\n   kubectl apply -n ${NAMESPACE} -f ./install/operatorless/020-ClusterRole-console-server.yaml\n   cat ./install/operatorless/030-ClusterRoleBinding-console-server.yaml | envsubst | kubectl apply -n ${NAMESPACE} -f -\n   kubectl create token console-server -n ${NAMESPACE} --duration=$((365*24))h\n   ```\n\n4. By default, the provided configuration will use the latest console release container images. If you would like to\n   build your own images with changes you've made locally, you may also set the `CONSOLE_API_IMAGE` and `CONSOLE_UI_IMAGE`\n   in your `compose.env` and build them with `make container-images`\n\n5. Start the environment with `make compose-up`.\n\n6. When finished with the local console process, you may run `make compose-down` to clean up.\n\n## Contributing\n\nWe welcome contributions of all forms. Please see the [CONTRIBUTING](./CONTRIBUTING.md) file for how to get started.\nJoin us in enhancing the capabilities of this console for Apache Kafka\u003csup\u003e®\u003c/sup\u003e on Kubernetes.\n\n## Releasing\n\n### Milestones\nEach release requires an open milestone that includes the issues/pull requests that are part of the release. All issues in the release milestone must be closed. The name of the milestone must match the version number to be released.\n\n### Configuration\nThe release action flow requires that the following secrets are configured in the repository:\n* `IMAGE_REPO_HOSTNAME` - the host (optionally including a port number) of the image repository where images will be pushed\n* `IMAGE_REPO_NAMESPACE` - namespace/library/user where the image will be pushed\n* `IMAGE_REPO_USERNAME` - user name for authentication to server `IMAGE_REPO_HOSTNAME`\n* `IMAGE_REPO_PASSWORD` - password for authentication to server `IMAGE_REPO_HOSTNAME`\nThese credentials will be used to push the release image to the repository configured in the `.github/workflows/release.yml` workflow.\n\n### Performing the Release\nReleases are performed by modifying the `.github/project.yml` file, setting `current-version` to the release version and `next-version` to the next SNAPSHOT. Open a pull request with the changed `project.yml` to initiate the pre-release workflows. At this phase, the project milestone will be checked and it will be verified that no issues for the release milestone are still open. Additionally, the project's integration test will be run.\nOnce approved and the pull request is merged, the release action will execute. This action will execute the Maven release plugin to tag the release commit, build the application artifacts, create the build image, and push the image to (currently) quay.io. If successful, the action will push the new tag to the Github repository and generate release notes listing all of the closed issues included in the milestone. Finally, the milestone will be closed.\n\n## License\n\nThis project is licensed under the Apache License 2.0 - see the LICENSE file for details.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreamshub%2Fconsole","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstreamshub%2Fconsole","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstreamshub%2Fconsole/lists"}