https://github.com/mdawar/nats-dashboard
Web dashboard for monitoring NATS servers.
https://github.com/mdawar/nats-dashboard
dashboard monitoring nats
Last synced: about 1 month ago
JSON representation
Web dashboard for monitoring NATS servers.
- Host: GitHub
- URL: https://github.com/mdawar/nats-dashboard
- Owner: mdawar
- License: mit
- Created: 2023-07-29T12:53:59.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-05-23T10:37:28.000Z (about 1 year ago)
- Last Synced: 2025-04-13T09:08:20.595Z (about 1 month ago)
- Topics: dashboard, monitoring, nats
- Language: TypeScript
- Homepage: https://natsdashboard.com
- Size: 1.22 MB
- Stars: 156
- Watchers: 3
- Forks: 21
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# NATS Web Dashboard
A web dashboard to display live [NATS server](https://nats.io) monitoring metrics.
[Live demo](https://natsdashboard.com/?url=https%3A%2F%2Fdemo.nats.io%3A8222) monitoring the demo NATS server at https://demo.nats.io:8222.
## About
This is a **static web app** that was inspired by [nats-top](https://github.com/nats-io/nats-top), it fetches and displays the monitoring stats of a [NATS server](https://nats.io) but in the browser instead of the CLI.
Since this is a static web app, it **can be deployed anywhere** and can also **run locally** on your machine.
This is also a **PWA** (Progressive Web App) so it's installable and usable offline, but of course you need access to the NATS server, for example you can monitor a local NATS server while being offline.
There's **no backend** involved, the requests are made directly from the browser, so you can monitor a **local NATS server** (http://localhost:8222) even when the app is not running locally.
There's **no data retention**, so no historical stats can be displayed, you will only be able to view the live server stats, if you need this feature you should use a Prometheus exporter with Grafana and set an appropriate data retention policy.
## Using the App
#### PWA
The app is deployed on [Cloudflare Pages](https://pages.cloudflare.com) at:
https://natsdashboard.com
The app can be installed on your device for offline use (Desktop or mobile).
#### Docker Image
```sh
docker run --rm -it -p 8000:80 mdawar/nats-dashboard
```The image uses [Caddy server](https://caddyserver.com) and exposes port `80`.
In the example above we map the image port `80` to port `8000` on `localhost`.
**Note**: You can use a custom server configuration (`Caddyfile`) and mount it at `/etc/caddy/Caddyfile`.
#### Build Files
The build files are available on the releases page in a `build.zip` file.
You can serve the app locally using any HTTP server.
Serving using Python's HTTP server:
```sh
cd ./dist && python -m http.server
```Serving using Caddy server:
```sh
docker run --rm -it -p 8000:80 -v ./dist:/usr/share/caddy caddy
```## Configuration
The app uses a runtime JSON config file served at `/config.json`.
You can run the Docker image and mount the `config.json` file at `/srv/config.json`.
#### Configuration Options
| Name | Type | Description |
| ----------------- | ---------- | ------------------------------------------- |
| `server` | `Server` | Default NATS server to monitor. |
| `servers` | `Server[]` | List of NATS servers to suggest in the app. |
| `hideServerInput` | `boolean` | Hide the server URL input. |The `Server` type definition:
```ts
interface Server {
/** Server display name (Optional). */
name?: string;
/** Server URL. */
url: string;
}
```#### Example Config File
```json
{
"server": {
"name": "My NATS Server",
"url": "http://nats:8222"
},
"servers": [
{
"name": "localhost",
"url": "http://localhost:8222"
},
{
"name": "demo.nats.io",
"url": "https://demo.nats.io:8222"
}
],
"hideServerInput": false
}
```#### Single Server Config Example
This configuration is suitable for monitoring a single NATS server.
```json
{
"server": {
"name": "My NATS Server",
"url": "http://nats:8222"
},
"hideServerInput": true
}
```## Internal NATS Servers
The app can monitor NATS servers accessible to the user only, so any NATS servers accessible on your network can be monitored.
To monitor NATS servers on a private network, you can run your own instance of the app using the Docker image and configure a reverse proxy to the NATS monitoring server.
Example Docker compose configuration:
```yml
services:
# Internal NATS server.
server:
image: nats:2.10
command: -n internal-server -m 8222 -js# NATS dashboard instance running on the same private network.
dashboard:
image: mdawar/nats-dashboard
environment:
# The NATS monitoring server will be proxied on /proxy/* on the frontend.
# See: config/Caddyfile for the reverse proxy configuration.
REVERSE_PROXY_UPSTREAM: 'server:8222'
volumes:
# Optional config file.
- ./config.json:/srv/config.json
ports:
- target: 80
published: 8000
protocol: tcp
```Now when using the app you can monitor this private NATS server using the path `/proxy/` on the same domain.
This is an example `config.json` file to set the default URL and disable the URL input:
```json
{
"server": {
"name": "Internal Server",
"url": "https://natsdashboard.example.com/proxy/"
},
"hideServerInput": true
}
```Replace the server `url` with the actual NATS dashboard URL.
**Warning**: Your NATS monitoring server will be exposed to the public, you will have to make sure that you secure your NATS dashboard instance.
## Limitations
#### Mixed Content
> An HTTPS page that includes content fetched using cleartext HTTP is called a mixed content page.
If the app is served over `HTTPS` you won't be able to monitor NATS servers served over `HTTP` (Most browsers block mixed content).
This is the case when using the app hosted on https://natsdashboard.com.
**Note**: This does not affect NATS servers running on `localhost`.
**Solutions**:
1. Serve the NATS monitoring server over `HTTPS`.
2. Reverse proxy the monitoring server on `localhost` (Browsers allow locally delivered mixed content).For example:
```sh
# Reverse proxy a NATS monitoring server on localhost:8222.
# Now http://localhost:8222 can be used to monitor the server without it being blocked by the browser.
docker run --rm -it --net host caddy caddy reverse-proxy --from http://localhost:8222 --to http://example.com:8222
```## Development
#### Requirements
- **Node**: Version defined in `.nvmrc` file (If you have `nvm` installed, run `nvm use`)
- **Docker** + **Compose Plugin** (Optional): Used for running a local NATS server and the app previewInstall the required packages:
```sh
npm i
```#### Run the web app in dev mode
```sh
npm start
```#### Run a local NATS server
```sh
# Start a local NATS server using Docker compose
just server
# Or
make server
# Remove containers and volumes
just clean
# Or
make clean
```#### Run the tests
There are a few tests for a couple of functions for now, more tests will be added later.
```sh
npm test
# Run the tests and watch for changes
npm run test:watch
```## Build the App
#### Build the Web App
```sh
# Build a static web app to ./dist
npm run build
```To build a sitemap and to have proper URL meta tags, the `SITE_DOMAIN` environment variable must be set.
```sh
# The SITE_DOMAIN env variable sets the Astro.site config.
SITE_DOMAIN=https://example.com npm run build
```#### Build Docker Image
Build using Docker compose:
```sh
just build
# Or
make build
# Or
docker compose build
```The environment variable `SITE_DOMAIN` will be passed as a build argument if set.
Or using the Docker CLI:
```sh
docker build -t nats-dashboard .
# The site domain can be passed as a build arg.
docker build -t nats-dashboard --build-arg SITE_DOMAIN=https://example.com .
```## Build and Preview
Build the Docker image and run the server on http://localhost:8000 with a NATS server running on port `4222`.
This is useful for testing **SSG** and the **PWA** config (eg: service worker).
```sh
just preview
# Or
make preview
# Or
docker compose build && docker compose up
```The environment variable `SITE_DOMAIN` will be passed as a build argument if set.
Cleanup:
```sh
# Remove containers and volumes
just clean
# Or
make clean
# Or
docker compose down -v
```## Data Fetching
By default the data is fetched using the [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) since NATS server started supporting [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) in [v2.9.22](https://github.com/nats-io/nats-server/releases/tag/v2.9.22).
For NATS servers `< v2.9.22` there's an option to use [JSONP](https://en.wikipedia.org/wiki/JSONP) requests that fetch the data by injecting a `` tag that executes and calls a JavaScript function that receives the data.
This option must be explicitly enabled in the app settings.
## Service Worker
The service worker is generated after the site is built, it's available at `src/sw.ts`, it's built by `vite` using the script `scripts/build-sw.mjs` and then the [Workbox](https://developer.chrome.com/docs/workbox) precache manifest is injected by the `scripts/workbox.mjs` script.
The service worker is registered only in production mode by the script `src/sw-register.ts` that's imported by the base layout at `src/layouts/Base.astro`.
To test locally, use `just preview` to build the Docker container and run a Caddy server similar to a production environment.
#### Generate the Service Worker
```sh
# This is automatically run after the build script.
npm run generateSW
```## GitHub Actions Requirements
#### Repository Variables
| Variable Name | Description |
| ---------------- | -------------------------------------------------------------- |
| `DOCKERHUB_USER` | Required to push the Docker image to Docker Hub. |
| `SITE_DOMAIN` | Needed to generate a sitemap and the URL meta tags (Optional). |#### Repository Secrets
| Secret Name | Description |
| ----------------------- | ------------------------------------------------------------ |
| `CLOUDFLARE_ACCOUNT_ID` | Required for uploading the assets to Cloudflare Pages. |
| `CLOUDFLARE_ZONE_ID` | Required for purging the zone cache. |
| `CLOUDFLARE_API_TOKEN` | Required for Clouflare Pages and for purging the zone cache. |
| `DOCKERHUB_TOKEN` | Required to push the Docker image to Docker Hub. |#### Required Permissions
- Cloudflare [API Token](https://dash.cloudflare.com/profile/api-tokens) with the following permissions:
- Account > Cloudflare Pages > Edit
- Zone > Cache Purge > Purge- Docker Hub [token](https://hub.docker.com/settings/security) with **Read, write, delete** scope.
## Alternatives
- [nats-top](https://github.com/nats-io/nats-top): A top-like tool for monitoring NATS servers.
- [prometheus-nats-exporter](https://github.com/nats-io/prometheus-nats-exporter): A Prometheus exporter for NATS metrics.
- [nats-surveyor](https://github.com/nats-io/nats-surveyor): Another Prometheus exporter.## Credits
- [Astro](https://astro.build/): Web Framework
- [Solid](https://www.solidjs.com/): UI Framework
- [TanStack Query](https://tanstack.com/query/latest): Asynchronous state management
- [Tailwind UI](https://tailwindui.com/): Tailwind CSS components
- [Heroicons](https://heroicons.com/): SVG Icons
- [CNCF Artwork](https://github.com/cncf/artwork): NATS logo
- [Workbox](https://developer.chrome.com/docs/workbox/): Service worker libraries and tooling