Deployment
VirtualMetric DataStream Directors support flexible deployment options to match your infrastructure requirements and operational preferences. Whether you're running on physical hardware, virtual machines, or containerized environments, Directors can be deployed to optimize performance while maintaining data sovereignty.
For Director concepts, capabilities, and installation types, see Directors - Overview.
Options
As Physical Server
Deploy Directors directly on dedicated physical hardware for maximum performance and complete infrastructure control. This option provides maximum performance and resource allocation with complete control over hardware specifications. Without virtualization overhead, physical deployments are ideal for high-throughput environments.
Physical server deployments involve higher infrastructure costs and maintenance overhead. They offer limited flexibility for resource scaling and require longer deployment and provisioning times.
As Virtual Machine
Deploy Directors on virtual machines across various hypervisors and cloud platforms for balanced performance and flexibility. Virtual machine deployments offer flexible resource allocation and scaling with cost-effective resource utilization. They simplify backup and disaster recovery procedures and are platform agnostic, supporting VMware, Hyper-V, KVM, AWS, Azure, and GCP.
Virtual machine deployments introduce slight performance overhead from virtualization and create dependency on hypervisor platform stability.
Recommended VM Specifications:
| Workload Size | CPU Cores | Memory | Storage | Notes |
|---|---|---|---|---|
| Small | 2-4 cores | 8GB RAM | 50GB | Development/testing, < 10K EPS |
| Medium | 4-8 cores | 16GB RAM | 100GB | Standard production, 10K-50K EPS |
| Large | 8+ cores | 32GB RAM | 200GB+ | High-volume production, > 50K EPS |
Actual requirements may vary depending on the workload.
As Container
Deploy Directors in containerized environments for modern infrastructure management and orchestration capabilities.
Docker deployments run as single-host containers with simplified dependency management. They offer easy scaling and updates, making them ideal for development and small production environments.
Kubernetes deployments provide multi-node orchestration with automatic scaling, built-in service discovery and load balancing. They support rolling updates with zero downtime and deliver enterprise-grade high availability and resilience.
Containerized deployments provide consistent deployment across environments with rapid scaling and resource optimization. They include integrated monitoring and logging capabilities and support DevOps-friendly CI/CD integration.
Platform-Specific Considerations
On Linux
Linux deployments offer performance advantages: network-based collectors (syslog, TCP, SNMP) operate more efficiently with lower resource overhead for network processing. Linux provides superior performance for high-volume data ingestion and native support for Unix/Linux system integration.
Agent Connectivity:
- Windows Agent: Full support for Windows systems via VirtualMetric Agent with optional pre-processing
- Linux Agentless: Complete support via SSH-based connections
- Windows Agentless: Full support via WinRM protocols
Microsoft has announced plans to deprecate WinRM in future Windows releases. VirtualMetric continues to support WinRM-based agentless monitoring. Consider using VirtualMetric Agent for long-term Windows endpoint monitoring strategies.
Recommended For:
- High-volume network data collection environments
- Mixed Windows/Linux infrastructure monitoring
- Cost-sensitive deployments requiring maximum efficiency
On Windows
Agentless Connectivity:
- Windows Agentless: Full support via WinRM protocols
- Linux Agentless: Complete support via SSH connections
- Universal Agent: Support for both Windows and Linux systems with optional pre-processing
Microsoft has announced plans to deprecate WinRM in future Windows releases. VirtualMetric continues to support WinRM-based agentless monitoring. Consider using VirtualMetric Agent for long-term Windows endpoint monitoring strategies.
Windows deployments provide native Windows service integration with Active Directory authentication support. They offer PowerShell-based management capabilities and seamless Windows ecosystem integration.
Recommended For:
- Windows-centric environments
- Organizations requiring agentless Windows monitoring
- Environments with existing Windows management infrastructure
Installation Process
Standalone Director Installation
Directors are always created as standalone instances. To create a clustered deployment for high availability, first create Directors using this wizard, then group them using the Clusters tab. See Clusters for configuration details.
Navigate to Home > Fleet Management > Directors and click
Director Setup
Director Name:
Enter a unique identifier for the Director (3-64 characters). This name is used for identification across the platform.
Mode Selection:
Select the management approach using radio tiles:
- Managed - VirtualMetric manages Director infrastructure with automated updates, proactive monitoring, and reduced operational overhead
- Self-managed - User controls Director deployment with manual updates, custom security configurations, and full infrastructure control
- Orchestrated - For auto-scaling cloud environments where instances are automatically managed, scaled, and replaced by the platform
- Serverless - Runs on demand as a container without dedicated infrastructure, scaling automatically with load
For what each mode means operationally, see Platform Management Options. The mode cannot be changed after creation for Serverless Directors, and no other Director can be converted to serverless mode.
A self-managed Director is indicated under the Mode column as Self-managed, with a warning icon when configuration has changed. Hovering over the icon displays a tooltip reading "Director configuration changed after last update. Please deploy the current configuration."
The actions menu contains a vmetric.vmf file. Place this file under the <vm_root>\Director\config directory. Self-managed Directors skip access verification — monitor errors through the CLI or the files under <vm_root>\Director\storage\logs.
Container Type:
Selecting the Serverless mode reveals an additional required selection. It does not appear for the other three modes, and a container type cannot be submitted with them:
- Docker - Lightweight containerized deployment. Runs anywhere Docker is available, ideal for single-host or self-managed setups
- Kubernetes - Orchestrated container deployment. Scales across clusters with self-healing and rolling updates
- Azure Container Instances - Serverless containers on Azure. Fast startup with no cluster to manage, suited for bursty or short-lived workloads
- Azure Container Apps - Managed container platform on Azure. Built-in autoscaling and microservice support with managed identity integration
The container type determines the form of the deployment manifest generated in the Install and Connect Director step, and it cannot be changed afterwards.
Managed Environment Settings:
Selecting Azure Container Apps adds an optional Managed environment settings block. By default the deployment manifest creates a managed environment for the Director, along with the virtual network it needs; the block also lets you point the Director at an existing environment instead. Click
Autoscaling Policy:
A serverless Director on Azure Container Apps decides for itself how many replicas it needs, and the scale rule in its deployment manifest follows that decision (see Serverless Deployment Manifest under Install and Connect Director). Four fields tune the decision. The Autoscaling policy block is where you set them; each is stored as a node property under properties.autoscale in the Director's configuration, and the full key reference is Autoscale Policy in Service Configuration.
| Field | Key under properties.autoscale | Director default | Meaning |
|---|---|---|---|
| Backlog per replica | backlog_per_replica | 10000 | Queued records one replica is expected to hold. The total backlog divided by this number is one estimate of the replicas needed |
| CPU target (%) | cpu_target_percent | 75 | The CPU utilization to hold each replica at |
| Memory target (%) | memory_target_percent | 0 (off) | The memory utilization to hold each replica at |
| Maximum replicas | max_replicas | 0 (no ceiling) | Ceiling on the replicas the Director asks for. The wizard pre-fills 2 — see below |
Each of the three targets yields its own estimate of the replicas the current load needs, and the highest wins. Whatever the estimates say, the Director never asks for fewer than one replica: it is a collector, and at zero replicas its listeners would be closed with nothing arriving to wake it.
A change to any of these fields reaches a running Director within seconds and takes effect on the replica set that is already serving, without a redeploy. That is why the policy is Director configuration rather than a setting in the deployment manifest: on Azure Container Apps a scale rule is part of the app's revision template, so retuning a threshold there would create a new revision and restart every replica.
Four behaviors are worth knowing before changing these fields:
- Every field opens pre-filled. Backlog per replica, CPU target and Memory target open showing the Director's own default. A value equal to the default is displayed but not saved, so a Director you never tune keeps following its own defaults from release to release. Clearing a field has the same effect: it goes blank, the default reappears as greyed placeholder text, and the decision is left to the Director.
0is a real setting, and it means two different things. On the three targets,0stops that input counting toward the decision — it is not a target of zero percent. This is why memory is off by default: an idle Director already sits at roughly a quarter of its memory allocation and does not release memory promptly once a burst has passed, so with a memory target set, memory would drive every scaling decision and hold replicas up after the work is gone. Enable it only where memory is the constraint you actually scale on. On Maximum replicas,0means no ceiling — never "no replicas".- Maximum replicas is pre-filled with
2, and that value is saved. Unlike the three targets, this pre-fill is a policy of the wizard's own rather than the Director's default, so a Director created without touching the field is capped at two replicas. Raise the number, or enter0to remove the ceiling. Clearing the field to blank also removes the ceiling, but only until the panel is next opened and saved, when the pre-filled2returns — so0is the durable way to say "no ceiling". The ceiling can only ever reduce: the Container App's own maximum replica count, which the manifest sets to 10, still applies on top, and the smaller of the two wins, so a value above it changes nothing. - Scaling out does not drain an existing backlog. A new replica receives only new arrivals; records already queued on another replica stay there. Scaling out relieves incoming pressure rather than clearing a queue that has already built up, and when one replica holds nearly all of the backlog, the Director stops asking for more replicas on its account, because they would sit idle while that backlog does not move.
Enter whole numbers only; the two percentage fields accept values up to 100. A blank field is always valid.
Access Management
Configure optional access controls for the Director.
Access Tokens:
- Enable Access Tokens - Toggle to require token authentication
- Token Name - Identifier for the token
- Token Value - Auto-generated when token is created (use copy button to copy)
- Expiration - Token validity period (default: 3 months):
- 1 month
- 3 months
- 1 year
- Unlimited
Access Restriction:
Restrict which IP addresses can connect to the Director:
- Enable Access Restriction - Toggle to enable IP filtering
- Restriction Type:
- Single Block - Single IP address
- Range - IP address range (start-end)
- CIDR - CIDR notation (e.g., 10.0.0.0/8)
- Sources - List of allowed IP addresses/ranges
TLS Configuration
Select how TLS is managed for agent-to-director communication using radio tiles:
- Auto-generated - The Director manages its own certificate authority (CA) and certificates
- Custom certificate - The Director uses your certificate and private key, for organizations with an existing PKI
- TLS offloading - TLS termination is handled by your load balancer
Each mode exposes its own fields, along with the agent communication port and, where applicable, the discovery endpoint used for agent enrollment. For the full field reference, the mode-to-proxy_tls mapping, and the certificate resolution order, see Transport Layer Security.
Serverless Directors are subject to stricter port rules, because these values are written into the deployment manifest as the container's exposed ports:
| Rule | Applies to |
|---|---|
| The agent communication port is mandatory and must be in the range 1-65535 | All container types |
| The discovery port is mandatory, and must differ from the agent communication port, when discovery is enabled | All container types |
| Ports 80 and 443 are rejected | Azure Container Apps only — the platform reserves them for its own ingress |
| Device listener ports must be among those the manifest publishes | Enforced on Azure Container Apps and Azure Container Instances; advisory on Docker and Kubernetes — see Device Listener Ports below |
| No UDP listener port is published | Azure Container Apps and Azure Container Instances only — their templates render the TCP subset, see Device Listener Ports below |
The Director is created when this step is submitted, so a port that violates these rules is reported here rather than at deployment time.
Device Listener Ports
A container Director receives device traffic only on the ports its deployment manifest publishes. These come from the install templates rather than from anything chosen when the Director is created:
| Container Type | Published listener ports |
|---|---|
| Docker, Kubernetes | 1514/udp, 1514/tcp, 4317/tcp, 4318/tcp, 6514/tcp |
| Azure Container Instances, Azure Container Apps | 1514/tcp, 4317/tcp, 4318/tcp, 6514/tcp |
The Docker and Kubernetes manifests are yours to edit, so a Director of either type can publish more than this. The Azure templates are deployed as rendered.
The two Azure container types are TCP-only for different reasons. Azure Container Apps ingress does not support UDP at all. Azure Container Instances does support UDP, but rejects a container group that publishes the same port number on both protocols, so the UDP twin of 1514 would fail the whole deployment. Either way both templates render the TCP subset only, so a device that listens on UDP cannot receive traffic on an Azure container Director. Because the syslog device's protocol defaults to udp, a syslog device created there without naming a protocol binds UDP 1514, reports itself Connected, and receives nothing.
None of the templates publishes port 514. The Director image runs as an unprivileged user, so a listener cannot bind 514 inside the container without platform-specific capability tweaks, which is why the defaults are 1514 and 6514. A platform can still publish an external 514 mapped onto the container's 1514 — the device's own port stays 1514.
A device whose listener port is not published is handled differently by container type:
| Container Type | Behavior on save |
|---|---|
| Azure Container Apps, Azure Container Instances | Refused with DEVICE_LISTENER_PORT_NOT_PUBLISHED, naming the ports that Director does publish |
| Docker, Kubernetes | Saved with a warning — you apply these manifests yourself and may have added ports to the Compose file or the Service |
An update that changes neither the port, the transport, nor the bound Directors is downgraded to a warning, so an already-misconfigured device can still be edited. Self-managed, managed and orchestrated Directors publish nothing and constrain nothing. Outbound collectors — mssql, mysql, postgres, oracle, datagen, and the queue and object-store pulls — are exempt, because their port is the remote server's, not a local bind.
The published port is where senders aim; the bound port is where the device listens inside the container. Renumbering what Azure Container Apps publishes — 1514 to 21514, say — changes the address your senders use, but the device still listens on 1514 and its port must stay 1514.
Install and Connect Director
Installation Scripts:
- PowerShell Script - For Windows deployments
- Bash Script - For Linux/macOS deployments
- Copy Button - One-click copy to clipboard
- API Key - Auto-generated secure authentication key included in scripts
Run the provided script with administrative privileges on the target system. The installation downloads and configures the Director service with automatic service registration and startup configuration.
Serverless Deployment Manifest:
Serverless Directors do not use an installation script. This step instead presents a complete deployment manifest for the container type selected in Director Setup, and the PowerShell/Bash selector is not shown — the manifest is the same regardless of the platform you apply it from:
| Container Type | Manifest | Applied with |
|---|---|---|
| Docker | A Compose service definition | docker compose up |
| Kubernetes | A vmetric namespace, a Secret, a Deployment, and a LoadBalancer Service | kubectl apply |
| Azure Container Instances | An Azure Resource Manager template for a container group, with a public IP and DNS label | Azure CLI or portal deployment |
| Azure Container Apps | An Azure Resource Manager template for a container app with external ingress and a scale rule that polls the Director's own /scale endpoint | Azure CLI or portal deployment |
The manifest carries the API key as the VMETRIC_CONFIG_HASH environment variable, supplied through the platform's own secret mechanism rather than as plain text. The container name is derived from the Director name, reduced to lowercase letters, digits and hyphens and truncated to 32 characters so that it is valid on every supported platform.
Reinstalling a Director issues a new API key and a new manifest. The previously issued manifest stops authenticating, so redeploy from the new one rather than reusing the old copy.
The Azure Container Apps manifest scales on the Director's own judgement. It carries a custom scale rule of type metrics-api that polls the Director's /scale endpoint and reads back the replica count the Autoscaling policy (see Director Setup) has computed. Every replica reports the same replica-set-wide figure, so it does not matter which one answers the poll. The manifest also fixes the platform's own bounds at 1 to 10 replicas. Earlier versions of this manifest scaled on concurrent HTTP requests instead; a Director deployed from one of those keeps that rule until you reinstall it and redeploy from the new manifest.
The scale rule is an ordinary client of /scale, which sits behind the same access controls as the rest of the Director. When the Director has an access token, the manifest renders that token into an app secret for the rule to present. It is rendered once: a token rotated afterwards, or added to a Director that previously had none, does not reach the deployed rule, which is then refused with no symptom except a replica count that stops moving. Reinstall the Director to get a manifest carrying the current token.
Self-Update on Azure Container Apps:
Restarting an Azure Container Apps Director does not update it: Container Apps restarts the container inside the replica it already has, and that replica keeps the image it booted with. A new version arrives only when the replica is replaced, which is what a revision restart does (see Update Management Tab under Management). Two template parameters let the Director restart its own revision, so that
| Parameter | Default | Description |
|---|---|---|
enableSelfUpdate | false | Gives the container app a system-assigned managed identity, grants that identity a role on this one container app (nothing on the resource group), and passes the app its subscription and resource group. On an update the Director then restarts its own revision |
selfUpdateRoleDefinitionId | b24988ac-6180-42a0-ab88-20f7382dd24c (built-in Contributor) | The role granted to the app's identity, scoped to this one app. Used only when enableSelfUpdate is on |
Turning enableSelfUpdate on requires the right to create role assignments. What the deployer needs on the resource group or subscription:
| Deployer | enableSelfUpdate=true |
|---|---|
| Owner | ✅ Nothing extra needed |
| Contributor + User Access Administrator | ✅ |
| Contributor + Role Based Access Control Administrator | ✅ Can be conditioned, see below |
| Contributor only | ❌ Leave the default false |
Without the right to assign roles, a deployment with enableSelfUpdate=true fails partway: the container app is created, then the role assignment step fails with an authorization error. Deploy with the default instead, or get the right role first.
For an automation principal, the least-privilege option is Role Based Access Control Administrator with a condition that allows assigning only the Contributor role (b24988ac-6180-42a0-ab88-20f7382dd24c), and only to service principals:
((!(ActionMatches{'Microsoft.Authorization/roleAssignments/write'})) OR (@Request[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {b24988ac-6180-42a0-ab88-20f7382dd24c} AND @Request[Microsoft.Authorization/roleAssignments:PrincipalType] StringEqualsIgnoreCase 'ServicePrincipal')) AND ((!(ActionMatches{'Microsoft.Authorization/roleAssignments/delete'})) OR (@Resource[Microsoft.Authorization/roleAssignments:RoleDefinitionId] ForAnyOfAnyValues:GuidEquals {b24988ac-6180-42a0-ab88-20f7382dd24c}))
Pass it with az role assignment create … --condition-version 2.0 --condition "<condition>".
To grant the app only what an update needs instead of Contributor, create this custom role once at subscription scope and put its GUID in selfUpdateRoleDefinitionId:
{
"Name": "VirtualMetric Director Self-Update",
"Description": "Restart a Container Apps revision so it pulls a new image.",
"Actions": ["Microsoft.App/containerApps/revisions/restart/action"],
"AssignableScopes": ["/subscriptions/<subscription-id>"]
}
The condition above allows assigning the Contributor role only. If the deployer holds the conditioned Role Based Access Control Administrator role, put the custom role's GUID in place of b24988ac-6180-42a0-ab88-20f7382dd24c in both GuidEquals clauses, or the role assignment is refused.
- Turning
enableSelfUpdateon for an app that is already deployed changes the revision, so also set a newrevisionSuffixin the same deployment, or Azure refuses it as a clashing revision. - A Director deployed before these parameters existed cannot update from the console until it is redeployed once with
enableSelfUpdate=true. The update logic runs in the Director being updated. - In the first minutes after deployment an update can fall back to a plain restart while Azure propagates the new role assignment. The Director logs the reason, and the next attempt works.
Connection Verification:
After running the installation script, verify Director connectivity:
- Connecting - Director attempting initial connection
- Success - Director successfully connected to platform
- Failed - Connection attempt unsuccessful
Real-time connection status updates with visual indicators for each state.
If the Director is not yet connected, click
Update Management
Configure the Director's update policy. By default the organization-level update settings apply; enable the
Review and Complete Setup
A read-only summary of the values entered in the preceding steps. Click
Navigation
The wizard displays a 6-step progress indicator (Director Setup > Access Management > TLS Configuration > Install and Connect Director > Update Management > Review and Complete Setup). Click completed steps to navigate back. Invalid steps are marked with an error indicator.
Navigation Buttons:
Cancel - Exit wizard (first step)Next Step - Advance to next step with validationCreate director - Submit Director configuration and proceed to connection (from the Access Management step; shown asUpdate director when returning to that step after creation)Connect later - Skip connection verification (Install and Connect Director step)Back - Return to the previous stepComplete setup - Finalize Director creation (final step)
Network Requirements
Before running installation commands, ensure the target system has outbound HTTPS access to dl.vget.me. The installation scripts are served from this URL and will fail silently or with connection errors if blocked by firewall rules.
Outbound Connectivity:
- Port 443 (HTTPS) to
dl.vget.mefor installation script and binary downloads - Port 443 (HTTPS) for DataStream cloud platform communication
- DNS resolution for
dl.vget.meandapi-service.*.cloud.virtualmetric.comdomains
Serverless Directors do not download an installation script, so dl.vget.me access is not required for them. The container platform pulls the Director image from Docker Hub instead, and that registry must be reachable from wherever the manifest is deployed. Platform communication over port 443 applies as it does to every other mode.
TLS certificate validation requires accurate system time. Ensure NTP is configured and the system clock is synchronized before installation.
Installation Script Delivery
The installation commands use dl.vget.me as the script delivery endpoint. This URL serves platform-appropriate installation scripts based on the requesting client:
| Client | Script Served | Command Example |
|---|---|---|
| PowerShell | install.ps1 | $h="<apiKey>"; iwr dl.vget.me | iex |
curl/wget | install.sh | curl -sL dl.vget.me | h="<apiKey>" bash |
| Browser | Redirects to virtualmetric.com | N/A |
The scripts automatically:
- Detect the operating system (Windows, Linux, macOS, FreeBSD, etc.)
- Detect the CPU architecture (amd64, arm64)
- Download the appropriate Agent binary from
dl.vget.me/agent/{os}/{arch} - Configure the Agent with the provided API key
- Install and start the service
Supported Platforms:
| Operating System | Architectures |
|---|---|
| Windows | amd64, arm64 |
| Linux | amd64, arm64, 386, ppc64, ppc64le |
| macOS (Darwin) | amd64, arm64 |
| FreeBSD | amd64, arm64 |
| Other Unix | amd64, arm64 |
For environments where dl.vget.me is not accessible, the download URL can be configured via the VITE_INSTALLATION_DOWNLOAD_URL environment variable in self-hosted deployments.
Inbound Connectivity:
- Configure based on data source requirements
- Ports as defined in device configurations
Firewall Configuration
Outbound Rules (Required):
- Allow HTTPS (443) to
dl.vget.me(installation scripts and binaries) - Allow HTTPS/WebSocket Secure (443) to
api-service.eu-west.cloud.virtualmetric.com(platform communication - Europe) - Allow HTTPS/WebSocket Secure (443) to
api-service.aus-east.cloud.virtualmetric.com(platform communication - Australia) - Allow HTTPS/WebSocket Secure (443) to
api-service.us-east.cloud.virtualmetric.com(platform communication - US) - Allow DNS queries for name resolution
- Allow NTP for time synchronization
If your firewall processes rules in order, ensure the dl.vget.me rule is evaluated before any blanket deny rules. Installation will fail if the target system cannot reach this endpoint.
Inbound Rules (As Needed):
- Open ports for configured data collection protocols
- Allow management access (SSH for Linux, RDP for Windows)
- Configure source restrictions based on security policies
Security and Performance
Security Considerations
Deploy Directors in appropriate network segments and implement network access controls and monitoring. Use dedicated service accounts with minimal privileges and enable logging and audit trails for security monitoring. Implement encryption for data at rest and in transit, and maintain regular security updates and patch management.
Performance Optimization
Monitor CPU and memory utilization patterns and allocate sufficient disk space for logging and buffering. Configure appropriate network interface capacity and plan for peak load scenarios and growth.
For data processing efficiency, optimize YAML pipeline configurations for performance and implement efficient parsing and transformation rules. Use appropriate batch sizes for different data sources and monitor processing latency and throughput metrics. Consider Agent pre-processing for high-volume deployments to distribute processing load.
High Availability Planning
Maintain regular configuration backups and version control. Document recovery procedures and test them regularly. Implement monitoring and alerting for service health and plan for disaster recovery scenarios.
For redundancy, group Directors into clusters for automatic failover and load balancing. See Clusters for configuration details and quorum requirements. Consider geographic distribution for disaster recovery and plan for seamless failover procedures.
Advanced Deployment Scenarios
Multi-Site Deployments
For organizations with multiple locations or data centers, deploy Directors at each site for local data processing. Implement centralized configuration management and coordinate routing and aggregation strategies. Plan for inter-site connectivity and failover.
Compliance and Regulatory Requirements
For regulated industries requiring specific compliance, implement appropriate data retention and disposal policies. Configure audit logging and compliance reporting, ensure data sovereignty and jurisdictional requirements are met, and plan for regulatory audit and inspection procedures.
Scalability Planning
As your environment grows, monitor resource utilization and performance trends. Plan for vertical scaling (more resources per Director) or horizontal scaling (clustering multiple Directors). Implement capacity planning and forecasting procedures to determine when to transition from standalone to clustered deployments.