Centralized log management is essential for debugging production issues, detecting security incidents, and understanding application behavior — but traditional solutions like the ELK stack (Elasticsearch, Logstash, Kibana) can consume 4–8 GB of RAM on their own, making them impractical for budget VPS. The Grafana LGTM stack — Loki (log aggregation), Promtail (log agent), and Grafana (visualization) — offers a lightweight alternative that runs comfortably on a 1–2 GB VPS while indexing gigabytes of logs per day.
This guide covers deploying Loki + Promtail + Grafana on a single VPS. For performance considerations and VPS sizing, check our performance benchmarks.
Why Loki Instead of Elasticsearch?
| Feature | Loki (Grafana) | Elasticsearch (ELK) |
|---|---|---|
| RAM at idle (single node) | 150–300 MB | 1.5–3 GB |
| Storage approach | Labels + compressed chunks | Full-text inverted index |
| Disk usage | ~30% of raw log size | ~150% of raw log size |
| Query language | LogQL (simple, PromQL-like) | Query DSL (verbose JSON) |
| Compression | gzip/zstd (default) | Requires ILM tuning |
| Best for | Small-medium VPS, 1–50 GB/day | Large clusters, 100+ GB/day |
For a single VPS handling multiple applications (Nginx, PostgreSQL, system logs), Loki’s label-based indexing keeps memory usage flat regardless of log volume — unlike Elasticsearch, which builds in-memory indices proportional to ingested data.
Prerequisites
- VPS with at least 1 GB RAM (2 GB recommended for production)
- Ubuntu 22.04+ or Debian 12+
- Docker and Docker Compose installed (or install binaries directly)
- At least 10 GB of disk for log storage (NVMe recommended)
Step 1: Install Loki (Binary Method)
For maximum memory efficiency on a 1 GB VPS, install the Loki binary directly (no Docker overhead):
# Download the latest Loki binary
curl -O -L "https://github.com/grafana/loki/releases/latest/download/loki-linux-amd64.zip"
unzip loki-linux-amd64.zip
sudo mv loki-linux-amd64 /usr/local/bin/loki
sudo chmod +x /usr/local/bin/loki
# Create config directory
sudo mkdir -p /etc/loki /data/loki
Step 2: Configure Loki for Low Memory
Create /etc/loki/loki-config.yaml with memory-efficient settings:
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
chunk_idle_period: 30m
chunk_target_size: 1048576 # 1 MB chunks
max_chunk_age: 1h
wal:
enabled: true
dir: /data/loki/wal
compactor:
working_directory: /data/loki/compactor
retention_enabled: true
schema_config:
configs:
- from: 2024-01-01
store: boltdb-shipper
object_store: filesystem
schema: v12
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /data/loki/index
cache_location: /data/loki/cache
shared_store: filesystem
filesystem:
directory: /data/loki/chunks
limits_config:
ingestion_rate_mb: 10
ingestion_burst_size_mb: 20
max_series_per_user: 5000
max_global_streams_per_user: 5000
table_manager:
retention_deletes_enabled: true
retention_period: 168h # 7 days
Step 3: Install and Configure Promtail
curl -O -L "https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip"
unzip promtail-linux-amd64.zip
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
sudo chmod +x /usr/local/bin/promtail
sudo mkdir -p /etc/promtail
Create /etc/promtail/promtail-config.yaml to collect Nginx and system logs:
server:
http_listen_port: 9080
positions:
filename: /data/promtail-positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets: [localhost]
labels:
job: varlogs
__path__: /var/log/*.log
- job_name: nginx
static_configs:
- targets: [localhost]
labels:
job: nginx
__path__: /var/log/nginx/*.log
Step 4: Install Grafana
sudo apt install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo wget -q -O /usr/share/keyrings/grafana.key https://packages.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install -y grafana
sudo systemctl enable grafana-server
Step 5: Start the Stack
# Start Loki
sudo -u nobody loki -config.file=/etc/loki/loki-config.yaml &
# Or use systemd for production
# Start Promtail
sudo -u nobody promtail -config.file=/etc/promtail/promtail-config.yaml &
# Start Grafana
sudo systemctl start grafana-server
# Verify all services
curl http://localhost:3100/ready
curl http://localhost:9090/api/health
curl http://localhost:3000/api/health
Step 6: Connect Grafana to Loki
Open http://YOUR_VPS_IP:3000 (default login: admin/admin). Go to Configuration → Data Sources → Add data source → Loki. Set the URL to http://localhost:3100 and click Save & Test. Then go to Explore and run a LogQL query:
{job="varlogs"} |= "error"
This returns all system log lines containing “error” — without needing to SSH into the server or grep through files manually.
Resource Usage on a 2 GB VPS
| Service | RAM (idle) | RAM (1K lines/sec) | Disk/day |
|---|---|---|---|
| Loki | 95 MB | 180 MB | ~500 MB |
| Promtail | 18 MB | 35 MB | N/A (stateless) |
| Grafana | 85 MB | 120 MB | ~50 MB (dashboards) |
| Total | 198 MB | 335 MB | ~550 MB/day |
At this rate, a 20 GB disk stores ~35 days of logs — more than enough for debugging and compliance. With 7-day retention configured in Loki, disk usage stabilizes at ~4 GB.
Useful LogQL Queries
# Top 10 IPs hitting your server (Nginx)
rate({job="nginx"} |= "GET" | pattern " [] " " [ ]" [][:5m]
# Slow requests (>5 seconds)
{job="nginx"} | json | upstream_response_time > 5
# Database errors
{job="varlogs"} |= "postgres" |= "ERROR"
# Rate of 5xx errors per minute
sum by (host) (rate({job="nginx"} | json | status =~ "5.." [1m]))
Conclusion
Loki + Promtail + Grafana replaces the bloated ELK stack with a solution that runs on any modern VPS with 1–2 GB RAM. You get centralized log search, real-time monitoring, and Grafana dashboards — all for under 200 MB of baseline RAM. For faster log queries and lower disk usage, pair this setup with NVMe storage. Compare VPS plans on our site and see our VPS comparison table for plans with sufficient RAM and fast storage for log-heavy workloads.



Leave a Reply
You must be logged in to post a comment.