Skip to content

vamischenko/AdminLogPanel

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

        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^ index.php [QSA,L]
    </Directory>
</VirtualHost>

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

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

Nginx

server {
    listen 80;
    server_name adminlogpanel.local;
    root /path/to/AdminLogPanel/public_www;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.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              SERIAL PRIMARY 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 записей)
  • Для расширения создайте дополнительные партиции:
CREATE TABLE data_logs_p20 PARTITION OF data_logs
FOR VALUES FROM (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

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors