Quick Start
Voltrus runs as a single binary with zero dependencies. From download to live dashboard in under three minutes.
1. Download
Get the binary for your platform from the downloads page or extract from your purchase email.
2. Configure
Copy the example configuration and edit it for your Modbus devices:
cp config.yaml.example config.yaml
nano config.yaml
3. Run
Linux:
./voltrus
Windows:
voltrus.exe
Open http://localhost:3000 in your browser. On first startup, a random 16-character admin password is generated and printed to the terminal once:
GENERATED ADMIN PASSWORD: xK9mP2vLqR5nW8jD
You will be required to change this on first login.
Username: admin — Password: the one shown in your terminal output.
You will be forced to change the password on your first login. Save it immediately — it will not be shown again.
data.db and restart to regenerate (this resets all data).
Configuration Reference
Everything is configured through a single config.yaml file. Here are the available sections.
| Key | Required | Description |
|---|---|---|
| server_port | Yes | HTTP port to listen on |
| db_path | Yes | SQLite database file path |
| persist_interval_secs | Yes | How often to persist live data to disk |
| auth_secret | No | JWT signing secret (random string) |
| retention | No | Data retention and downsampling policies |
Minimal Config Example
Devices are configured through the UI — no need to edit the config file for device setup.
server_port: 3000
db_path: "data.db"
persist_interval_secs: 5
# auth_secret: "change-me-to-a-strong-random-string"
# Data retention - automatic downsampling and archiving
# retention:
# enabled: true
# run_interval_secs: 21600
# archive_dir: "./archive"
# tiers:
# - name: raw
# keep: 604800
# downsample_to: hourly
# archive: true
# - name: hourly
# keep: 7776000
# downsample_to: daily
# - name: daily
# keep: null
Modbus Register Mapping
Each device in your config.yaml can have multiple registers. Here is the full set of options per register.
| Field | Type | Description |
|---|---|---|
| name | string | Display name in dashboard |
| address | integer | Modbus register address |
| type | string | Int16, Uint16, Int32, Float32 |
| endian | string | Big, Little, SwappedBig, SwappedLittle |
| scale | float | Multiplier applied to raw value |
| unit | string | Display unit (V, A, kW, etc.) |
| warning_threshold | float | Yellow alarm threshold |
| critical_threshold | float | Red alarm threshold |
Multi-Device Example
devices:
- name: "Main Power Meter"
address: "192.168.1.100:502"
unit_id: 1
interval_ms: 1000
registers:
- name: "Voltage_L1"
address: 0
type: Float32
endian: Big
unit: "V"
- name: "Current_L1"
address: 2
type: Float32
endian: Big
unit: "A"
- name: "Solar Inverter"
address: "192.168.1.101:502"
unit_id: 1
interval_ms: 2000
registers:
- name: "DC_Power"
address: 10
type: Float32
endian: Big
unit: "kW"
Protocol Support
Voltrus supports five industrial protocols. All protocols are configured through the web UI or config.yaml and share the same device/metric pipeline.
| Protocol | Minimum Tier | Details |
|---|---|---|
| Modbus TCP | All tiers | Native TCP client, configurable polling, register flexibility |
| MQTT | All tiers | Publish/subscribe, configurable topics |
| OPC-UA | Professional | Connect, browse, subscribe to variables |
| Siemens S7 | Enterprise | S7-300/400/1200/1500 via ISO-on-TCP |
| AB EtherNet/IP | Enterprise | ControlLogix, CompactLogix via CIP |
OPC-UA Configuration
Add OPC-UA endpoints through the web UI under Devices, or in config.yaml:
# OPC-UA devices are configured through the web UI.
# Navigate to Devices → Add Device → OPC-UA
# Enter the endpoint URL, security policy, and authentication.
Siemens S7 Configuration
Enterprise tier. Add S7 devices through the web UI. Supported blocks: DB, I/O, Markers, Timers, Counters.
# S7 devices are configured through the web UI.
# Navigate to Devices → Add Device → Siemens S7
# Enter IP, rack, slot, and select block types.
Allen-Bradley EtherNet/IP Configuration
Enterprise tier. Supports tag browsing — discover available tags from the controller.
# AB devices are configured through the web UI.
# Navigate to Devices → Add Device → Allen-Bradley
# Enter IP, and browse controller tags.
Modbus TCP Auto-Discovery
Scan a subnet for Modbus TCP devices and auto-generate device configuration:
./voltrus discover --range 192.168.1.0/24 --port 502
This scans all hosts in the subnet, probes standard register maps, and outputs discovered devices. Export to config YAML for review before importing.
Alarm Notifications
Four notification channels are available. All work on-premise with zero cloud dependency.
Email (SMTP)
Configure your client's mail server in config.yaml. Uses SMTP relay — works with any on-premise mail server.
smtp:
host: "smtp.client-network.local"
port: 587
from: "voltrus@client-network.local"
username: "voltrus"
password: "smtp-password"
use_tls: true
Webhook
HTTP POST on alarm trigger. Configure through the Data Flow Engine using the http_out node. Send to Slack, Teams, PagerDuty, or any HTTP endpoint.
Push Notifications
Web Push API with VAPID. Works on Chrome, Safari, and Firefox — including mobile browsers. Configure in config.yaml:
web_push:
vapid_subject: "mailto:admin@yourcompany.com"
vapid_public_key: "BP..."
vapid_private_key: "priv..."
Users subscribe through the notification settings panel in the dashboard.
SMS
Professional tier. Uses email-to-SMS carrier gateways — no external SMS service required:
| Carrier | Gateway |
|---|---|
| AT&T | number@txt.att.net |
| Verizon | number@vtext.com |
| T-Mobile | number@tmomail.net |
SMS piggybacks on the SMTP configuration above. No separate service needed.
REST API
Voltrus includes a REST API for programmatic access to device data, alarms, and configuration. Available from Starter tier.
Authentication
API requests require an API key. Generate keys through the web UI under Settings → API Keys.
curl -H "Authorization: Bearer YOUR_API_KEY" \
http://localhost:3000/api/v1/devices
Key Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /api/v1/devices | GET | List all devices and their status |
| /api/v1/devices/{id}/metrics | GET | Get current values for a device |
| /api/v1/data | GET | Query historical data with time range filters |
| /api/v1/alarms | GET | List alarms with filtering |
| /api/v1/flows | GET/POST | Manage data flow pipelines |
| /api/v1/screens | GET/POST | Manage dashboard screens |
Query Parameters
# Historical data with time range
GET /api/v1/data?device_id=1&metric=voltage&start=2026-05-01T00:00:00Z&end=2026-05-03T00:00:00Z
# Aggregated data
GET /api/v1/data?device_id=1&metric=voltage&aggregation=avg&interval=1h
CORS
CORS headers are enabled for external access. Configure allowed origins in config.yaml:
cors:
allowed_origins:
- "https://your-frontend.example.com"
Analytics
Statistical process control and analytics endpoints for advanced data analysis. Available from Professional tier.
Endpoints
| Endpoint | Method | Description |
|---|---|---|
| /api/v1/analytics/spc | GET | Statistical Process Control charts (X-bar & R, CUSUM, EWMA, P-chart, NP-chart) |
| /api/v1/analytics/histogram | GET | Histogram with normal curve overlay and process capability indices (Cp, Cpk, Pp, Ppk) |
| /api/v1/analytics/run-chart | GET | Run charts with Western Electric signal detection rules |
| /api/v1/analytics/custom-metrics | GET | List all custom calculation metrics |
| /api/v1/analytics/custom-metrics | POST | Create a new custom metric from tag formulas |
| /api/v1/analytics/custom-metrics/{id} | PUT | Update an existing custom metric definition |
| /api/v1/analytics/custom-metrics/{id} | DELETE | Delete a custom metric |
API Reference & SDKs
Interactive API Explorer
Navigate to /api/docs on your Voltrus instance for the interactive Swagger UI. All endpoints are documented with request/response schemas and "Try it out" functionality.
OpenAPI Spec
The raw OpenAPI 3.1 spec is available at /api/openapi.json. Use it with any OpenAPI-compatible tool (Postman, Insomnia, code generators).
voltrus --dump-openapi > openapi.json
Python SDK
pip install voltrus
from voltrus import ApiClient, Configuration
from voltrus.api.data_api import DataApi
config = Configuration(host="http://192.168.1.100:3000")
config.api_key["api_key"] = "vt_sk_abc123"
with ApiClient(config) as client:
data = DataApi(client).get_data(screen="overview")
for ds in data:
print(f"{ds.key}: {ds.value}")
TypeScript SDK
npm install voltrus
import { Configuration, DataApi } from "voltrus";
const config = new Configuration({
basePath: "http://192.168.1.100:3000",
apiKey: "vt_sk_abc123",
});
const data = await new DataApi(config).getData({ screen: "overview" });
data.forEach(ds => console.log(`${ds.key}: ${ds.value}`));
Backup & Restore
Create consistent backups of the SQLite database and configuration. Available from Starter tier.
Create Backup
./voltrus backup
Creates a timestamped archive containing the SQLite database snapshot and config.yaml:
voltrus-backup-20260503-143022.tar.gz
Restore from Backup
./voltrus restore voltrus-backup-20260503-143022.tar.gz
Uses the SQLite backup API for consistent snapshots. A pre-restore backup is automatically created before overwriting.
Restore Without Confirmation
./voltrus restore voltrus-backup-20260503-143022.tar.gz --force
Custom Config Path
./voltrus restore backup.tar.gz --config /etc/voltrus/prod.yaml
CLI Reference
Voltrus includes several CLI subcommands beyond the main server.
| Command | Description |
|---|---|
| ./voltrus | Start the server (default) |
| ./voltrus backup | Create a backup archive |
| ./voltrus restore <FILE> | Restore from backup archive |
| ./voltrus config export <DIR> | Export config to YAML files (Git-friendly) |
| ./voltrus config import <DIR> | Import config from YAML files |
| ./voltrus config validate <DIR> | Validate YAML config files (dry-run) |
| ./voltrus discover --range <CIDR> | Scan subnet for Modbus TCP devices |
| --generate-request <KEY> | Generate license request file (offline activation) |
| --import-activation <PATH> | Import signed activation file |
| --online-activate <KEY> | Activate license directly via internet |
| --license-status | Check current license status |
| --reset-admin-password | Generate a new random admin password |
Git-Friendly Configuration
Export your entire configuration to human-readable YAML files for version control:
./voltrus config export ./my-config
# Creates:
# my-config/devices/
# my-config/metrics/
# my-config/dashboards/
# my-config/flows/
# Track in git
cd my-config
git init
git add .
git commit -m "Initial config"
# Validate before importing
./voltrus config validate ./my-config
# Import on a new server
./voltrus config import ./my-config
Diff-friendly format — git diff shows exactly what changed in device addresses, register maps, alarm thresholds, and dashboard layouts.
Deployment Guide
Voltrus is designed to run anywhere — a $4 VPS, an industrial PC, or any x86_64 server.
Linux VPS (systemd)
Copy the binary and config to /opt/voltrus/, then install the included service file:
sudo cp deploy/voltrus.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable voltrus
sudo systemctl start voltrus
Windows Service
Use nssm or Windows Service Wrapper to run voltrus.exe as a background service. No installation wizard required.
OT Network Deployment & EDR Compatibility (v0.36.0)
When deploying to Windows-based SCADA servers with endpoint security (Defender, Trellix, CrowdStrike), add exclusion paths to prevent performance degradation:
# Generate recommended exclusions for your installation
voltrus edr report
# Generate PowerShell script for Windows Defender
voltrus edr exclusions-ps1 > defender-exclusions.ps1
# Run as Administrator
powershell -ExecutionPolicy Bypass -File defender-exclusions.ps1
For Active Directory-managed environments, use Group Policy to deploy exclusions across all SCADA servers. Run voltrus edr gpo-guide for step-by-step instructions.
API endpoints for programmatic access: GET /api/v1/edr/report, GET /api/v1/edr/exclusions, GET /api/v1/edr/exclusions/ps1, GET /api/v1/edr/gpo-guide
Hardware Certification & Edge Deployment (v0.38.0)
Voltrus runs on a wide range of hardware — from Raspberry Pi to enterprise servers. Use the hardware certification tools to test and verify your deployment platform:
# Check hardware compatibility for all tiers
voltrus hw report
# Run performance benchmarks (~20 seconds)
voltrus hw benchmark
# View official hardware compatibility matrix
voltrus hw compat-matrix
# Generate edge deployment guide for your platform
voltrus hw edge-deploy
# Raspberry Pi quick-start
voltrus hw rpi-quickstart
Hardware Compatibility Matrix
| Platform | CPU | RAM | Storage | Tiers | Max Tags |
|---|---|---|---|---|---|
| Raspberry Pi 4 (4GB) | 4× Cortex-A72 @ 1.5GHz | 4 GB | MicroSD (A2) | Free, Starter | 1,000 |
| Raspberry Pi 5 (8GB) | 4× Cortex-A76 @ 2.4GHz | 8 GB | NVMe HAT / MicroSD | Free, Starter, Pro | 5,000 |
| Advantech UNO-2484G | 4× Core i7 @ 1.7GHz | 8 GB | M.2 SATA SSD | Free, Starter, Pro | 8,000 |
| Siemens SIMATIC IPC227E | 2× Core i3 @ 3.0GHz | 16 GB | NVMe SSD | All tiers | 10,000 |
| Generic Fanless PC | 2–4× Core i3/i5 | 8 GB | NVMe SSD | Free, Starter, Pro | 8,000 |
| Standard Server | 4+ cores @ 2.5GHz+ | 16 GB | SSD / NVMe | All tiers | 10,000 |
Recommendations based on testing with typical SCADA workloads. Actual performance depends on tag count, polling rate, and enabled features.
Raspberry Pi Quick Start
# 1. Flash Raspberry Pi OS Lite (64-bit) to SD card
# 2. Enable SSH: touch /boot/firmware/ssh
# 3. SSH in and download Voltrus:
curl -L https://voltrus.id/downloads/voltrus-arm64-latest.tar.gz | tar xz
sudo mv voltrus /usr/local/bin/
# 4. Create config
mkdir -p /etc/voltrus /var/lib/voltrus
cat > /etc/voltrus/config.yaml << 'EOF'
server_port: 8080
db_path: /var/lib/voltrus/voltrus.db
auth_secret: YOUR_RANDOM_SECRET_HERE
retention:
hot_days: 1
warm_days: 30
enabled: true
EOF
# 5. Set up auto-start (systemd)
voltrus hw edge-deploy # Generates full service file
# 6. Start
voltrus /etc/voltrus/config.yaml
# Open: http://:8080
API endpoints: GET /api/v1/hw/report, POST /api/v1/hw/benchmark, GET /api/v1/hw/compatibility-matrix, GET /api/v1/hw/edge-deploy
Docker (Optional)
While Voltrus is a single binary, you can containerize it if your infrastructure requires it:
FROM scratch
COPY voltrus /app/
COPY config.yaml /app/
COPY static /app/static
EXPOSE 3000
WORKDIR /app
ENTRYPOINT ["/app/voltrus"]
Authentication
Voltrus supports both local authentication and enterprise SSO out of the box.
Local Authentication
Enabled by default. Users are stored in the local SQLite database with Argon2 password hashing. Admin can create and manage users through the UI.
SSO / OIDC
To connect to your identity provider, add the oidc block to config.yaml:
auth:
jwt_secret: "your-secret-here"
token_expire_hours: 24
oidc:
issuer: "https://your-idp.com"
client_id: "voltrus"
client_secret: "your-client-secret"
redirect_uri: "http://localhost:3000/auth/callback"
Supported providers: Keycloak, Auth0, Azure AD, and any standard OpenID Connect provider.
SAML 2.0
Enterprise tier. Connect to Active Directory Federation Services (ADFS) and other SAML providers:
auth:
saml:
idp_metadata_url: "https://adfs.example.com/FederationMetadata/2007-06/FederationMetadata.xml"
entity_id: "voltrus"
acs_url: "http://localhost:3000/auth/saml/callback"
LDAP
Enterprise tier. Fallback for legacy Active Directory without ADFS:
auth:
ldap:
url: "ldap://dc.example.com:389"
base_dn: "DC=example,DC=com"
bind_dn: "CN=voltrus,OU=ServiceAccounts,DC=example,DC=com"
bind_password: "service-account-password"
Group-based role mapping: AD group maps to Voltrus role (Admin, Operator, Viewer). Just-in-time user provisioning on first login.
Role-Based Access
Four built-in roles with custom role support (Professional tier and above):
- Admin — Full access: devices, users, system settings, config
- Operator — Dashboard, alarm acknowledgment, recipe loading
- Viewer — Read-only dashboard access and history viewing
- Custom — Per-screen and per-action permissions (Professional+)
Compliance & Security
RBAC with Audit Trail
Professional tier and above. Granular role-based access control with per-screen and per-action permissions. All user actions are logged to an append-only audit trail table.
- Admin — Full access: devices, users, system settings, config
- Operator — Dashboard, alarm acknowledgment, recipe loading
- Viewer — Read-only dashboard access
- Custom — Define your own permission sets
Audit log captures: user, action, timestamp, before/after values. Immutable — records cannot be deleted or modified.
FDA 21 CFR Part 11 Mode
Enterprise tier. Enables compliance features for regulated industries (pharma, food, beverage):
- Electronic signatures with reason codes for critical actions
- Audit trail meeting CFR Part 11 requirements
- Record integrity verification (checksums on audit records)
- Automatic logout / session timeout enforcement
- Password complexity and rotation policies
- "Authority to change" workflow — changes require approval
Enable in config.yaml:
compliance:
cfr_part_11: true
session_timeout_minutes: 15
password_min_length: 12
password_require_special: true
Multi-Site Hub
Professional tier. One Voltrus instance aggregates data from multiple remote sites:
- Each site runs its own Voltrus instance (existing single-binary model)
- One Professional hub instance subscribes to each site's SSE stream
- Hub dashboard shows all sites with grouping and labeling
- Hub auto-discovers devices from connected sites
# Hub configuration in config.yaml
hub:
sites:
- name: "Plant A - Jakarta"
url: "http://192.168.1.100:3000"
api_key: "site-a-api-key"
- name: "Plant B - Surabaya"
url: "http://192.168.2.100:3000"
api_key: "site-b-api-key"
OEE / Downtime Tracking
Available from Starter tier. Track machine states and calculate Overall Equipment Effectiveness without PLC program changes — uses existing Modbus/MQTT data.
- Machine states: Running, Idle, Faulted, Setup, Maintenance
- OEE = Availability x Performance x Quality
- Configurable downtime reason codes
- Shift-based reporting (per-shift, per-day, per-week)
RTSP Video Integration
Enterprise tier. Display live camera feeds on the dashboard and capture alarm-triggered snapshots.
- RTSP stream ingestion from IP cameras (Hikvision, Dahua, Axis, generic)
- MJPEG snapshot capture on alarm trigger
- Snapshots stored in SQLite alongside alarm events
- No transcoding — direct stream proxy to browser
PDF Reporting
Professional tier and above. Schedule automated report generation:
- Daily, weekly, or monthly report schedules
- HTML template to PDF conversion
- Includes: summary stats, alarm log, trend charts, uptime metrics
- Email delivery (uses SMTP configuration)
External Integration & BI Connectors (v0.39.0)
Voltrus can push data to external BI tools, monitoring systems, and storage. All integration endpoints are tier-gated.
Prometheus Exporter
Voltrus exposes a standard Prometheus endpoint for IT/OT bridging. No authentication required — tier-gated internally (Professional+).
# Prometheus scrape config
scrape_configs:
- job_name: 'voltrus'
scrape_interval: 15s
static_configs:
- targets: ['your-voltrus-server:8080']
metrics_path: /metrics
Available metrics:
voltrus_tag_value{device,tag,unit}— current tag valuesvoltrus_device_up{device}— device online status (1=online, 0=offline)voltrus_alarms_active{severity}— active alarm counts
BI Query Endpoint
Query historical data for Power BI, Metabase, or custom integrations (Professional+).
# JSON query (Power BI: Get Data > Web)
GET /api/v1/integration/bi/query?devices=plc1&from=now-24h&to=now&limit=1000
# CSV export
GET /api/v1/integration/bi/query?format=csv&from=1710000000&to=1710086400
# Filter by metrics
GET /api/v1/integration/bi/query?metrics=voltage,current&from=now-1h
Query parameters: devices, metrics, from, to, limit, offset, format (json/csv).
Time formats: ISO 8601 (2024-03-09T00:00:00Z), unix timestamp (1710000000), or relative (now-1h, now-7d).
Grafana Integration
Use the Infinity data source or JSON API plugin to connect Grafana to Voltrus (Professional+).
# Query endpoint (returns [value, timestamp_ms] format)
GET /api/v1/integration/grafana/query?devices=plc1&from=now-1h
# Search endpoint (list available metrics)
GET /api/v1/integration/grafana/search
Outbound Webhooks
Push alarm and tag change events to external systems like Slack, Teams, or custom APIs (Starter+).
# Create an outbound webhook via API
POST /api/v1/integration/webhooks/outbound
{
"name": "Slack Alert",
"url": "https://hooks.slack.com/services/...",
"events": "[\"alarm\"]",
"headers": "{\"Authorization\": \"Bearer xxx\"}"
}
# Test a webhook
POST /api/v1/integration/webhooks/outbound/{id}/test
Event types: alarm (fires on every alarm), tag_change (fires on each persistence tick). Supports retry with exponential backoff and device filtering.
Scheduled Data Export (Egress)
Automatically export data to filesystem or S3-compatible storage on a schedule (Professional+).
# Create a daily export job via API
POST /api/v1/egress/jobs
{
"name": "Daily Backup",
"schedule": "daily",
"format": "csv",
"destination": "/mnt/exports",
"time_range": "24h",
"compression": true
}
# S3-compatible storage
{
"destination": "s3://my-bucket/voltrus/",
"schedule": "every_6h"
}
# CLI commands
voltrus egress list # List all egress jobs
voltrus egress run 1 # Manually trigger job #1
Schedules: hourly, daily, weekly, or every_Nm/every_Nh/every_Nd. Formats: csv or parquet. Optional gzip compression.
Connection Info
Auto-generated connection details for all BI tools:
GET /api/v1/integration/connection-info
License Activation
Voltrus uses an air-gap friendly license system. Each license is bound to one server via hardware fingerprinting, and activation works even on completely offline networks.
How It Works
The activation flow is designed for industrial environments where servers may not have internet access. Your license key is already embedded in the request file — no need to enter it again on the web page:
- Your server generates a
license-request.binfile containing its hardware fingerprint and your Polar.sh license key - You copy this file to any PC with internet and upload it to the activation page
- The activation server validates your license key and returns a signed
license-activation.bin - You copy the activation file back to your server and import it
- The server verifies the cryptographic signature and binds the license to its hardware fingerprint
Step 1: Generate License Request
On your Voltrus server, run:
./voltrus --generate-request YOUR_POLAR_LICENSE_KEY
This creates license-request.bin in the current directory. This file contains your server's hardware fingerprint and license key.
Step 2: Upload to Activation Server
Copy license-request.bin to a computer with internet access and upload it at:
https://activate.voltrus.id
The server will validate your license key and return license-activation.bin.
Step 3: Import Activation
Copy the returned license-activation.bin back to your Voltrus server and run:
./voltrus --import-activation license-activation.bin
If successful, you'll see:
License activated successfully: YOUR_POLAR_LICENSE_KEY
Step 4: Verify
Check your license status anytime:
./voltrus --license-status
Expected output when valid:
{
"status": "Valid",
"license_key": "polar_sh_key_abc123",
"expires_at": "2026-05-01T12:05:00Z",
"days_remaining": 365
}
Moving to a New Server
If you need to move your installation to new hardware:
- Contact support to clear the existing hardware binding
- Repeat the activation steps on the new server
Alternatively, if you have access to the admin panel at activate.voltrus.id/admin, support can transfer the license directly.
CLI Reference
| Command | Description |
|---|---|
| --help | Show all available commands and options |
| --online-activate <KEY> | Activate directly via internet (one command, no file transfer needed) |
| --generate-request <KEY> | Generate license-request.bin for offline/air-gapped activation |
| --import-activation <PATH> | Import and store a signed activation file |
| --license-status | Check current license status (exits 1 if invalid) |
| --reset-admin-password | Generate a new random admin password (use if lost) |
Quick Online Activation
If your server has internet access, activate in one step:
./voltrus --online-activate YOUR_LICENSE_KEY
This generates the request, contacts the activation server, and imports the activation — all in one command. No file transfer needed.
Troubleshooting
Binary won't start
Symptom: Permission denied or command not found.
Fix: Ensure the binary has execute permissions on Linux:
chmod +x voltrus
Modbus connection timeout
Symptom: Dashboard shows "offline" for all devices.
Fix: Verify network connectivity and firewall rules. Test with the included Modbus simulator:
./modbus-sim --port 5020
Port already in use
Symptom: Error binding to port 3000.
Fix: Change the port in config.yaml or stop the existing process:
lsof -i :3000
kill -9 <PID>
Lost admin password
Symptom: Cannot log in, lost the initial password.
Fix: Run the CLI command to reset:
./voltrus --reset-admin-password
This generates a new random password and prints it to the terminal. You will be required to change it on next login.
Still stuck?
Contact support with your config.yaml (redact secrets) and any error logs: