BizFirst Observe
Docker Compose Deployment
The reference Docker Compose file for the complete BizFirst Observe stack. This configuration is suitable for development and small single-node production deployments.
Reference docker-compose.yml
version: "3.8"
networks:
observe-net:
driver: bridge
volumes:
loki-data: {}
prometheus-data: {}
tempo-data: {}
grafana-data: {}
services:
# ── OTel Collector ─────────────────────────────────
otel-collector:
image: otel/opentelemetry-collector-contrib:0.99.0
command: ["--config=/etc/otel-collector-config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- "4317:4317" # OTLP gRPC — BizFirstGO services send here
- "4318:4318" # OTLP HTTP
- "8888:8888" # Collector self-metrics (scraped by Prometheus)
networks: [observe-net]
restart: unless-stopped
# ── Grafana Loki ────────────────────────────────────
loki:
image: grafana/loki:3.1.0
command: -config.file=/etc/loki/loki-config.yaml
volumes:
- ./loki-config.yaml:/etc/loki/loki-config.yaml
- loki-data:/loki
ports:
- "3100:3100"
networks: [observe-net]
restart: unless-stopped
# ── Prometheus ──────────────────────────────────────
prometheus:
image: prom/prometheus:v2.51.0
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.retention.time=90d"
- "--storage.tsdb.path=/prometheus"
- "--web.enable-remote-write-receiver"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./alert-rules.yml:/etc/prometheus/alert-rules.yml
- prometheus-data:/prometheus
ports:
- "9090:9090"
networks: [observe-net]
restart: unless-stopped
# ── Grafana Tempo ────────────────────────────────────
tempo:
image: grafana/tempo:2.4.0
command: -config.file=/etc/tempo-config.yaml
volumes:
- ./tempo-config.yaml:/etc/tempo-config.yaml
- tempo-data:/tmp/tempo
ports:
- "3200:3200" # Tempo HTTP API (Grafana queries here)
- "4327:4317" # OTLP gRPC (Collector exports traces here; mapped to avoid conflict)
networks: [observe-net]
restart: unless-stopped
# ── Grafana ─────────────────────────────────────────
grafana:
image: grafana/grafana:10.4.0
environment:
GF_AUTH_ANONYMOUS_ENABLED: "false"
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: "${GRAFANA_ADMIN_PASSWORD}"
GF_USERS_ALLOW_SIGN_UP: "false"
GF_FEATURE_TOGGLES_ENABLE: "traceqlEditor traceToMetrics"
volumes:
- grafana-data:/var/lib/grafana
- ./grafana-provisioning:/etc/grafana/provisioning
- ./dashboards:/var/lib/grafana/dashboards
ports:
- "3000:3000"
networks: [observe-net]
depends_on: [loki, prometheus, tempo]
restart: unless-stopped
# ── Alertmanager ────────────────────────────────────
alertmanager:
image: prom/alertmanager:v0.27.0
command: --config.file=/etc/alertmanager/alertmanager.yml
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports:
- "9093:9093"
networks: [observe-net]
restart: unless-stopped
# ── Node Exporter (host metrics) ─────────────────────
node-exporter:
image: prom/node-exporter:v1.7.0
pid: host
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- "--path.procfs=/host/proc"
- "--path.sysfs=/host/sys"
networks: [observe-net]
restart: unless-stopped
Starting the Stack
# Copy the reference configs to your deployment directory
cp -r /path/to/bizfirst-observe-configs ./observe
# Set required environment variables
export GRAFANA_ADMIN_PASSWORD="your-secure-password"
# Start all components
cd ./observe
docker compose up -d
# Verify all containers are running
docker compose ps
# Expected output: all services in "running" state
# NAME STATUS
# otel-collector running
# loki running
# prometheus running
# tempo running
# grafana running
# alertmanager running
# node-exporter running
Accessing the Stack
| Component | URL | Notes |
|---|---|---|
| Grafana UI | http://localhost:3000 | Login with admin / GRAFANA_ADMIN_PASSWORD |
| Prometheus UI | http://localhost:9090 | For admin use only; not for regular engineers |
| Alertmanager UI | http://localhost:9093 | For managing silences and alert routing |