nativelink Docker & Self-Hosted Deployment

GitHub

NativeLink is a Nix-powered, open source, high-performance build cache and remote execution server, compatible with Bazel, Soong, Pants, Buck2, Reclient,...

RAW Compose
1. Pull Image (DOCKERHUB) docker pull otel/opentelemetry-collector-contrib
2. Docker Run (1-Click Launch) docker run -d --name nativelink -p 4317:4317 --restart always otel/opentelemetry-collector-contrib:0.98.0
3. Podman Run podman run -d --name nativelink -p 4317:4317 --restart always otel/opentelemetry-collector-contrib:0.98.0
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://docker.io/otel/opentelemetry-collector-contrib:0.98.0
5. ORAS Pull (OCI Artifact) oras pull otel/opentelemetry-collector-contrib:0.98.0
6. Compose Deployment docker compose up -d
deployment-examples/metrics/docker-compose.yaml
Download .yml
version: '3.8'

services:
  # OpenTelemetry Collector
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.98.0
    container_name: otel-collector
    restart: unless-stopped
    command: ["--config=/etc/otel-collector/config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector/config.yaml:ro
    ports:
      - "4317:4317"   # OTLP gRPC receiver
      - "4318:4318"   # OTLP HTTP receiver
      - "9090:9090"   # Prometheus metrics exporter
      - "8888:8888"   # Collector metrics
      - "13133:13133" # Health check
    environment:
      - OTLP_BACKEND_ENDPOINT=${OTLP_BACKEND_ENDPOINT:-otlp-backend:4317}
      - OTLP_BACKEND_TOKEN=${OTLP_BACKEND_TOKEN:-}
    networks:
      - metrics

  # Prometheus with OTLP support
  prometheus:
    image: prom/prometheus:v3.0.0
    container_name: prometheus
    restart: unless-stopped
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
      - '--web.enable-otlp-receiver'  # Enable OTLP receiver
      - '--storage.tsdb.retention.time=30d'
    volumes:
      - ./prometheus-config.yaml:/etc/prometheus/prometheus.yml:ro
      - ./prometheus-recording-rules.yml:/etc/prometheus/rules/nativelink.yml:ro
      - prometheus_data:/prometheus
    ports:
      - "9091:9090"  # Prometheus web UI (different port to avoid conflict with collector)
    networks:
      - metrics
    depends_on:
      - otel-collector

  # Grafana for visualization
  grafana:
    image: grafana/grafana:12.4.0
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_INSTALL_PLUGINS=grafana-piechart-panel
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
      - ./grafana/dashboards:/var/lib/grafana/dashboards:ro
    networks:
      - metrics
    depends_on:
      - prometheus

  # Optional: AlertManager for alerts
  alertmanager:
    image: prom/alertmanager:v0.27.0
    container_name: alertmanager
    restart: unless-stopped
    volumes:
      - ./alertmanager-config.yml:/etc/alertmanager/config.yml:ro
      - alertmanager_data:/alertmanager
    ports:
      - "9093:9093"
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'
    networks:
      - metrics

  # Optional: Node exporter for host metrics
  node-exporter:
    image: prom/node-exporter:v1.7.0
    container_name: node-exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    ports:
      - "9100:9100"
    networks:
      - metrics

  # Optional: Jaeger for trace visualization (if traces are enabled)
  jaeger:
    image: jaegertracing/all-in-one:1.53
    container_name: jaeger
    restart: unless-stopped
    environment:
      - COLLECTOR_OTLP_ENABLED=true
    ports:
      - "16686:16686"  # Jaeger UI
      - "14268:14268"  # Jaeger collector HTTP
    networks:
      - metrics

volumes:
  prometheus_data:
  grafana_data:
  alertmanager_data:

networks:
  metrics:
    driver: bridge

# Usage Instructions:
# 1. Start the stack: docker-compose up -d
# 2. Configure NativeLink with these environment variables:
#    export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
#    export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
#    export OTEL_SERVICE_NAME=nativelink
#    export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=dev"
# 3. Access services:
#    - Prometheus: http://localhost:9091
#    - Grafana: http://localhost:3000 (admin/admin)
#    - Jaeger: http://localhost:16686
#    - AlertManager: http://localhost:9093
#    - OTEL Collector metrics: http://localhost:8888/metrics