Domain

Конечно. Я полностью переработал инструкцию, разбив её на четкие последовательные шаги, и перевел пояснения на русский язык.

⚠️ ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ:
Перед началом редактирования обязательно сделайте резервную копию (бэкап) всех редактируемых файлов и базы данных. Ошибки в коде (даже пропущенная запятая) могут сломать панель.


Шаг 1: Подготовка и установка зависимостей

Зайдите в консоль вашего сервера, перейдите в папку с панелью Pterodactyl и выполните команду для установки Cloudflare SDK.

cd /var/www/pterodactyl
composer require cloudflare/sdk:dev-master

Шаг 2: Загрузка файлов

Загрузите папки из архива с аддоном (app, database, resources, vendor) в корневую папку вашей панели (/var/www/pterodactyl).

  • Если система спросит о замене файлов — подтвердите (перезапись/слияние).

Шаг 3: Настройка маршрутов (Routes)

3.1. Файл /routes/api-client.php

Откройте этот файл. Найдите строку:
Route::group(['prefix' => '/settings'], function () {

Вставьте ПРЕД этой строкой следующий код:

Route::group(['prefix' => '/subdomain'], function () {
    Route::get('/', 'Servers\SubdomainController@index');
    Route::post('/create', 'Servers\SubdomainController@create');
    Route::delete('/delete/{id}', 'Servers\SubdomainController@delete');
});

3.2. Файл /routes/admin.php

Откройте этот файл и прокрутите в самый низ. Вставьте в конце файла этот код:

/*
|----------------------------------------------------------------
| SubDomain Controller Routes
|--------------------------------------------------------------------------
|
| Endpoint: /admin/subdomain
|
*/
Route::group(['prefix' => 'subdomain'], function () {
    Route::get('/', 'SubDomainController@index')->name('admin.subdomain');
    Route::get('/new', 'SubDomainController@new')->name('admin.subdomain.new');
    Route::get('/edit/{id}', 'SubDomainController@edit')->name('admin.subdomain.edit');

    Route::post('/settings', 'SubDomainController@settings')->name('admin.subdomain.settings');
    Route::post('/create', 'SubDomainController@create')->name('admin.subdomain.create');
    Route::post('/update/{id}', 'SubDomainController@update')->name('admin.subdomain.update');

    Route::delete('/delete', 'SubDomainController@delete')->name('admin.subdomain.delete');
});

Шаг 4: Добавление кнопки в меню админа

Файл /resources/views/layouts/admin.blade.php

Найдите строку, содержащую: admin.nodes. Она выглядит примерно так:
<li class="{{ ! starts_with(Route::currentRouteName(), 'admin.nodes') ?: 'active' }}">

Вставьте ПРЕД ней этот блок:

<li class="{{ ! starts_with(Route::currentRouteName(), 'admin.subdomain') ?: 'active' }}">
    <a href="{{ route('admin.subdomain') }}">
        <i class="fa fa-globe"></i> <span>SubDomain Manager</span>
    </a>
</li>

Шаг 5: Настройка логики удаления (Backend)

Здесь нужно внести изменения в файл /app/Services/Servers/ServerDeletionService.php. Будьте внимательны.

5.1. Найдите строку: use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;
ПОД ней вставьте:

use Pterodactyl\Services\Servers\SubDomainDeletionService;

5.2. Найдите строку: private $databaseManagementService;
ПОД ней вставьте:

/**
 * $var \Pterodactyl\Services\Servers\SubDomainDeletionService
 */
private $subDomainDeletionService;

5.3. Найдите в конструкторе (public function __construct) строку: DaemonServerRepository $daemonServerRepository,
ПОД ней вставьте:

SubDomainDeletionService $subDomainDeletionService,

5.4. Чуть ниже в том же конструкторе найдите: $this->daemonServerRepository = $daemonServerRepository;
ПОД ней вставьте:

$this->subDomainDeletionService = $subDomainDeletionService;

5.5. Найдите строку (уже в методе handle или delete): $server->delete();
ПРЕД этой строкой вставьте:

$this->subDomainDeletionService->delete($server->id, $server->egg_id);

Шаг 6: Настройка прав доступа (Permissions)

Файл /app/Models/Permission.php

Найдите строку: 'websocket' => [
ПРЕД ней вставьте:

'subdomain' => [
    'description' => 'Manage Subdomain',
    'keys' => [
        'manage' => 'Create / Delete subdomain for current server.',
    ],
],

Шаг 7: Настройка Frontend (React)

Файл /resources/scripts/routers/ServerRouter.tsx

7.1. Найдите импорты вверху файла. Найдите строку:
import requireServerPermission from '@/hoc/requireServerPermission';
ПОД ней вставьте:

import SubdomainContainer from '@/components/server/subdomain/SubdomainContainer';

7.2. Найдите блок навигации. Ищите строку:
<Can action={[ 'settings.*', 'file.sftp' ]} matchAny>
ПРЕД ней вставьте:

<Can action={'subdomain.*'}>
    <NavLink to={`${match.url}/subdomain`}>Subdomain</NavLink>
</Can>

7.3. Найдите конец роутинга. Ищите строку: <Route path={'*'} component={NotFound}/>
ПРЕД ней вставьте:

<Route path={`${match.path}/subdomain`} exact>
    <RequireServerPermission permissions={'subdomain.*'}>
        <SubdomainContainer />
    </RequireServerPermission>
</Route>

Шаг 8: Завершение установки

Выполните следующие команды в терминале (в папке /var/www/pterodactyl), чтобы применить изменения базы данных и собрать обновленную панель:

yarn install
yarn run build:production
php artisan route:clear && php artisan cache:clear && php artisan view:clear
php artisan migrate

(При вопросе от команды migrate ответьте yes)


Шаг 9: Настройка Cloudflare и Панели

Теперь, когда аддон установлен, вам понадобятся данные от Cloudflare:

  1. Cloudflare Email: Почта вашего аккаунта Cloudflare.
  2. Cloudflare API Key: Ваш Global API Key (можно найти в профиле Cloudflare -> API Tokens).
  3. Домен: Добавьте ваш домен в Cloudflare.

В панели Pterodactyl:

  • Перейдите в настройки аддона (обычно появляется новая вкладка в админке). Введите туда полученные данные Cloudflare.
  • Важно: Убедитесь, что для каждой Ноды (Node) в настройках "Allocation" установлен IP Alias (псевдоним IP, например, доменное имя узла).

Хотите, я объясню, как найти Global API Key в Cloudflare, если вы не знаете где он находится?