A customizable web dashboard for managing and monitoring multiple servers. Execute remote commands, monitor system status, and access services through a unified interface.
- Remote Command Execution: Create buttons that execute SSH commands on your servers
- Status Monitoring: Real-time widgets for ZFS health, disk usage, Docker containers, and more
- Quick Links: Easy access to web services (Proxmox, Portainer, Grafana, etc.)
- Customizable: JSON-based configuration with web UI editor
- Docker-based: Easy deployment with Docker Compose
cd HomeLabOverviewnote: Make sure to replace the placeholder in the project with your IP address.
make buildmake upAccess the dashboard at: http://localhost
The dashboard needs SSH access to your servers. There are two methods:
Your ~/.ssh directory is already mounted in the container. Make sure your servers accept your SSH key:
# On your local machine, copy your SSH key to servers
ssh-copy-id user@your-server-ipConfigure servers with password in data/config.json:
{
"servers": [
{
"id": "server1",
"name": "My Server",
"host": "<IP_ADDRESS>",
"port": 22,
"username": "admin",
"password": "your-password"
}
]
}Note: Password auth is less secure. SSH keys are recommended.
Copy the example config:
cp data/config.example.json data/config.jsonEdit data/config.json with your servers, or use the web UI (click "Edit Config").
Define your server connections:
{
"servers": [
{
"id": "homelab",
"name": "Home Lab Server",
"host": "<IP_ADDRESS>",
"port": 22,
"username": "admin",
"privateKeyPath": "/root/.ssh/id_rsa"
}
]
}Authentication Options:
privateKeyPath: Path to SSH private key (inside container:/root/.ssh/id_rsa,/root/.ssh/id_ed25519, etc.)password: SSH password (if not using keys)- If neither is specified, defaults to
/root/.ssh/id_rsa
Create buttons that run commands:
{
"commandButtons": [
{
"id": "restart-docker",
"label": "Restart Docker",
"serverId": "homelab",
"command": "sudo systemctl restart docker",
"color": "bg-blue-600 hover:bg-blue-700"
}
]
}Monitor server status:
{
"statusWidgets": [
{
"id": "zfs-pool",
"type": "zfs",
"label": "ZFS Pool Status",
"serverId": "homelab",
"command": "zpool status",
"refreshInterval": 30000
},
{
"id": "disk-space",
"type": "disk",
"label": "Disk Usage",
"serverId": "homelab",
"command": "df -h",
"refreshInterval": 60000
}
]
}Add links to services with icons:
{
"quickLinks": [
{
"id": "proxmox",
"label": "Proxmox",
"url": "https://proxmox.local:8006",
"icon": "server",
"description": "VM Management"
},
{
"id": "jellyfin",
"label": "Jellyfin",
"url": "http://<IP_ADDRESS>:8096",
"icon": "video",
"description": "Media Server"
}
]
}Available Icons:
server- Server/VM managementcontainer- Docker/Container servicesdatabase- Database servicesvideo- Media servers (Jellyfin, Emby)tv- Streaming (Plex, TV apps)film- Movie librariesmusic- Music servicesdownload- Download managerschart- Monitoring (Grafana, charts)settings- Configuration panelsshield- Security servicesnetwork- Network toolscloud- Cloud storage (Nextcloud)hard-drive- Storage managementfile- File managersbook- Documentation/Wikihome- Home automationfolder- File browsersbox- Generic servicesglobe- Web appsmonitor- Monitoring dashboards
make build # Build Docker images
make up # Start containers
make down # Stop containers
make restart # Restart containers
make logs # View all logs
make logs-backend # View backend logs only
make logs-frontend # View frontend logs only
make clean # Remove containers and images-
Check SSH key permissions on your local machine:
chmod 600 ~/.ssh/id_rsa chmod 700 ~/.ssh
-
Verify SSH access from your machine:
ssh user@server-ip
-
Check container SSH access:
docker exec -it server-dashboard-backend sh ls -la /root/.ssh/ -
Test SSH from container:
docker exec -it server-dashboard-backend ssh user@server-ip -
Check backend logs:
make logs-backend
# Check logs
docker logs server-dashboard-backend
docker logs server-dashboard-frontend
# Rebuild
make clean
make build
make upEdit docker-compose.yml to change ports:
frontend:
ports:
- "8080:80" # Change 8080 to any available port
backend:
ports:
- "3002:3001" # Change 3002 to any available port- SSH Keys: Keep private keys secure. The container mounts
~/.sshas read-only. - Network Access: Only expose ports on trusted networks.
- HTTPS: Consider adding a reverse proxy with SSL for production use.
- Passwords: Avoid storing passwords in config. Use SSH keys instead.
- Sudo Commands: Be careful with commands requiring sudo. Ensure proper sudoers configuration on servers.
Run in development mode with hot reload:
# Terminal 1
make backend-dev
# Terminal 2
make frontend-devFrontend: http://localhost:3000 Backend: http://localhost:3001
- Frontend: React + TypeScript + Vite + Tailwind CSS
- Backend: Node.js + Express + TypeScript
- SSH: node-ssh library for remote command execution
- Deployment: Docker + Docker Compose
MIT