NPMDeck is a modern, responsive web interface for Nginx Proxy Manager. Built with React, Material-UI, and Express.js, it provides an improved user experience with powerful features and a beautiful design.
Important
NPMDeck does NOT access your database directly!
NPMDeck works exclusively through the official Nginx Proxy Manager API. This means:
- β No database access - We never touch your database
- β API-only communication - All operations go through NPM's REST API
- β No data storage - NPMDeck doesn't store any of your data
- β Secure by design - Same security as the official NPM interface
- β Compatible - Works with any NPM installation that has API access
- π Dark Mode - Built-in dark theme with system preference detection
- π Global Search - Search across all resources
- π¨ Customizable UI - Choose between drawer and dialog views
- π Permission System
- β‘ Blazing Fast - Built with Vite and React 18 for optimal performance
- π― Smart Filters - Advanced filtering and sorting options
- π Enhanced Domain Input - Smart URL parsing with automatic cleaning and validation
- β Node.js 20+ (LTS recommended)
- π¦ pnpm 8+ (Package Manager)
- π³ Docker (optional, for containerized deployment)
- π§ Running instance of Nginx Proxy Manager backend
# 1. Clone the repository
git clone https://github.com/smartlabsAT/NPMDeck.git
cd NPMDeck
# 2. Install pnpm (if not already installed)
npm install -g pnpm
# 3. Install dependencies
pnpm install
# 4. Configure environment
cp .env.example .env
# Edit .env with your NPM backend URLEdit .env and set your NPM backend URL:
NPM_API_URL=http://localhost:81 # Your NPM backend address
PORT=3000 # Express server portpnpm run devThis starts two servers simultaneously:
- π₯ Vite Dev Server: http://localhost:5173 (React app with hot reload)
- π Express Server: http://localhost:3000 (API proxy to NPM backend)
Open http://localhost:5173 in your browser for development.
docker-compose up devThis starts:
- π NPMDeck development container with hot reload
- π Watches for file changes and automatically rebuilds
# Build the application
pnpm run build
# Start production server
pnpm startThe application will be available at http://localhost:3000
# Build the image
docker build -t npmdeck:latest .Create a docker-compose.yml file:
version: '3.8'
services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: npm
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
environment:
- DB_MYSQL_HOST=db
- DB_MYSQL_PORT=3306
- DB_MYSQL_USER=npm
- DB_MYSQL_PASSWORD=${MYSQL_PASSWORD}
- DB_MYSQL_NAME=npm
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- proxy
depends_on:
- db
db:
image: 'mariadb:10.11'
container_name: npm-db
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=npm
- MYSQL_USER=npm
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
volumes:
- ./mysql:/var/lib/mysql
networks:
- proxy
npmdeck:
image: npmdeck:latest
container_name: npmdeck
restart: unless-stopped
ports:
- '82:3000' # Access NPMDeck on port 82
environment:
# For macOS Docker Desktop use:
- NPM_API_URL=http://host.docker.internal:81
# For Linux or container-to-container:
# - NPM_API_URL=http://nginx-proxy-manager:81
depends_on:
- nginx-proxy-manager
networks:
- proxy
networks:
proxy:
driver: bridgeImportant
macOS Users: Use host.docker.internal for NPM_API_URL when NPM runs on the host or in another Docker network.
Linux Users: Use the container name (e.g., nginx-proxy-manager) for container-to-container communication.
Start everything:
docker-compose up -dAccess:
- NPM Admin: http://localhost:81
- NPMDeck: http://localhost:82
- Proxy: http://localhost:80
# For macOS (NPM on host or different network)
docker run -d \
--name npmdeck \
-p 3000:3000 \
-e NPM_API_URL=http://host.docker.internal:81 \
npmdeck:latest
# For Linux or same Docker network
docker run -d \
--name npmdeck \
--network npm-network \
-p 3000:3000 \
-e NPM_API_URL=http://nginx-proxy-manager:81 \
npmdeck:latest| Variable | Description | Default |
|---|---|---|
PORT |
Server port | 3000 |
NODE_ENV |
Environment mode | development |
NPM_API_URL |
NPM backend URL | http://localhost:81 |
NPMDeck/
βββ π src/ # React frontend source
βββ π server/ # Express backend server
β βββ π routes/ # API routes
β βββ π config/ # Server configuration
β βββ π index.js # Main server file
βββ π dist/ # Built frontend (generated)
βββ π public/ # Static assets
NPMDeck acts as a proxy between the frontend and NPM backend:
- β‘οΈ All
/api/*requests are proxied to the NPM backend - π Authentication headers are automatically forwarded
- π Additional dashboard-specific endpoints at
/api/dashboard/*
pnpm run dev- π Start development servers (Vite + Express)pnpm run build- ποΈ Build for productionpnpm start-βΆοΈ Start production serverpnpm run lint- π Run ESLintpnpm run typecheck- π Run TypeScript type checkingpnpm run test- π§ͺ Run tests (when available)pnpm run docker:build- π³ Build Docker imagepnpm run docker:run- π Run Docker containerpnpm run clean- π§Ή Clean build artifacts
- Frontend: βοΈ React 18, TypeScript, Material-UI v5, Vite
- Backend: π’ Express.js, http-proxy-middleware
- State Management: π» Zustand, React Query
- Routing: π£οΈ React Router v6
- Build: β‘ Vite, π³ Docker
This project uses GitHub Actions for continuous integration:
- Code Quality: Automatic TypeScript and ESLint checks on every push
- Build Tests: Ensures the project builds successfully
- Docker Build: Validates Docker image creation
- PR Checks: Automated quality gates for pull requests
Before committing, run:
# Type checking
pnpm run typecheck
# Linting
pnpm run lint
# Build test
pnpm run buildWe love contributions! Here's how you can help:
- π΄ Fork the repository
- π Create your feature branch (
git checkout -b feature/amazing-feature) - πΎ Commit your changes (
git commit -m 'Add amazing feature') - π€ Push to the branch (
git push origin feature/amazing-feature) - π Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- π― Nginx Proxy Manager for the excellent backend
- πͺ The NPM community for feedback and contributions
- β€οΈ All our contributors and supporters
Cannot connect to NPM backend:
- Ensure NPM is running and accessible
- Check
NPM_API_URLin your.envfile - For Docker: Use
host.docker.internalon macOS or container name on Linux
Build fails with TypeScript errors:
pnpm run typecheck # Check for type errors
pnpm run lint # Check for linting issuesPort already in use:
- Change the port in
.envfile - Or stop the conflicting service
- π Documentation
- π Issue Tracker
- π¬ Discussions
β Star us on GitHub β it motivates us a lot!
