BizFirst Observe
Prerequisites
Before starting the BizFirst Observe installation, verify that your host meets the infrastructure requirements — compute, disk, ports, and network access. Skipping this step is the most common source of installation failures.
Compute Requirements
| Profile | CPU | RAM | Disk | Use Case |
|---|---|---|---|---|
| Development | 2 cores | 8 GB | 20 GB | Local dev, short-lived data, single tenant |
| Staging | 4 cores | 16 GB | 50 GB | Pre-production testing, 7-day retention |
| Production (small) | 8 cores | 32 GB | 500 GB | Up to 5 tenants, 30-day log retention |
| Production (medium) | 16 cores | 64 GB | 2 TB | Up to 20 tenants, 90-day metric retention |
Software Prerequisites
| Software | Minimum Version | Check Command |
|---|---|---|
| Docker Engine | 24.0 | docker --version |
| Docker Compose | 2.20 | docker compose version |
| OR: Kubernetes | 1.28 | kubectl version |
| OR: Helm | 3.12 | helm version |
| curl | any | curl --version |
| jq (optional) | 1.6 | jq --version |
Required Ports
| Port | Component | Direction | Description |
|---|---|---|---|
| 4317 | OTel Collector | Inbound from BizFirstGO | OTLP/gRPC — primary telemetry intake |
| 4318 | OTel Collector | Inbound from BizFirstGO | OTLP/HTTP — alternative to gRPC |
| 3100 | Loki | Internal (OTel→Loki) | Loki HTTP API; also used by Grafana |
| 9090 | Prometheus | Internal (scraping outbound) | Prometheus UI and query API |
| 3200 | Tempo | Internal (OTel→Tempo) | Tempo OTLP receiver and query API |
| 3000 | Grafana | Inbound from engineers | Grafana web UI |
| 9093 | Alertmanager | Internal (Prometheus→AM) | Alertmanager webhook receiver |
| 9100 | Node Exporter | Internal (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.