bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Развёртывание Grafana Loki для централизованного логирования на VPS: Promtail, Nginx, Systemd

calendar_month Jun 07, 2026 schedule 23 мин. чтения visibility 48 просмотров
Развёртывание Grafana Loki для централизованного логирования на VPS: Promtail, Nginx, Systemd
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Развёртывание Grafana Loki для централизованного логирования на VPS: Promtail, Nginx, Systemd

TL;DR

В этом подробном руководстве мы шаг за шагом настроим централизованную систему сбора и анализа логов на вашем VPS, используя стек Grafana Loki. Вы научитесь устанавливать и конфигурировать Loki для хранения логов, Promtail для их сбора с ваших приложений, и Nginx в качестве обратного прокси с HTTPS для безопасного доступа. В результате вы получите мощное и масштабируемое решение для эффективного мониторинга событий на вашем сервере и приложениях.

  • Установка Grafana Loki и Promtail как служб Systemd.
  • Настройка Nginx как обратного прокси для Loki с поддержкой HTTPS через Certbot.
  • Конфигурация Promtail для сбора логов с различных источников и отправки их в Loki.
  • Обеспечение безопасного доступа к Loki UI через Nginx и TLS.
  • Пошаговая инструкция по подготовке сервера, установке, настройке, бэкапам и устранению неполадок.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

В современном мире, где приложения и сервисы генерируют огромные объемы данных, централизованное логирование становится не просто удобством, а необходимостью. Мы будем развертывать Grafana Loki — горизонтально масштабируемую, высокодоступную, мультиарендную систему агрегации логов, разработанную Grafana Labs. Loki отличается от других систем логирования тем, что индексирует только метаданные (лейблы) логов, а сами логи хранит в сжатом виде. Это делает его очень эффективным с точки зрения использования ресурсов и стоимости хранения.

В рамках этого туториала мы настроим полный стек для централизованного сбора, хранения и доступа к логам:

  • Grafana Loki: Ядро системы, которое принимает логи, индексирует их по лейблам и хранит.
  • Promtail: Агент, который устанавливается на каждый сервер, где генерируются логи. Он отслеживает указанные файлы логов, применяет к ним лейблы и отправляет их в Loki.
  • Nginx: Будет выступать в роли обратного прокси для Loki, обеспечивая безопасный доступ через HTTPS и возможность хостить Loki на стандартных портах.
  • Systemd: Мы будем использовать Systemd для управления службами Loki и Promtail, обеспечивая их автоматический запуск и мониторинг.

В итоге, читатель получит полностью рабочую систему централизованного логирования. Это позволит собирать логи со всех ваших приложений и сервисов на VPS (или нескольких VPS), просматривать их в удобном интерфейсе Grafana (которую можно подключить к Loki), быстро находить нужные события, отлаживать проблемы и мониторить состояние системы. Это значительно упрощает управление инфраструктурой, особенно когда у вас несколько сервисов или микросервисов, развернутых на одном или разных серверах.

Альтернативы: Cloud-managed vs. Self-hosted на VPS

Существует несколько подходов к централизованному логированию:

  • Cloud-managed сервисы (SaaS): Такие платформы, как Datadog, Splunk Cloud, Logz.io, AWS CloudWatch, Google Cloud Logging, Azure Monitor. Они предлагают готовые решения с минимальной настройкой, высокой доступностью, масштабируемостью и богатым функционалом. Плюсы: Простота использования, не нужно управлять инфраструктурой, мощные аналитические инструменты. Минусы: Высокая стоимость, особенно при больших объемах логов; потенциальные вопросы конфиденциальности данных, так как логи хранятся у стороннего провайдера; меньший контроль над инфраструктурой.
  • Self-hosted решения на выделенном сервере/VPS: Это подход, который мы реализуем с Loki. Вы полностью контролируете всю систему, от инфраструктуры до конфигурации. Плюсы: Полный контроль над данными и безопасностью, потенциально значительно меньшая стоимость при больших объемах логов (плата только за VPS/dedicated), гибкость в настройке под специфические нужды. Минусы: Требует технических знаний для развертывания и обслуживания, ответственность за доступность и масштабирование лежит на вас.

Выбор self-hosted решения на VPS с Loki особенно актуален для владельцев VPS, разработчиков, соло-фаундеров и энтузиастов, которые хотят иметь полный контроль над своей инфраструктурой, оптимизировать расходы и не зависеть от сторонних облачных провайдеров. Loki, благодаря своему дизайну, является отличным выбором для этой задачи, так как он менее требователен к ресурсам по сравнению с другими системами, такими как ELK-стек (Elasticsearch, Logstash, Kibana), особенно в плане потребления оперативной памяти и дискового пространства за счет индексации только метаданных.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Выбор подходящего VPS для Grafana Loki зависит от объема логов, которые вы планируете собирать, и срока их хранения. Loki эффективно сжимает логи, но все равно требует достаточного дискового пространства и умеренных ресурсов CPU/RAM для индексации и запросов.

Минимальные требования для Loki и Promtail (для небольших проектов, до 100 ГБ логов в месяц)

  • CPU: 2 ядра. Loki и Promtail не сильно нагружают процессор в режиме ожидания, но пиковые нагрузки при индексации или сложных запросах могут потребовать больше.
  • RAM: 4 ГБ. Loki может быть довольно прожорлив к памяти при больших объемах запросов или длительном хранении индексов в памяти. Promtail потребляет мало.
  • Диск: NVMe SSD от 100 ГБ. Скорость диска критична для записи логов и выполнения запросов. Объем зависит от объема логов и политики их хранения. Для 100 ГБ логов в месяц и хранения за 3 месяца потребуется около 300 ГБ.
  • Сеть: 100 Мбит/с. Для передачи логов от Promtail к Loki и доступа к UI.

Рекомендуемый VPS-план для средних проектов (до 500 ГБ логов в месяц, несколько источников)

Для более серьезных задач, где вы собираете логи с нескольких приложений или серверов, и ожидаете до 500 ГБ логов в месяц, следует рассмотреть более мощный конфигурацию:

  • CPU: 4 ядра.
  • RAM: 8 ГБ.
  • Диск: NVMe SSD от 500 ГБ до 1 ТБ.
  • Сеть: 1 Гбит/с.

Такой план обеспечит достаточную производительность для обработки запросов и хранения большего объема данных. Вы можете рассмотреть VPS с указанными характеристиками для развертывания вашей системы централизованного логирования.

Когда нужен dedicated, а не VPS

Выделенный сервер (dedicated server) становится предпочтительнее, когда:

  • Очень большие объемы логов: Если вы планируете собирать терабайты логов в месяц (например, с крупного кластера Kubernetes или множества микросервисов).
  • Высокая производительность запросов: Требуется мгновенный доступ к логам и выполнение сложных аналитических запросов на огромных массивах данных.
  • Гарантированные ресурсы: Вам нужны 100% гарантированные ресурсы CPU, RAM и диска, без "соседского" эффекта, который иногда встречается на VPS.
  • Строгие требования к хранению: Необходимость в массивах RAID для повышения надежности дисковой подсистемы или специфические требования к типу дисков (например, высокопроизводительные HDD для архивного хранения логов, совместно с SSD для горячих данных).
  • Физическая изоляция: Для соблюдения строгих норм безопасности и соответствия (например, PCI DSS, HIPAA), где требуется полная физическая изоляция.

Для большинства индивидуальных разработчиков, соло-фаундеров и малых команд VPS будет более чем достаточно и более экономически выгодно. Однако, если вы видите, что ваш объем логов превышает 1-2 ТБ в месяц, или производительность VPS начинает страдать, переход на подходящий dedicated будет оправдан.

Локация VPS: на что влияет

Выбор локации VPS влияет на несколько ключевых аспектов:

  • Задержка (Latency): Чем ближе VPS к источникам логов (вашим другим серверам, клиентам приложений), тем ниже задержка при передаче логов. Это важно для оперативного мониторинга и снижения сетевой нагрузки.
  • Соответствие законодательству: В некоторых юрисдикциях существуют строгие требования к хранению данных, включая логи. Убедитесь, что выбранная локация соответствует применимым законам о конфиденциальности данных (например, GDPR в Европе).
  • Стоимость: Цены на VPS могут варьироваться в зависимости от региона.
  • Доступность: Выбирайте регионы с хорошей сетевой инфраструктурой и высокой доступностью дата-центров.

В идеале, выбирайте локацию, которая географически близка к вашим основным серверам, генерирующим логи, чтобы минимизировать сетевые задержки и обеспечить быструю передачу данных.

Подготовка сервера

Схема: Подготовка сервера
Схема: Подготовка сервера

Прежде чем приступать к установке Loki и Promtail, необходимо выполнить базовую настройку вашего свежего VPS. Это повысит безопасность и удобство работы.

Предполагается, что вы используете дистрибутив Ubuntu Server 22.04 LTS или 24.04 LTS, который является популярным выбором для VPS.

1. Подключение по SSH и обновление системы

Подключитесь к вашему серверу по SSH, используя данные, предоставленные провайдером. Обычно это root-пользователь и пароль.


ssh root@ВАШ_IP_АДРЕС

После успешного входа обновите список пакетов и установленные пакеты до последних версий:


sudo apt update && sudo apt upgrade -y

2. Создание нового пользователя с правами sudo

Работать под учетной записью root небезопасно. Создадим нового пользователя и предоставим ему права sudo.


adduser lokiadmin
usermod -aG sudo lokiadmin

Теперь выйдите из root-сессии и войдите как новый пользователь:


exit
ssh lokiadmin@ВАШ_IP_АДРЕС

3. Настройка аутентификации по SSH-ключам

Для повышения безопасности рекомендуется использовать SSH-ключи вместо паролей. Если у вас еще нет ключей, сгенерируйте их на локальной машине:


ssh-keygen -t rsa -b 4096

Скопируйте публичный ключ на сервер (замените lokiadmin и ВАШ_IP_АДРЕС):


ssh-copy-id lokiadmin@ВАШ_IP_АДРЕС

Теперь вы можете отключить аутентификацию по паролю для SSH. Отредактируйте файл /etc/ssh/sshd_config:


sudo nano /etc/ssh/sshd_config

Найдите и измените следующие строки:


#PasswordAuthentication yes
PasswordAuthentication no
#PermitRootLogin yes
PermitRootLogin no

Сохраните изменения (Ctrl+O, Enter) и выйдите (Ctrl+X). Перезапустите службу SSH:


sudo systemctl restart sshd

После этого убедитесь, что вы можете войти по SSH-ключу, прежде чем закрывать текущую сессию.

4. Настройка файрвола (UFW)

UFW (Uncomplicated Firewall) — это удобная оболочка для iptables. Установите и настройте его:


sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
sudo ufw status

Проверьте статус. Должны быть разрешены порты 22 (SSH), 80 (HTTP) и 443 (HTTPS). В дальнейшем мы добавим порт для Loki.

5. Установка Fail2Ban

Fail2Ban помогает защититься от атак перебора паролей, блокируя IP-адреса, которые делают слишком много неудачных попыток входа.


sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Fail2Ban по умолчанию защищает SSH. Вы можете настроить его, отредактировав файл /etc/fail2ban/jail.local (создайте его, если нет) и добавив свои правила.

6. Установка базовых утилит

Установите несколько полезных утилит, которые пригодятся в процессе настройки и отладки:


sudo apt install curl wget git nano htop unzip -y

Теперь ваш сервер готов к развертыванию Grafana Loki и Promtail.

Установка ПО — пошагово

Схема: Установка ПО — пошагово
Схема: Установка ПО — пошагово

Мы будем устанавливать Loki и Promtail, загружая бинарные файлы с официальных GitHub-репозиториев, и настраивать их как службы Systemd. Nginx будет установлен из репозитория APT.

Актуальные версии ПО на 2026 год будут условными, но мы будем использовать последние стабильные релизы, доступные на момент генерации.

Установка Grafana Loki

Создадим директории для Loki и скачаем актуальный бинарный файл.


# 1. Создаем директории для Loki
sudo mkdir -p /etc/loki
sudo mkdir -p /var/lib/loki
sudo chown -R lokiadmin:lokiadmin /var/lib/loki # Даем права на запись текущему пользователю

# 2. Переходим во временную директорию
cd /tmp

# 3. Скачиваем последнюю стабильную версию Loki (например, v3.1.0 для 2026 года)
# Всегда проверяйте актуальную версию на GitHub: https://github.com/grafana/loki/releases
LOKI_VERSION="3.1.0" # Указываем актуальную версию
wget "https://github.com/grafana/loki/releases/download/v${LOKI_VERSION}/loki-linux-amd64.zip"

# 4. Распаковываем архив
unzip "loki-linux-amd64.zip"

# 5. Перемещаем бинарный файл в /usr/local/bin
sudo mv loki-linux-amd64 /usr/local/bin/loki

# 6. Убеждаемся, что файл исполняемый
sudo chmod a+x /usr/local/bin/loki

# 7. Проверяем версию
loki --version

Теперь создадим пользователя loki, под которым будет работать служба, чтобы обеспечить принцип наименьших привилегий.


# 1. Создаем системного пользователя loki без домашней директории и оболочки
sudo useradd --system --no-create-home --shell /bin/false loki

# 2. Передаем владение над директорией данных Loki пользователю loki
sudo chown -R loki:loki /var/lib/loki

Установка Promtail

Аналогично Loki, скачиваем и устанавливаем Promtail.


# 1. Создаем директорию для Promtail
sudo mkdir -p /etc/promtail

# 2. Переходим во временную директорию
cd /tmp

# 3. Скачиваем последнюю стабильную версию Promtail (например, v3.1.0 для 2026 года)
# Всегда проверяйте актуальную версию на GitHub: https://github.com/grafana/loki/releases
PROMTAIL_VERSION="3.1.0" # Указываем актуальную версию
wget "https://github.com/grafana/loki/releases/download/v${PROMTAIL_VERSION}/promtail-linux-amd64.zip"

# 4. Распаковываем архив
unzip "promtail-linux-amd64.zip"

# 5. Перемещаем бинарный файл в /usr/local/bin
sudo mv promtail-linux-amd64 /usr/local/bin/promtail

# 6. Убеждаемся, что файл исполняемый
sudo chmod a+x /usr/local/bin/promtail

# 7. Проверяем версию
promtail --version

Создадим пользователя promtail для запуска службы.


# 1. Создаем системного пользователя promtail без домашней директории и оболочки
sudo useradd --system --no-create-home --shell /bin/false promtail

Установка Nginx и Certbot

Nginx будет выступать в качестве обратного прокси и обеспечивать HTTPS доступ к Loki. Certbot поможет автоматизировать выпуск и обновление TLS-сертификатов от Let's Encrypt.


# 1. Устанавливаем Nginx из репозиториев Ubuntu
sudo apt install nginx -y

# 2. Запускаем Nginx и добавляем его в автозагрузку
sudo systemctl start nginx
sudo systemctl enable nginx

# 3. Устанавливаем Certbot и плагин для Nginx
sudo apt install certbot python3-certbot-nginx -y

На этом этапе основные компоненты установлены. Теперь перейдем к их конфигурированию.

Конфигурация

Схема: Конфигурация
Схема: Конфигурация

Правильная конфигурация — ключ к стабильной и эффективной работе системы. Мы настроим Loki, Promtail, Nginx и Certbot.

Конфигурация Loki

Создадим конфигурационный файл для Loki /etc/loki/config.yaml. Этот файл определяет, как Loki будет хранить логи, какие порты слушать и другие параметры.


sudo nano /etc/loki/config.yaml

Вставьте следующее содержимое:


auth_enabled: false # Для простоты, отключаем аутентификацию. Для продакшена рассмотрите basic_auth или OIDC

server:
  http_listen_port: 3100 # Порт, на котором Loki будет слушать HTTP-запросы
  grpc_listen_port: 9095 # Порт для gRPC (используется Promtail)

common:
  path_prefix: /var/lib/loki/wal # Путь для Write-Ahead Log
  replication_factor: 1 # Количество реплик для хранения данных
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory # Для простой установки используем inmemory, для продакшена рассмотрите Consul/Etcd
    replication_factor: 1

schema_config:
  configs:
    - from: 2020-10-24 # Дата начала использования этой схемы
      store: boltdb-shipper # Используем boltdb-shipper для хранения индексов
      object_store: filesystem # Хранение чанков логов на файловой системе
      schema: v12
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /var/lib/loki/boltdb-shipper-active # Директория для активных индексов
    cache_location: /var/lib/loki/boltdb-shipper-cache # Директория для кэша индексов
    resync_interval: 5s
    shared_store: filesystem
  filesystem:
    directory: /var/lib/loki/chunks # Директория для хранения чанков логов

compactor:
  working_directory: /var/lib/loki/compactor # Директория для компактора
  shared_store: filesystem

limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h # Отклонять сэмплы старше 7 дней
  max_query_lookback: 720h # Максимальный период для запросов (30 дней)
  max_query_series: 5000 # Максимальное количество серий в запросе
  max_query_length: 720h # Максимальная продолжительность запроса
  max_global_streams_per_user: 5000000
  max_streams_per_user: 100000

ruler:
  storage:
    type: local
    local:
      directory: /var/lib/loki/rules
  rule_path: /var/lib/loki/rules-temp
  alertmanager_url: http://localhost:9093 # Пример, если будете использовать Alertmanager
  ring:
    kvstore:
      store: inmemory

# Настройка для запросов (query-frontend, query-scheduler)
query_range:
  align_queries_with_step: true

# Настройка для ingester (компонент, который принимает логи)
ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  max_transfer_retries: 0

Сохраните файл. Теперь создадим службу Systemd для Loki.


sudo nano /etc/systemd/system/loki.service

Вставьте следующее содержимое:


[Unit]
Description=Loki log aggregation system
After=network.target

[Service]
User=loki
Group=loki
Type=simple
ExecStart=/usr/local/bin/loki -config.file /etc/loki/config.yaml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Сохраните файл, перезагрузите Systemd и запустите Loki:


sudo systemctl daemon-reload
sudo systemctl start loki
sudo systemctl enable loki
sudo ufw allow 3100/tcp # Открываем порт Loki
sudo ufw reload

Проверьте статус Loki:


sudo systemctl status loki

Должно быть active (running).

Конфигурация Promtail

Теперь настроим Promtail для сбора логов. Создадим файл /etc/promtail/config.yaml.


sudo nano /etc/promtail/config.yaml

Вставьте следующее содержимое. Этот пример будет собирать логи системного журнала и логи Nginx.


server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /var/lib/promtail/positions.yaml # Файл для отслеживания позиций в логах

clients:
  - url: http://localhost:3100/loki/api/v1/push # URL для отправки логов в Loki

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          __path__: /var/log/log # Собираем все .log файлы из /var/log
          host: YOUR_HOSTNAME # Замените на реальное имя хоста вашего VPS
    pipeline_stages:
      - docker: {} # Пример, если бы Promtail был в Docker, здесь можно использовать другие парсеры
      - match:
          selector: '{job="varlogs"}'
          stages:
            - regex:
                expression: '^(?P?)(?:\[(?P\d+)])?:\s+(?P.)'
            - labels:
                time:
                hostname:
                process:
                pid:
            - output:
                source: message

  - job_name: nginx_access
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx_access
          __path__: /var/log/nginx/access.log # Путь к логам доступа Nginx
          host: YOUR_HOSTNAME
    pipeline_stages:
      - regex:
          expression: '^(?P\S+) - (?P\S+) \[(?P)" "(?P[^"])"'
      - labels:
          ip:
          user:
          method:
          path:
          status:
          bytes:
          referrer:
          agent:
      - timestamp:
          format: "DD/MMM/YYYY:HH:MM:SS +0000"
          source: time
      - output:
          source: message

  - job_name: nginx_error
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx_error
          __path__: /var/log/nginx/error.log # Путь к логам ошибок Nginx
          host: YOUR_HOSTNAME
    pipeline_stages:
      - regex:
          expression: '^(?P(?P\d+) (?P.)'
      - labels:
          time:
          level:
          pid:
          tid:
          cid:
      - timestamp:
          format: "YYYY/MM/DD HH:MM:SS"
          source: time
      - output:
          source: message

ВАЖНО: Замените YOUR_HOSTNAME на актуальное имя хоста вашего VPS. Также убедитесь, что пути к логам (/var/log/log, /var/log/nginx/access.log, /var/log/nginx/error.log) соответствуют вашей системе.

Сохраните файл. Теперь создадим службу Systemd для Promtail.


sudo nano /etc/systemd/system/promtail.service

Вставьте следующее содержимое:


[Unit]
Description=Promtail log collector
After=network.target

[Service]
User=promtail
Group=promtail
Type=simple
ExecStart=/usr/local/bin/promtail -config.file /etc/promtail/config.yaml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Сохраните файл, перезагрузите Systemd и запустите Promtail:


sudo systemctl daemon-reload
sudo systemctl start promtail
sudo systemctl enable promtail

Проверьте статус Promtail:


sudo systemctl status promtail

Должно быть active (running).

Конфигурация Nginx

Nginx будет выступать в качестве обратного прокси для Loki. Сначала удалим конфигурацию Nginx по умолчанию:


sudo rm /etc/nginx/sites-enabled/default

Создадим новый файл конфигурации для Loki, например, /etc/nginx/sites-available/loki.conf.


sudo nano /etc/nginx/sites-available/loki.conf

Вставьте следующее содержимое. Замените your.domain.com на ваш домен, который будет указывать на ваш VPS.


server {
    listen 80;
    listen [::]:80;
    server_name your.domain.com; # Замените на ваш домен

    location / {
        proxy_pass http://localhost:3100; # Проксируем запросы на Loki
        proxy_set_header Host $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;
        proxy_read_timeout 300s; # Увеличиваем таймаут для больших запросов
    }
}

Сохраните файл. Теперь активируем этот конфиг, создав символическую ссылку:


sudo ln -s /etc/nginx/sites-available/loki.conf /etc/nginx/sites-enabled/

Проверьте конфигурацию Nginx на ошибки и перезапустите его:


sudo nginx -t
sudo systemctl restart nginx

Если ошибок нет, Nginx должен успешно перезапуститься.

Настройка HTTPS с Certbot

Для безопасного доступа к Loki через Nginx используем Certbot для получения TLS-сертификата от Let's Encrypt.


sudo certbot --nginx -d your.domain.com

Certbot проведет вас через процесс. Вам нужно будет ввести адрес электронной почты для уведомлений и согласиться с условиями обслуживания. Он автоматически обнаружит ваш Nginx-сервер-блок для your.domain.com и изменит его, добавив настройки HTTPS и перенаправление HTTP на HTTPS.

После успешной настройки Certbot, ваш файл /etc/nginx/sites-available/loki.conf будет выглядеть примерно так (Certbot добавит свои директивы):


server {
    listen 80;
    listen [::]:80;
    server_name your.domain.com;

    # Certbot добавит сюда перенаправление на HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your.domain.com;

    ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem; # Путь к сертификату
    ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem; # Путь к приватному ключу
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3100;
        proxy_set_header Host $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;
        proxy_read_timeout 300s;
    }
}

Certbot также настроит автоматическое обновление сертификатов. Вы можете проверить это:


sudo systemctl status certbot.timer
sudo certbot renew --dry-run

Проверка работоспособности

Убедимся, что все компоненты работают корректно.

  1. Проверка Loki:
    
    curl -v http://localhost:3100/ready
    

    Должен вернуться статус 200 OK и сообщение Loki is ready.

  2. Проверка Promtail:
    
    sudo journalctl -u promtail.service -f
    

    Вы увидите логи Promtail. Убедитесь, что нет ошибок при отправке логов в Loki.

  3. Проверка Nginx и HTTPS:

    Откройте в браузере https://your.domain.com. Вы должны увидеть интерфейс Loki. Если вы видите ошибку 404 или 502 Bad Gateway, проверьте логи Nginx (/var/log/nginx/error.log) и Loki.

  4. Проверка логов в Loki:

    Из командной строки можно выполнить запрос к Loki через curl, чтобы убедиться, что логи поступают:

    
    curl -G "https://your.domain.com/loki/api/v1/query_range" --data-urlencode 'query={job="varlogs"}' | jq .
    

    Вы должны увидеть JSON-ответ с вашими логами. Если jq не установлен, установите его: sudo apt install jq -y.

    Для более удобного просмотра логов вы можете подключить Loki к Grafana. Установите Grafana на отдельном сервере или как Docker-контейнер и добавьте Loki как источник данных. Тогда вы сможете использовать язык запросов LogQL в Grafana Explore.

Бэкапы и обслуживание

Схема: Бэкапы и обслуживание
Схема: Бэкапы и обслуживание

Бэкап и регулярное обслуживание являются критически важными для любой системы, особенно для системы логирования, где потеря данных может быть катастрофической.

Что бэкапить

Для Loki основные данные, которые нужно бэкапить, это:

  • Конфигурационные файлы: /etc/loki/config.yaml, /etc/promtail/config.yaml, конфигурация Nginx /etc/nginx/sites-available/loki.conf и сертификаты Let's Encrypt /etc/letsencrypt/.
  • Данные Loki: Директории, указанные в storage_config (/var/lib/loki/chunks, /var/lib/loki/boltdb-shipper-active, /var/lib/loki/boltdb-shipper-cache). Эти данные содержат сами логи и их индексы.
  • Позиции Promtail: Файл /var/lib/promtail/positions.yaml. Он отслеживает, до какого места Promtail прочитал каждый файл логов. Если его потерять, Promtail может начать читать логи с самого начала после восстановления, что приведет к дублированию.

Простой скрипт автобэкапа

Мы создадим простой скрипт, который будет архивировать ключевые файлы и директории. Для хранения бэкапов рекомендуется использовать внешнее хранилище, а не тот же VPS.


sudo nano /usr/local/bin/backup_loki.sh

Вставьте следующее содержимое. Замените /path/to/your/backup/destination на реальный путь к вашей директории для бэкапов (например, смонтированный S3-бакет или NFS-ресурс).


#!/bin/bash

# Директория для временных бэкапов
BACKUP_DIR="/tmp/loki_backup_$(date +%Y%m%d%H%M%S)"
mkdir -p "$BACKUP_DIR"

# Директория для хранения финальных архивов
FINAL_BACKUP_DESTINATION="/path/to/your/backup/destination" # ЗАМЕНИТЕ ЭТОТ ПУТЬ
mkdir -p "$FINAL_BACKUP_DESTINATION"

# Файлы и директории для бэкапа
CONFIG_FILES="/etc/loki/config.yaml /etc/promtail/config.yaml /etc/nginx/sites-available/loki.conf"
LETSENCRYPT_DIR="/etc/letsencrypt"
LOKI_DATA_DIR="/var/lib/loki"
PROMTAIL_POSITIONS="/var/lib/promtail/positions.yaml"

# Копируем конфигурационные файлы и сертификаты
cp -r $CONFIG_FILES "$BACKUP_DIR/"
cp -r $LETSENCRYPT_DIR "$BACKUP_DIR/"
cp $PROMTAIL_POSITIONS "$BACKUP_DIR/"

# Останавливаем Loki и Promtail для консистентного бэкапа данных
# В ПРОДАКШЕНЕ рассмотрите более сложные методы для горячего бэкапа или репликации
sudo systemctl stop loki
sudo systemctl stop promtail

# Копируем данные Loki (это может занять много времени для больших объемов)
# Используем rsync для инкрементального копирования
sudo rsync -az "$LOKI_DATA_DIR" "$BACKUP_DIR/"

# Запускаем Loki и Promtail обратно
sudo systemctl start loki
sudo systemctl start promtail

# Создаем архив
ARCHIVE_NAME="loki_backup_$(date +%Y%m%d%H%M%S).tar.gz"
tar -czf "$FINAL_BACKUP_DESTINATION/$ARCHIVE_NAME" -C "$BACKUP_DIR" .

# Удаляем временные файлы
rm -rf "$BACKUP_DIR"

# Очистка старых бэкапов (например, храним 7 дней)
find "$FINAL_BACKUP_DESTINATION" -name "loki_backup_.tar.gz" -type f -mtime +7 -delete

echo "Loki backup completed: $FINAL_BACKUP_DESTINATION/$ARCHIVE_NAME"

Сделайте скрипт исполняемым:


sudo chmod +x /usr/local/bin/backup_loki.sh

Куда складывать бэкапы

Никогда не храните бэкапы на том же сервере, что и оригинальные данные. Если сервер выйдет из строя, вы потеряете и данные, и бэкапы.

  • Внешний S3-совместимый объектный сторадж: Наиболее распространенный и надежный вариант. Используйте такие сервисы, как AWS S3, DigitalOcean Spaces, Backblaze B2 или MinIO (для self-hosted). Для загрузки можно использовать утилиты типа s3cmd или rclone.
  • Отдельный VPS/Dedicated сервер: Выделите отдельный сервер специально для хранения бэкапов. Можно использовать rsync по SSH для копирования архивов.
  • NFS-хранилище: Если у вас есть централизованное сетевое хранилище.

Для интеграции с S3-подобным хранилищем, вы можете установить s3cmd или rclone и добавить команду загрузки в ваш скрипт бэкапа.


# Пример добавления в скрипт backup_loki.sh для S3 (после создания tar.gz)
# sudo apt install rclone -y
# rclone config # Настройте rclone для вашего S3-провайдера
# rclone copy "$FINAL_BACKUP_DESTINATION/$ARCHIVE_NAME" "your_s3_remote:your-bucket-name/loki-backups/"

Автоматизация бэкапов с Cron

Добавьте скрипт в расписание Cron для ежедневного выполнения:


sudo crontab -e

Добавьте следующую строку для выполнения скрипта ежедневно в 03:00 ночи:


0 3    /usr/local/bin/backup_loki.sh >> /var/log/loki_backup.log 2>&1

Обновления: Rolling vs. Maintenance Window

  • Rolling updates (для кластера): Если Loki развернут в кластере (чего мы не делали в этом туториале, так как это VPS), вы можете обновлять узлы по очереди, чтобы поддерживать доступность системы.
  • Maintenance window (для одиночного VPS): Для одиночного VPS, как в нашем случае, обновления Loki и Promtail потребуют короткого "окна обслуживания", во время которого службы будут остановлены.
    1. Остановите Promtail и Loki.
    2. Загрузите новые бинарные файлы.
    3. Замените старые бинарники новыми.
    4. Запустите Loki, затем Promtail.
    5. Проверьте логи и работоспособность.

    Рекомендуется проводить обновления в нерабочее время и всегда иметь свежий бэкап.

Troubleshooting + FAQ

В этом разделе собраны распространенные проблемы и вопросы, которые могут возникнуть при развертывании и эксплуатации Grafana Loki.

Loki или Promtail не запускаются, или неактивны. Что делать?

Если служба Loki или Promtail не запускается или ее статус failed, первое, что нужно проверить, это логи Systemd. Используйте команды:


sudo systemctl status loki.service
sudo journalctl -u loki.service -f

Аналогично для Promtail: sudo systemctl status promtail.service и sudo journalctl -u promtail.service -f. Логи часто содержат информацию об ошибках конфигурации, проблемах с доступом к файлам или занятых портах. Убедитесь, что конфигурационные файлы config.yaml синтаксически верны (используйте онлайн-валидатор YAML) и что у пользователя loki/promtail есть права на чтение файлов конфигурации и запись в директории данных.

Я не вижу логов в Loki UI (через Grafana или curl).

Если логи не поступают, проверьте следующее:

  1. Статус Promtail: Убедитесь, что Promtail запущен и работает без ошибок (sudo systemctl status promtail).
  2. Логи Promtail: Проверьте логи Promtail (sudo journalctl -u promtail.service -f) на наличие ошибок при отправке логов в Loki. Частые ошибки: connection refused (Loki не доступен), 400 Bad Request (проблема с форматом логов или лейблами).
  3. Конфигурация Promtail: Убедитесь, что в /etc/promtail/config.yaml правильно указан url Loki (http://localhost:3100/loki/api/v1/push) и что пути к файлам логов (__path__) верны и доступны для чтения пользователю promtail.
  4. Статус Loki: Убедитесь, что Loki запущен и доступен на порту 3100.
  5. Файрвол: Проверьте, что порт 3100 открыт, если Loki и Promtail находятся на разных серверах или Promtail пытается подключиться к Loki через публичный IP.

Nginx выдает ошибку 502 Bad Gateway или 404 Not Found.

Ошибка 502 Bad Gateway обычно означает, что Nginx не может связаться с бэкендом (в данном случае Loki). Проверьте:

  1. Статус Loki: Убедитесь, что Loki запущен и слушает на localhost:3100.
  2. Логи Nginx: Проверьте /var/log/nginx/error.log. Он точно укажет причину ошибки, например, connection refused.
  3. Конфигурация Nginx: Проверьте файл /etc/nginx/sites-available/loki.conf. Убедитесь, что proxy_pass http://localhost:3100; указан верно.

Ошибка 404 Not Found может указывать на неправильную конфигурацию location / в Nginx или на то, что Loki не имеет такого пути.

Какой VPS-конфиг минимально подойдёт для Grafana Loki?

Для небольших проектов, например, для личного блога, небольшого SaaS-приложения или нескольких микросервисов, генерирующих до 100 ГБ логов в месяц, минимально подойдет VPS с 2 ядрами CPU, 4 ГБ RAM и 100-200 ГБ NVMe SSD. Скорость диска здесь более критична, чем чистый объем, так как Loki активно работает с диском. Убедитесь, что выбранный тарифный план предлагает достаточно быстрый SSD для эффективной работы с индексами и чанками логов.

Что выбрать — VPS или dedicated для этой задачи?

Выбор между VPS и выделенным сервером зависит от масштаба вашей задачи. Для большинства индивидуальных разработчиков, малых команд и проектов с объемом логов до 1-2 ТБ в месяц, VPS будет оптимальным выбором с точки зрения стоимости и простоты управления. Loki спроектирован быть легковесным, что делает его идеальным для VPS. Выделенный сервер становится необходимым, когда требуется максимальная производительность, гарантированные ресурсы без оверселлинга, очень большие объемы логов (терабайты в день), или специфические требования к аппаратному обеспечению (например, RAID-массивы для дисков, высокопроизводительные сетевые карты). Если вы только начинаете, всегда выбирайте VPS, а затем масштабируйтесь до dedicated, если возникнет реальная необходимость.

Как обеспечить безопасность Loki?

В этом туториале мы отключили аутентификацию (auth_enabled: false) для упрощения, но для продакшена это неприемлемо. Рекомендуется:

  1. Basic Auth через Nginx: Nginx может предоставлять базовую HTTP-аутентификацию перед проксированием запросов к Loki.
  2. OIDC/OAuth2: Если вы используете Grafana, она поддерживает интеграцию с OIDC/OAuth2, что позволяет централизовать аутентификацию.
  3. TLS/HTTPS: Убедитесь, что весь трафик к Loki идет через HTTPS (что мы настроили с Nginx и Certbot).
  4. Файрвол: Ограничьте доступ к портам Loki только для необходимых IP-адресов.
  5. Принцип наименьших привилегий: Loki и Promtail работают под отдельными системными пользователями с ограниченными правами.

Как подключить Grafana к Loki?

После развертывания Loki, вы можете легко подключить его к Grafana. Для этого:

  1. Установите Grafana (если еще не сделали).
  2. В Grafana перейдите в Configuration -> Data Sources.
  3. Нажмите Add data source и выберите Loki.
  4. В поле URL укажите адрес вашего Loki-сервера, например, https://your.domain.com.
  5. Если вы используете аутентификацию (например, Basic Auth через Nginx), укажите соответствующие учетные данные.
  6. Нажмите Save & Test.

После этого вы сможете использовать Loki как источник данных в Grafana Explore для запросов логов с помощью LogQL и создания дашбордов.

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Поздравляем! Вы успешно развернули и настроили мощную и экономичную систему централизованного логирования на вашем VPS, используя Grafana Loki, Promtail и Nginx. Теперь у вас есть полный контроль над вашими логами, возможность быстро искать и анализировать события, что значительно упрощает отладку и мониторинг ваших приложений и сервера.

Следующие шаги для развития вашей системы:

  • Интеграция с Grafana: Подключите ваш Loki-сервер к существующей или новой установке Grafana. Это позволит вам использовать мощные возможности визуализации Grafana, создавать дашборды, алерты и проводить более глубокий анализ логов с помощью языка запросов LogQL.
  • Мониторинг Loki: Настройте мониторинг самого Loki с помощью Prometheus и Grafana. Loki предоставляет метрики в формате Prometheus, которые можно собирать и визуализировать для отслеживания его производительности и состояния.
  • Масштабирование и высокая доступность: Если ваш объем логов значительно возрастет, рассмотрите масштабирование Loki путем добавления дополнительных инстансов, использования объектного хранилища (S3-совместимого) вместо файловой системы для чанков логов и распределенного хранилища для индексов (например, Consul или Etcd).
  • Расширение сбора логов: Настройте Promtail для сбора логов со всех ваших приложений, включая Docker-контейнеры (если используете), а также с других серверов, если они у вас есть.

Поделиться этой записью:

развёртывание grafana loki для централизованного логирования на vps: promtail, nginx, systemd
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.