Легковесный модуль для логирования и анализа запросов для Lampac-ng.
Модуль хранит историю запросов в локальной базе данных SQLite и предоставляет простой веб-интерфейс для просмотра запросов, активности пользователей и базовой статистики сервиса.
- Логирование запросов
- Хранилище SQLite
- Веб-интерфейс администратора
- Просмотр истории запросов
- Отслеживание активности пользователей
- Фильтрация запросов по UID
- Статистика самых популярных пользователей
- Статистика самых активных балансировщиков
- Базовая аналитика запросов
- Аутентификация и защита сессий
LogUserRequest-Lite помогает администраторам:
- проверять историю запросов
- анализировать активность пользователей
- проверять использование балансировщиков
- отслеживать базовую статистику сервиса
Lite-версия включает базовую аналитику: топ пользователей, топ балансиров, поиск по UID и демо-график активности за 3 дня.
Расширенная статистика, live-обновления, модальные окна, гибкие фильтры, экспорт данных, архивация, Telegram-уведомления и другие продвинутые функции доступны в Premium-версии.
Модуль подходит администраторам Lampac-ng, которым нужна простая история запросов и базовая статистика без лишней нагрузки на сервер.
Полный список возможностей Premium можно посмотреть в модальном окне по кнопке «Premium». Условия получения — в личных сообщениях.
- Скачайте архив с модулем
- Распакуйте папку
LogUserRequest-Liteв/lampac/mods/ - Отредактируйте init.conf. Разрешите доступ к странице админки LogUserRequest-Lite:
"accsdb": {
"enable": true,
"whitepattern": "^/lite/logrequest"
}, - Перезапустите Lampac
- Админка: http://ваш_сервер/lite/logrequest
{
"enable": true,
"version": 4,
"namespace": "LogUserRequest",
"logDay": 90
}
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
| enable | Включить модуль | true |
| logDay | Сколько дней хранить логи | 90 |
- Переменная окружения (LOGUSER_ADMIN_PASSWORD=my-super-super-secret-key)
- Пароль генерируется автоматически при первом запуске и сохраняется в файл: /lampac/database/LogUserRequest/passlogreg
(Посмотреть пароль: docker exec lampac cat /lampac/database/LogUserRequest/passlogreg)
Что произойдёт при первом запуске
| Ситуация | Результат |
|---|---|
| ENV задан | Используется ENV, файл не создаётся |
| ENV пуст, файла нет | Создаётся /lampac/database/LogUserRequest/passlogreg со случайным паролем (36 символов) |
| ENV пуст, файл есть | Используется пароль из файла |
Если переменная окружения задана - она имеет наивысший приоритет, и остальные источники игнорируются.
Как работает блокировка:
| Параметр | Значение |
|---|---|
| Максимум попыток | 5 неверных паролей в день |
| Блокировка | После 5 неудачных попыток |
| Сброс счётчика | В полночь (по UTC) |
| Блокируется | Только IP нарушителя (остальные пользователи не страдают) |
Что делать при блокировке
-
Подождать до полуночи
Счётчик сбрасывается автоматически в 00:00 UTC. (в кодеDateTime.UtcNow.Date.AddDays(1)— сброс всегда в полночь UTC) -
Сменить IP (если нужно срочно)
Переподключиться к VPN
Использовать другой интернет
Перезагрузить роутер -
Проверить правильность пароля
docker exec lampac cat /lampac/database/LogUserRequest/passlogreg -
Сбросить блокировку вручную (требуется root доступ)
Перезапустить контейнер (сбросит кэш попыток)
docker restart lampac
Сброс счётчика в полночь:
Изменения можно внести в Controllers/ApiController.cs
// В коде используется
AbsoluteExpiration = DateTime.UtcNow.Date.AddDays(1)
Все фильтры находятся в файле LogUserRequestListener.cs в начале класса LogUserRequestListener.
Модуль использует три уровня фильтрации:
- Автоматическая (EventListener lampac) — отсеивает анонимные запросы, локальные IP, служебные эндпоинты ядра
- Список префиксов (
_skipPrefixes) — пути, которые начинаются с указанных строк - Список расширений (
_skipExtensions) — статические файлы по расширению
Попадание в любой из фильтров — запрос не логируется.
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", // Ещё один пример
};
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 изображения
};
_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 запрос/сек
private const int MaxQueueSize = 20000;
При превышении лимита новые записи отбрасываются с throttled-логом (не чаще раза в минуту).
| Что хотите заблокировать | Куда добавить | Код |
|---|---|---|
| Конкретный путь /api/test | _skipPrefixes | "/api/test" |
| Все пути с префиксом /bot/ | _skipPrefixes | "/bot" |
| Все .php файлы | _skipExtensions | ".php" |
| Слишком частые запросы | Rate Limit | Увеличить FromMilliseconds(33) до FromMilliseconds(100) |
Это не нужно добавлять в списки — 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/
Пошаговая инструкция
-
Скопируйте файл
userlog.dbиз папкиlampac-docker/database/LogUserRequest/в любое удобное место (это будет ваш бэкап) -
Отредактируйте копию в 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. Если в админке время отличается от вашего локального — это нормально, но можно настроить.
Варианты решения
- Сменить часовой пояс контейнера (рекомендуется)
Добавьте переменную окружения TZ при запуске контейнера:
docker run -e TZ=Europe/…
docker run -e TZ=Asia/…
Или в docker-compose.yml:
environment:- TZ=Europe/….
После изменения — перезапустите контейнер.
- TZ=Europe/….
- Если 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 везде.
- Проверьте синтаксис в
manifest.json(запятые, кавычки) - Посмотрите логи:
docker logs lampac | grep LogUserRequest
- Убедитесь, что путь
/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-версии
- Lite-версия полностью бесплатна и функциональна
💡 Premium-версия добавляет графики, экспорт, Telegram-уведомления и гибкие фильтры через UI. Подробнее — в модальном окне по кнопке "Premium" в админке или у разработчика.
По вопросам работы модуля, предложениям и багам:
- Telegram: @Viacheslav_Sh1
LogUserRequest Lite — бесплатный модуль для логирования запросов в Lampac NG.