Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,216 changes: 956 additions & 260 deletions README.md

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions alloy/config.alloy
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Grafana Alloy: discover Docker containers and ship logs to Loki.

discovery.docker "containers" {
host = "unix:///var/run/docker.sock"
}

// Optional: add useful labels.
discovery.relabel "docker_labels" {
targets = discovery.docker.containers.targets

rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "container"
}

rule {
source_labels = ["__meta_docker_container_image"]
target_label = "image"
}

rule {
source_labels = ["__meta_docker_container_id"]
target_label = "container_id"
}
}

loki.source.docker "docker" {
host = "unix:///var/run/docker.sock"
targets = discovery.relabel.docker_labels.output
forward_to = [loki.process.docker.receiver]
}

loki.process "docker" {
stage.docker {}
forward_to = [loki.write.loki.receiver]
}

loki.write "loki" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
}
}
14 changes: 14 additions & 0 deletions caddy/Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,17 @@
}
reverse_proxy pushgateway:9091
}

:3100 {
basicauth /* {
{$ADMIN_USER} {$ADMIN_PASSWORD_HASH}
}
reverse_proxy loki:3100
}

:3200 {
basicauth /* {
{$ADMIN_USER} {$ADMIN_PASSWORD_HASH}
}
reverse_proxy tempo:3200
}
Binary file added core
Binary file not shown.
88 changes: 88 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ networks:
volumes:
prometheus_data: {}
grafana_data: {}
loki_data: {}
tempo_data: {}

services:

Expand Down Expand Up @@ -104,6 +106,90 @@ services:
labels:
org.label-schema.group: "monitoring"

loki:
image: grafana/loki:2.9.8
container_name: loki
command: -config.file=/etc/loki/loki.yml
volumes:
- ./loki:/etc/loki:ro
- loki_data:/loki
restart: unless-stopped
expose:
- 3100
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"

tempo:
image: grafana/tempo:2.3.1
container_name: tempo
command: -config.file=/etc/tempo/tempo.yml
volumes:
- ./tempo:/etc/tempo:ro
- tempo_data:/var/tempo
restart: unless-stopped
expose:
- 3200
- 4317
- 4318
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"

otel-collector:
image: otel/opentelemetry-collector-contrib:0.96.0
container_name: otel-collector
command: ["--config=/etc/otel-collector/config.yml"]
volumes:
- ./otel-collector:/etc/otel-collector:ro
restart: unless-stopped
ports:
# OTLP endpoints for apps (host -> collector)
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
expose:
- 8889 # Prometheus scrape (OTLP metrics -> Prometheus exporter)
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"

ollama-gateway:
image: envoyproxy/envoy:v1.30.4
container_name: ollama-gateway
command: ["/usr/local/bin/envoy", "-c", "/etc/envoy/envoy.yml", "--log-level", "info"]
volumes:
- ./envoy:/etc/envoy:ro
extra_hosts:
# Linux Docker: maps to host gateway IP (Docker 20.10+)
- "host.docker.internal:host-gateway"
ports:
# Local Ollama gateway for users/apps (host -> gateway)
- "11435:11434"
expose:
# Envoy admin (/stats/prometheus)
- 9901
restart: unless-stopped
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"

alloy:
image: grafana/alloy:v1.3.0
container_name: alloy
command: ["run", "--server.http.listen-addr=0.0.0.0:12345", "/etc/alloy/config.alloy"]
volumes:
- ./alloy:/etc/alloy:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"

pushgateway:
image: prom/pushgateway:v1.11.0
container_name: pushgateway
Expand All @@ -124,6 +210,8 @@ services:
- "9090:9090"
- "9093:9093"
- "9091:9091"
- "3100:3100"
- "3200:3200"
volumes:
- ./caddy:/etc/caddy
environment:
Expand Down
77 changes: 77 additions & 0 deletions envoy/envoy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
static_resources:
listeners:
- name: listener_ollama
address:
socket_address:
address: 0.0.0.0
port_value: 11434
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ollama_gateway
generate_request_id: true
tracing:
provider:
name: envoy.tracers.opentelemetry
typed_config:
"@type": type.googleapis.com/envoy.config.trace.v3.OpenTelemetryConfig
grpc_service:
envoy_grpc:
cluster_name: otel_collector
timeout: 0.25s
service_name: ollama-gateway
access_log:
- name: envoy.access_loggers.stdout
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
route_config:
name: local_route
virtual_hosts:
- name: ollama
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: ollama_upstream
timeout: 0s
http_filters:
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

clusters:
- name: ollama_upstream
type: STRICT_DNS
connect_timeout: 2s
load_assignment:
cluster_name: ollama_upstream
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: host.docker.internal
port_value: 11434

- name: otel_collector
type: STRICT_DNS
connect_timeout: 1s
http2_protocol_options: {}
load_assignment:
cluster_name: otel_collector
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: otel-collector
port_value: 4317

admin:
address:
socket_address:
address: 0.0.0.0
port_value: 9901
Loading