addresses #306 - The dashboard and storage views were hardcoding port 8006 for node links, but now they properly use the host URLs from the node configuration. This ensures users are redirected to the correct URL when clicking on node names, respecting custom ports and protocols configured in the settings. - Added host field to Node struct in Go models - Updated monitor.go to populate host field from instance config - Added host field to TypeScript Node interface - Modified Dashboard and Storage components to use nodeHostMap for correct URLs - Falls back to old behavior if host field is not available
Pulse for Proxmox
Real-time monitoring for Proxmox VE and PBS with alerts and webhooks.
💖 Support This Project
Features
- Auto-Discovery: Finds Proxmox nodes on your network, one-liner setup via generated scripts
- Cluster Support: Configure one node, monitor entire cluster
- Security: Credentials encrypted at rest, masked in logs, never sent to frontend
- Live monitoring of VMs, containers, nodes, storage
- Alerts with email and webhooks (Discord, Slack, Telegram, Teams, ntfy.sh, Gotify)
- Unified view of PBS backups, PVE backups, and snapshots
- PBS push mode for firewalled servers
- Config export/import with encryption and authentication
- Dark/light themes, responsive design
- Built with Go for minimal resource usage
Quick Start
Install
# Option A: Proxmox Helper Script (creates LXC container)
bash -c "$(wget -qLO - https://github.com/community-scripts/ProxmoxVE/raw/main/ct/pulse.sh)"
# Option B: Docker
docker run -d -p 7655:7655 -v pulse_data:/data rcourtman/pulse:latest
# Option C: Manual (existing systems)
curl -fsSL https://raw.githubusercontent.com/rcourtman/Pulse/main/install.sh | sudo bash
Configure Nodes
- Open
http://<your-server>:7655 - Go to Settings → Nodes
- Discovered nodes appear automatically
- Click "Setup Script" next to any node
- Run the generated one-liner on that node
- Node is configured and monitoring starts
The script handles user creation, permissions, token generation, and registration automatically.
Docker
Basic
docker run -d \
--name pulse \
-p 7655:7655 \
-v pulse_data:/data \
--restart unless-stopped \
rcourtman/pulse:latest
With Network Discovery
# Specify your LAN subnet for auto-discovery
docker run -d \
--name pulse \
-p 7655:7655 \
-v pulse_data:/data \
-e DISCOVERY_SUBNET=192.168.1.0/24 \
--restart unless-stopped \
rcourtman/pulse:latest
Docker Compose
services:
pulse:
image: rcourtman/pulse:latest
container_name: pulse
ports:
- "7655:7655"
volumes:
- pulse_data:/data
environment:
# Network discovery
# - DISCOVERY_SUBNET=192.168.1.0/24 # Auto-discovery subnet (default: auto-detect)
# Ports
# - PORT=7655 # Backend port (default: 7655)
# - FRONTEND_PORT=7655 # Frontend port (default: 7655)
# Security
# - API_TOKEN=your-secure-token # API authentication token
# - ALLOW_UNPROTECTED_EXPORT=false # Allow export without auth (default: false)
# Polling & timeouts
# - POLLING_INTERVAL=5 # Seconds between node checks (default: 5)
# - CONNECTION_TIMEOUT=10 # Connection timeout in seconds (default: 10)
# Updates
# - UPDATE_CHANNEL=stable # Update channel: stable or rc (default: stable)
# - AUTO_UPDATE_ENABLED=true # Enable auto-updates (default: true)
# - AUTO_UPDATE_CHECK_INTERVAL=24 # Hours between update checks (default: 24)
# - AUTO_UPDATE_TIME=03:00 # Time to install updates HH:MM (default: 03:00)
# CORS & logging
# - ALLOWED_ORIGINS=* # CORS allowed origins (default: *)
# - LOG_LEVEL=info # Log level: debug/info/warn/error (default: info)
restart: unless-stopped
volumes:
pulse_data:
PBS Agent (Push Mode)
For isolated PBS servers, see PBS Agent documentation
Security
- Credentials encrypted at rest (AES-256-GCM)
- Tokens masked in logs
- Frontend never receives actual credentials
- Export requires authentication
See Security Documentation for details.
Configuration
Quick start - most settings are in the web UI:
- Settings → Nodes: Add/remove Proxmox instances
- Settings → System: Polling intervals, CORS settings
- Alerts: Thresholds and notifications
Email Alerts Configuration
Configure email notifications in Settings → Alerts → Email Destinations
Supported Providers
- Gmail/Google Workspace: Requires app-specific password
- Outlook/Office 365: Requires app-specific password
- Custom SMTP: Any SMTP server
Recommended Settings
- Port 587 with STARTTLS (recommended for most providers)
- Port 465 for SSL/TLS
- Port 25 for unencrypted (not recommended)
Gmail Setup
- Enable 2-factor authentication
- Generate app-specific password at https://myaccount.google.com/apppasswords
- Use your email as username and app password as password
- Server: smtp.gmail.com, Port: 587, Enable STARTTLS
Outlook Setup
- Generate app password at https://account.microsoft.com/security
- Use your email as username and app password as password
- Server: smtp-mail.outlook.com, Port: 587, Enable STARTTLS
For deployment overrides (ports, etc), use environment variables:
# Systemd: sudo systemctl edit pulse-backend
Environment="FRONTEND_PORT=8080"
# Docker: -e FRONTEND_PORT=8080
Backup/Restore
# Export (v4.0.3+)
pulse config export -o backup.enc
# Import
pulse config import -i backup.enc
Or use Settings → Security tab in UI.
Updates
Docker
docker pull rcourtman/pulse:latest
docker stop pulse
docker rm pulse
# Run docker run command again
Manual Install
Settings → System → Check for Updates
After updates complete, refresh your browser (Ctrl+F5 or Cmd+Shift+R) to load the new version.
API
# Status
curl http://localhost:7655/api/health
# Metrics (default time range: 1h)
curl http://localhost:7655/api/charts
# With authentication (if configured)
curl -H "X-API-Token: your-token" http://localhost:7655/api/health
📖 Full API Documentation → - Complete endpoint reference with examples
Reverse Proxy
Using Pulse behind a reverse proxy? WebSocket support is required for real-time updates.
See Reverse Proxy Configuration Guide for nginx, Caddy, Apache, Traefik, HAProxy, and Cloudflare Tunnel configurations.
Troubleshooting
Connection Issues
- Check Proxmox API is accessible (port 8006/8007)
- Verify credentials have PVEAuditor role minimum
- For PBS: ensure API token has Datastore.Audit permission
High CPU/Memory
- Reduce polling interval in Settings
- Check number of monitored nodes
- Disable unused features (backups, snapshots)
Logs
# Docker
docker logs pulse
# Manual
journalctl -u pulse -f
Documentation
- Configuration Guide - Complete setup and configuration
- API Reference - REST API endpoints and examples
- Webhook Guide - Setting up webhooks and custom payloads
- Reverse Proxy Setup - nginx, Caddy, Apache, Traefik configs
- PBS Agent - Monitoring isolated PBS servers
- Security - Security features and best practices
- FAQ - Common questions and troubleshooting
- Migration Guide - Upgrading from v3 to v4
Security
- Credentials stored encrypted (AES-256-GCM)
- Optional API token authentication
- Export/import requires passphrase
- Security Details →
Development
# Frontend
cd frontend-modern
npm install
npm run dev
# Backend
go run cmd/pulse/*.go
Links
License
MIT - See LICENSE
