Files
nats-console/README.md
T
2025-12-05 15:14:24 +05:30

473 lines
12 KiB
Markdown

# NATS JetStream Console
A modern, enterprise-grade web console for managing NATS JetStream clusters. Built with Next.js, Node.js, and TypeScript, featuring real-time monitoring and a developer-friendly experience.
**Maintained by [KLogic](https://klogic.io)**
![NATS Console](https://img.shields.io/badge/NATS-JetStream-blue)
![TypeScript](https://img.shields.io/badge/TypeScript-5.0-blue)
![Next.js](https://img.shields.io/badge/Next.js-15-black)
![Fastify](https://img.shields.io/badge/Fastify-5-black)
## Features
- **Multi-cluster Management** - Connect and manage multiple NATS JetStream clusters
- **Stream Management** - Create, configure, and monitor streams with message browser
- **Consumer Management** - Manage consumers with real-time lag visualization
- **Real-time Metrics** - Live dashboards with ClickHouse-backed analytics
- **Alerting** - Configurable alerts for lag, throughput, and errors
- **Team Collaboration** - Multi-tenant with organizations and teams
## Tech Stack
| Layer | Technology |
|-------|------------|
| Frontend | Next.js 15, React 19, TypeScript, TailwindCSS, shadcn/ui, TanStack Query |
| Backend | Fastify, Prisma ORM, PostgreSQL |
| Metrics | ClickHouse (time-series), Redis (cache/sessions) |
| Messaging | NATS JetStream |
---
## Deployment Options
Choose the deployment method that fits your needs:
| Method | Use Case | Complexity |
|--------|----------|------------|
| [All-in-One Docker](#1-all-in-one-docker-image) | Quick demos, testing, local dev | Simple |
| [Docker Compose (All-in-One)](#2-docker-compose-all-in-one) | Easy deployment with volume persistence | Simple |
| [Docker Compose (Production)](#3-docker-compose-production) | Production deployments | Medium |
| [Local Development](#4-local-development-mode) | Active development with hot reload | Medium |
---
## 1. All-in-One Docker Image
The simplest way to try NATS Console. A single container with all services embedded.
### Quick Start
```bash
# Build the image
docker build -t nats-console:allinone .
# Run the container
docker run -d \
--name nats-console \
-p 3000:3000 \
-p 3001:3001 \
-p 4222:4222 \
-p 8222:8222 \
-e JWT_SECRET="your-secret-key-change-in-production" \
nats-console:allinone
```
### Access
| Service | URL |
|---------|-----|
| Web Dashboard | http://localhost:3000 |
| API | http://localhost:3001 |
| NATS Client | nats://localhost:4222 |
| NATS Monitoring | http://localhost:8222 |
### With Data Persistence
```bash
docker run -d \
--name nats-console \
-p 3000:3000 \
-p 3001:3001 \
-p 4222:4222 \
-v nats-console-postgres:/var/lib/postgresql/data \
-v nats-console-redis:/var/lib/redis \
-v nats-console-clickhouse:/var/lib/clickhouse \
-v nats-console-nats:/var/lib/nats \
-e JWT_SECRET="your-secret-key-change-in-production" \
nats-console:allinone
```
---
## 2. Docker Compose (All-in-One)
Same all-in-one container but managed with Docker Compose for easier configuration.
```bash
# Start
docker-compose -f docker-compose.allinone.yml up -d
# View logs
docker-compose -f docker-compose.allinone.yml logs -f
# Stop
docker-compose -f docker-compose.allinone.yml down
# Stop and remove data
docker-compose -f docker-compose.allinone.yml down -v
```
### Custom Configuration
Create a `.env` file:
```bash
cp .env.example .env
# Edit .env with your settings
```
```env
JWT_SECRET=your-secure-random-string-here
JWT_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=7d
```
---
## 3. Docker Compose (Production)
For production deployments with separate, scalable services.
### Prerequisites
- Docker & Docker Compose
- At least 4GB RAM recommended
### Setup
1. **Create environment file**
```bash
cp .env.example .env.prod
```
2. **Edit production environment** (`.env.prod`)
```env
NODE_ENV=production
# Database
DATABASE_URL=postgresql://nats_console:secure_password@postgres:5432/nats_console
POSTGRES_PASSWORD=secure_password
# Redis
REDIS_URL=redis://redis:6379
# ClickHouse
CLICKHOUSE_URL=http://clickhouse:8123
CLICKHOUSE_DATABASE=nats_console
# NATS
NATS_URL=nats://nats:4222
# Security (IMPORTANT: Use a secure random string!)
JWT_SECRET=generate-with-openssl-rand-hex-32
JWT_EXPIRES_IN=15m
JWT_REFRESH_EXPIRES_IN=7d
```
3. **Start services**
```bash
# Build and start
docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d
# Run database migrations
docker-compose -f docker-compose.prod.yml exec api npx prisma migrate deploy
# Check status
docker-compose -f docker-compose.prod.yml ps
# View logs
docker-compose -f docker-compose.prod.yml logs -f
```
### With Nginx Reverse Proxy
```bash
# Include nginx profile
docker-compose -f docker-compose.prod.yml --profile with-nginx up -d
```
### Scaling
```bash
# Scale API instances
docker-compose -f docker-compose.prod.yml up -d --scale api=3
# Scale workers
docker-compose -f docker-compose.prod.yml up -d --scale workers=2
```
---
## 4. Local Development Mode
For active development with hot reload. Infrastructure runs in Docker, apps run locally.
### Prerequisites
- Node.js 20+
- pnpm 9+
- Docker & Docker Compose
### Setup
1. **Clone and install**
```bash
git clone https://github.com/your-org/nats-console.git
cd nats-console
pnpm install
```
2. **Start infrastructure services**
```bash
# Start PostgreSQL, Redis, ClickHouse, NATS
docker-compose -f docker-compose.dev.yml up -d
# Or use the existing docker-compose.yml
docker-compose up -d
```
3. **Setup environment**
```bash
# Copy environment files
cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env
cp apps/workers/.env.example apps/workers/.env
```
4. **Initialize database**
```bash
# Generate Prisma client
make prisma-generate
# Run migrations
make prisma-migrate
```
5. **Start development servers**
```bash
# Start all services with hot reload
make dev
# Or start individually
make api-dev # API only
make web-dev # Web only
make workers-dev # Workers only
```
### Access
| Service | URL |
|---------|-----|
| Web Dashboard | http://localhost:3000 |
| API | http://localhost:3001 |
| NATS Monitoring | http://localhost:8222 |
| Prisma Studio | `make prisma-studio` |
### One-Command Setup
```bash
make setup && make dev
```
---
## Makefile Commands
### Development
```bash
make dev # Start all services in dev mode
make api-dev # Start API only
make web-dev # Start Web only
make workers-dev # Start Workers only
```
### Database Operations
```bash
make db-up # Start database containers
make db-down # Stop database containers
make db-shell-postgres # PostgreSQL shell
make db-shell-redis # Redis CLI
make db-shell-clickhouse # ClickHouse client
make db-shell-nats # NATS CLI
```
### Prisma
```bash
make prisma-generate # Generate Prisma client
make prisma-migrate # Run migrations
make prisma-studio # Open Prisma Studio
make prisma-reset # Reset database
```
### Build & Production
```bash
make build # Build all packages
make start # Start in production mode
make health # Check health of all services
```
### Docker
```bash
make docker-build-allinone # Build all-in-one image
make docker-up-allinone # Start all-in-one container
make docker-down # Stop all containers
```
---
## Architecture
```
┌─────────────────────────────────────────────────────────────────┐
│ Browser │
└─────────────────────────────┬───────────────────────────────────┘
│
┌─────▼─────┐
│ Web UI │
│ (Next.js) │
└─────┬─────┘
│ HTTP/REST
│
┌─────▼─────┐
│ API │◄─────────────────────────────┐
│ (Fastify) │ │
└─────┬─────┘ │
│ │
┌───────────────────┼───────────────────┐ │
│ │ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼──────┐
│ PostgreSQL│ │ Redis │ │ ClickHouse│ │ Workers │
│ (Data) │ │ (Cache) │ │ (Metrics) │ │(Background)│
└───────────┘ └───────────┘ └───────────┘ └─────┬──────┘
│
┌────────────────────────────────────────────────────────┘
│
│ ┌─────────────────────────────────────────────────────┐
│ │ NATS JetStream Clusters │
│ │ (Managed by API - streams, consumers, messages) │
└──► │
└─────────────────────────────────────────────────────┘
```
**Data Flow:**
- **Web UI → API**: All frontend requests go through the REST API
- **API → NATS**: API connects to NATS clusters to manage streams/consumers
- **Workers → NATS**: Background jobs for metrics collection and alerting
---
## Testing with Example Apps
The `examples/` directory contains sample NATS applications:
```bash
cd examples
# Install dependencies
pnpm install
# Setup example streams
pnpm run setup-streams
# Run message producer
pnpm run producer
# Run message consumer
pnpm run consumer
# Run high-volume load test
pnpm run load-test
```
---
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `NODE_ENV` | Environment mode | `development` |
| `PORT` | API server port | `3001` |
| `DATABASE_URL` | PostgreSQL connection string | - |
| `REDIS_URL` | Redis connection string | - |
| `CLICKHOUSE_URL` | ClickHouse HTTP URL | - |
| `NATS_URL` | NATS server URL | - |
| `JWT_SECRET` | JWT signing secret | - |
| `JWT_EXPIRES_IN` | Access token expiry | `15m` |
| `JWT_REFRESH_EXPIRES_IN` | Refresh token expiry | `7d` |
See `.env.example` for the complete list.
---
## Troubleshooting
### Container won't start
```bash
# Check logs
docker logs nats-console
# Check if ports are in use
lsof -i :3000,:3001,:4222
# Restart with fresh data
docker-compose down -v
docker-compose up -d
```
### Database connection issues
```bash
# Check PostgreSQL is running
docker exec nats-console-postgres pg_isready
# Check Redis
docker exec nats-console-redis redis-cli ping
# Check ClickHouse
curl http://localhost:8123/ping
```
### Reset everything
```bash
# Stop all containers and remove volumes
docker-compose down -v
# Remove images
docker rmi nats-console:allinone
# Start fresh
docker-compose up -d --build
```
---
## Contributing
1. Fork the repository
2. Create feature branch: `git checkout -b feature/my-feature`
3. Commit changes: `git commit -am 'Add feature'`
4. Push to branch: `git push origin feature/my-feature`
5. Open a Pull Request
---
## License
MIT License - see [LICENSE](./LICENSE) for details.