Panel Installation
Step 1: Copy the new files
The panel/ folder is laid out to match your panel's root folder by folder: app/ goes over your app/, database/ over your database/, resources/ over your resources/. Nothing needs to be renamed or rearranged.
Option A: drag and drop (recommended if you use FileZilla, WinSCP, or similar):
- Connect to your server/panel over SFTP.
- In the left panel (your computer) open
panel/.new- files/ - Drag the
appfolder from the left onto theappfolder on the right (your panel's root) and choose merge when the client asks what to do with folders that already exist (never "replace all"), it only needs to add new files inside subfolders you already have. - Repeat the same with
databaseandresources.
Option B: over SSH/terminal, if you prefer the command line:
cp -r panel/new-files/app/* /path/to/panel/app/
cp -r panel/new-files/database/* /path/to/panel/database/
cp -r panel/new-files/resources/* /path/to/panel/resources/
Files that get copied (28 in total, all of them new files, none overwrite an existing file in your panel):
app/Services/ Domains/ WingsProxyClient. php app/Services/ Domains/ DomainService. php app/Jobs/ Domains/ ApplyDomainProxy. php app/Jobs/ Domains/ RevokeDomainProxy. php app/Models/ Domain. php app/Models/ NodeProxySetting. php app/Transformers/ Api/ Client/ DomainTransformer. php app/Http/ Controllers/ Api/ Client/ Servers/ DomainController. php app/Http/ Controllers/ Admin/ Nodes/ NodeProxyController. php app/Http/ Requests/ Admin/ Node/ NodeProxyFormRequest. php app/Http/ Requests/ Api/ Client/ Servers/ Domains/ StoreDomainRequest. php app/Http/ Requests/ Api/ Client/ Servers/ Domains/ GetDomainsRequest. php app/Http/ Requests/ Api/ Client/ Servers/ Domains/ DeleteDomainRequest. php app/Http/ Requests/ Api/ Client/ Servers/ Domains/ VerifyDomainRequest. php database/migrations/ 2025_ 05_ 04_ 000001_ create_ server_ domains_ table. php database/migrations/ 2025_ 05_ 04_ 000002_ create_ node_ proxy_ settings_ table. php database/migrations/ 2026_ 05_ 29_ 000001_ fix_ server_ domains_ unique_ index. php database/migrations/ 2026_ 09_ 16_ 000001_ add_ custom_ ssl_ and_ allocation_ to_ server_ domains. php database/migrations/ 2026_ 09_ 17_ 000001_ add_ verification_ to_ server_ domains. php database/migrations/ 2026_ 09_ 18_ 000001_ add_ show_ conf_ path_ to_ node_ proxy_ settings. php resources/scripts/ components/ server/ domains/ DomainsContainer. tsx resources/scripts/ components/ server/ domains/ AddDomainModal. tsx resources/scripts/ components/ server/ domains/ DomainRow. tsx resources/scripts/ api/ swr/ getServerDomains. ts resources/scripts/ api/ server/ domains/ createServerDomain. ts resources/scripts/ api/ server/ domains/ deleteServerDomain. ts resources/scripts/ api/ server/ domains/ verifyServerDomain. ts resources/views/ admin/ nodes/ view/ proxy. blade. php
Step 2: Apply the 6 injected fragments
This part isn't dragged over: these are files that already exist in your panel, and you need to open them with a text editor (or your panel/hPanel/whatever file editor you use) to paste a block of code at the exact spot. Every file in panel/ starts with a DESTINO:/UBICACIÓN: comment that tells you which file and where exactly it goes. Summary:
| Fragment | Target file | Where |
|---|---|---|
routes_ | routes/ | inside the / group, right before the / group |
routes_ | routes/ | inside the prefix('nodes') group, alongside the other GET/POST routes of / |
app_ | app/ | constants alongside the other ACTION_ ones, and the 'domain' => [. entry as the last key of the $permissions array |
app_ | app/ | alongside the other relations (after allocations()); no extra use needed |
resources_ | resources/ | import of the DomainsContainer component + entry in the server. array, after Backups |
resources_ | the 5 blades in admin/ (index., settings., configuration., allocation., servers.) | as the last <li> of the <ul class="nav nav- |
Step 3: Migrate the database
cd /path/to/panel
php artisan migrate
This creates the server_ and node_ tables, applies the fix for the unique index (2026_), adds the custom certificate and allocation columns (2026_), and adds the domain verification column and state (2026_).
Don't skip the fix migration. Without it, deleting a domain and creating it again (even on a different server) can collide with the table's
UNIQUE(domain)constraint and throw a duplicate error. See Troubleshooting.
Step 4: Regenerate Composer's autoloader
composer dump-autoload -o
If your panel was installed with the optimized autoloader (composer install -, the recommended mode for production), Laravel builds a fixed class → file map on install. That map doesn't automatically pick up the new classes you just copied: if you skip this step, VerifyDomainRequest and friends throw "Class not found" the moment something tries to use them, even though the file is in the right place. If your panel doesn't use the optimized autoloader you can skip this step, but running it anyway doesn't break anything.
Step 5: Build the frontend
yarn install
yarn run build:production
On a server with little RAM (under 1-2 GB free) the build can fail with an out-of-memory error before finishing. If that happens, run:
NODE_OPTIONS="--max-old-space-size=2048" yarn run build:production
Step 6: Clear caches and restart the queue
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan queue:restart
If you use supervisor or systemd for queue:work, confirm the process restarts on its own (Restart=always or equivalent). queue:restart only tells the worker to finish its current cycle, it doesn't bring it back up by itself.
Verification
- Go to any server in the panel → the Proxy tab should show up.
- Go to Admin → Nodes → (a node) → Proxy → the configuration view should load with no 404 or 500 error.
Next: Installation: Wings →

