## Установка 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.Today.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.Today.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/](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`** | Может удалить на час больше или меньше записей при переходе времени | #### 💡 Рекомендация: Оставьте 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" в админке или у разработчика. ## 📞 Поддержка По вопросам работы модуля, предложениям и багам: - Telegram: [@Viacheslav_Sh1](https://t.me/Viacheslav_Sh1) --- **LogUserRequest Lite** — бесплатный модуль для логирования запросов в Lampac NG.