- Migrate all 127 non-reserved docs to OKF v0.1 frontmatter (type/description/tags/timestamp); fix 13 YAML issues, 2 duplicate-FM blocks, strip reserved-page FM - Restructure log.md to OKF (## YYYY-MM-DD, newest-first) - Fact-check against scripts/AGENTS.md ground truth: fix 6 false 'Active' banners on retired runbooks, 96->114 GiB GTT, deployment.md vs deploy-plan.py/deploy-remote.sh, Deployment Flow frank-medium=Quadlet, Calibre 9.9.0->9.15.0 + CVE-2025-7404 conflation, Copyparty v1.20.24, RomM 5.3.0 breaking change - Move *arr docs to new FrankBook-Pro/ section (git mv, link-safe) - Write active runbook bodies from ground truth (frank-large, frank-small) - Add 3 research briefs + HTML report: Local TTS and Voice Cloning, AI Job Search and Resume Tools, Most Popular Self-Hosted AI Apps (Jun-Sep 2026) - Add upstream-version rows to ComfyUI/OpenWebUI/Hermes app docs - All 336 tests pass; 136 pages, 0 unresolved wikilinks
63 lines
2.8 KiB
Markdown
63 lines
2.8 KiB
Markdown
---
|
|
type: reference
|
|
description: "Alloy is Grafana's log and telemetry shipper."
|
|
tags:
|
|
- infrastructure
|
|
timestamp: 2026-09-11
|
|
---
|
|
|
|
# Alloy
|
|
|
|
Alloy is Grafana's log and telemetry shipper. It replaces Promtail (EOL 2026-03-02). It forwards container and journal logs to Loki.
|
|
|
|
**Host:** Dankclaw (one instance per host) — **Port:** 12345 (loopback) — **Docs:** https://grafana.com/docs/alloy/latest
|
|
|
|
## Facts
|
|
|
|
| Item | Value |
|
|
|------|-------|
|
|
| Image | `franksdank/alloy:latest` (local build: upstream + a static busybox for the healthcheck) |
|
|
| Published | `127.0.0.1:12345` → 12345 (its own UI/health port) |
|
|
| Unit | `dankclaw/observability/quadlet/alloy.container` → `alloy.service` |
|
|
| Config | `shared/alloy/config.alloy`, installed to `/opt/alloy/config/` |
|
|
| Inputs | host journald socket, podman container logs, `/var/log` |
|
|
| Output | `http://loki:3100/loki/api/v1/push` |
|
|
| Successor to | Promtail (EOL 2026-03-02) |
|
|
|
|
## Why Alloy and not Promtail
|
|
|
|
Promtail reached end-of-life on 2026-03-02 and Grafana Labs directs new installs to Alloy. This stack uses Alloy from day one.
|
|
|
|
## Configuration
|
|
|
|
`shared/alloy/config.alloy` is the source of truth:
|
|
|
|
- Reads journald logs from the host's `/run/systemd/journal/socket`.
|
|
- Reads container logs from `/var/lib/containers/storage/...` (podman).
|
|
- Forwards to Loki with `job` labels.
|
|
|
|
## Volumes
|
|
|
|
| Container path | Host path |
|
|
|----------------|-----------|
|
|
| `/etc/alloy` | `/opt/alloy/config` |
|
|
| `/run/systemd/journal/socket` | host journald socket (read-only) |
|
|
| `/var/log` | host logs (read-only) |
|
|
| `/var/lib/containers` | podman storage (read-only) |
|
|
|
|
## The UI port is published on purpose
|
|
|
|
Alloy's UI listens on the container's own `127.0.0.1:12345` by default, and Alloy 1.x refuses to configure the `ui` service from a config block ("service ui does not support being configured"). Under compose that meant **no reachable health endpoint at all**: the homepage status card for alloy read `down` continuously and a deploy had nothing to wait on. The unit therefore passes `--server.http.listen-addr=0.0.0.0:12345` and publishes `127.0.0.1:12345` — same posture as the other three: reachable from the host and from Caddy's network, and from nothing off-host. Alloy has no authentication, which is exactly why it is not published wider.
|
|
|
|
## Gotchas
|
|
|
|
- The journald socket mount is required for journal scraping.
|
|
- Container log paths differ between docker (`/var/lib/docker/containers`) and podman (`/var/lib/containers/storage/...`); point the config at the right one per host.
|
|
- One Alloy per host; do not run a single instance that tries to reach both hosts' logs.
|
|
- The unit `Wants=`/`After=` `loki.service`: without a reachable Loki the write client fails and the pipeline backs up.
|
|
|
|
## See Also
|
|
|
|
- [[Loki]] — the log backend
|
|
- [[Observability]] — the full stack, including what is still unconfigured
|