Современная система администрирования логов с разделением прав доступа для администраторов и пользователей.
Веб-приложение для управления логами с расширенными возможностями:
- ✅ Авторизация на основе cookies с CSRF защитой
- ✅ Разделение прав: администратор и пользователь
- ✅ Просмотр, поиск и сортировка логов
- ✅ Пагинация с настраиваемыми лимитами
- ✅ Управление пользователями (для админа)
- ✅ Статистика по логам
- ✅ Воркер для генерации тестовых данных с проверкой GeoIP
- ✨ 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
Самый быстрый способ запустить проект:
# Запустить все сервисы
docker-compose up -d
# Проверить статус
docker-compose ps
# Открыть в браузере
open http://localhost:8000Логин: admin / Пароль: password
Готово! База данных автоматически создана и заполнена.
Для остановки:
docker-compose down# Создайте базу данных
createdb adminlogpanel
# Импортируйте схему
psql -d adminlogpanel -f database.sqlПо умолчанию используются следующие параметры подключения:
- 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<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]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;
}
}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)
Воркер автоматически проверяет соответствие IP адреса и страны через API ip-api.com:
- Если страна совпадает →
country_true = true - Если не совпадает →
country_true = false
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 # Получить статистику
-
Управление пользователями
- Создание новых аккаунтов
- Редактирование (логин, пароль, права, блокировка)
- Удаление аккаунтов
-
Просмотр всех логов
- Все логи всех пользователей
- Отображение аккаунта для каждой записи
- Поиск по тексту
- Сортировка по дате, стране, аккаунту
- Пагинация
- Удаление записей
-
Статистика
- Количество логов по странам
- Количество логов по пользователям
- Количество логов по датам (последние 30 дней)
- Просмотр своих логов
- Только записи своего аккаунта
- Поиск по тексту
- Сортировка по дате, стране
- Пагинация
- Нет доступа к чужим данным
- Авторизация на основе cookies
- Cookie содержит токен формата:
{account_id}:{hash} - Hash = SHA256(account_id + password_hash)
При невалидном токене:
- Удаляются все cookies пользователя
- Аккаунт блокируется в БД (
is_blocked = true)
Все защищенные endpoints проверяют:
- Наличие cookie
- Валидность токена
- Статус блокировки аккаунта
- Права доступа (для админских endpoint'ов)
id SERIAL PRIMARY KEY
login VARCHAR(255) UNIQUE
password_hash VARCHAR(255)
is_admin BOOLEAN
is_blocked BOOLEAN
created_at TIMESTAMPid 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 - Автоинкремент для каждого аккаунта
- Создайте новую папку в
worker/test/:
mkdir worker/test/5- Создайте файлы:
echo "Your log text here" > worker/test/5/info.txt
echo -e "ip: 1.2.3.4\nCountry: US" > worker/test/5/country.txt- Запустите воркер
- Создайте метод в контроллере
- Зарегистрируйте роут в
index.php - Добавьте вызов в
app.js(если нужен фронтенд)
Проверьте:
- PostgreSQL запущен
- База данных создана
- Права доступа настроены
- Параметры подключения корректны
# Проверьте структуру
ls -la worker/test/
# Должны быть папки 1, 2, 3, 4 с файлами info.txt и country.txt- API ip-api.com имеет лимит 45 запросов в минуту для бесплатного использования
- Воркер делает паузу 200ms между запросами
- При превышении лимита подождите 1 минуту
Проверьте настройки rewrite rules веб-сервера.
MIT