Skip to content

Repository files navigation

Admin Log Panel

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

🎯 Описание

Веб-приложение для управления логами с расширенными возможностями:

Основной функционал

  • ✅ Авторизация на основе cookies с CSRF защитой
  • ✅ Разделение прав: администратор и пользователь
  • ✅ Просмотр, поиск и сортировка логов
  • ✅ Пагинация с настраиваемыми лимитами
  • ✅ Управление пользователями (для админа)
  • ✅ Статистика по логам
  • ✅ Воркер для генерации тестовых данных с проверкой GeoIP

🚀 Улучшения (NEW!)

  • CSRF Protection - защита от межсайтовых атак
  • Rate Limiting - ограничение частоты запросов
  • Input Validation - валидация всех входных данных
  • Loading Indicators - индикаторы загрузки
  • Toast Notifications - красивые уведомления
  • CSV Export - экспорт данных в CSV
  • Date Range Filters - фильтрация по датам
  • Debounced Search - оптимизированный поиск
  • Docker Support - полная контейнеризация

📖 Подробнее об улучшениях: IMPROVEMENTS.md

Требования

  • PHP 7.4+
  • PostgreSQL 12+
  • Веб-сервер (Apache/Nginx)
  • PHP расширения: pdo_pgsql, json

Структура проекта

AdminLogPanel/
├── public_www/ # Веб-приложение
│ ├── index.php # Точка входа
│ ├── config/ # Конфигурация
│ │ ├── database.php # Подключение к БД
│ │ └── router.php # Роутер
│ ├── controllers/ # Контроллеры
│ │ ├── AuthController.php
│ │ ├── AdminController.php
│ │ └── UserController.php
│ ├── models/ # Модели
│ │ ├── Account.php
│ │ └── DataLog.php
│ ├── middleware/ # Middleware
│ │ └── AuthMiddleware.php
│ └── views/ # Фронтенд
│ ├── index.html
│ └── app.js
├── worker/ # Воркер для генерации данных
│ ├── worker.php # Главный скрипт воркера
│ ├── GeoIP.php # Проверка GeoIP
│ └── test/ # Тестовые данные
│ ├── 1/
│ │ ├── info.txt
│ │ └── country.txt
│ ├── 2/
│ ├── 3/
│ └── 4/
├── database.sql # SQL схема БД
└── README.md

Установка

Вариант 1: Docker (Рекомендуется) 🐳

Самый быстрый способ запустить проект:

# Запустить все сервисы
docker-compose up -d
# Проверить статус
docker-compose ps
# Открыть в браузере
open http://localhost:8000

Логин: admin / Пароль: password

Готово! База данных автоматически создана и заполнена.

Для остановки:

docker-compose down

Вариант 2: Локальная установка

1. Создание базы данных

# Создайте базу данных
createdb adminlogpanel
# Импортируйте схему
psql -d adminlogpanel -f database.sql

2. Настройка базы данных

По умолчанию используются следующие параметры подключения:

  • Host: localhost
  • Port: 5432
  • Database: adminlogpanel
  • User: postgres
  • Password: postgres

Для изменения параметров установите переменные окружения:

export DB_HOST=localhost
export DB_PORT=5432
export DB_NAME=adminlogpanel
export DB_USER=postgres
export DB_PASSWORD=your_password

3. Настройка веб-сервера

Apache

<VirtualHost*:80>
ServerName adminlogpanel.local
DocumentRoot /path/to/AdminLogPanel/public_www
<Directory/path/to/AdminLogPanel/public_www>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
RewriteEngineOnRewriteCond%{REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule^index.php [QSA,L]
</Directory>
</VirtualHost>

Создайте файл .htaccess в папке public_www:

RewriteEngineOnRewriteCond%{REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule^index.php [QSA,L]

Nginx

server{listen80;server_name adminlogpanel.local;root /path/to/AdminLogPanel/public_www;indexindex.php;location / {try_files$uri$uri/ /index.php?$query_string;}location~\.php$ {fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;fastcgi_indexindex.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}

4. Встроенный PHP сервер (для разработки)

cd public_www
php -S localhost:8000

Откройте в браузере: http://localhost:8000

Учетные данные

После импорта базы данных доступны 2 аккаунта:

Администратор:

  • Login: admin
  • Password: password

Пользователь:

  • Login: user
  • Password: password

Использование воркера

Воркер генерирует тестовые данные на основе файлов в папке worker/test/.

Структура тестовых данных

Каждая папка в test/ содержит 2 файла:

info.txt - произвольный текст (до 1000 символов)

country.txt - IP и страна в формате:

ip: 95.153.177.120
Country: RU

Запуск воркера

cd worker
# Сгенерировать 10 записей для аккаунта #2 (user)
php worker.php
# Сгенерировать 50 записей для аккаунта #2
php worker.php 50
# Сгенерировать 100 записей для аккаунта #1 (admin)
php worker.php 100 1

Параметры:

  • 1-й параметр: количество записей (по умолчанию 10)
  • 2-й параметр: ID аккаунта (по умолчанию 2)

Проверка GeoIP

Воркер автоматически проверяет соответствие IP адреса и страны через API ip-api.com:

  • Если страна совпадает → country_true = true
  • Если не совпадает → country_true = false

API Endpoints

Авторизация

POST /api/auth/login # Вход
POST /api/auth/logout # Выход
GET /api/auth/me # Текущий пользователь

Для пользователя

GET /api/user/logs # Получить свои логи
?page=1 # Страница
&limit=20 # Записей на странице
&order_by=created_at # Сортировка (created_at, country)
&order_dir=DESC # Направление (ASC, DESC)
&search=text # Поиск по info_text

Для администратора

# Управление аккаунтами
GET /api/admin/accounts # Список всех аккаунтов
POST /api/admin/accounts # Создать аккаунт
PUT /api/admin/accounts/{id} # Обновить аккаунт
DELETE /api/admin/accounts/{id} # Удалить аккаунт
# Управление логами
GET /api/admin/logs # Все логи (с теми же параметрами, что /api/user/logs)
DELETE /api/admin/logs/{id} # Удалить лог
# Статистика
GET /api/admin/statistics # Получить статистику

Функционал

Администратор

  1. Управление пользователями

    • Создание новых аккаунтов
    • Редактирование (логин, пароль, права, блокировка)
    • Удаление аккаунтов
  2. Просмотр всех логов

    • Все логи всех пользователей
    • Отображение аккаунта для каждой записи
    • Поиск по тексту
    • Сортировка по дате, стране, аккаунту
    • Пагинация
    • Удаление записей
  3. Статистика

    • Количество логов по странам
    • Количество логов по пользователям
    • Количество логов по датам (последние 30 дней)

Пользователь

  1. Просмотр своих логов
    • Только записи своего аккаунта
    • Поиск по тексту
    • Сортировка по дате, стране
    • Пагинация
    • Нет доступа к чужим данным

Безопасность

Авторизация

  • Авторизация на основе cookies
  • Cookie содержит токен формата: {account_id}:{hash}
  • Hash = SHA256(account_id + password_hash)

Защита от взлома

При невалидном токене:

  1. Удаляются все cookies пользователя
  2. Аккаунт блокируется в БД (is_blocked = true)

Middleware

Все защищенные endpoints проверяют:

  1. Наличие cookie
  2. Валидность токена
  3. Статус блокировки аккаунта
  4. Права доступа (для админских endpoint'ов)

База данных

Таблица accounts

id SERIALPRIMARY KEY
login VARCHAR(255) UNIQUE
password_hash VARCHAR(255)
is_admin BOOLEAN
is_blocked BOOLEAN
created_at TIMESTAMP

Таблица data_logs (партиционированная)

id SERIAL# Общий ID
account_id INTEGER# ID аккаунта
account_log_id INTEGER# Уникальный ID в рамках аккаунта
log_id VARCHAR(255)
ip_address INET
country VARCHAR(10)
country_true BOOLEAN
info_text TEXT
created_at TIMESTAMP

Партиционирование

  • Партиции по 100 ID
  • Создано 20 партиций (до 2000 записей)
  • Для расширения создайте дополнительные партиции:
CREATETABLEdata_logs_p20 PARTITION OF data_logs
FOR VALUESFROM (2000) TO (2100);

Триггер

При вставке новой записи автоматически генерируется account_log_id:

  • Уникальный в рамках account_id
  • Автоинкремент для каждого аккаунта

Разработка

Добавление новых тестовых данных

  1. Создайте новую папку в worker/test/:
mkdir worker/test/5
  1. Создайте файлы:
echo"Your log text here"> worker/test/5/info.txt
echo -e "ip: 1.2.3.4\nCountry: US"> worker/test/5/country.txt
  1. Запустите воркер

Добавление новых endpoint'ов

  1. Создайте метод в контроллере
  2. Зарегистрируйте роут в index.php
  3. Добавьте вызов в app.js (если нужен фронтенд)

Устранение неполадок

Ошибка подключения к БД

Проверьте:

  • PostgreSQL запущен
  • База данных создана
  • Права доступа настроены
  • Параметры подключения корректны

Воркер не находит папки

# Проверьте структуру
ls -la worker/test/
# Должны быть папки 1, 2, 3, 4 с файлами info.txt и country.txt

GeoIP не работает

  • API ip-api.com имеет лимит 45 запросов в минуту для бесплатного использования
  • Воркер делает паузу 200ms между запросами
  • При превышении лимита подождите 1 минуту

Ошибка 404 на роутах

Проверьте настройки rewrite rules веб-сервера.

Лицензия

MIT

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages