Skip to content

Viacheslav-Sh1/LogUserRequest-Lite

Repository files navigation

LogUserRequest-Lite для Lampac-ng

Легковесный модуль для логирования и анализа запросов для Lampac-ng.

Модуль хранит историю запросов в локальной базе данных SQLite и предоставляет простой веб-интерфейс для просмотра запросов, активности пользователей и базовой статистики сервиса.

🌐 Навигация

Функции

  • Логирование запросов
  • Хранилище SQLite
  • Веб-интерфейс администратора
  • Просмотр истории запросов
  • Отслеживание активности пользователей
  • Фильтрация запросов по UID
  • Статистика самых популярных пользователей
  • Статистика самых активных балансировщиков
  • Базовая аналитика запросов
  • Аутентификация и защита сессий

Назначение

LogUserRequest-Lite помогает администраторам:

  • проверять историю запросов
  • анализировать активность пользователей
  • проверять использование балансировщиков
  • отслеживать базовую статистику сервиса

Ограничения Lite

Lite-версия включает базовую аналитику: топ пользователей, топ балансиров, поиск по UID и демо-график активности за 3 дня.

Расширенная статистика, live-обновления, модальные окна, гибкие фильтры, экспорт данных, архивация, Telegram-уведомления и другие продвинутые функции доступны в Premium-версии.

Для кого

Модуль подходит администраторам Lampac-ng, которым нужна простая история запросов и базовая статистика без лишней нагрузки на сервер.

Premium

Полный список возможностей Premium можно посмотреть в модальном окне по кнопке «Premium». Условия получения — в личных сообщениях.

Установка

  1. Скачайте архив с модулем
  2. Распакуйте папку LogUserRequest-Lite в /lampac/mods/
  3. Отредактируйте init.conf. Разрешите доступ к странице админки LogUserRequest-Lite:
    "accsdb": {
    "enable": true,
    "whitepattern": "^/lite/logrequest"
    },
  4. Перезапустите Lampac
  5. Админка: http://ваш_сервер/lite/logrequest

Настройка модуля:

1. Конфигурация в manifest.json:

{
"enable": true,
"version": 4,
"namespace": "LogUserRequest",
"logDay": 90
}

Параметр Описание Значение по умолчанию
enable Включить модуль true
logDay Сколько дней хранить логи 90

Пароль администратора:

  1. Переменная окружения (LOGUSER_ADMIN_PASSWORD=my-super-super-secret-key)
  2. Пароль генерируется автоматически при первом запуске и сохраняется в файл: /lampac/database/LogUserRequest/passlogreg
    (Посмотреть пароль: docker exec lampac cat /lampac/database/LogUserRequest/passlogreg)

Что произойдёт при первом запуске

Ситуация Результат
ENV задан Используется ENV, файл не создаётся
ENV пуст, файла нет Создаётся /lampac/database/LogUserRequest/passlogreg со случайным паролем (36 символов)
ENV пуст, файл есть Используется пароль из файла

⚠️ Важно:
Если переменная окружения задана - она имеет наивысший приоритет, и остальные источники игнорируются.

Блокировка при входе в LogUserRequest

Как работает блокировка:

Параметр Значение
Максимум попыток 5 неверных паролей в день
Блокировка После 5 неудачных попыток
Сброс счётчика В полночь (по UTC)
Блокируется Только IP нарушителя (остальные пользователи не страдают)

Что делать при блокировке

  1. Подождать до полуночи
    Счётчик сбрасывается автоматически в 00:00 UTC. (в коде DateTime.UtcNow.Date.AddDays(1) — сброс всегда в полночь UTC)

  2. Сменить IP (если нужно срочно)
    Переподключиться к VPN
    Использовать другой интернет
    Перезагрузить роутер

  3. Проверить правильность пароля
    docker exec lampac cat /lampac/database/LogUserRequest/passlogreg

  4. Сбросить блокировку вручную (требуется root доступ)
    Перезапустить контейнер (сбросит кэш попыток)
    docker restart lampac

Сброс счётчика в полночь:
Изменения можно внести в Controllers/ApiController.cs
// В коде используется
AbsoluteExpiration = DateTime.UtcNow.Date.AddDays(1)

Инструкция по настройке фильтрации в Lite-версии

Где находятся фильтры

Все фильтры находятся в файле LogUserRequestListener.cs в начале класса LogUserRequestListener.

Как работает фильтрация

Модуль использует три уровня фильтрации:

  1. Автоматическая (EventListener lampac) — отсеивает анонимные запросы, локальные IP, служебные эндпоинты ядра
  2. Список префиксов (_skipPrefixes) — пути, которые начинаются с указанных строк
  3. Список расширений (_skipExtensions) — статические файлы по расширению

Попадание в любой из фильтров — запрос не логируется.


1. Список пропускаемых префиксов (_skipPrefixes)

private static readonly string[] _skipPrefixes =
{
"/.well-known",
"/admin/health",
"/admin/ping",
"/testaccsdb",
"/nws",
"/lifeevents",
"/proxyimg",
"/lite/logrequest",
"/lite/events",
"/nexthub",
"/externalids",
"/lampa-main",
"/lite/withsearch",
"/timecode",
"/bookmark",
"/storage",
"/cub",
"/cub/",
"/sisi/bookmarks",
"/proxy/"
};

Как добавить новый путь:

private static readonly string[] _skipPrefixes =
{
// ... существующие ...
"/ваш_путь", // Блокирует /ваш_путь и /ваш_путь/что-угодно
"/api/internal", // Ещё один пример
};

2. Список расширений (_skipExtensions)

private static readonly string[] _skipExtensions =
{
".js", ".css", ".svg", ".png", ".jpg", ".jpeg",
".woff", ".woff2", ".ogg", ".ico", ".map"
};

Как добавить новое расширение:

private static readonly string[] _skipExtensions =
{
// ... существующие ...
".php", // Блокирует все .php файлы
".webp", // Блокирует .webp изображения
};

3. Rate Limit (ограничение частоты запросов)

_rateLimitCache.Set(realIP, DateTime.UtcNow, new MemoryCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMilliseconds(33), // ← интервал
Size = 1
});

Как изменить интервал:

TimeSpan.FromMilliseconds(33) — ~30 запросов/сек с одного IP
TimeSpan.FromMilliseconds(100) — 10 запросов/сек
TimeSpan.FromSeconds(1) — 1 запрос/сек

4. Максимальный размер очереди

private const int MaxQueueSize = 20000;

При превышении лимита новые записи отбрасываются с throttled-логом (не чаще раза в минуту).

📋 Примеры фильтрации

Что хотите заблокировать Куда добавить Код
Конкретный путь /api/test _skipPrefixes "/api/test"
Все пути с префиксом /bot/ _skipPrefixes "/bot"
Все .php файлы _skipExtensions ".php"
Слишком частые запросы Rate Limit Увеличить FromMilliseconds(33) до FromMilliseconds(100)

Что фильтруется автоматически (EventListener lampac)

Это не нужно добавлять в списки — lampac делает это сам:
Статические файлы (js, css, png, svg, woff)
Анонимные запросы
Локальные IP (127.0.0.1, ::1)
Служебные эндпоинты lampac
Запросы до авторизации

⚠️ Важные замечания

После изменения файла нужна перекомпиляция модуля
Синтаксис C# чувствителен к регистру и запятым
Не удаляйте /lite/logrequest из _skipPrefixes — иначе страница модуля будет логировать саму себя
При ошибке в синтаксисе модуль не загрузится

База данных

Путь: /lampac/database/LogUserRequest/userlog.db

Очистка старых записей
В Lite-версии реализована очистка по дням через параметр logDay в manifest.json.
{
"logDay": 90
}

Как работает:

Записи старше logDay дней удаляются раз в сутки
Проверка запускается через 1 минуту после старта модуля и затем каждые 24 часа
Удаление происходит батчами по 5000 записей для защиты от блокировки SQLite при больших объёмах
После удаления старых записей также удаляются неиспользуемые unfo и headers

Код в ModInit.cs:

Код находится в ModInit.cs, метод ClearJurnal. Удаление происходит батчами по 5000 записей.

Почему батчами:
SQLite блокирует всю таблицу при удалении
При большом количестве записей (100 000+) одиночный DELETE может занять секунды
Батчи по 5000 позволяют другим операциям (запись логов, чтение админки) работать между удалениями

Рекомендуемые значения

Сценарий logDay:
Домашнее использование (1-5 пользователей) 90 дней
Небольшой сервер (5-20 пользователей) 60 дней
Крупный сервер (20+ пользователей) 30 дней

Оптимизация SQLite (уже настроено)
В модуле применены:
WAL — ускорение записи
cache_size = -64000 — кэш 64 МБ
temp_store = MEMORY — временные таблицы в памяти
mmap_size = 33554432 — memory-mapped I/O (32 МБ)

Ручная очистка и редактирование базы данных

Для редактирования базы данных используйте DB Browser for SQLite — бесплатный визуальный редактор.

🔗 Скачать: https://sqlitebrowser.org/

Пошаговая инструкция

  1. Скопируйте файл userlog.db из папки lampac-docker/database/LogUserRequest/ в любое удобное место (это будет ваш бэкап)

  2. Отредактируйте копию в DB Browser for SQLite:

    • Откройте скопированный файл

    • Перейдите на вкладку "Execute SQL"

    • Вставьте и выполните запросы:

      DELETE FROM jurnal WHERE time < datetime('now', '-30 days');
      VACUUM;

Сохраните изменения (Ctrl+S)

Замените оригинал — скопируйте отредактированный файл обратно в lampac-docker/database/LogUserRequest/ с заменой
Перезапустите контейнер:

docker restart lampac

✅ Готово! База очищена, старые записи удалены.

📋 Альтернативные запросы

Задача SQL-запрос
Удалить старше 7 дней DELETE FROM jurnal WHERE time < datetime('now', '-7 days');
Удалить старше 90 дней DELETE FROM jurnal WHERE time < datetime('now', '-90 days');
Удалить ВСЕ записи DELETE FROM jurnal;
Посмотреть количество записей SELECT COUNT(*) FROM jurnal;

🕐 Время записей не совпадает с местным

По умолчанию модуль сохраняет время запросов в UTC. Если в админке время отличается от вашего локального — это нормально, но можно настроить.

Варианты решения

  1. Сменить часовой пояс контейнера (рекомендуется)
    Добавьте переменную окружения TZ при запуске контейнера:
    docker run -e TZ=Europe/…
    docker run -e TZ=Asia/…
    Или в docker-compose.yml:
    environment:
    • TZ=Europe/….
      После изменения — перезапустите контейнер.
  2. Если TZ не поддерживается нужно изменить код модуля (⚠️Не рекомендуется)
    Если нужно хранить локальное время вместо UTC, измените во всех файлах модуля
    // Было
    DateTime.UtcNow
    DateTime.UtcNow.AddDays(-X)
    DateTime.UtcNow.Date
    // Стало
    DateTime.Now
    DateTime.Now.AddDays(-X)
    DateTime.Now.Date

Не заменяйте:
DateTime.Now.Ticks
В именах файлов экспорта ($"export_{DateTime.Now:yyyyMMdd}.zip")

⚠️ Важно: последствия перехода на локальное время

Проблема Описание
Переход на летнее/зимнее время Дважды в год время сдвигается на час. Записи могут дублироваться или нарушится сортировка
Смена часового пояса сервера При переезде на другой сервер все исторические данные будут показывать неверное время
Сравнение логов с разных серверов Если у вас несколько серверов в разных часовых поясах — логи невозможно сопоставить
Очистка по logDay Может удалить на час больше или меньше записей при переходе времени

Модуль использует DateTime.UtcNow везде. ⚠️ Менять UTC на Now в коде категорически не рекомендуется.

💡 Рекомендация: Оставьте UTC. Браузер сам покажет локальное время. Это стандарт для логирования.

❓ Частые проблемы

Модуль не загружается

  • Проверьте синтаксис в manifest.json (запятые, кавычки)
  • Посмотрите логи: docker logs lampac | grep LogUserRequest

Не открывается админка (404)

  • Убедитесь, что путь /lite/logrequest не заблокирован в чёрном списке
  • Проверьте, что модуль включён: "enable": true

Пароль не подходит

  • ENV переменная имеет приоритет: docker exec lampac env | grep LOGUSER
  • Проверьте файл: docker exec lampac cat /lampac/database/LogUserRequest/passlogreg

База данных растёт слишком быстро

  • Уменьшите logDay до 30
  • Добавьте в чёрный список часто вызываемые служебные пути

После входа в админку белый экран

  • Проверьте консоль браузера (F12) на ошибки
  • Убедитесь, что файлы index.html и auth.html не повреждены
  • Очистите кэш браузера

Не работает кнопка "Premium"

  • Это не баг 😄 — кнопка открывает пасхалку и информацию о Premium-версии
  • Lite-версия полностью бесплатна и функциональна

💡 Premium-версия добавляет графики, экспорт, Telegram-уведомления и гибкие фильтры через UI. Подробнее — в модальном окне по кнопке "Premium" в админке или у разработчика.

📞 Поддержка

По вопросам работы модуля, предложениям и багам:


LogUserRequest Lite — бесплатный модуль для логирования запросов в Lampac NG.

About

User request logging module for Lampa NG

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages