10 KiB
Pulse Configuration Guide
Key Features
- 🔒 Auto-Hashing Security (v4.5.0+): Plain text credentials in environment variables are automatically hashed
- 📁 Separated Configuration: Authentication (.env), settings (system.json), and node credentials (nodes.enc)
- 🚀 Zero-Touch Deployment: Configure via environment variables, skip UI setup entirely
- 🔐 Enterprise Security: Credentials encrypted at rest, hashed in memory
Configuration File Structure
Pulse uses three separate configuration files, each with a specific purpose. This separation ensures security, clarity, and proper access control.
File Locations
All configuration files are stored in /etc/pulse/ (or /data/ in Docker containers).
/etc/pulse/
├── .env # Authentication credentials ONLY
├── system.json # Application settings (ports, intervals, etc.)
├── nodes.enc # Encrypted node credentials
├── alerts.json # Alert thresholds and rules
└── webhooks.enc # Encrypted webhook configurations (v4.1.9+)
📁 .env - Authentication & Security
Purpose: Contains authentication credentials and security settings ONLY.
Format: Environment variables (KEY=VALUE)
Contents:
# User authentication
PULSE_AUTH_USER='admin' # Admin username
PULSE_AUTH_PASS='$2a$12$...' # Bcrypt hashed password (keep quotes!)
API_TOKEN=abc123... # API token (plain text, not hashed)
# Security settings
DISABLE_AUTH=true # Disable authentication entirely
ENABLE_AUDIT_LOG=true # Enable security audit logging
# Proxy/SSO Authentication (see docs/PROXY_AUTH.md for full details)
PROXY_AUTH_SECRET=secret123 # Shared secret between proxy and Pulse
PROXY_AUTH_USER_HEADER=X-Username # Header containing authenticated username
PROXY_AUTH_ROLE_HEADER=X-Groups # Header containing user roles/groups
PROXY_AUTH_ADMIN_ROLE=admin # Role that grants admin access
PROXY_AUTH_LOGOUT_URL=/logout # URL for SSO logout
Important Notes:
- Password hash MUST be in single quotes to prevent shell expansion
- API tokens are stored in plain text (48-64 hex characters)
- This file should have restricted permissions (600)
- Never commit this file to version control
- ProxmoxVE installations may pre-configure API_TOKEN
- Changes to this file are applied immediately without restart (v4.3.9+)
- DO NOT put port configuration here - use system.json or systemd overrides
📁 system.json - Application Settings
Purpose: Contains all application behavior settings and configuration.
Format: JSON
Contents:
{
"pollingInterval": 10, // Fixed at 10 seconds to match Proxmox update cycle
"connectionTimeout": 10, // Seconds before node connection timeout
"autoUpdateEnabled": false, // Enable automatic updates
"updateChannel": "stable", // Update channel: stable, rc, beta
"autoUpdateTime": "03:00", // Time for automatic updates (24hr format)
"allowedOrigins": "", // CORS allowed origins (empty = same-origin only)
"backendPort": 7655, // Backend API port
"frontendPort": 7655, // Frontend UI port (same as backend in embedded mode)
"discoveryEnabled": true, // Enable/disable network discovery for Proxmox/PBS servers
"discoverySubnet": "auto" // Subnet to scan ("auto" or CIDR like "192.168.1.0/24")
}
Important Notes:
- User-editable via Settings UI
- Can be safely backed up without exposing secrets
- Missing file results in defaults being used
- Changes take effect immediately (no restart required)
- API tokens are no longer managed in system.json (moved to .env in v4.3.9+)
📁 nodes.enc - Encrypted Node Credentials
Purpose: Stores encrypted credentials for Proxmox VE and PBS nodes.
Format: Encrypted JSON (AES-256-GCM)
Structure (when decrypted):
{
"pveInstances": [
{
"name": "pve-node1",
"url": "https://192.168.1.10:8006",
"username": "root@pam",
"password": "encrypted_password_here",
"token": "optional_api_token"
}
],
"pbsInstances": [
{
"name": "backup-server",
"url": "https://192.168.1.20:8007",
"username": "admin@pbs",
"password": "encrypted_password_here"
}
]
}
Important Notes:
- Encrypted at rest using system-generated key
- Credentials never exposed in UI (only "•••••" shown)
- Export/import requires authentication
- Automatic re-encryption on each save
Configuration Priority
Settings are loaded in this order (later overrides earlier):
- Built-in defaults - Hardcoded application defaults
- system.json file - Settings configured via UI
- Environment variables - Override both defaults and system.json
Environment Variables
Configuration Variables (override system.json)
These env vars override system.json values. When set, the UI will show a warning and disable the affected fields:
DISCOVERY_ENABLED- Enable/disable network discovery (default: true)DISCOVERY_SUBNET- Custom network to scan (default: auto-scans common networks)CONNECTION_TIMEOUT- API timeout in seconds (default: 10)ALLOWED_ORIGINS- CORS origins (default: same-origin only)LOG_LEVEL- Log verbosity: debug/info/warn/error (default: info)
Authentication Variables (from .env file)
These should be set in the .env file for security:
PULSE_AUTH_USER,PULSE_AUTH_PASS- Basic authenticationAPI_TOKEN- API token for authenticationDISABLE_AUTH- Set totrueto disable authentication entirely
Proxy/SSO Authentication Variables
For integration with authentication proxies (Authentik, Authelia, etc):
PROXY_AUTH_SECRET- Shared secret between proxy and Pulse (required for proxy auth)PROXY_AUTH_USER_HEADER- Header containing authenticated username (default: none)PROXY_AUTH_ROLE_HEADER- Header containing user roles/groups (default: none)PROXY_AUTH_ROLE_SEPARATOR- Separator for multiple roles (default: |)PROXY_AUTH_ADMIN_ROLE- Role name that grants admin access (default: admin)PROXY_AUTH_LOGOUT_URL- URL to redirect for SSO logout (default: none)
See Proxy Authentication Guide for detailed configuration examples.
Port Configuration
Port configuration should be done via one of these methods:
-
systemd override (Recommended for production):
sudo systemctl edit pulse # Add: Environment="FRONTEND_PORT=8080" -
system.json (For persistent configuration):
{"frontendPort": 8080} -
Environment variable (For Docker/testing):
FRONTEND_PORT- Port to listen on (default: 7655)PORT- Legacy port variable (use FRONTEND_PORT instead)
TLS/HTTPS Configuration
HTTPS_ENABLED- Enable HTTPS (true/false)TLS_CERT_FILE,TLS_KEY_FILE- Paths to TLS certificate files
⚠️ UI Override Warning: When configuration env vars are set (like
ALLOWED_ORIGINS), the corresponding UI fields will be disabled with a warning message. Remove the env var and restart to enable UI configuration.
Automated Setup (Skip UI)
For automated deployments (CI/CD, infrastructure as code, ProxmoxVE scripts), you can configure Pulse authentication via environment variables, completely bypassing the UI setup screen.
Simple Automated Setup
Option 1: API Token Authentication
# Start Pulse with API token - setup screen is skipped
API_TOKEN=your-secure-api-token ./pulse
# The token is hashed and stored securely
# Use this same token for all API calls
curl -H "X-API-Token: your-secure-api-token" http://localhost:7655/api/nodes
Option 2: Basic Authentication
# Start Pulse with username/password - setup screen is skipped
PULSE_AUTH_USER=admin \
PULSE_AUTH_PASS=your-secure-password \
./pulse
# Password is bcrypt hashed and stored securely
# Use these credentials for UI login or API calls
Option 3: Both (API + Basic Auth)
# Configure both authentication methods
API_TOKEN=your-api-token \
PULSE_AUTH_USER=admin \
PULSE_AUTH_PASS=your-password \
./pulse
Security Notes
- Automatic hashing: Plain text credentials are automatically hashed when provided via environment variables
- API tokens → SHA3-256 hash
- Passwords → bcrypt hash (cost 12)
- Pre-hashed credentials supported: Advanced users can provide pre-hashed values:
- API tokens: 64-character hex string (SHA3-256 hash)
- Passwords: bcrypt hash starting with
$2a$,$2b$, or$2y$(60 characters)
- No plain text in memory: All credentials are hashed before use
- Once configured, the setup screen is automatically skipped
- Credentials work immediately - no additional setup required
Example: Docker Automated Deployment
#!/bin/bash
# Generate secure token
API_TOKEN=$(openssl rand -hex 32)
# Deploy with authentication pre-configured
docker run -d \
--name pulse \
-p 7655:7655 \
-e API_TOKEN="$API_TOKEN" \
-v pulse-data:/data \
rcourtman/pulse:latest
echo "Pulse deployed! Use API token: $API_TOKEN"
# Immediately use the API - no setup needed
curl -H "X-API-Token: $API_TOKEN" http://localhost:7655/api/nodes
ProxmoxVE Helper Script
The ProxmoxVE community scripts already use this approach:
# They generate a token and set it directly
API_TOKEN=generated-token-here /opt/pulse/bin/pulse
Security Best Practices
-
File Permissions
chmod 600 /etc/pulse/.env # Only readable by owner chmod 644 /etc/pulse/system.json # Readable by all, writable by owner chmod 600 /etc/pulse/nodes.enc # Only readable by owner -
Backup Strategy
.env- Backup separately and securely (contains auth)system.json- Safe to include in regular backupsnodes.enc- Backup with .env (contains encrypted credentials)
-
Version Control
- NEVER commit
.envornodes.enc system.jsoncan be committed if it doesn't contain sensitive data- Use
.gitignoreto exclude sensitive files
- NEVER commit