444d694a0613abcfc4bfaee9b9f85b5829c369c7
RackMapper
A self-hosted, dark-mode web app for visualising and managing network rack infrastructure. Built for Unraid / Docker single-container deployment.
Features
Rack Planner (/rack)
- Drag-and-drop module placement from a device palette onto U-slots
- Drag modules between racks or reorder racks via header grip
- Resize modules by dragging the bottom handle
- Click any module to edit name, IP, manufacturer, model, notes, uSize
- Port indicator dots — click any dot to open the port configuration modal
- Set mode (Access / Trunk / Hybrid), native VLAN, tagged VLANs
- Quick-create VLANs without leaving the modal
- Export the full rack view as PNG
Service Mapper (/map)
- React Flow canvas for mapping service dependencies and traffic flows
- Right-click canvas → add any node type at cursor position
- Right-click node → Edit, Duplicate, Delete
- Right-click edge → Toggle animation, change edge type, Delete
- Double-click a node → edit label, accent colour, logical IP/Port, and rack module link
- Logical Address mapping — assign IP and Port to any node type via metadata (stored as JSON)
- Persistent storage — all node details and logical addresses are saved to the SQLite database
- Auto-populate nodes from all rack modules ("Import Rack" button)
- Connect nodes by dragging from handles; Delete key removes selected items
- Minimap, zoom controls, snap-to-grid (15px), PNG export
VLAN Management (/vlans)
- Create, edit, and delete VLANs with ID, name, description, and colour
- VLANs defined here are available in all port configuration modals
Quick Start (Docker Compose)
1. Create a docker-compose.yml:
version: '3.8'
services:
rackmapper:
image: rackmapper
build: .
container_name: rackmapper
ports:
- "3001:3001"
environment:
- NODE_ENV=production
- PORT=3001
- DATABASE_URL=file:./data/rackmapper.db
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=yourpassword
- JWT_SECRET=your-random-secret-min-32-chars
- JWT_EXPIRY=8h
volumes:
- ./data:/app/data
restart: unless-stopped
2. Build and run:
docker compose up --build -d
3. Open http://localhost:3001 and log in with the credentials above.
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
ADMIN_USERNAME |
Yes | admin |
Login username |
ADMIN_PASSWORD |
Yes | — | Login password (plain text) |
JWT_SECRET |
Yes | — | Secret for signing JWTs (min 32 chars) |
JWT_EXPIRY |
No | 8h |
Session token lifetime |
DATABASE_URL |
No | file:./data/rackmapper.db |
SQLite file path |
PORT |
No | 3001 |
HTTP port |
NODE_ENV |
No | — | Set to production in Docker |
To change the password, update ADMIN_PASSWORD in your Docker environment and restart the container.
Data Persistence
The SQLite database is stored at ./data/rackmapper.db inside the container. Mount ./data:/app/data to persist it across container restarts (already included in the compose file above).
Tech Stack
| Layer | Technology |
|---|---|
| Frontend | React 18 + TypeScript + Vite |
| Styling | Tailwind CSS (dark-mode only) |
| State | Zustand |
| Node Graph | React Flow (@xyflow/react v12+) |
| Drag & Drop | @dnd-kit/core + @dnd-kit/sortable |
| Backend | Node.js + Express |
| Database | SQLite via Prisma ORM (better-sqlite3) |
| Auth | JWT in httpOnly cookie |
| Containerisation | Docker — single container serves API + static build |
Description
Languages
TypeScript
98.2%
Dockerfile
0.5%
JavaScript
0.5%
CSS
0.4%
Shell
0.2%
Other
0.2%