Building a Comprehensive Infrastructure Monitoring System with VictoriaMetrics, Vector, and Grafana on a Single VPS
Introduction: The Challenge of Single-VPS Observability
In modern infrastructure management, observability is no longer a luxury reserved for large enterprises with massive budgets. Startups, independent developers, and small-to-medium enterprises (SMEs) frequently deploy their applications on a single Virtual Private Server (VPS) to keep costs predictable. However, monitoring that infrastructure often introduces a paradox: traditional monitoring stacks—such as Prometheus, Grafana Loki, and the Elastic Stack (ELK)—are notoriously resource-heavy. Running them on a single VPS can consume more CPU, RAM, and disk I/O than the actual production applications they are meant to monitor.
To solve this, architectural efficiency is paramount. This blog post explores how to build a highly optimized, production-ready, and comprehensive monitoring system on a single VPS using three cutting-edge tools: VictoriaMetrics (for metrics storage), Vector (for log collection and routing), and Grafana (for unified visualization). Together, this trio forms an incredibly lightweight yet powerful ecosystem that provides deep insights into your system without suffocating your budget or server resources.
---Why This Stack? VictoriaMetrics + Vector vs. The Alternatives
Before diving into the implementation details, it is vital to understand why this specific combination of tools changes the game for single-server infrastructure.
1. VictoriaMetrics: The Prometheus Killer
While Prometheus is the de facto standard for cloud-native metrics, it is highly memory-intensive. VictoriaMetrics was engineered from the ground up as a drop-in replacement for Prometheus, offering full support for the PromQL query language while utilizing significantly less RAM and disk space. In benchmark tests, VictoriaMetrics often demonstrates up to a 10x reduction in memory usage and superior data compression rates compared to standard Prometheus instances, making it the perfect fit for constrained VPS environments.
2. Vector: One Agent to Rule Them All
Traditionally, engineers used Promtail for logs and Node Exporter for metrics. Running multiple daemons wastes precious CPU cycles. Vector, built by Datadog in Rust, is an ultra-fast, memory-safe data pipeline. It acts as both a metric scraper and a log aggregator simultaneously. Vector can collect system logs, parse application outputs, scrape hardware metrics, and ship everything to its respective destinations. Replacing multiple collectors with a single Vector agent reduces system overhead drastically.
3. Grafana: The Gold Standard for Visualization
Grafana remains the undisputed king of open-source dashboards. Because VictoriaMetrics behaves exactly like a Prometheus data source, Grafana connects seamlessly. This allows you to build stunning, real-time dashboards for both logs and metrics under a single pane of glass.
---Architectural Overview: Data Flow on a Single VPS
On a single host, efficiency is achieved by localizing data transmission. The architecture functions via a streamlined pipeline:
- Data Collection: Vector runs as a background service, reading system metrics (CPU, RAM, Disk, Network) and tailing system log files (such as
/var/log/nginx/access.logor Docker container logs). - Ingestion and Storage: Vector processes the raw data. It pushes the system metrics into VictoriaMetrics via the Prometheus remote-write API and forwards organized log data into VictoriaMetrics' log storage engine (or a lightweight system journal).
- Visualization: Grafana queries VictoriaMetrics using PromQL/MetricsQL to generate live, interactive graphs and alerts.
Key Insight: By containing this entire loop within a single loopback interface (localhost), you eliminate network latency and external bandwidth costs, maximizing overall data security and throughput.---
Step-by-Step Deployment Strategy
To maintain clean isolation and ease of upgrades, we recommend deploying VictoriaMetrics and Grafana via Docker Compose, while running Vector either via Docker or as a native systemd service for direct hardware access.
Step 1: Deploying VictoriaMetrics and Grafana via Docker Compose
Create a directory named /opt/monitoring and define your docker-compose.yml file. This configuration ensures persistent data storage across restarts:
version: '3.8'
services:
victoriametrics:
image: victoriametrics/victoria-metrics:v1.95.0
container_name: victoria_metrics
ports:
- "8428:8428"
volumes:
- vmdata:/vmdata
command:
- '--storageDataPath=/vmdata'
- '--retentionPeriod=1 month'
restart: always
grafana:
image: grafana/grafana:10.2.0
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafanadata:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=your_secure_password
restart: always
volumes:
vmdata:
grafanadata:
Run docker compose up -d to spin up the core databases and visualization layer. VictoriaMetrics will now listen on port 8428, ready to receive incoming metrics and logs.
Step 2: Configuring Vector for Metrics and Logs
Next, we configure Vector using its native TOML configuration language. Vector must be instructed to scrape the local host system resources and parse standard system logs, then ship them cleanly into VictoriaMetrics.
[sources.host_metrics]
type = "host_metrics"
scrape_interval_secs = 15
[sources.syslog]
type = "file"
include = ["/var/log/auth.log", "/var/log/syslog"]
ignore_older_secs = 600
[sinks.vm_metrics]
type = "prometheus_remote_write"
inputs = ["host_metrics"]
endpoint = "http://localhost:8428/api/v1/write"
[sinks.vm_logs]
type = "elasticsearch"
inputs = ["syslog"]
endpoint = "http://localhost:8428/insert/elasticsearch/"
mode = "bulk"
Note: VictoriaMetrics provides an Elasticsearch-compatible endpoint, making it incredibly simple to ingest text logs using standard log shippers like Vector without needing to maintain heavy Elasticsearch clusters.
---Optimizing for Single-Server Resource Limits
When running monitoring alongside production workloads, strict resource management is critical. Implement these configurations to avoid out-of-memory (OOM) errors:
- Set Data Retention Wisely: On a limited disk, keep your retention period short (e.g., 14 to 30 days). VictoriaMetrics compresses data brilliantly, but logs can quickly bloat storage if left unchecked.
- Configure Scraping Intervals: Lower the frequency of metric collection. Scraping every 15 to 30 seconds instead of every 1 second dramatically reduces CPU utilization and storage growth.
- Implement Memory Caps: Use Docker Compose resource limits to restrict Grafana and VictoriaMetrics from hogging system memory during heavy queries.
Conclusion and Next Steps
Building a comprehensive monitoring stack on a single VPS doesn't mean compromising on quality or performance. By combining the hyper-efficient storage of VictoriaMetrics, the unified processing power of Vector, and the rich analytics of Grafana, you achieve an enterprise-grade observability platform that operates cleanly within a minimal footprint.
With your new stack up and running, your next step is to log into your Grafana dashboard (at http://your-vps-ip:3000), add VictoriaMetrics as a Prometheus datasource, and import standard host-monitoring dashboards. You will instantly gain complete visibility over your single-server infrastructure, ensuring your applications stay healthy, fast, and cost-efficient.
