https://github.com/kzamanbd/browser-terminal
📝 Web SSH Client using ssh2, socket.io, xterm.js, and express. ⚡️
https://github.com/kzamanbd/browser-terminal
socket-io ssh ssh-client ssh2
Last synced: 13 days ago
JSON representation
📝 Web SSH Client using ssh2, socket.io, xterm.js, and express. ⚡️
- Host: GitHub
- URL: https://github.com/kzamanbd/browser-terminal
- Owner: kzamanbd
- License: mit
- Created: 2024-08-05T17:20:17.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2024-09-07T15:21:35.000Z (over 1 year ago)
- Last Synced: 2025-01-10T16:25:05.599Z (over 1 year ago)
- Topics: socket-io, ssh, ssh-client, ssh2
- Language: TypeScript
- Homepage: https://terminal-zit.vercel.app
- Size: 1.25 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 🌐 Browser Terminal
A modern, full-stack web-based SSH terminal client that enables secure connections to remote servers through your browser. This is a full stack application with React and Node.js, built with NestJS, Socket.IO, and xterm.js for a seamless terminal experience.
## 🚀 Features
- **SSH Terminal**: Connect to remote servers through your browser
- **Real-time Communication**: Socket.IO powered terminal interface
- **Theme Support**: Multiple terminal themes with xterm.js addons
- **Authentication**: Username/password and SSH key support
- **Responsive Design**: Works on desktop and mobile devices
- **Docker Ready**: Single image deployment with Nginx reverse proxy
- **Hot Reload**: Development environment with live code updates
## 🏗️ Architecture
**Monorepo Structure:**
- `apps/api` - NestJS backend with Socket.IO and SSH2
- `apps/client` - React frontend with xterm.js terminal
- Single Docker image with Nginx reverse proxy for production
- Docker Compose setup for local development
## 🛠️ Tech Stack
**Frontend:** React 18, TypeScript, Vite, Tailwind CSS, xterm.js
**Backend:** NestJS, Socket.IO, ssh2, Node.js 22+
**DevOps:** Docker, pnpm, Turborepo, Nginx
## 🚀 Quick Start
### Using Docker Hub Image (Recommended)
```bash
# Run the complete application with a single command
docker run -p 8080:80 -p 8081:8081 kzamanbd/terminal:latest
```
- **Client Application**: `http://localhost:8080`
- **API Server**: `http://localhost:8081`
- **Health Check**: `http://localhost:8080/health`
### Local Development
1. **Clone and install**
```bash
git clone
cd browser-terminal
pnpm install
```
2. **Start development servers**
```bash
# Option 1: Direct development (recommended)
pnpm dev # Start both API (8081) and client (5173)
# Option 2: Docker Compose development
pnpm docker:up # Start with Docker Compose
```
3. **Access the application**
- **Client**: `http://localhost:5173` (Vite dev server)
- **API**: `http://localhost:8081` (NestJS server)
- **Health Check**: `http://localhost:8081/health`
## 🐳 Docker Development
The project includes a complete Docker Compose setup for local development with hot reload:
```bash
# Start development environment
docker-compose up --build
# Start in background
docker-compose up -d --build
# Stop services
docker-compose down
# View logs
docker-compose logs -f
```
**Development Services:**
- **API**: `http://localhost:8081` (NestJS with watch mode)
- **Client**: `http://localhost:5173` (Vite dev server)
- **Health Check**: `http://localhost:8081/health`
## 🚀 Usage
1. **Connect to SSH Server**
- Enter server details (host, port, username)
- Provide authentication (password or SSH key)
- Click connect to start terminal session
2. **Use the Terminal**
- Execute commands as in a regular terminal
- Switch themes and customize experience
- Real-time output with Socket.IO
## 📋 Scripts
### Root Level Scripts
- `pnpm dev` - Start development servers (API + Client)
- `pnpm build` - Build for production
- `pnpm lint` - Run linting
- `pnpm format` - Format code with Prettier
- `pnpm docker:up` - Start with Docker Compose
- `pnpm docker:down` - Stop Docker Compose services
- `pnpm docker:build` - Build and push to Docker Hub
### API Scripts (`apps/api`)
- `pnpm dev` - Start with watch mode
- `pnpm start` - Start production build
- `pnpm build` - Build for production
- `pnpm test` - Run tests
### Client Scripts (`apps/client`)
- `pnpm dev` - Start Vite dev server
- `pnpm build` - Build for production
- `pnpm preview` - Preview production build
- `pnpm lint` - Run ESLint
## 🐳 Docker Hub
**Image:** `kzamanbd/terminal:latest`
### Production Deployment
```bash
# Run in production (single container)
docker run -d \
--name browser-terminal \
-p 80:80 \
-p 8081:8081 \
kzamanbd/terminal:latest
# With custom ports
docker run -d \
--name browser-terminal \
-p 8080:80 \
-p 8081:8081 \
kzamanbd/terminal:latest
```
### Build and Push
```bash
# Build and push new version
./scripts/docker-build-push.sh v1.0.0
# Or use npm script
pnpm docker:build
```
### Production Features
- **Single Image**: Contains both API and client
- **Nginx Reverse Proxy**: Serves client and proxies API requests
- **Health Monitoring**: Built-in health check endpoint
- **Optimized Build**: Multi-stage Docker build for minimal size
- **Process Management**: Uses tini for proper signal handling
## 🚀 Deployment Guide
### Docker Compose Deployment
Create a `docker-compose.prod.yml` file:
```yaml
services:
browser-terminal:
image: kzamanbd/terminal:latest
container_name: browser-terminal
restart: unless-stopped
ports:
- "80:80" # Client (nginx)
- "8081:8081" # API (direct access)
environment:
- NODE_ENV=production
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/health"]
interval: 30s
timeout: 10s
retries: 3
networks:
- app-network
networks:
app-network:
driver: bridge
```
Deploy with:
```bash
docker-compose -f docker-compose.prod.yml up -d
```
### Kubernetes Deployment
Create `k8s-deployment.yaml`:
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: browser-terminal
spec:
replicas: 2
selector:
matchLabels:
app: browser-terminal
template:
metadata:
labels:
app: browser-terminal
spec:
containers:
- name: browser-terminal
image: kzamanbd/terminal:latest
ports:
- containerPort: 80
- containerPort: 8081
env:
- name: NODE_ENV
value: "production"
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: browser-terminal-service
spec:
selector:
app: browser-terminal
ports:
- name: http
port: 80
targetPort: 80
- name: api
port: 8081
targetPort: 8081
type: LoadBalancer
```
Deploy with:
```bash
kubectl apply -f k8s-deployment.yaml
```
### Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `NODE_ENV` | Environment mode | `production` |
| `PORT` | API server port | `8081` |
### Health Checks
The application provides health check endpoints:
- **Client Health**: `GET /health` - Returns "healthy"
- **API Health**: `GET /health` - Returns `{"status":"ok"}`
### Monitoring
Monitor your deployment:
```bash
# Check container health
docker ps
docker logs browser-terminal
# Check API health
curl http://localhost:8081/health
# Check client health
curl http://localhost/health
```
## 🔧 Troubleshooting
### Common Issues
1. **Port Conflicts**
```bash
# Check what's using the ports
lsof -i :80
lsof -i :8081
# Use different ports
docker run -p 8080:80 -p 8081:8081 kzamanbd/terminal:latest
```
2. **Container Won't Start**
```bash
# Check logs
docker logs browser-terminal
# Check container status
docker ps -a
```
3. **API Not Responding**
```bash
# Test API directly
curl http://localhost:8081
# Check if container is running
docker exec -it browser-terminal ps aux
```
4. **Client Not Loading**
```bash
# Check nginx status
docker exec -it browser-terminal nginx -t
# Check if files are served
curl -I http://localhost
```
### Development Issues
1. **Dependencies Not Installing**
```bash
# Clear Docker cache
docker system prune -a
# Rebuild without cache
docker-compose build --no-cache
```
2. **Hot Reload Not Working**
```bash
# Ensure volume mounts are correct
docker-compose config
# Check file permissions
docker-compose exec api ls -la /app/apps/api
```
## 📝 License
MIT License - see [LICENSE](LICENSE) for details.
## 👨💻 Author
Kamruzzaman