337 lines
17 KiB
Markdown
337 lines
17 KiB
Markdown
## Установка
|
||
|
||
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.
|