# Grafana Loki + Alloy: восемь практических задач

Авторский учебный стенд ae-nekrasov.ru. Loki 3.7.10, Alloy 1.21.3, Grafana 13.3.1, Node.js 24 LTS >=24.15, Bootstrap 5.3.9. Данные вымышленные. Генератор создаёт JSONL в трёх форматах сервисов; Alloy действительно читает их, Loki действительно выполняет 15 запросов. Мастерская воспроизводит записанные ответы. Она не подключается к вашему серверу и не выполняет свободный LogQL на сайте.

## Быстрый просмотр

Готовые public/capture.json и локальный CSS включены. Без Docker:

```sh
node tools/serve.mjs
```

Откройте http://127.0.0.1:8514. Восемь задач, 15 вариантов, результаты, метки, запросы, поиск внутри записи, конструктор ограниченных запросов, экспорт JSON и исходники с хешами. Ссылка на общий ZIP работает в опубликованном плагине; в распакованном проекте исходники уже рядом.

## Windows PowerShell: настоящее выполнение

Установите Node.js 24 LTS и Docker Desktop с Linux containers. Запустите Docker Desktop. Команды выполняются в корне распакованного проекта:

```powershell
npm ci
npm run prepare:lab
docker compose config --quiet
docker compose up -d
npm run capture
npm run verify
npm test
node tools/check-stack.mjs
node tools/serve.mjs
```

Capture ждёт готовности Loki и доставки всех 74 строк. Повторный capture создаёт новый run и добавляет новые строки, не стирая предыдущие. Результат последнего запуска записывается в public/capture.json. Для просмотра в Grafana: http://127.0.0.1:8532, пользователь admin; пароль локально прочитайте `Get-Content .runtime/admin_password`. Не помещайте этот файл в Git/ZIP/публикацию. Изменение файла не сбрасывает пароль уже созданного пользователя в сохранённой базе Grafana.

## Linux / VPS: повторяемый запуск

Нужны Docker Engine с Compose v2 и Node.js 24 LTS. Установка Docker: https://docs.docker.com/engine/install/ubuntu/ . Версию и группы доступа настраивает администратор сервера; членство в docker даёт привилегированный доступ к хосту.

```bash
mkdir -p ~/labs/loki
cd ~/labs/loki
# Распакуйте проект в этот каталог, затем:
npm ci
npm run prepare:lab
chmod 700 .runtime
chmod 600 .runtime/admin_password
docker compose config --quiet
docker compose up -d
node tools/capture.mjs
node tools/verify.mjs
node tools/check-stack.mjs
docker compose ps
```

Без Node на VPS подготовка возможна официальным Node-контейнером (содержимое каталога доверенное, UID/GID соответствуют вашему пользователю):

```bash
docker run --rm --user "$(id -u):$(id -g)" -e npm_config_cache=/tmp/npm-cache -v "$PWD:/app" -w /app node:24.22.2-bookworm-slim sh -lc 'npm ci && npm run prepare:lab'
docker compose up -d
docker compose --profile tools run --rm -e CAPTURE_FILE=public/capture.json linux-capture node tools/capture.mjs
docker compose --profile tools run --rm -e CAPTURE_FILE=public/capture.json linux-capture node tools/verify.mjs
```

Linux-контейнерный повтор использует готовый run и тот же временной интервал:

```sh
docker compose --profile tools run --rm linux-capture
docker compose --profile tools run --rm linux-capture node tools/verify.mjs
```

По умолчанию контейнер пишет public/capture-linux.json. Первый запуск требует обычного capture, создавшего .runtime/fixture.json. Старые записи удаляются по retention, поэтому --reuse не предназначен для вечного восстановления давно удалённых данных.

## Доступ к VPS и реальным приложениям

Порты Loki/Alloy/Grafana привязаны только к 127.0.0.1. На своём компьютере выполните `ssh -L 8532:127.0.0.1:8532 user@server`, затем откройте http://127.0.0.1:8532. Это удобный закрытый способ просмотра; не меняйте адрес на 0.0.0.0 ради доступа. Для команды используйте HTTPS reverse proxy, отдельные учётные записи Grafana и выбранную схему авторизации. Сам Loki не содержит встроенной проверки пользователей. auth_enabled управляет многопользовательской моделью tenant, а не паролями.

Замените три bind-mount файла на каталоги журналов ваших сервисов, смонтированные read-only. Измените __path__ в Alloy. PHP-FPM, supervisor или systemd должны направлять JSON-stdout в управляемый файл/сборщик; пример PHP сам по себе не настраивает журналирование FPM. Node-пример выводит одну JSON-строку в stdout. На нескольких серверах установите сборщик у каждого источника и передавайте поток через защищённый вход Loki. Не используйте публичный endpoint без авторизации.

## Диагностика, диск и обслуживание

```sh
docker compose logs --tail 80 alloy
docker compose logs --tail 80 loki
docker compose logs --tail 80 grafana
docker compose ps
docker compose down
```

down останавливает только проект aen-loki-b18 и сохраняет именованные тома. Не добавляйте -v без осознанного решения удалить учебную историю. Удержание 168h включено через compactor; удаление асинхронное и не гарантирует свободное место при любом потоке. Следите за диском, скоростью поступления, очередью ошибок доставки и резервным копированием. Один Loki с filesystem не является HA-кластером. Снимки томов делайте согласованно с остановкой записи либо выбранной поддерживаемой стратегией хранения.

Если Docker сообщает пересечение подсети, выберите свободную частную подсеть: PowerShell `$env:LAB_SUBNET='10.203.219.0/24'`, Bash `export LAB_SUBNET=10.203.219.0/24`. Не удаляйте чужие сети. Значение по умолчанию 10.203.218.0/24 — пример, не универсально свободный адрес.

## Контракт данных и ограничения

75 исходных строк: 72 HTTP-события трёх сервисов, одна учебная строка с токеном, debug и невалидный JSON. Debug удалён, поэтому хранится 74. 12 HTTP500, три события одного request ID, четыре медленных Node-события. Подстановка token=(...) ограничена синтетическим форматом: это не универсальная защита от секретов. Удалять чувствительные данные лучше до формирования журнала.

Индексные метки: env/service_name/level. request_id и URL не становятся индексными labels. Числовые поля разбираются во время запроса. p95 и rate рассчитаны из журналов небольшого учебного окна, не являются бенчмарком или гарантией полноты мониторинга.

## Файлы

- compose.yaml и config/: Loki, Alloy, datasource и dashboard из трёх панелей.
- src/fixtures.mjs: генератор и определения 15 запросов.
- examples/: JSON-stdout на Node.js и PHP.
- tools/: подготовка, capture, проверка, локальный сервер.
- public/: самостоятельная мастерская и записи.
- tests/: инварианты фикстур.

Авторский код MIT. Bootstrap MIT; его текст лицензии включён. Grafana/Loki/Alloy распространяются отдельно со своими лицензиями, контейнеры не вложены в ZIP. Источники: https://grafana.com/docs/loki/latest/ , https://grafana.com/docs/alloy/latest/ , https://grafana.com/docs/grafana/latest/ .
