Каждый системный администратор и разработчик сталкивался с ночным инцидентом: веб-приложение начинает спорадически отвечать ошибками 502 Bad Gateway или 500 Internal Server Error, а пользователи жалуются на недоступность сервиса. Вы подключаетесь к VDS по SSH и начинаете судорожно открывать десятки вкладок терминала, перебирая команды docker logs --tail 200 -f app, грепая /var/log/nginx/error.log и пытаясь по временным меткам свести логи разных микросервисов в единую картину.
Традиционный корпоративный стек ELK (Elasticsearch, Logstash, Kibana) решает эту задачу, но требует минимум 4–8 ГБ оперативной памяти только под работу JVM, что для типового сервера VDS стоимостью 400–1000 рублей в месяц является непозволительной роскошью. В этом практическом руководстве мы разберем современную легковесную альтернативу — стек Grafana Loki v3 + Grafana Alloy в Docker Compose. Он потребляет в разы меньше памяти, чем ELK (комфортно работает на VDS с 1–2 ГБ RAM), мгновенно индексирует события и позволяет анализировать логи десятков контейнеров в едином окне Grafana.
1. Проблема логирования на VDS: почему стек ELK разоряет сервер, а grep в консоли превращается в кошмар
В микросервисной архитектуре Docker логи контейнеров изолированы друг от друга. По умолчанию Docker Engine записывает стандартные потоки вывода stdout и stderr в локальные файлы формата JSON по пути /var/lib/docker/containers/<container-id>/<container-id>-json.log. Ручной разбор таких логов сопряжен с тремя критическими проблемами:
- Фрагментация данных: Ошибка в бэкенде может быть следствием таймаута в базе данных PostgreSQL или сброса сессии в Redis. Чтобы сопоставить эти события вручную, инженеру приходится параллельно открывать 3–4 сессии терминала.
- Риск исчерпания дискового пространства (No space left on device): Без централизованного контроля файлы логов Docker разрастаются до десятков гигабайт, приводя к аварийной остановке СУБД из-за нехватки свободного места.
- Отсутствие оперативных алертов: Вы узнаете о проблеме не в момент её возникновения, а когда рассерженные клиенты начинают писать в службу поддержки.
Сравним архитектурные подходы классического стека ELK и связки Grafana Loki + Grafana Alloy на сервере с ограниченными ресурсами:
| Критерий сравнения | Стек ELK (Elasticsearch + Kibana) | Стек Grafana Loki + Grafana Alloy |
|---|---|---|
| Потребление памяти (RAM) | От 4 до 8 ГБ (Java Virtual Machine) | ~600–900 МБ полный стек (~150–250 МБ сам Loki в idle) |
| Принцип индексации | Полнотекстовый инвертированный индекс каждого слова (Lucene) | Индексация метаданных (лейблов), потоковый grep сжатых чанков, Bloom Filters в v3.x |
| Расход дискового пространства | Индекс занимает до 100–150% от исходного размера логов | Сжатие Snappy/Gzip сокращает объем логов на 70–85% |
| Минимальный тариф VDS | 4–8 vCPU / 8–16 ГБ RAM (~3 500–7 000 ₽/мес) | 1–2 vCPU / 1–2 ГБ RAM (~300–700 ₽/мес) |
| Язык поисковых запросов | KQL / Lucene Query Syntax | LogQL (мощный синтаксис, схожий с PromQL) |
2. Архитектура Grafana Loki v3: почему логи индексируются как метрики и экономят 90% диска
Ключевая идея создателей Grafana Loki формулируется принципом: «Like Prometheus, but for logs» (Как Prometheus, только для логов). Вместо того чтобы строить тяжелый полнотекстовый индекс по каждому слову сообщения, Loki действует принципиально иначе:
- Потоки логов (Streams): Логи группируются в независимые потоки по набору уникальных меток (лейблов), например:
{container="nginx", env="production"}. - Сжатые чанки (Chunks): Внутри каждого потока строки логов сжимаются алгоритмами Snappy или Gzip и упаковываются в блоки фиксированного размера (по умолчанию 1.5–2 МБ) с сохранением на локальный NVMe-диск.
- Индекс TSDB (Time Series Database): В актуальной ветке Loki v3.x используется ультраэффективная схема индексации TSDB (пришедшая на смену устаревшему
boltdb-shipper). В индекс попадают только временные метки и хеши лейблов. Сам индекс занимает считанные мегабайты оперативной памяти. - Grep по сжатым блокам и фильтры Блума (Bloom Filters): При выполнении запроса LogQL движок Loki находит подходящие потоки по лейблам, параллельно считывает только нужные чанки и фильтрует текст на лету с огромной скоростью за счет потоковой декомпрессии в памяти. В версии Loki 3.x добавлены фильтры Блума для ускоренного отсечения нерелевантных блоков при поиске редких подстрок.
Монолитный режим развертывания Single-Binary: идеальный выбор для VDS
В отличие от распределенного enterprise-режима микросервисов (distributor, ingester, querier, compactor на отдельных нодах Kubernetes), для серверов VDS проект Grafana официально предоставляет монолитный режим single-binary (параметр запуска -target=all). Все компоненты инжеста, кэширования, сжатия и очистки запускаются внутри единого бинарного процесса, гарантируя минимальный оверхед по памяти.
3. Подготовка VDS и файловой структуры каталогов с изоляцией прав
Подготовим структуру каталогов на сервере под управлением Ubuntu 22.04 или 24.04 LTS. Сервисы стека будут размещены в директории /opt/loki.
Официальный Docker-образ grafana/loki по соображениям безопасности запускается от непривилегированного пользователя с системным идентификатором UID 10001 (GID 10001), а образ grafana/grafana — от UID 472 (GID 472). Заранее назначим владельцев каталогов данных, чтобы избежать ошибок отказа в доступе (permission denied):
# Создаем изолированную директорию проекта и папки данных
sudo mkdir -p /opt/loki/config /opt/loki/loki-data /opt/loki/loki-wal /opt/loki/grafana-data /opt/loki/alloy-data
# Назначаем права для пользователя Loki (UID 10001)
sudo chown -R 10001:10001 /opt/loki/loki-data /opt/loki/loki-wal
# Назначаем права для пользователя Grafana (UID 472)
sudo chown -R 472:472 /opt/loki/grafana-data
# Ограничиваем доступ администратора
sudo chmod 700 /opt/loki/loki-data /opt/loki/grafana-data /opt/loki/alloy-data
Также сгенерируем надежный пароль администратора для первоначального входа в Grafana с помощью генератора SysKit или утилиты OpenSSL:
# Создаем файл переменных окружения для Grafana
cat << EOF | sudo tee /opt/loki/.env
GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=$(openssl rand -hex 16)
GF_USERS_ALLOW_SIGN_UP=false
EOF
sudo chmod 600 /opt/loki/.env
4. Развертывание Grafana Loki, Grafana Alloy и Grafana в Docker Compose
Создадим манифест /opt/loki/docker-compose.yml. В конфигурации учтены строгие стандарты сетевой безопасности SysKit: сервис Loki доступен внутри изолированной Docker-сети logging-net, а веб-интерфейс Grafana (порт 3000) привязывается строго к локальному интерфейсу 127.0.0.1 для проксирования через Nginx с SSL, что исключает доступ злоумышленников из интернета в обход брандмауэра UFW:
services:
loki:
image: grafana/loki:3.2.0
container_name: logging-loki
restart: unless-stopped
user: "10001:10001"
command: -config.file=/etc/loki/loki-config.yaml -target=all
ports:
# Публикация на loopback хоста (для локальных проверок curl/CLI)
- "127.0.0.1:3100:3100"
volumes:
- ./config/loki-config.yaml:/etc/loki/loki-config.yaml:ro
- ./loki-data:/loki:rw
- ./loki-wal:/wal:rw
# Лимиты ресурсов ядра Linux cgroups v2 (защита от OOM Killer)
deploy:
resources:
limits:
cpus: '0.75'
memory: 512M
mem_limit: 512m
cpus: 0.75
security_opt:
- no-new-privileges:true
networks:
- logging-net
alloy:
image: grafana/alloy:v1.3.1
container_name: logging-alloy
restart: unless-stopped
command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
volumes:
- ./config/config.alloy:/etc/alloy/config.alloy:ro
# Доступ к сокету Docker для автоматического Service Discovery
- /var/run/docker.sock:/var/run/docker.sock:ro
# Чтение системных логов хоста и файлов Nginx
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./alloy-data:/var/lib/alloy/data:rw
deploy:
resources:
limits:
cpus: '0.25'
memory: 192M
mem_limit: 192m
cpus: 0.25
security_opt:
- no-new-privileges:true
networks:
- logging-net
depends_on:
- loki
grafana:
image: grafana/grafana:11.2.0
container_name: logging-grafana
restart: unless-stopped
user: "472:472"
ports:
# Доступ к дашборду через защищенный обратный прокси Nginx на хосте
- "127.0.0.1:3000:3000"
env_file:
- .env
volumes:
- ./grafana-data:/var/lib/grafana:rw
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
mem_limit: 256m
cpus: 0.5
security_opt:
- no-new-privileges:true
networks:
- logging-net
depends_on:
- loki
networks:
logging-net:
driver: bridge
Переход на Grafana Alloy: Promtail признан End of Life (EOL)
Обратите внимание: агент Promtail достиг статуса End of Life (2 марта 2026 г.) и более не поддерживается Grafana Labs. В современной инфраструктуре официальным преемником Promtail и Grafana Agent является Grafana Alloy — единый OpenTelemetry-совместимый агент с декларативным синтаксисом конфигурации, нативной поддержкой Service Discovery и встроенной фильтрацией потоков логов.
5. Надежные VDS-провайдеры для размещения централизованного стека логирования
Стек сбора логов непрерывно выполняет операции записи небольших сжатых блоков (чанков) на диск. Для бесперебойной работы Loki критически важно наличие быстрых NVMe-накопителей с высоким показателем случайной записи 4K IOPS и честной KVM-виртуализации без скрытого оверселлинга дисковой подсистемы.
Инженерные критерии отбора VDS для сбора логов
Редакция SysKit протестировала производительность Loki при потоке 5 000 логов в секунду на различных тарифах:
- NVMe Latency: Задержка синхронизации fsync на диске должна составлять ≤ 0.6 мс, чтобы буферы инжеста Loki не накапливались в оперативной памяти.
- Объем накопителя: Для хранения архива логов 5–10 сайтов за 14 дней с компрессией достаточно 20–30 ГБ дискового пространства.
- Оперативная память: Для комфортной работы стека Loki + Alloy + Grafana рекомендуется выбирать сервер с объемом памяти от 1.5–2 ГБ RAM.
Примечание редакции SysKit: Ниже представлены проверенные облачные провайдеры с честной KVM-виртуализацией, протестированные инженерами платформы. Ссылки являются партнерскими и поддерживают публикацию открытых технических руководств.
Рекомендуемые VDS-провайдеры
Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с
Timeweb Cloud — Высокоскоростные NVMe VDS
Сверхбыстрые NVMe-накопители с высокой скоростью произвольной записи IOPS, идеально подходящие под чанки логов Loki и сжатые архивы.
Selectel — Надежная облачная инфраструктура
Мощные серверы на базе AMD EPYC и Intel Xeon с гарантированными ресурсами CPU и широким сетевым каналом без оверселлинга.
Beget — Быстрый запуск VDS с почасовой оплатой
Удобная панель управления сервером, моментальный деплой Docker-стеков и гибкое масштабирование дискового пространства.
6. Тонкая настройка loki-config.yaml: схема TSDB v13, лимиты памяти и автоматический Retention
Создадим конфигурационный файл /opt/loki/config/loki-config.yaml. В нем настроена современная схема индексации TSDB (v13), ограничены буферы в памяти и включен встроенный модуль Compactor для автоматического удаления устаревших логов по истечении 7 дней (168 часов):
# Базовая конфигурация Grafana Loki v3.x для VDS
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
log_level: info
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
# Схема хранения: современный индекс TSDB v13
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
# Ограничения ресурсов и политики хранения (Retention)
limits_config:
retention_period: 168h # Автоматическое хранение логов 7 дней
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
ingestion_rate_mb: 4 # Максимальная скорость инжеста 4 МБ/с
ingestion_burst_size_mb: 8
max_entries_limit_per_query: 5000 # Защита от переполнения памяти при тяжелых запросах
max_query_length: 721h
# Фоновый сборщик мусора и удаление старых логов
compactor:
working_directory: /loki/compactor
compaction_interval: 10m
retention_enabled: true # Активация автоочистки устаревших логов
delete_request_store: filesystem
# Управление сжатием чанков в оперативной памяти
ingester:
chunk_idle_period: 30m
chunk_block_size: 262144 # Размер блока 256 КБ
chunk_retain_period: 1m
max_chunk_age: 2h
wal:
enabled: true
dir: /wal
analytics:
reporting_enabled: false
Защита от переполнения диска: retention_enabled: true
По умолчанию в Loki удаление старых данных отключено из соображений безопасности. Директива retention_enabled: true в секции compactor в связке с retention_period: 168h гарантирует, что каждые 10 минут фоновый процесс сканирует хранилище и удаляет чанки старше 7 дней, сохраняя свободное место на вашем сервере.
7. Настройка Grafana Alloy: автоматический сбор логов всех контейнеров Docker и JSON-парсинг Nginx
Grafana Alloy выступает в роли легковесного OpenTelemetry-совместимого агента доставки логов: он автоматически обнаруживает запущенные контейнеры через Docker Socket, считывает их stdout/stderr, обогащает метаданными и передает по HTTP на эндпоинт Loki http://loki:3100/loki/api/v1/push.
Для веб-сервера Nginx наилучшей практикой является вывод логов в формате JSON. Добавьте в блок http файла /etc/nginx/nginx.conf структурированный формат логирования:
# /etc/nginx/nginx.conf (внутри блока http)
log_format json_analytics escape=json '{'
'"time_local":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request_method":"$request_method",'
'"request_uri":"$request_uri",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
access_log /var/log/nginx/analytics_access.log json_analytics;
Теперь создадим файл конфигурации агента /opt/loki/config/config.alloy:
// Конфигурация Grafana Alloy для сбора логов Docker и Nginx
// 1. Автоматическое обнаружение запущенных Docker-контейнеров
discovery.docker "containers" {
host = "unix:///var/run/docker.sock"
}
// 2. Нормализация имени контейнера (удаление ведущего слэша)
discovery.relabel "docker_logs" {
targets = discovery.docker.containers.targets
rule {
source_labels = ["__meta_docker_container_name"]
regex = "/(.*)"
target_label = "container"
}
}
// 3. Сбор логов stdout/stderr контейнеров
loki.source.docker "default" {
host = "unix:///var/run/docker.sock"
targets = discovery.docker.containers.targets
relabel_rules = discovery.relabel.docker_logs.rules
forward_to = [loki.write.local.receiver]
}
// 4. Поиск и сбор логов веб-сервера Nginx на хосте
local.file_match "nginx_access" {
path_targets = [{
__path__ = "/var/log/nginx/analytics_access.log",
job = "nginx",
service = "web-server",
}]
}
// 5. Парсинг JSON-логов Nginx в структурированные метки
loki.process "nginx_parser" {
forward_to = [loki.write.local.receiver]
stage.json {
expressions = {
status = "status",
client_ip = "remote_addr",
method = "request_method",
duration = "request_time",
}
}
stage.labels {
values = {
status = "status",
}
}
}
loki.source.file "nginx" {
targets = local.file_match.nginx_access.targets
forward_to = [loki.process.nginx_parser.receiver]
}
// 6. Отправка пакетов логов в контейнер Grafana Loki
loki.write "local" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
batch_wait = "1s"
batch_size = "102400"
}
}
8. Настройка Nginx на хосте: Reverse Proxy, WebSockets (Grafana Live) и авто-SSL Let's Encrypt
Панель Grafana слушает сокет 127.0.0.1:3000. Опубликуем ее через защищенный обратный прокси Nginx на поддомене logs.yourdomain.ru. Обратите особое внимание на поддержку WebSockets: функция Grafana Live обновляет дашборды в реальном времени через веб-сокеты.
Для поддержки WebSockets в функции Grafana Live требуется корректная передача заголовков Upgrade и Connection. Чтобы избежать конфликта повторного объявления переменной $connection_upgrade в Nginx, если она уже используется в других виртуальных хостах, вынесем директиву map в отдельный файл глобального контекста http:
# Создаем файл маппинга WebSockets в контексте http (если не был создан ранее)
cat << 'EOF' | sudo tee /etc/nginx/conf.d/websocket_upgrade.conf
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
EOF
Теперь создадим виртуальный хост веб-интерфейса /etc/nginx/sites-available/grafana.conf:
server {
listen 80;
# listen [::]:80; # Раскомментируйте при подтвержденной поддержке IPv6
server_name logs.yourdomain.ru;
# Доверие локальным интерфейсам для заголовков реального IP
set_real_ip_from 127.0.0.1;
set_real_ip_from ::1;
real_ip_header X-Forwarded-For;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Поддержка WebSockets для Grafana Live
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# Заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
}
}
Активируем конфигурацию, проверяем синтаксис и выпускаем SSL-сертификат Let's Encrypt с автоматическим перенаправлением 301 на HTTPS:
# Создаем символическую ссылку
sudo ln -s /etc/nginx/sites-available/grafana.conf /etc/nginx/sites-enabled/
# Проверяем синтаксис Nginx
sudo nginx -t
# Перезагружаем веб-сервер
sudo systemctl reload nginx
# Запускаем выпуск SSL через Certbot
sudo certbot --nginx -d logs.yourdomain.ru --redirect
Теперь запускаем весь стек логирования одной командой в каталоге /opt/loki:
# Запуск контейнеров Loki, Alloy и Grafana
cd /opt/loki && sudo docker compose up -d
# Проверка статуса контейнеров
sudo docker compose ps
9. Практика поиска в Grafana с помощью LogQL: от фильтрации ошибок 5xx до аналитики атак
Откройте в браузере адрес https://logs.yourdomain.ru и войдите с логином admin и сгенерированным ранее паролем. Первым делом подключим Loki как источник данных:
- Перейдите в Administration → Data Sources → Add data source.
- Выберите Loki.
- В поле URL укажите внутренний адрес Docker-сети:
http://loki:3100. - Нажмите «Save & Test». Зеленый индикатор подтвердит успешное подключение.
Перейдите в раздел Explore в левом меню. Язык запросов LogQL делится на две части: фильтрацию логов по меткам (Stream Selector) и фильтрацию содержимого строк (Log Pipeline). Разберем самые полезные запросы администратора:
1. Просмотр логов конкретного Docker-контейнера в реальном времени
{container="my-web-app"}
В выпадающем меню переключитесь в режим Live — новые строки логов будут появляться на экране с задержкой менее 1 секунды без необходимости обновлять страницу.
2. Фильтрация фатальных сбоев и ошибок в коде
{container=~".+"} |= "error" != "debug"
Выводит события со словом error (регистрозависимо) и исключает служебные отладочные сообщения debug из всех запущенных контейнеров.
3. Поиск всех пятисотых ошибок в Nginx с парсингом JSON
{job="nginx"} | json | status >= 500
Благодаря парсеру | json строковые поля преобразуются в типизированные переменные. Вы можете фильтровать числовые статусы так же легко, как в SQL.
4. Выявление медленных запросов к сайту (более 1.5 секунд)
{job="nginx"} | json | duration > 1.5
Моментально подсвечивает тяжелые скрипты PHP-FPM или узкие места базы данных, замедляющие загрузку страниц для пользователей.
5. Построение графика частоты ошибок прямо из логов (Log Metrics)
sum by (status) (rate({job="nginx"} | json [1m]))
LogQL позволяет налету вычислять метрики: функция rate() превращает поток текстовых логов в красивый линейный график частоты запросов с разбивкой по HTTP-кодам.
10. Настройка алертов в Telegram при всплеске сбоев через Grafana Alerting
Вместо того чтобы сидеть перед дашбордом, настроим автоматическую отправку уведомлений в Telegram при аномальном росте ошибок:
- Перейдите в Alerting → Contact points → Add contact point.
- Укажите имя
Telegram-DevOps, выберите интеграцию Telegram, вставьте токен вашего бота иChat IDгруппы. - Создайте правило в Alerting → Alert rules → New alert rule:
- Запрос правила:
count_over_time({job="nginx"} | json | status >= 500 [2m]). - Пороговое значение (Condition):
IS ABOVE 5(если за последние 2 минуты произошло более 5 пятисотых ошибок). - Время оценки (Evaluation interval): каждые
1mв течение2m.
- Запрос правила:
- Привяжите контактную точку
Telegram-DevOpsв разделе Notification policies.
При возникновении сбоя дежурный инженер получит компактный алерт со ссылкой на соответствующий временной срез в Grafana Explore.
11. Диагностика неполадок: рассинхронизация времени NTP, права Docker сокета и разрастание WAL
При развертывании стека логирования на VDS администраторы могут столкнуться с характерными проблемами:
1. Ошибка инжеста Loki: «entry too far behind» или «entry out of order»
Причина: Рассинхронизация системных часов между хостом и контейнером, либо отправка старых исторических логов с временной меткой, выходящей за пределы reject_old_samples_max_age.
Решение: Настройте точную синхронизацию времени по протоколу NTP на хосте VDS:
sudo timedatectl set-ntp true
timedatectl status
2. Ошибка Grafana Alloy: «permission denied» при обращении к /var/run/docker.sock
Причина: Пользователь внутри контейнера Alloy не имеет прав на чтение сокета Docker Engine хоста.
Решение: Убедитесь, что в манифесте docker-compose.yml для сервиса Alloy примонтирован сокет с параметром /var/run/docker.sock:/var/run/docker.sock:ro, либо добавьте пользователя контейнера в группу docker на хосте.
3. Высокое потребление оперативной памяти процессом Loki
Причина: Слишком большой размер буфера не сброшенных чанков при высокой плотности входящих логов или выполнение тяжелых запросов без фильтрации по лейблам.
Решение: Уменьшите параметр chunk_idle_period: 15m и max_chunk_age: 1h в секции ingester файла loki-config.yaml, а также убедитесь, что в docker-compose.yml активны жесткие лимиты cgroups memory: 512M.
12. Резюме и итоговый чек-лист внедрения централизованного логгинга
Связка Grafana Loki v3 и Grafana Alloy — это идеальное инженерное решение для VDS начального и среднего уровня. Она закрывает 100% потребностей вебмастеров и сисадминов в поиске логов, не требуя гигабайтов памяти и сложной кластеризации.
Итоговый чек-лист развертывания Loki на VDS
Перед вводом сервера сбора логов в эксплуатацию убедитесь в соблюдении ключевых параметров:
- Веб-интерфейс Grafana (порт
3000) изолирован на локальной петле127.0.0.1и защищен SSL Nginx. - Для контейнеров заданы лимиты памяти в блоках
deploy.resources.limitsиmem_limit(Loki: 512M, Alloy: 192M, Grafana: 256M). - В конфигурации
loki-config.yamlвключена схемаtsdb(v13) и активирован модульcompactorс автоочисткойretention_period: 168h. - В Grafana Alloy настроен сбор логов контейнеров через
loki.source.dockerи парсинг Nginx JSON черезloki.process. - Настроен автоматический выпуск SSL Let's Encrypt и безопасное проксирование WebSockets в Nginx.