Reviewed-on: #2
vps/fleet
A self-hosted VPS fleet manager — track every server you own in one dark, minimal dashboard.
Features
- 📊 Fleet stats — live totals for online / offline / maintenance counts and monthly spend
- 🃏 Server cards — status dot, IP, CPU · RAM · Disk chips, and price at a glance
- ✏️ Full CRUD — add, edit, and delete servers via a clean modal form
- 🗺️ Interactive map — Leaflet.js world map; locations geocoded automatically via OpenStreetMap
- 💾 Zero-config storage — flat-file JSON, no database, no migrations
- 🌑 Dark theme — GitHub-style
#0d1117palette with IBM Plex Mono / Sans - 📄 Single HTML file — no bundler, no framework, no build step
Requirements
| Dependency | Version |
|---|---|
| Node.js | 18 or higher |
| npm | included with Node |
Quick Start
git clone https://github.com/your-username/vps-manager.git
cd vps-manager
npm install
npm start
Open http://localhost:8095 in your browser.
Windows — double-click
start.batLinux / macOS —
chmod +x start.sh && ./start.sh
Docker
One command — no Node.js install required.
docker compose up -d
Open http://localhost:8095 in your browser. Server data is persisted in ./data/ on the host via a bind mount, so it survives container restarts and rebuilds.
To stop:
docker compose down
To rebuild after pulling changes:
docker compose up -d --build
To run without Compose (manual):
docker build -t vps-fleet .
docker run -d -p 8095:8095 -v "$(pwd)/data:/app/data" --name vps-fleet vps-fleet
Usage
Add a server — click + Add Server in the top-right corner. Only the hostname is required; all other fields are optional. Enter a location and a map pin is placed automatically.
Edit — click the pencil icon on any card to reopen the form pre-filled with its data.
Delete — click the trash icon on any card. The change is saved immediately.
Map view — switch to the map tab to see all geocoded servers plotted on a world map. Click a pin for a quick summary.
API
All data is served over a local REST API on port 8095.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/servers |
Return all servers |
POST |
/api/servers |
Create or update a server (id present = update) |
DELETE |
/api/servers/:id |
Delete a server by ID |
Server object
{
"id": "srv_1700000000000",
"name": "prod-app-01",
"status": "online",
"ipv4": "203.0.113.42",
"ipv6": "2001:db8::1",
"provider": "DigitalOcean",
"plan": "s-2vcpu-4gb",
"cpu": "2",
"ram": "4",
"disk": "80",
"price": "24.00",
"billing": "monthly",
"renewal": "2026-07-01",
"location": "Toronto, Canada",
"region": "ca-central",
"sites": "myapp.example.com",
"notes": "Primary application node"
}
Configuration
| Variable | Default | Description |
|---|---|---|
PORT |
8095 |
Port the server listens on |
PORT=3000 npm start
Project Structure
vps-manager/
├── server.js # Express server · REST API · geocoding
├── vps_manager.html # Full UI — HTML + CSS + JS in one file
├── package.json # Dependencies
├── start.bat # Windows launcher
├── start.sh # Linux / macOS launcher
└── data/
└── servers.json # Auto-created on first run (gitignored)
License
Released under the MIT License.