Portal Community

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

ComponentURLNotes
Grafana UIhttp://localhost:3000Login with admin / GRAFANA_ADMIN_PASSWORD
Prometheus UIhttp://localhost:9090For admin use only; not for regular engineers
Alertmanager UIhttp://localhost:9093For managing silences and alert routing