|
Some checks are pending
Docker Publish / build-and-push (push) Waiting to run
Bump frontend package version to 2.0.0. Update Footer component to improve layout (wrap, spacing) and add Google Play and Apple App Store links with SVG icons and accessible labels; also tidy anchor class ordering. Regenerate/update routeTree to reorder/include the /scan-history route entries (no behavioral change expected beyond regeneration). |
||
|---|---|---|
| .github/workflows | ||
| frontend | ||
| home | ||
| mobile | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| env.example | ||
| LICENSE | ||
| multi-host.md | ||
| Readme.md | ||
VPS-Monitor
VPS-Monitor is an open-source, high-performance Docker container monitoring and management tool. Built for speed and ease of use, it provides real-time log streaming, container stats, image management, network visualization, alerting, and multi-host support through a clean, modern interface.
Stats
Images Managment
Network Info
Grouping by Compose files
Table of Contents
- Features
- Quick Start
- Installation
- Configuration
- API Reference
- Architecture
- Development
- Troubleshooting
Features
Container Management
- Start, stop, restart, and remove containers
- Real-time container state synchronization
- Filter by state (running, exited, paused, restarting, dead)
- Search by container name, ID, or image
- Group containers by Docker Compose project
- Sort by creation date with date range filtering
- Read-only mode for monitoring-only deployments
Real-Time Log Streaming
- Live log streaming with play/pause controls
- Historical log viewing with configurable line counts
- Auto-scroll toggle during streaming
- Toggleable timestamps and text wrapping
- Full-text search with highlighting and navigation
- Filter by log level (TRACE, DEBUG, INFO, WARN, ERROR, FATAL, PANIC)
- Log download in JSON or TXT format
Container Stats and Metrics
- Real-time CPU and memory usage via WebSocket
- Network I/O monitoring (RX/TX bytes)
- Block I/O statistics (read/write)
- Process count (PIDs) tracking
- Threshold-based alerting
Image Management
- List images across all Docker hosts
- View image details including size, tags, and creation date
- Pull images with real-time progress streaming
- Remove images with force option
- Multi-host image operations
Network Management
- View Docker networks across all hosts
- Network details including IPAM configuration
- Connected containers with IP and MAC addresses
- Internal/external network indicators
- IPv6 support status
Alerting and Notifications
- CPU and memory threshold monitoring
- Container stopped detection
- Webhook notifications (Slack, Discord, custom endpoints)
- In-memory alert history with acknowledge function
- Configurable check intervals
Multi-Host Docker Support
- Connect to local Unix sockets, remote SSH, or TCP endpoints
- Parallel queries across all hosts for performance
- Host-aware filtering and operations
- Secure SSH-based connections with key authentication
See the Multi-Host Setup Guide for detailed configuration.
Interactive Terminal
- WebSocket-based container terminal access
- Full terminal emulation with XTerm.js
- 10,000 line scrollback history
- Copy-to-clipboard support
Environment Variables Management
- View and edit container environment variables
- Bulk import from .env files
- Container recreation with updated variables
User Interface
- Clean dashboard with summary cards
- Light, dark, and system theme support
- Responsive design for mobile, tablet, and desktop
- Dedicated Capacitor-based mobile app in
mobile/ - Mobile routes for dashboard, stats, containers, images, networks, and alerts
- Mobile routes for walkthrough and About Us
- URL state persistence for shareable views
- Accessible UI components with Radix UI
Authentication and Security
- Optional JWT-based authentication
- SHA256 password+salt credential hashing
- Read-only mode support
- Per-request authorization
Mobile App
- React + Vite + Capacitor mobile client under
mobile/ - Authenticated login and URL-only login
- First-launch walkthrough with replay support
- About Us page with app metadata and support links
- Mobile dashboard with system stats and container cards
- Dedicated mobile stats page for running containers
- Container detail support for logs, live stats, terminal, and env variables
- Images, networks, and alerts screens adapted for mobile
- Mobile API smoke test and production checklist included in the repo
Quick Start
Using Docker Compose
services:
vps-monitor:
image: hhftechnology/vps-monitor:latest
ports:
- "6789:6789"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc:/host/proc:ro
- ./data:/data
environment:
- READONLY_MODE=false
- DOCKER_HOSTS=local=unix:///var/run/docker.sock
- HOSTNAME_OVERRIDE=Pangolin Host
docker compose up -d
Access the dashboard at http://localhost:6789
Mobile Quick Start
Run the backend:
cd home
go run ./cmd/server
In another terminal, run the mobile client:
cd mobile
npm install
npm run dev
Then:
- Open the mobile app in a browser, emulator, or Capacitor shell
- Connect to your backend URL, for example
http://localhost:6789 - Log in if authentication is enabled
- Complete the walkthrough on first launch
- Validate the API first with:
chmod +x home/scripts/mobile-api-smoke.sh
VPS_MONITOR_USERNAME=admin \
VPS_MONITOR_PASSWORD='your-password' \
home/scripts/mobile-api-smoke.sh http://localhost:6789
For the full mobile validation flow, see:
mobile/README.mdmobile/MOBILE_PROD_CHECKLIST.md
With Authentication
services:
vps-monitor:
image: hhftechnology/vps-monitor:latest
ports:
- "6789:6789"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /proc:/host/proc:ro
- ./data:/data
environment:
- JWT_SECRET=your-secret-key-minimum-32-characters
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD_SALT=mysalt
# Hash of "admin123mysalt"
- ADMIN_PASSWORD=200ceb26807d6bf99fd6f4f0d1ca54d410af42fd47c58747466549a8f2762e15
Generate password hash:
# Format: echo -n "password+salt" | shasum -a 256
echo -n "admin123mysalt" | shasum -a 256 | awk '{print $1}'
Installation
Prerequisites
- Docker 20.10 or higher
- Go 1.24 or higher (for building from source)
- Node.js 20 or higher with Bun (for frontend development)
- Node.js 20 or higher with npm (for mobile development)
From Source
# Clone repository
git clone https://github.com/hhftechnology/vps-monitor.git
cd vps-monitor
# Build backend
cd home
go build -o vps-monitor ./cmd/server
# Build frontend
cd ../frontend
bun install
bun run build
# Build mobile web bundle
cd ../mobile
npm install
npm run build
# Run
./vps-monitor
Using Docker
docker pull hhftechnology/vps-monitor:latest
docker run -d -p 6789:6789 -v /var/run/docker.sock:/var/run/docker.sock hhftechnology/vps-monitor:latest
Configuration
Environment Variables
Authentication (Optional)
| Variable | Description | Default |
|---|---|---|
JWT_SECRET |
Secret key for JWT tokens (min 32 chars) | None (auth disabled) |
ADMIN_USERNAME |
Admin username | None |
ADMIN_PASSWORD |
SHA256 hash of (password + salt) | None |
ADMIN_PASSWORD_SALT |
Salt for SHA256 password hashing | None |
Authentication is disabled when these variables are not set.
Server Configuration
| Variable | Description | Default |
|---|---|---|
READONLY_MODE |
Disable mutating operations | false |
HOSTNAME_OVERRIDE |
Custom hostname to display in UI | System hostname |
BACKEND_PORT |
Backend server port | 6789 |
FRONTEND_PORT |
Frontend dev server port | 2345 |
Docker Configuration
| Variable | Description | Default |
|---|---|---|
DOCKER_HOSTS |
Multi-host configuration | Local socket |
Format: name1=host1,name2=host2
Examples:
# Local only
DOCKER_HOSTS=local=unix:///var/run/docker.sock
# Local and remote
DOCKER_HOSTS=local=unix:///var/run/docker.sock,prod=ssh://deploy@prod.example.com
# Multiple remotes
DOCKER_HOSTS=us=ssh://root@us.example.com,eu=ssh://root@eu.example.com
Alert Configuration
| Variable | Description | Default |
|---|---|---|
ALERTS_ENABLED |
Enable alerting system | false |
ALERTS_WEBHOOK_URL |
Webhook URL for notifications | None |
ALERTS_CPU_THRESHOLD |
CPU usage alert threshold (0-100) | 80 |
ALERTS_MEMORY_THRESHOLD |
Memory usage alert threshold (0-100) | 90 |
ALERTS_CHECK_INTERVAL |
Check interval (Go duration) | 30s |
Example:
ALERTS_ENABLED=true
ALERTS_WEBHOOK_URL=https://hooks.slack.com/services/XXX/YYY/ZZZ
ALERTS_CPU_THRESHOLD=85
ALERTS_MEMORY_THRESHOLD=90
ALERTS_CHECK_INTERVAL=1m
API Reference
Authentication
POST /api/v1/auth/login
Request body:
{
"username": "admin",
"password": "password"
}
Response:
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}
Use the token in subsequent requests:
Authorization: Bearer <token>
Containers
GET /api/v1/containers # List all containers
GET /api/v1/containers/{id}?host={host} # Get container details
POST /api/v1/containers/{id}/start # Start container
POST /api/v1/containers/{id}/stop # Stop container
POST /api/v1/containers/{id}/restart # Restart container
POST /api/v1/containers/{id}/remove # Remove container
GET /api/v1/containers/{id}/logs/parsed # Get or stream parsed logs
GET /api/v1/containers/{id}/stats # Stream stats (WebSocket)
GET /api/v1/containers/{id}/stats/once # Get one stats snapshot
GET /api/v1/containers/{id}/exec # Terminal access (WebSocket)
GET /api/v1/containers/{id}/env # Get environment variables
PUT /api/v1/containers/{id}/env # Update environment variables
Note: container terminal access is implemented on /api/v1/containers/{id}/exec. Older references to /api/v1/containers/{id}/terminal are legacy naming and not the current documented route.
Images
GET /api/v1/images # List all images
GET /api/v1/images/{id}?host={host} # Get image details
DELETE /api/v1/images/{id}?host={host}&force=bool # Remove image
POST /api/v1/images/pull?host={host}&image=name # Pull image (streams progress)
Networks
GET /api/v1/networks # List all networks
GET /api/v1/networks/{id}?host={host} # Get network details
Alerts
GET /api/v1/alerts # List all alerts
GET /api/v1/alerts/config # Get alert configuration
POST /api/v1/alerts/{id}/acknowledge # Acknowledge an alert
POST /api/v1/alerts/acknowledge-all # Acknowledge all alerts
System
GET /api/v1/system/stats # Get system statistics
Devices
POST /api/v1/devices/register # Accept mobile device registration payload
Architecture
Backend (Go)
home/
cmd/server/main.go # Application entry point
internal/
api/ # HTTP handlers and routing
router.go # Chi router setup
handlers.go # Container handlers
image_handlers.go # Image handlers
network_handlers.go # Network handlers
alert_handlers.go # Alert handlers
stats_ws.go # WebSocket stats streaming
terminal.go # WebSocket terminal
docker/ # Docker client layer
client.go # Multi-host client
container.go # Container operations
image.go # Image operations
network.go # Network operations
stats.go # Stats streaming
models/ # Data structures
config/ # Configuration parsing
auth/ # JWT authentication
alerts/ # Alert monitoring system
monitor.go # Background monitoring
webhook.go # Webhook notifications
history.go # Alert storage
Frontend (React + TypeScript)
frontend/src/
components/ # Shared UI components
ui/ # Shadcn UI components
header.tsx # Navigation header
footer.tsx # Page footer
theme-toggle.tsx # Theme switcher
contexts/ # React contexts
auth-context.tsx # Authentication state
theme-context.tsx # Theme state
features/ # Feature modules
containers/ # Container management
api/ # API functions
hooks/ # React Query hooks
components/ # UI components
types.ts # TypeScript types
images/ # Image management
networks/ # Network management
alerts/ # Alert management
routes/ # TanStack Router pages
__root.tsx # Root layout
index.tsx # Dashboard
images/ # Images page
networks/ # Networks page
alerts/ # Alerts page
lib/ # Utilities
api-client.ts # Authenticated fetch
utils.ts # Helper functions
Mobile App (React + Capacitor)
mobile/
src/
App.tsx # Mobile router and shell
pages/ # Mobile route screens
components/ # Mobile UI and feature components
hooks/ # Mobile data/realtime hooks
lib/api-client.ts # Shared mobile HTTP/WS client helpers
lib/onboarding.ts # Walkthrough persistence helpers
lib/push-notifications.ts
MOBILE_PROD_CHECKLIST.md
README.md
Key Technologies
Backend:
- Go 1.24+
- Chi v5 router
- Docker SDK v28
- gorilla/websocket
- JWT authentication
Frontend:
- React 19
- TypeScript 5.7
- TanStack Router and Query
- Tailwind CSS 4
- Shadcn UI with Radix
- Vite 7
Development
Backend Development
cd home
go run ./cmd/server
The server runs on port 6789.
Frontend Development
cd frontend
bun install
bun run dev
The dev server runs on port 2345 with API proxy to localhost:6789.
Mobile Development
cd mobile
npm install
npm run dev
Typecheck, lint, and test the mobile app:
cd mobile
npx tsc -p tsconfig.app.json --noEmit
npm run lint
npm test
Build the mobile web bundle:
cd mobile
npm run build
Capacitor workflows:
cd mobile
npm run build:mobile
npm run cap:sync
npm run cap:android
npm run cap:ios
The mobile app now also includes:
- a first-launch walkthrough
- replay support from the header menu
- an About Us page with app/version/support info
Running Tests
# Backend
cd home
go test ./...
# Frontend
cd frontend
bun run test
# Mobile
cd ../mobile
npm test
Mobile API smoke test
chmod +x home/scripts/mobile-api-smoke.sh
VPS_MONITOR_USERNAME=admin \
VPS_MONITOR_PASSWORD='your-password' \
home/scripts/mobile-api-smoke.sh https://your-server:6789
For the full real-device/mobile validation flow, see:
mobile/MOBILE_PROD_CHECKLIST.md
Building for Production
# Backend
cd home
go build -o vps-monitor ./cmd/server
# Frontend
cd frontend
bun run build
# Mobile
cd ../mobile
npm run build
The frontend build output is served by the backend from the embedded filesystem.
Troubleshooting
Cannot connect to Docker
Verify Docker socket access:
ls -l /var/run/docker.sock
docker ps
Ensure the user has Docker permissions:
sudo usermod -aG docker $USER
Authentication not working
-
Verify all four environment variables are set:
JWT_SECRETADMIN_USERNAMEADMIN_PASSWORDADMIN_PASSWORD_SALT
-
Ensure
ADMIN_PASSWORDis the SHA256 hash ofpassword + salt, not plaintext -
Check JWT_SECRET is at least 32 characters
WebSocket connections failing
- Check firewall allows WebSocket upgrades
- Verify reverse proxy configuration (if applicable)
- Check browser console for connection errors
Alerts not triggering
- Verify
ALERTS_ENABLED=true - Check container stats are streaming correctly
- Verify webhook URL is accessible
- Check server logs for alert errors
Multi-host SSH connection issues
See the Multi-Host Setup Guide for detailed SSH configuration and troubleshooting.
License
GPL-3.0 License. See LICENSE for details.
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests
- Submit a pull request
Support
- GitHub Issues: https://github.com/hhftechnology/vps-monitor/issues
- Documentation: https://github.com/hhftechnology/vps-monitor