personal-lifecycle-tracker / observability / docker-compose.yaml
docker-compose.yaml
Raw
name: personal-lifecycle-observability

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.95.0
    container_name: ${OTEL_COLLECTOR_CONTAINER_NAME:-personal-lifecycle-otel-collector}
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:ro
    ports:
      - "${OTEL_GRPC_PORT:-4327}:4317" # OTLP gRPC receiver
      - "${OTEL_HTTP_PORT:-4328}:4318" # OTLP HTTP receiver
      - "${OTEL_METRICS_PORT:-8899}:8889" # Prometheus metrics exporter
    networks:
      observability-net:
        aliases:
          - otel-collector
          - personal-lifecycle-otel-collector
    depends_on:
      - tempo
      - loki
      - prometheus
    restart: unless-stopped

  prometheus:
    image: prom/prometheus:v2.51.0
    container_name: ${PROMETHEUS_CONTAINER_NAME:-personal-lifecycle-prometheus}
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --web.enable-lifecycle
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./alert_rules.yml:/etc/prometheus/alert_rules.yml:ro
      - prometheus_data:/prometheus
    ports:
      - "${PROMETHEUS_PORT:-9091}:9090"
    networks:
      - observability-net
    restart: unless-stopped

  loki:
    image: grafana/loki:2.9.4
    container_name: ${LOKI_CONTAINER_NAME:-personal-lifecycle-loki}
    command: -config.file=/etc/loki/local-config.yaml
    volumes:
      - ./loki-config.yaml:/etc/loki/local-config.yaml:ro
      - loki_data:/loki
    ports:
      - "${LOKI_PORT:-3101}:3100"
    networks:
      - observability-net
    restart: unless-stopped

  tempo:
    image: grafana/tempo:2.4.1
    container_name: ${TEMPO_CONTAINER_NAME:-personal-lifecycle-tempo}
    command: ["-config.file=/etc/tempo.yaml"]
    volumes:
      - ./tempo-config.yaml:/etc/tempo.yaml:ro
      - tempo_data:/var/tempo
    ports:
      - "${TEMPO_PORT:-3201}:3200"
    networks:
      - observability-net
    restart: unless-stopped

  grafana:
    image: grafana/grafana:10.4.0
    container_name: ${GRAFANA_CONTAINER_NAME:-personal-lifecycle-grafana}
    environment:
      - GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin}
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
      - GF_USERS_ALLOW_SIGN_UP=false
      - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor
    volumes:
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
      - ./grafana/dashboards:/etc/grafana/dashboards:ro
      - grafana_data:/var/lib/grafana
    ports:
      - "${GRAFANA_PORT:-3004}:3000"
    networks:
      - observability-net
    depends_on:
      - prometheus
      - loki
      - tempo
    restart: unless-stopped

networks:
  observability-net:
    name: ${OBSERVABILITY_NET:-personal-lifecycle-observability-net}
    driver: bridge

volumes:
  prometheus_data:
  loki_data:
  tempo_data:
  grafana_data: