Сэр, подвиньтесь, такого перспективного разработчика должен забрать я.
Так вот, мне нужен плагин чтоб я удаленно мог управлять веб-сервером из админ панели, вот ТЗ:
1. Общее описание
Плагин "Server Control Panel" предназначен для предоставления администраторам XenForo удобного интерфейса для мониторинга и базового управления ключевыми компонентами серверной инфраструктуры (веб-сервер, PHP, MySQL) напрямую из админ-панели XenForo. Цель — упростить частые операции по настройке и перезапуску сервисов, сокращая необходимость прямого доступа к SSH.
2. Версия XenForo
- Требуемая версия: XenForo 2.3.x
3. Цели плагина
- Обеспечить возможность перезапуска/перезагрузки веб-сервера (Apache/Nginx), PHP-FPM и MySQL.
- Предоставить интерфейс для просмотра и изменения ключевых параметров php.ini.
- Предоставить интерфейс для просмотра и изменения ключевых параметров my.cnf.
- Отображать текущий статус управляемых сервисов.
- Вести логи всех действий, выполненных через плагин.
- Обеспечить высокий уровень безопасности, предотвращая несанкционированный доступ и потенциальные уязвимости.
4. Нефункциональные требования
- Безопасность:
- Все действия должны быть доступны только пользователям с соответствующими разрешениями администратора XenForo.
- Любое выполнение системных команд (через exec, shell_exec и т.д.) должно быть крайне осторожным, с полной валидацией входных данных и использованием "белых списков" разрешенных команд/параметров.
- Должна быть возможность указать, какие команды требуют sudo и какие пользователи могут их выполнять (путем настройки sudoers на сервере). Плагин не должен запрашивать пароль.
- Конфигурационные файлы (пути к ним, команды перезапуска) должны храниться в защищенном месте (например, в системных настройках XenForo, а не в открытом коде).
- Предупреждения о потенциальной опасности изменения настроек должны быть явно видны.
- Производительность: Плагин не должен создавать чрезмерную нагрузку на сервер. Запросы к сервисам должны быть быстрыми.
- Удобство использования (UX): Интуитивно понятный интерфейс в админ-панели XenForo, с четкими описаниями полей и действий.
- Надежность: Устойчивость к ошибкам при выполнении команд. Четкое информирование пользователя об успехе или неудаче операции.
- Локализация: Все текстовые элементы должны быть реализованы через систему фраз XenForo.
5. Функциональные требования
5.1. Административный интерфейс (Admin CP)
- Новый раздел/меню: В админ-панели XenForo должен быть создан новый раздел, например, "Server Control".
- Главная страница плагина ("Dashboard"):
- Краткий обзор состояния всех управляемых сервисов (Web Server, PHP-FPM, MySQL).
- Возможность быстрого перезапуска/перезагрузки для каждого сервиса.
- Ссылки на более детальные страницы настроек каждого модуля.
- Страница настроек плагина:
- Настройка путей к конфигурационным файлам (e.g., /etc/php/8.x/fpm/php.ini, /etc/nginx/nginx.conf, /etc/mysql/my.cnf).
- Настройка команд для проверки статуса сервисов (e.g., systemctl status nginx, pgrep -x php-fpm).
- Настройка команд для перезагрузки/перезапуска сервисов (e.g., sudo systemctl reload nginx, sudo systemctl restart php8.x-fpm, sudo systemctl restart mysql).
- Выбор типа веб-сервера (Apache/Nginx).
- Выбор версии PHP-FPM.
- Раздел предупреждений и рекомендаций по безопасности.
5.2. Модуль управления Web Server (Apache/Nginx)
- Страница: "Server Control -> Web Server"
- Отображение статуса:
- Текущий статус сервиса (работает/остановлен/ошибка).
- Дополнительная информация (PID, время работы, нагрузка — если доступно через команду статуса).
- Действия:
- Перезагрузить (Reload): Мягкая перезагрузка конфигурации без остановки сервиса.
- Перезапустить (Restart): Полная остановка и повторный запуск сервиса.
- Остановить (Stop): Полная остановка сервиса (с предупреждением).
- Запустить (Start): Запуск остановленного сервиса.
- Отображение конфигурации (read-only): Возможность просмотреть содержимое основного конфигурационного файла веб-сервера (например, nginx.conf или httpd.conf). Только для чтения.
5.3. Модуль управления PHP (PHP-FPM)
- Страница: "Server Control -> PHP"
- Отображение статуса:
- Текущий статус сервиса PHP-FPM.
- Текущая используемая версия PHP.
- Просмотр и изменение php.ini параметров:
- Список ключевых параметров, которые можно редактировать (через xf
ption_group или кастомный интерфейс):
- upload_max_filesize
- post_max_size
- memory_limit
- max_execution_time
- max_input_vars
- display_errors (с предупреждением о безопасности для production)
- error_reporting
- date.timezone
- Другие, часто используемые.
- Каждый параметр должен быть представлен в виде формы ввода с текущим значением и возможностью его изменения.
- После изменения параметров должна быть кнопка "Сохранить и перезапустить PHP-FPM".
- Действия:
- Перезапустить PHP-FPM: Полная остановка и повторный запуск сервиса для применения новых настроек.
- Кэширование PHP: Возможность очистки opcache (если используется и команда доступна).
5.4. Модуль управления MySQL
- Страница: "Server Control -> MySQL"
- Отображение статуса:
- Текущий статус сервиса (работает/остановлен/ошибка).
- Версия MySQL/MariaDB.
- Просмотр и изменение my.cnf параметров:
- Список ключевых параметров, которые можно редактировать (через xf
ption_group или кастомный интерфейс):
- max_connections
- innodb_buffer_pool_size
- query_cache_size (если используется)
- wait_timeout
- interactive_timeout
- key_buffer_size
- Другие, часто используемые.
- Каждый параметр должен быть представлен в виде формы ввода с текущим значением и возможностью его изменения.
- После изменения параметров должна быть кнопка "Сохранить и перезапустить MySQL".
- Действия:
- Перезапустить MySQL: Полная остановка и повторный запуск сервиса для применения новых настроек.
5.5. Общие функции
- Логирование действий:
- Каждое действие (перезапуск, изменение параметра, попытка выполнения команды) должно быть записано в журнал.
- Журнал должен содержать: дату/время, администратора, тип действия, измененный параметр (если применимо), результат (успех/ошибка), полный вывод команды (если есть).
- Интерфейс для просмотра журнала в админ-панели.
- Система разрешений:
- Интеграция с системой разрешений администраторов XenForo. Возможность назначать, какие группы администраторов могут управлять каждым из сервисов или выполнять определенные действия.
- Валидация:
- Строгая валидация всех пользовательских вводов (числовые значения, строки, пути к файлам).
- Проверка существования файлов и доступности команд перед их выполнением.
- Резервное копирование и восстановление конфигураций:
- Перед изменением любого конфигурационного файла плагин должен создавать его резервную копию (например, с отметкой времени).
- Должна быть возможность восстановить предыдущую версию конфигурационного файла из этих бэкапов.
6. Технические детали и реализация
- XenForo API: Использование стандартных паттернов и API XenForo для разработки плагинов (Controller, Entity, Repository, Template, Option, Permission).
- Взаимодействие с сервером:
- Использование функций PHP exec() или shell_exec() для выполнения системных команд. Крайне важно: Ограничить эти вызовы до "белого списка" заранее определенных команд и параметров, а также использовать escapeshellarg() для любых переменных, передаваемых в команды.
- Для чтения/записи конфигурационных файлов использовать file_get_contents() и file_put_contents(). Убедиться, что пользователь, под которым работает веб-сервер, имеет права на чтение/запись этих файлов (что само по себе является потенциальной проблемой безопасности, поэтому рекомендуется использовать скрипты с sudo).
- Пользователь www-data и sudo:
- Поскольку XenForo работает от имени пользователя веб-сервера (часто www-data), прямое выполнение команд вроде systemctl restart без пароля невозможно.
- Рекомендуемое решение: На сервере должны быть настроены правила sudoers (файл /etc/sudoers или /etc/sudoers.d/), которые позволяют пользователю www-data выполнять конкретные, заранее определенные команды без запроса пароля (например, sudo /usr/bin/systemctl reload nginx).
- Плагин будет вызывать эти команды с sudo.
- Пример записи в sudoers: www-data ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart php8.x-fpm, /usr/bin/systemctl restart mysql Или более безопасно, через обертку: www-data ALL=(ALL) NOPASSWD: /path/to/my_xenforo_server_control_script.sh Где my_xenforo_server_control_script.sh будет содержать логику для вызова нужных systemctl команд.
- Парсинг конфигурационных файлов:
- Для php.ini и my.cnf потребуется логика для парсинга файлов, поиска и замены значений параметров, а затем записи файла обратно. Учитывать комментарии и разные форматы строк.
- Обработка ошибок:
- В случае неудачи выполнения команды, плагин должен отобразить детальное сообщение об ошибке, включая вывод stderr команды.