Back up the panel before starting (or at least the files you're about to touch). Every step below runs from the root of your Pterodactyl Panel install (typically /var/www/pterodactyl).

1. Copy the new files

Everything inside panel/new-files/ goes exactly where it sits inside that folder, relative path and all:

  • app/Http/Controllers/Admin/Nodes/NodeTrashController.php
  • app/Http/Controllers/Api/Client/Servers/TrashController.php
  • app/Http/Controllers/Api/Remote/TrashSettingsController.php
  • app/Http/Requests/Admin/Node/NodeTrashFormRequest.php
  • app/Http/Requests/Api/Client/Servers/Trash/GetTrashRequest.php
  • app/Http/Requests/Api/Client/Servers/Trash/PurgeTrashRequest.php
  • app/Http/Requests/Api/Client/Servers/Trash/RestoreTrashRequest.php
  • app/Models/NodeTrashSetting.php
  • app/Services/Trash/WingsTrashClient.php
  • database/migrations/2026_10_01_000001_create_node_trash_settings_table.php
  • resources/scripts/api/server/trash/purgeTrashItems.ts
  • resources/scripts/api/server/trash/restoreTrashItems.ts
  • resources/scripts/api/swr/getServerTrash.ts
  • resources/scripts/components/server/trash/TrashContainer.tsx
  • resources/scripts/components/server/trash/TrashRow.tsx
  • resources/views/admin/nodes/view/trash.blade.php

2. Apply the fragments to existing files

Every file inside panel/injected-code/ maps to a file that already exists in your panel. The filename spells out the path (__ marks the final folder), and each block starts with a DESTINO: comment (the real file) and UBICACIÓN: (exactly where it goes), with "before" and "after" code so it's a straightforward replacement:

  • app_Models__Permission.php → app/Models/Permission.php
  • resources_scripts_components_server_files__FileManagerContainer.tsx → resources/scripts/components/server/files/FileManagerContainer.tsx
  • resources_scripts_components_server_files__FileObjectRow.tsx → resources/scripts/components/server/files/FileObjectRow.tsx
  • resources_views_admin_nodes_view__TABS.blade.php → resources/views/admin/nodes/view/TABS.blade.php
  • routes__admin.php → routes/admin.php
  • routes__api-client.php → routes/api-client.php
  • routes__api-remote.php → routes/api-remote.php

None of these fragments replace a whole file - they're small, targeted blocks to insert or swap inside a file that's already there.

3. Run the migration

php artisan migrate

This creates the node_trash_settings table, where each node's config (enabled/disabled and retention days) lives.

4. Rebuild the frontend

yarn install
yarn build:production

If the build fails with a memory error (JavaScript heap out of memory) on a low-RAM box, run it with a higher heap limit, leaning on available swap:

arduino
NODE_OPTIONS=--max-old-space-size=1600 yarn build:production

5. Clear caches

arduino
php artisan config:clear
php artisan route:clear

If PHP-FPM has opcache enabled, restart it so the new code actually loads:

systemctl restart php8.2-fpm

That's the panel side done. Move on to the Wings installation before testing anything - the panel alone doesn't move any files, Wings does.

Previous: Requirements · Next: Wings Installation