Portal Community

Compute Requirements

ProfileCPURAMDiskUse Case
Development2 cores8 GB20 GBLocal dev, short-lived data, single tenant
Staging4 cores16 GB50 GBPre-production testing, 7-day retention
Production (small)8 cores32 GB500 GBUp to 5 tenants, 30-day log retention
Production (medium)16 cores64 GB2 TBUp to 20 tenants, 90-day metric retention

Software Prerequisites

SoftwareMinimum VersionCheck Command
Docker Engine24.0docker --version
Docker Compose2.20docker compose version
OR: Kubernetes1.28kubectl version
OR: Helm3.12helm version
curlanycurl --version
jq (optional)1.6jq --version

Required Ports

PortComponentDirectionDescription
4317OTel CollectorInbound from BizFirstGOOTLP/gRPC — primary telemetry intake
4318OTel CollectorInbound from BizFirstGOOTLP/HTTP — alternative to gRPC
3100LokiInternal (OTel→Loki)Loki HTTP API; also used by Grafana
9090PrometheusInternal (scraping outbound)Prometheus UI and query API
3200TempoInternal (OTel→Tempo)Tempo OTLP receiver and query API
3000GrafanaInbound from engineersGrafana web UI
9093AlertmanagerInternal (Prometheus→AM)Alertmanager webhook receiver
9100Node ExporterInternal (Prometheus scrapes)Host-level system metrics

Network Requirements

# Verify required ports are available before starting:
for port in 3000 3100 3200 4317 4318 9090 9093 9100; do
  nc -zv localhost $port 2>&1 | grep -q "succeeded" && \
    echo "PORT $port: ALREADY IN USE (conflict)" || \
    echo "PORT $port: available"
done

# Expected output (all ports should show "available"):
# PORT 3000: available
# PORT 3100: available
# ...

# If a port is in use, find the conflicting process:
lsof -i :3000

Disk Configuration

# Recommended mount points for production:
# Separate mounts prevent observability storage from filling the OS disk

/var/lib/loki/       → 200 GB (log storage)
/var/lib/prometheus/ → 100 GB (metric storage — 90-day TSDB blocks)
/var/lib/tempo/      → 50 GB  (trace storage — 7-day WAL + blocks)
/var/lib/grafana/    → 5 GB   (dashboard definitions, users)

# Verify available space:
df -h /var/lib/

# Minimum inode count (Loki creates many small files):
df -i /var/lib/loki/
# Should show > 1,000,000 inodes available

S3-Compatible Storage (Production Recommended)

For production deployments, configure Loki, Tempo, and the Prometheus remote write target to use S3-compatible object storage. This decouples retention from local disk size:

# Options for S3-compatible storage:
# 1. AWS S3 (recommended for cloud deployments)
# 2. MinIO (self-hosted, S3-compatible)
# 3. Azure Blob Storage (via S3 compatibility layer)
# 4. Google Cloud Storage (via S3 compatibility layer)

# If using MinIO for on-premises:
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -v /var/lib/minio:/data \
  minio/minio server /data --console-address ":9001"

# Create required buckets:
mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/loki-chunks
mc mb local/loki-ruler
mc mb local/tempo-traces
mc mb local/prometheus-thanos
Local Disk Storage Is For Development Only

Using local disk storage for Loki and Tempo in production means that data is lost if the host is replaced. Always configure S3-compatible object storage for production — it also enables horizontal scaling later.