Naar de inhoud
Actuele kortingscode:10% kortingGebruiken bij je bestelling

Pterodactyl Panel: volledige installatie op je eigen VPS

Je installeert Pterodactyl Panel op Ubuntu 24.04 of Debian 13: PHP 8.3, MariaDB, Redis, Nginx met HTTPS, de wachtrij, cron en de eerste beheerder. Elke stap en elke keuze wordt uitgelegd.

  • expert
  • ~90 min
  • Bijgewerkt op 2-10-2026

We installeren Pterodactyl Panel, een webinterface voor het beheren van gameservers, op je VPS. Aan het eind draait het op het adres https://panel.example.cz met een Let's Encrypt-certificaat, een takenwachtrij, cron en je beheerdersaccount.

Wat je nodig hebt

  • Een VPS bij StormHost met een schone installatie van Ubuntu 24.04 of Debian 13
  • Een domein of subdomein voor het panel (in deze handleiding panel.example.cz) en toegang tot de DNS-instellingen ervan
  • Een SSH-verbinding als root (handleiding)
  • Basiskennis van de terminal: bestanden bewerken in de editor nano, commando's kopiëren
  • Ongeveer 90 minuten

Hoe het werkt#

Pterodactyl bestaat uit twee delen. Het Panel is een webapplicatie (PHP, framework Laravel) waarin je gebruikers en servers aanmaakt en waarin spelers de console bedienen. Wings is de service die de gameservers op de server daadwerkelijk start, in Docker-containers. Het Panel en Wings kunnen op dezelfde VPS draaien. Deze handleiding installeert het Panel; Wings voeg je toe in de vervolghandleiding Pterodactyl Wings.

Het Panel heeft nog een aantal andere programma's nodig:

OnderdeelWaarvoor het Panel het nodig heeft
PHP 8.3 + PHP-FPMHet Panel is geschreven in PHP. PHP-FPM is het proces dat de PHP-code uitvoert voor de webserver.
MariaDBDe database. Slaat gebruikers, servers, instellingen en gamesjablonen op.
RedisSnelle opslag in het geheugen voor de cache, inlogsessies (session) en de takenwachtrij.
NginxDe webserver. Ontvangt verzoeken van de browser en geeft ze door aan PHP-FPM.
ComposerDe beheerder van PHP-bibliotheken. Downloadt de bibliotheken die het Panel nodig heeft.
Cron en de service pteroqCron start elke minuut de planner van het Panel, pteroq verwerkt de takenwachtrij op de achtergrond (e-mails, geplande taken van servers).

Het Panel zelf vraagt weinig. Draaien op dezelfde VPS ook gameservers, plan het RAM dan vooral op basis daarvan en tel er een reserve bij op voor het systeem, de database en het Panel (ruwweg 1–⁠2 GB).

Heb je echt een eigen panel nodig?

Pterodactyl loont als je op één VPS meerdere gameservers wilt draaien, ze via het web wilt beheren en andere mensen toegang wilt geven. Heb je genoeg aan één gameserver, dan kun je die rechtstreeks als gameserver bestellen en in je klantaccount beheren zonder iets te installeren.

Installatieplan#

FaseWat je doet
1. DomeinJe laat panel.example.cz naar het IP-adres van de VPS verwijzen.
2. FirewallJe opent poort 80 en 443.
3. AfhankelijkhedenJe installeert PHP 8.3, MariaDB, Redis, Nginx en Composer.
4. PanelJe downloadt de bestanden van het Panel, maakt de database aan en stelt .env in.
5. Database en beheerderJe maakt de tabellen en de eerste beheerder aan.
6. AchtergrondJe stelt cron en de wachtrijservice pteroq in.
7. HTTPS en NginxJe vraagt een certificaat aan en stelt de webserver in.
8. ControleJe logt in en controleert of alles draait.

Domein en DNS#

Het Panel heeft een eigen domein of subdomein nodig. Een certificaat voor HTTPS wordt uitgegeven voor een domein, niet voor een IP-adres.

  1. Open in je klantaccount Mijn diensten, klik op de VPS en kopieer op het tabblad Netwerk het IPv4-⁠adres (en eventueel het IPv6-⁠adres).

  2. Maak bij je DNS-provider een record van het type A aan voor panel.example.cz met als waarde het IPv4-⁠adres van de VPS (bijvoorbeeld 203.0.113.10).

  3. Maak eventueel ook een AAAA-record aan met het IPv6-⁠adres van de VPS (bijvoorbeeld 2001:db8::10). De Nginx-configuratie hieronder luistert ook op IPv6.

  4. Controleer op de VPS of het domein al goed verwijst:

    bash
    getent hosts panel.example.cz
    • getent hosts – vraagt de DNS van het systeem naar het adres van het domein en toont het.

    Je ziet een regel met het IP-adres van je VPS. Verschijnt er niets, wacht dan een paar minuten (afhankelijk van de TTL van het record) en probeer het opnieuw.

Cloudflare: tijdens de installatie alleen het grijze wolkje

Beheer je het domein in Cloudflare, laat het record dan op DNS only staan (grijs wolkje). Zo controleer je het certificaat en de eerste keer inloggen rechtstreeks. Naar Proxied (oranje wolkje) kun je pas aan het eind overschakelen, zie Het Panel achter Cloudflare. De stappen met Cloudflare: Een domein op een VPS en Cloudflare.

Firewall#

De browser maakt verbinding met het Panel op poort 443 (HTTPS). Poort 80 (HTTP) is nodig voor de domeincontrole bij het uitgeven van het certificaat en voor de doorverwijzing naar HTTPS.

  • Firewall in je klantaccount: staat het inkomende verkeer in de modus Alles blokkeren behalve wat is toegestaan, voeg dan de regels Inkomend · Toestaan · TCP · poort 80,443 toe. De regel voor SSH (poort 22) moet blijven staan. Handleiding: Firewall in je klantaccount.

  • UFW op de VPS: gebruik je UFW, sta de poorten dan ook daar toe:

    bash
    ufw allow 80/tcp
    ufw allow 443/tcp
    • ufw allow 80/tcp – staat inkomende TCP-verbindingen op poort 80 toe.
    • ufw allow 443/tcp – hetzelfde voor poort 443.

De poorten voor Wings (8080 en 2022) en voor gameservers open je pas in de handleiding Pterodactyl Wings.

Afhankelijkheden installeren#

Werk eerst het systeem bij, zodat je op een actuele basis installeert:

bash
apt update && apt -y upgrade
  • apt update – haalt de actuele pakketlijst op.
  • apt -y upgrade – installeert de beschikbare updates; -y antwoordt “ja” op de bevestiging.

Installeer daarna de afhankelijkheden. De stappen verschillen per systeem: Ubuntu 24.04 heeft PHP 8.3 rechtstreeks in de repository, Debian 13 heeft in de standaardrepository PHP 8.4, dat het Panel niet ondersteunt (het huidige Panel vereist PHP 8.2 of 8.3). Op Debian voeg je daarom de repository packages.sury.org toe, die ook de officiële documentatie van Pterodactyl aanbeveelt.

Ubuntu 24.04

bash
apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-server curl

Voeg op Ubuntu 24.04 geen repository voor PHP toe. De officiële documentatie noemt de repository ppa:ondrej/php alleen voor het oudere Ubuntu 22.04.

Debian 13

Voeg eerst de repository met PHP 8.3 toe:

bash
apt -y install lsb-release ca-certificates curl
curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb
echo "deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update
  • apt -y install lsb-release ca-certificates curl – een hulpprogramma om de naam van de systeemversie op te vragen, certificaten voor HTTPS en het downloadprogramma curl.
  • curl -sSLo … debsuryorg-archive-keyring.deb – downloadt het pakket met de ondertekeningssleutel van de repository (-s stil, -S fouten tonen, -L doorverwijzingen volgen, -o opslaan in een bestand).
  • dpkg -i … – installeert de sleutel in /usr/share/keyrings/; apt controleert daarmee de pakketten uit de repository.
  • echo "deb …" > /etc/apt/sources.list.d/php.list – schrijft het adres van de repository weg. $(lsb_release -sc) wordt vervangen door de codenaam van het systeem (trixie).
  • apt update – laadt de pakketten uit de nieuwe repository.

Installeer daarna de afhankelijkheden:

bash
apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-server

Installeer MariaDB en Redis op Debian 13 uit de standaardrepository; ze hebben geen extra repository nodig.

Wat het installatiecommando bevat:

PakketWaarvoor het dient
php8.3, php8.3-cliPHP 8.3 en de bijbehorende opdrachtregel (voor de commando's php artisan).
php8.3-fpmHet proces waarmee Nginx PHP uitvoert. Luistert op de socket /run/php/php8.3-fpm.sock.
php8.3-common, -gd, -mysql, -mbstring, -bcmath, -xml, -curl, -zipPHP-extensies die het Panel vereist: afbeeldingen, de verbinding met MariaDB, werken met tekst in UTF-⁠8, nauwkeurige wiskunde, XML, HTTP-verzoeken en ZIP-archieven. De notatie php8.3-{common,cli,…} is een afkorting van de shell bash en wordt uitgeschreven tot php8.3-common php8.3-cli ….
mariadb-serverDe databaseserver.
nginxDe webserver.
redis-serverRedis.
tar, unzip, git, curlArchieven uitpakken en downloaden; Composer gebruikt ze bij het installeren van bibliotheken.

Controleer of je de juiste PHP-versie hebt:

bash
php -v
Uitvoertext
PHP 8.3.x (cli) …

Op de eerste regel moet PHP 8.3 staan. Zie je PHP 8.4, kijk dan in het onderdeel Als iets niet werkt.

Controleer of de services draaien:

bash
systemctl is-active mariadb redis-server nginx php8.3-fpm
  • systemctl is-active – toont de status van elke genoemde service.

Je ziet vier keer active. Is er één inactive, start die dan en schakel hem in bij het opstarten met het commando systemctl enable --now <SERVICE_NAME>, bijvoorbeeld systemctl enable --now redis-server.

Composer#

Composer downloadt de PHP-bibliotheken van het Panel. Installeer het met de officiële installer:

bash
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
  • curl -sS https://getcomposer.org/installer – downloadt het installatiescript van Composer.
  • | php -- – geeft het script door aan PHP om het uit te voeren; -- scheidt de parameters van PHP van die van de installer.
  • --install-dir=/usr/local/bin – waar Composer wordt geïnstalleerd (een map waarin het systeem naar programma's zoekt).
  • --filename=composer – de naam van het programma, zodat je het daarna start met het commando composer.

Controle: composer --version toont Composer version 2.…. Als root zie je ook de waarschuwing Do not run Composer as root/super user! en mogelijk de vraag Continue as root/super user [yes]?. Bevestig die met de toets Enter. Bij de installatie van het Panel hieronder onderdrukt de variabele COMPOSER_ALLOW_SUPERUSER=1 de waarschuwing.

Het Panel downloaden#

  1. Maak een map voor het Panel aan en ga ernaartoe:

    bash
    mkdir -p /var/www/pterodactyl
    cd /var/www/pterodactyl
    • mkdir -p – maakt de map aan (inclusief de bovenliggende mappen); bestaat hij al, dan volgt er geen foutmelding.
    • cd – gaat naar de map. Voer alle volgende commando's met php artisan daarin uit.
  2. Download de nieuwste versie van het Panel en pak die uit:

    bash
    curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
    tar -xzvf panel.tar.gz
    • curl -Lo panel.tar.gz … – downloadt het archief van de nieuwste release van GitHub en slaat het op als panel.tar.gz.
    • tar -xzvf – pakt het archief uit (x uitpakken, z gzip-formaat, v bestanden tonen, f uit een bestand).
  3. Stel de rechten in van de mappen waarin het Panel schrijft:

    bash
    chmod -R 755 storage/* bootstrap/cache/
    • chmod -R 755 – de eigenaar mag lezen, schrijven en de mappen openen, anderen mogen alleen lezen en de mappen openen. -R geldt voor de hele inhoud.
    • storage/ – logs, cache en geüploade bestanden; bootstrap/cache/ – de gecompileerde configuratie.

Een database voor het Panel#

Het Panel heeft een eigen database en een eigen gebruiker nodig. De databasegebruiker root verbieden de makers van Pterodactyl uitdrukkelijk voor het Panel: als iemand het Panel zou kraken, kreeg hij toegang tot alle databases op de VPS.

  1. Genereer een sterk wachtwoord voor de databasegebruiker, bijvoorbeeld met de wachtwoordgenerator. Gebruik alleen letters en cijfers (minstens 24 tekens), zodat je je niet druk hoeft te maken over speciale tekens in SQL en in .env. Bewaar het wachtwoord, je moet het zo meteen opnieuw invullen.

  2. Log in op MariaDB als beheerder:

    bash
    mariadb
    • mariadb – de client van de database. De gebruiker root van het systeem logt op zowel Ubuntu als Debian zonder wachtwoord in op MariaDB (via verificatie met de unix socket). Je ziet de prompt MariaDB [(none)]>.
  3. Maak de gebruiker en de database aan. Vervang <PANEL_DB_PASSWORD> door het wachtwoord uit stap 1 (laat de enkele aanhalingstekens rond het wachtwoord staan):

    SQL
    CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY '<PANEL_DB_PASSWORD>';
    CREATE DATABASE panel;
    GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1';
    exit
RegelWat hij doet
CREATE USER 'pterodactyl'@'127.0.0.1' …Maakt de gebruiker pterodactyl aan, die alleen mag inloggen vanaf het adres 127.0.0.1, dus alleen vanaf deze VPS via TCP. Van buitenaf kun je met dit account geen verbinding maken.
IDENTIFIED BY '…'Stelt het wachtwoord van de gebruiker in.
CREATE DATABASE panel;Maakt de lege database panel aan.
GRANT ALL PRIVILEGES ON panel.* …Geeft de gebruiker alle rechten, maar alleen op de database panel (panel.* = alle tabellen daarin). Tot andere databases heeft hij geen toegang.
exitSluit de client van MariaDB af.

Waarom 127.0.0.1 en niet localhost

Het Panel maakt via TCP verbinding met de database op het adres 127.0.0.1. De makers van Pterodactyl raden uitdrukkelijk af om localhost in te vullen, omdat PHP daarmee een verbinding via de socket probeert en dat problemen geeft. De gebruiker in de database moet daarom de host 127.0.0.1 hebben.

De omgeving configureren (.env)#

De instellingen van het Panel staan in het bestand /var/www/pterodactyl/.env. Je maakt het aan op basis van een voorbeeldbestand, installeert de bibliotheken en genereert de versleutelingssleutel.

  1. Kopieer het voorbeeldbestand:

    bash
    cp .env.example .env
  2. Installeer de PHP-bibliotheken van het Panel:

    bash
    COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
    • COMPOSER_ALLOW_SUPERUSER=1 – staat toe dat Composer zonder vraag als root wordt uitgevoerd.
    • composer install – downloadt de bibliotheken in precies de versies die het Panel voorschrijft (het bestand composer.lock).
    • --no-dev – slaat hulpmiddelen voor ontwikkelaars over, die heb je op een productieserver niet nodig.
    • --optimize-autoloader – zorgt ervoor dat PHP-klassen sneller worden geladen.

    De installatie duurt enkele minuten en eindigt zonder foutmeldingen (een gele waarschuwing over verouderde pakketten is geen probleem).

  3. Genereer de versleutelingssleutel:

    bash
    php artisan key:generate --force
    • php artisan – het hulpprogramma van het Panel voor beheer vanaf de opdrachtregel.
    • key:generate – maakt een willekeurige sleutel APP_KEY aan en schrijft die naar .env.
    • --force – voert het commando uit zonder bevestiging (het Panel draait in productiemodus, waarin het anders om bevestiging vraagt).

Maak nu meteen een back-up van APP_KEY

Met de sleutel APP_KEY versleutelt het Panel gevoelige gegevens in de database (bijvoorbeeld API-sleutels en wachtwoorden van databasehosts). Raak je hem kwijt, dan kun je de gegevens niet meer ontsleutelen, ook niet vanuit een back-up van de database. Voer het commando key:generate alleen bij de eerste installatie uit. Op een Panel dat al gegevens bevat, zou een nieuwe sleutel betekenen dat je de toegang tot die gegevens verliest.

  1. Toon de sleutel en bewaar de hele regel buiten de server (in een wachtwoordmanager of in een versleuteld bestand op je computer):

    bash
    grep APP_KEY /var/www/pterodactyl/.env
    Uitvoertext
    APP_KEY=base64:…

De wizard p:environment:setup#

De basisinstellingen regelt een wizard. Start hem:

bash
php artisan p:environment:setup

Hij vraagt achtereenvolgens het volgende (de standaardwaarde staat tussen vierkante haken, je bevestigt die met de toets Enter):

VraagWat je invultWaarom
E-mailadres van de auteur (… Author Email)Je e-mailadres, bijvoorbeeld [email protected]Wordt vermeld als auteur van de gamesjablonen die je uit het Panel exporteert. Het moet een geldig e-mailformaat zijn, anders stopt de wizard met een fout.
Application URLhttps://panel.example.czHet adres van het Panel inclusief https://. Wordt gebruikt in links in e-mails en bij het genereren van adressen. Zonder https:// verwijzen de links verkeerd.
Application TimezoneEurope/PragueDe tijdzone voor de weergave van tijden en voor geplande taken.
Cache DriverredisWaar de cache wordt opgeslagen. Redis is het snelst en wordt aanbevolen.
Session DriverredisWaar de inlogsessies van gebruikers worden opgeslagen.
Queue DriverredisWaar de takenwachtrij voor de service pteroq wordt opgeslagen.
Enable UI based settings editor?yesEen deel van de instellingen (naam van het Panel, e-mail, reCAPTCHA) kun je dan in het beheergedeelte wijzigen, niet alleen in .env.
Enable sending anonymous telemetry data?naar eigen keuzeHet Panel stuurt één keer per dag anonieme statistieken naar de makers (aantal servers, systeemversie). Wil je dat niet, antwoord dan no.
Redis Host127.0.0.1Redis draait op dezelfde VPS.
Redis Passwordniets, alleen EnterEen lokale Redis heeft na de installatie geen wachtwoord en luistert alleen op 127.0.0.1.
Redis Port6379De standaardpoort van Redis.

Vul je een adres in dat begint met https://, dan schakelt de wizard zelf veilige cookies in (SESSION_SECURE_COOKIE=true).

De wizard p:environment:database#

bash
php artisan p:environment:database
VraagWat je invultWaarom
Database Host127.0.0.1De database draait op dezelfde VPS. Vul geen localhost in (zie hierboven).
Database Port3306De standaardpoort van MariaDB.
Database NamepanelDe database uit het vorige hoofdstuk.
Database UsernamepterodactylDe gebruiker uit het vorige hoofdstuk.
Database Passwordhet wachtwoord <PANEL_DB_PASSWORD>Wordt tijdens het typen niet getoond.

De wizard probeert meteen verbinding te maken. Kloppen de gegevens niet, dan toont hij Unable to connect to the MySQL server…, slaat hij niets op en vraagt hij of je het opnieuw wilt proberen.

De wizard p:environment:mail#

Het Panel verstuurt e-mails (uitnodigingen voor nieuwe gebruikers, wachtwoordherstel). Zonder ingestelde e-mail werkt het Panel wel, alleen worden deze e-mails niet verstuurd. Je kunt dit ook later instellen, met hetzelfde commando:

bash
php artisan p:environment:mail
VraagWat je invultWaarom
Which driver should be used for sending emails?smtpVerzenden via de SMTP-server van je e-mailprovider is het betrouwbaarst.
SMTP Hosthet adres van de SMTP-server, bijvoorbeeld smtp.example.czJe vindt het in de helppagina's van je e-mailprovider.
SMTP Port587 (of 465)587 wordt gebruikt met TLS-versleuteling (STARTTLS), 465 met SSL-versleuteling.
SMTP Usernamehet volledige e-mailadres van de mailboxDe inlognaam van de mailbox.
SMTP Passwordhet wachtwoord van de mailboxSommige diensten vereisen een apart “app-wachtwoord”.
Encryption method to usetls voor poort 587, ssl voor 465Moet bij de poort passen, anders komt de verbinding niet tot stand.
Email address emails should originate frombijvoorbeeld [email protected]Het adres van de afzender. Het hoort bij het domein van de mailbox te horen, anders belanden de berichten in de spam.
Name that emails should appear frombijvoorbeeld GamepanelDe naam van de afzender in de e-mail.

Belangrijke sleutels in .env#

De wizards schrijven deze waarden naar .env. Je kunt het bestand ook handmatig bewerken (nano /var/www/pterodactyl/.env); voer na een handmatige wijziging php artisan config:clear uit.

InstellingWat het doetAanbevolen waardeWanneer wijzigen
APP_URLHet openbare adres van het Panel.https://panel.example.czBij een wijziging van het domein (en dan ook in Nginx en het certificaat).
APP_KEYDe versleutelingssleutel van de gegevens in de database.gegenereerd, nooit wijzigenNooit. Zet bij herstel vanuit een back-up de oorspronkelijke sleutel terug.
APP_TIMEZONEDe tijdzone van het Panel.Europe/PragueAls de beheerders in een andere tijdzone zitten.
APP_ENVIRONMENT_ONLYtrue = instellingen alleen in .env, false = ook in het beheergedeelte.falseAls je wijzigingen van instellingen via het web wilt verbieden.
DB_HOST, DB_PORTWaar de database van het Panel draait.127.0.0.1, 3306Als je de database naar een andere plek verhuist.
DB_DATABASE, DB_USERNAME, DB_PASSWORDDe database en de inloggegevens van het Panel.panel, pterodactyl, een sterk wachtwoordBij een wijziging van het wachtwoord van de gebruiker in MariaDB.
REDIS_HOST, REDIS_PASSWORD, REDIS_PORTDe verbinding met Redis.127.0.0.1, null, 6379Als je voor Redis een wachtwoord instelt.
CACHE_DRIVER, SESSION_DRIVER, QUEUE_CONNECTIONWaar de cache, de inlogsessies en de wachtrij worden opgeslagen.redisVrijwel nooit.
SESSION_SECURE_COOKIEInlogcookies worden alleen via HTTPS verstuurd.trueNooit, zolang het Panel op HTTPS draait.
MAIL_*Het verzenden van e-mails (server, poort, versleuteling, afzender).afhankelijk van de providerBij een wijziging van de mailbox.
MAIL_EHLO_DOMAINDe naam waarmee het Panel zich bij de SMTP-server meldt.panel.example.czAls bijvoorbeeld Gmail je e-mails weigert vanwege localhost.
TRUSTED_PROXIESDe adressen van proxy's die het Panel vertrouwt (Cloudflare, een andere Nginx).niet ingevuldAls het Panel achter een proxy draait, zie Het Panel achter Cloudflare.
PTERODACTYL_TELEMETRY_ENABLEDHet verzenden van anonieme telemetrie.naar eigen keuzefalse schakelt de telemetrie uit.

Databasetabellen en de eerste beheerder#

  1. Maak de tabellen aan en laad de standaardgegevens:

    bash
    php artisan migrate --seed --force
    • migrate – maakt in de database panel alle tabellen aan.
    • --seed – vult ze met standaardgegevens, waaronder gamesjablonen (Minecraft, Rust en andere).
    • --force – voert het commando in productiemodus uit zonder bevestiging.

    Het commando kan enkele minuten duren. Onderbreek het niet, anders blijft de database half aangemaakt achter.

  2. Maak het beheerdersaccount aan:

    bash
    php artisan p:user:make
VraagWat je invult
Is this user an administrator?yes – het account krijgt toegang tot het beheergedeelte.
Email AddressJe e-mailadres; je gebruikt het om in te loggen en je wachtwoord te herstellen.
UsernameDe inlognaam, bijvoorbeeld jan.
First Name, Last NameVoornaam en achternaam (wordt in het Panel getoond).
PasswordMinstens 8 tekens, minstens één hoofdletter en één cijfer. Wordt tijdens het typen niet getoond.

Aan het eind zie je een tabel met de gegevens van het account en de regel Admin | Yes.

Bestandsrechten#

De bestanden van het Panel zijn nu van de gebruiker root. De webserver draait als de gebruiker www-data en moet in de mappen storage en bootstrap/cache kunnen schrijven:

bash
chown -R www-data:www-data /var/www/pterodactyl/*
  • chown -R – wijzigt de eigenaar van de bestanden en van de hele inhoud van de mappen.
  • www-data:www-data – de gebruiker en de groep waaronder Nginx en PHP-FPM op Ubuntu en Debian draaien.

Na elk artisan-commando als root

Commando's met php artisan die je als root uitvoert, kunnen bestanden aanmaken (bijvoorbeeld logs) die www-data daarna niet mag overschrijven. Zie je na werk in de terminal een fout 500, voer dan het commando chown hierboven opnieuw uit.

Cron en de takenwachtrij#

Cron#

Cron start de planner van het Panel elke minuut (oude inlogsessies opruimen, geplande taken van servers).

  1. Open de crontab van de gebruiker root:

    bash
    crontab -e

    Bij de eerste keer vraagt het om een editor. Kies nano (typ het nummer ervan en druk op Enter). Meldt het systeem crontab: command not found, dan ontbreekt cron. Installeer het met het commando apt -y install cron en herhaal de stap.

  2. Plak aan het eind van het bestand deze regel:

    text
    * * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
  3. Sla op (Ctrl+O, Enter) en sluit de editor (Ctrl+X). Je ziet crontab: installing new crontab.

Deel van de regelBetekenis
* * * * *Minuut, uur, dag van de maand, maand, dag van de week. Vijf sterretjes = elke minuut.
php /var/www/pterodactyl/artisan schedule:runStart de planner van het Panel; die bepaalt zelf welke taken aan de beurt zijn.
>> /dev/null 2>&1Gooit de uitvoer en de fouten weg, zodat cron niet elke minuut een e-mail stuurt.

De wachtrijservice pteroq#

De wachtrij verwerkt werk op de achtergrond: het verzenden van e-mails en de taken die gebruikers bij hun servers inplannen (het onderdeel Schedules, bijvoorbeeld een nachtelijke herstart of back-up). Zonder de wachtrij worden e-mails niet verstuurd en worden geplande taken niet uitgevoerd.

  1. Maak het servicebestand aan:

    bash
    nano /etc/systemd/system/pteroq.service
  2. Plak de inhoud:

    /etc/systemd/system/pteroq.serviceini
    # Pterodactyl Queue Worker File
    [Unit]
    Description=Pterodactyl Queue Worker
    After=redis-server.service
    
    [Service]
    User=www-data
    Group=www-data
    Restart=always
    ExecStart=/usr/bin/php /var/www/pterodactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3
    StartLimitInterval=180
    StartLimitBurst=30
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Sla op en sluit de editor.

RegelWat hij doet
Description=De beschrijving van de service die je in de uitvoer van systemctl status ziet.
After=redis-server.serviceDe service start pas na Redis, waaruit hij de wachtrij leest.
User=www-data, Group=www-dataDe wachtrij draait onder dezelfde gebruiker als de website, zodat beide dezelfde rechten op de bestanden hebben.
Restart=alwaysStopt het proces (door een fout of normaal), dan start systemd het opnieuw.
ExecStart=… queue:workStart de verwerking van de wachtrij. --queue=high,standard,low bepaalt de volgorde van de wachtrijen op prioriteit, --sleep=3 = bij een lege wachtrij 3 seconden wachten, --tries=3 = een mislukte taak hoogstens drie keer proberen.
StartLimitInterval=180, StartLimitBurst=30Crasht de service vaker dan 30 keer in 180 seconden, dan stopt systemd met herstarten (bescherming tegen een eindeloze lus).
RestartSec=5sWacht 5 seconden vóór de herstart.
WantedBy=multi-user.targetDe service start bij elke start van de VPS (na enable).
  1. Schakel Redis en de wachtrij in bij het opstarten en start ze meteen:

    bash
    systemctl enable --now redis-server
    systemctl enable --now pteroq.service
    • enable – schakelt automatisch starten na een herstart van de VPS in.
    • --now – start de service bovendien meteen.
  2. Controleer de status:

    bash
    systemctl status pteroq

    Je ziet Active: active (running). Sluit de uitvoer met de toets q.

Het Let's Encrypt-certificaat#

De Nginx-configuratie hieronder verwijst naar de bestanden van het certificaat. Nginx start daarmee niet zolang het certificaat niet bestaat; daarom vraag je het certificaat als eerste aan.

  1. Installeer Certbot en de bijbehorende plugin voor Nginx:

    bash
    apt -y install certbot python3-certbot-nginx
    • certbot – het programma dat Let's Encrypt-certificaten aanvraagt en verlengt.
    • python3-certbot-nginx – een plugin die het domein controleert via de draaiende Nginx, zonder die uit te schakelen.
  2. Vraag het certificaat aan. Vervang panel.example.cz door je eigen domein:

    bash
    certbot certonly --nginx -d panel.example.cz
    • certonly – vraagt alleen het certificaat aan en slaat het op; de configuratie van Nginx past het niet aan (die schrijf je zelf).
    • --nginx – de domeincontrole verloopt via Nginx op poort 80.
    • -d panel.example.cz – het domein waarvoor je het certificaat wilt.
  3. Beantwoord bij de eerste keer de vragen:

    • E-mailadres (Enter email address…) – vul je e-mailadres in. Let's Encrypt stuurt daar belangrijke meldingen over het account naartoe. Waarschuwingen over het verlopen van een certificaat stuurt het sinds 2025 niet meer; de verlenging wordt daarom automatisch bewaakt (zie stap 5).
    • Servicevoorwaarden (Please read the Terms of Service… Do you agree?) – antwoord Y, zonder akkoord krijg je geen certificaat.
    • Je e-mailadres delen met de EFF (Would you be willing… to share your email address with the Electronic Frontier Foundation…) – naar eigen keuze, het heeft geen invloed op de uitgifte van het certificaat.

    Aan het eind zie je Successfully received certificate. en de paden naar de bestanden:

    Uitvoertext
    Certificate is saved at: /etc/letsencrypt/live/panel.example.cz/fullchain.pem
    Key is saved at:         /etc/letsencrypt/live/panel.example.cz/privkey.pem
  4. Zorg ervoor dat Nginx na elke verlenging van het certificaat het nieuwe laadt. Maak een zogeheten deploy hook aan (een script dat Certbot na een geslaagde verlenging uitvoert):

    bash
    cat > /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh <<'EOF'
    #!/bin/sh
    systemctl reload nginx
    EOF
    chmod 755 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
    • cat > … <<'EOF' … EOF – schrijft de regels tussen <<'EOF' en EOF naar het bestand.
    • systemctl reload nginx – laadt de nieuwe configuratie en de certificaten zonder verbindingen te verbreken.
    • chmod 755 – maakt het script uitvoerbaar; Certbot voert in de map renewal-hooks/deploy alleen uitvoerbare bestanden uit.
  5. Controleer of de automatische verlenging werkt. Het pakket van Certbot bevat op zowel Ubuntu als Debian een timer die de verlenging twee keer per dag probeert:

    bash
    systemctl list-timers | grep certbot
    certbot renew --dry-run
    • systemctl list-timers – toont de geplande timers; daartussen hoort certbot.timer te staan.
    • certbot renew --dry-run – test de verlenging tegen de testserver van Let's Encrypt; het echte certificaat verandert niet.

    De test eindigt met de melding Congratulations, all simulated renewals succeeded.

Het certificaat is 90 dagen geldig (stand oktober 2026; Let's Encrypt verkort de geldigheid geleidelijk). Certbot verlengt het zelf wanneer er nog ongeveer een derde van de geldigheid over is.

Nginx#

  1. Schakel de standaardwebsite van Nginx uit:

    bash
    rm /etc/nginx/sites-enabled/default
    • Verwijdert alleen de link in sites-enabled, het bestand zelf in sites-available blijft staan. Anders zou de standaardwebsite poort 80 bedienen in plaats van het Panel.
  2. Maak de configuratie van het Panel aan:

    bash
    nano /etc/nginx/sites-available/pterodactyl.conf
  3. Plak de inhoud en vervang alle vier de vermeldingen van panel.example.cz door je eigen domein:

    /etc/nginx/sites-available/pterodactyl.confnginx
    server {
        listen 80;
        listen [::]:80;
        server_name panel.example.cz;
        return 301 https://$server_name$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name panel.example.cz;
        server_tokens off;
    
        root /var/www/pterodactyl/public;
        index index.php;
    
        access_log /var/log/nginx/pterodactyl.app-access.log;
        error_log  /var/log/nginx/pterodactyl.app-error.log error;
    
        # grotere uploads en een langere looptijd van scripts
        client_max_body_size 100m;
        client_body_timeout 120s;
    
        sendfile off;
    
        ssl_certificate /etc/letsencrypt/live/panel.example.cz/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/panel.example.cz/privkey.pem;
        ssl_session_cache shared:SSL:10m;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
        ssl_prefer_server_ciphers on;
    
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header Content-Security-Policy "frame-ancestors 'self'";
        add_header X-Frame-Options DENY;
        add_header Referrer-Policy same-origin;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/run/php/php8.3-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param HTTP_PROXY "";
            fastcgi_intercept_errors off;
            fastcgi_buffer_size 16k;
            fastcgi_buffers 4 16k;
            fastcgi_connect_timeout 300;
            fastcgi_send_timeout 300;
            fastcgi_read_timeout 300;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }

De configuratie is gebaseerd op de officiële documentatie van Pterodactyl. We hebben het luisteren op IPv6 (listen [::]:…) en het verbergen van de Nginx-versie toegevoegd. Wat de afzonderlijke onderdelen doen:

DirectiveWat het doetWanneer wijzigen
server_tokens off;Nginx verraadt zijn versie niet in de headers en op de foutpagina's van het Panel. Op Debian 13 is dat al de standaardinstelling in /etc/nginx/nginx.conf, op Ubuntu 24.04 niet.Nooit.
het eerste blok server met listen 80Ontvangt verzoeken via HTTP en verwijst ze permanent (301) door naar HTTPS.Nooit.
listen 443 ssl http2;Luistert op poort 443 met TLS en HTTP/2. [::] is hetzelfde voor IPv6.Verwijder de regels met [::] als de VPS geen IPv6 heeft.
server_nameHet domein waarvoor het blok geldt.Bij een wijziging van het domein.
root /var/www/pterodactyl/public;De map waaruit bestanden worden geserveerd. Alleen public; de andere bestanden van het Panel (waaronder .env) zijn niet via het web bereikbaar.Nooit.
index index.php;Welk bestand wordt gebruikt als het adres op / eindigt.Nooit.
access_log, error_logWaar de toegangslog en de foutenlog worden weggeschreven.Nooit.
client_max_body_size 100m;Het grootste bestand dat mag worden geüpload (bijvoorbeeld via het bestandsbeheer in het Panel).Als je grotere bestanden moet uploaden; wijzig dan ook upload_max_filesize en post_max_size hieronder.
client_body_timeout 120s;Hoe lang Nginx tijdens een upload op verdere gegevens van de browser wacht. Een trage upload van een groot bestand wordt zo niet afgebroken.Bij uploaden via een heel trage verbinding.
sendfile off;Schakelt uit dat bestanden rechtstreeks door de kernel van het systeem worden verstuurd. Overgenomen uit de officiële configuratie van Pterodactyl.Nooit.
ssl_certificate, ssl_certificate_keyHet pad naar het certificaat en de privésleutel van Certbot.Bij een wijziging van het domein.
ssl_session_cache shared:SSL:10m;Geheugen (10 MB) voor opgeslagen TLS-sessies. Een herhaalde verbinding van de browser komt zo sneller tot stand.Nooit.
ssl_protocols TLSv1.2 TLSv1.3;De toegestane TLS-versies; oudere en onveilige versies zijn uitgeschakeld.Nooit.
ssl_ciphers, ssl_prefer_server_ciphersDe toegestane versleutelingsalgoritmen en hun volgorde.Nooit.
add_header …Beveiligingsheaders: een verbod op het insluiten van het Panel in andere pagina's, een verbod op indexering door zoekmachines en dergelijke.Nooit.
location / + try_filesStuurt een bestaand bestand rechtstreeks en geeft al het andere door aan index.php (de applicatie).Nooit.
location ~ \.php$Regels voor alle verzoeken naar .php-bestanden.Nooit.
fastcgi_pass unix:/run/php/php8.3-fpm.sock;Langs welke weg Nginx PHP-verzoeken doorgeeft aan PHP-FPM.Bij de overstap naar een andere PHP-versie.
fastcgi_split_path_info, fastcgi_index, include fastcgi_params, fastcgi_param SCRIPT_FILENAMEDe standaardoverdracht van een verzoek aan PHP: splitst het adres in het script en de rest van het pad, bepaalt het standaardscript en geeft de variabelen van het verzoek door aan PHP, inclusief het pad naar het uit te voeren bestand.Nooit.
fastcgi_intercept_errors off;Foutpagina's stuurt het Panel rechtstreeks; Nginx vervangt ze niet door eigen pagina's.Nooit.
fastcgi_buffer_size, fastcgi_buffersDe grootte van het geheugen waarin Nginx het antwoord van PHP opslaat.Nooit.
fastcgi_param PHP_VALUE …Verhoogt de uploadlimieten van PHP naar 100 MB.Samen met client_max_body_size.
fastcgi_param HTTP_PROXY "";Bescherming tegen de aanval “httpoxy”.Nooit.
fastcgi_*_timeout 300Hoe lang Nginx op PHP wacht (trage bewerkingen).Nooit.
location ~ /\.ht + deny allBlokkeert de toegang tot verborgen bestanden .ht….Nooit.

Waarschuwing over http2 op Debian 13

Debian 13 heeft Nginx 1.26, waarin de notatie listen … http2 als verouderd is gemarkeerd. De configuratietest toont de waarschuwing the "listen ... http2" directive is deprecated. Op de werking heeft dat geen invloed. Stoort de waarschuwing je, verwijder dan op Debian 13 het woord http2 uit beide regels listen 443… en voeg eronder de regel http2 on; toe. Op Ubuntu 24.04 (Nginx 1.24) bestaat de directive http2 on; niet; laat daar de notatie uit het voorbeeld staan.

  1. Schakel de configuratie in, test die en herstart Nginx:

    bash
    ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
    nginx -t
    systemctl restart nginx
    • ln -s – maakt in sites-enabled een link naar het bestand aan; Nginx laadt alleen configuraties in sites-enabled.
    • nginx -t – controleert de syntaxis. De uitvoer moet eindigen met de regel test is successful. Zo niet, herstart Nginx dan niet en verbeter de regel die de fout noemt.
    • systemctl restart nginx – laadt de nieuwe configuratie.

De eerste keer inloggen#

  1. Open https://panel.example.cz in je browser. Je ziet de inlogpagina van het Panel met een slotje (geldig certificaat) in de adresbalk.
  2. Log in met de naam of het e-mailadres en het wachtwoord van de beheerder.
  3. Klik rechtsboven op het tandwielpictogram (beheergedeelte). Stel in het onderdeel Settings de naam van het Panel in (Company Name).
  4. Schakel tweestapsverificatie in: klik rechtsboven op je account, open Account en scan in het onderdeel voor tweestapsverificatie de QR-code met een app (bijvoorbeeld Google Authenticator of Aegis). Het beheerdersaccount bestuurt alle servers, bescherm het daarom met meer dan alleen een wachtwoord.

Controle#

Controleer de hele installatie:

bash
systemctl is-active nginx php8.3-fpm mariadb redis-server pteroq
curl -sI https://panel.example.cz | head -n 1
  • Het eerste commando moet vijf keer active tonen.
  • curl -sI haalt alleen de headers van het antwoord op; de eerste regel is HTTP/2 302 (doorverwijzing naar de inlogpagina) of HTTP/2 200.

Het Panel is klaar. De volgende stap is een node met de service Wings toevoegen, waarop de gameservers gaan draaien: Pterodactyl Wings.

Het Panel achter Cloudflare#

Je kunt het Panel achter de proxy van Cloudflare zetten (oranje wolkje). Dat geldt alleen voor het Panel, niet voor Wings (zie Pterodactyl Wings).

Een node met hetzelfde domein als het Panel

Heb je in de handleiding voor Wings het domein van het Panel (panel.example.cz) als FQDN van de node ingevuld, laat het Panel dan niet via de proxy van Cloudflare lopen. Browsers zouden dan geen verbinding kunnen maken met Wings op poort 8080, en de console en de bestanden van servers zouden niet werken. Laat het domein van het Panel op DNS only staan, of geef de node een eigen subdomein (bijvoorbeeld node.example.cz) met een grijs wolkje en een eigen certificaat.

  1. Stel in Cloudflare de SSL/TLS-modus in op Full (strict). Cloudflare maakt dan via HTTPS verbinding met de VPS en controleert je Let's Encrypt-certificaat.

  2. Zet het record panel.example.cz op Proxied.

  3. Voeg in .env op één regel de IP-bereiken van Cloudflare toe. Achter de proxy komen alle verzoeken bij het Panel binnen vanaf adressen van Cloudflare. Het Panel neemt het echte IP-adres van de bezoeker dan over uit de header X-Forwarded-For, maar alleen van adressen die het vertrouwt. Zonder deze regel zou het Panel bij alle gebruikers alleen de adressen van Cloudflare zien, zowel in de activiteitenlogs als in de bescherming tegen het raden van wachtwoorden, die de pogingen per IP-adres telt. De lijst hieronder geeft de stand van 1 oktober 2026 weer; de actuele lijst vind je op de pagina cloudflare.com/ips (opent in een nieuw venster):

    /var/www/pterodactyl/.envini
    TRUSTED_PROXIES=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22,2400:cb00::/32,2606:4700::/32,2803:f800::/32,2405:b500::/32,2405:8100::/32,2a06:98c0::/29,2c0f:f248::/32
    • TRUSTED_PROXIES – een lijst met adressen en bereiken (gescheiden door komma's, zonder spaties) waarvan het Panel de headers X-Forwarded-* met het echte IP-adres van de bezoeker en het protocol accepteert. Van andere adressen negeert het deze headers, zodat niemand ze kan vervalsen.
  4. Laad de nieuwe configuratie: cd /var/www/pterodactyl && php artisan config:clear.

Gebruik de modus Flexible niet

In de modus Flexible gaat het verkeer tussen Cloudflare en de VPS onversleuteld via HTTP, maar Nginx verwijst het door naar HTTPS. Het resultaat is een eindeloze doorverwijzing (ERR_TOO_MANY_REDIRECTS). Gebruik Full (strict).

Het Panel updaten#

Nieuwe versies van het Panel verhelpen fouten en beveiligingslekken; update daarom regelmatig. Lees vóór het updaten de release-opmerkingen op GitHub en controleer welke PHP-versie de nieuwe versie vereist (php -v).

Eerst een back-up

Maak vóór het updaten een back-up van de database en van het bestand .env:

bash
mariadb-dump --single-transaction panel > /root/panel-$(date +%F).sql
cp /var/www/pterodactyl/.env /root/pterodactyl-env-$(date +%F).bak
  • mariadb-dump --single-transaction panel – exporteert de database panel naar een SQL-bestand zonder tabellen te vergrendelen.
  • $(date +%F) – zet de datum van vandaag (bijvoorbeeld 2026-10-01) in de bestandsnaam.

Voer daarna de update uit:

bash
cd /var/www/pterodactyl
php artisan down
curl -L https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz | tar -xzv
chmod -R 755 storage/* bootstrap/cache
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
php artisan view:clear
php artisan config:clear
php artisan migrate --seed --force
chown -R www-data:www-data /var/www/pterodactyl/*
php artisan queue:restart
php artisan up
CommandoWat het doet
php artisan downSchakelt de onderhoudsmodus in; gebruikers zien tijdens de update een onderhoudspagina in plaats van fouten.
curl -L … | tar -xzvDownloadt de nieuwste release en pakt die meteen uit over de bestaande bestanden heen. .env wordt niet overschreven, het zit niet in het archief.
chmod -R 755 …Herstelt de schrijfrechten van de mappen.
composer install …Installeert de bibliotheken voor de nieuwe versie.
view:clear, config:clearVerwijdert de gecompileerde sjablonen en de configuratiecache, zodat de nieuwe worden geladen.
migrate --seed --forcePast de tabellen aan voor de nieuwe versie en werkt de standaard gamesjablonen bij. Eigen aanpassingen aan standaardsjablonen worden overschreven; pas je een sjabloon aan, maak er dan een kopie van.
chown -R www-data:www-data …Geeft het eigendom van de bestanden terug aan de webserver.
queue:restartVertelt de service pteroq dat hij na het afronden van de huidige taak de nieuwe code moet laden.
php artisan upSchakelt de onderhoudsmodus uit.

Update na het Panel ook Wings; de stappen staan in de handleiding Pterodactyl Wings. De versies van het Panel en Wings horen gelijk op te lopen: gebruik van beide de nieuwste release.

Back-ups van het Panel#

Om het Panel te herstellen heb je twee dingen nodig: de database panel en het bestand .env (vooral APP_KEY). De gegevens van gameservers staan op de node met Wings, niet in het Panel; maak daar apart een back-up van. Hoe je back-ups automatiseert en buiten de server bewaart, staat in de handleiding Back-ups op een VPS.

Als iets niet werkt#

502 Bad Gateway#

Nginx heeft PHP-FPM niet bereikt. Controleer of PHP-FPM draait en of het pad naar de socket klopt:

bash
systemctl status php8.3-fpm
ls /run/php/

In de uitvoer van ls moet php8.3-fpm.sock staan en hetzelfde pad moet in de directive fastcgi_pass staan. Draait de service niet, start hem dan: systemctl enable --now php8.3-fpm.

Fout 500 of een lege pagina#

Kijk in de log van het Panel:

bash
tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log
  • tail -n 100 – toont de laatste 100 regels van de log van vandaag.

Zoek naar een regel met een datum en het woord ERROR. De meest voorkomende oorzaken:

  • Permission denied – een verkeerde eigenaar van de bestanden. Voer chown -R www-data:www-data /var/www/pterodactyl/* opnieuw uit.
  • No application encryption key has been specified. – APP_KEY ontbreekt. Voer bij de eerste installatie php artisan key:generate --force uit. Bevat het Panel al gegevens, zet dan de oorspronkelijke sleutel uit je back-up terug.
  • SQLSTATE[HY000] [1045] Access denied – het wachtwoord of de gebruiker van de database in .env klopt niet.

The MAC is invalid#

De database is versleuteld met een andere APP_KEY dan de sleutel die nu in .env staat. Meestal gebeurt dit na het terugzetten van de database op een nieuwe installatie. De enige oplossing is de oorspronkelijke APP_KEY terugzetten in .env. Zonder die sleutel zijn de versleutelde gegevens niet te herstellen.

E-mails worden niet verstuurd#

Meestal draait de wachtrij niet. Controleer de service en de bijbehorende log:

bash
systemctl status pteroq
journalctl -u pteroq -n 50
  • journalctl -u pteroq -n 50 – de laatste 50 regels van de log van de service.

Controleer ook of Redis draait (systemctl status redis-server). Voer na het oplossen systemctl restart pteroq uit. Draait de wachtrij wel, controleer dan de e-mailinstellingen (php artisan p:environment:mail) en de fouten in de log van het Panel (hoofdstuk Fout 500).

Een server blijft hangen op de installatie#

De installatie van een server voert Wings uit, niet het Panel. De stappen staan in de handleiding Pterodactyl Wings in het onderdeel “Als iets niet werkt” (meestal een niet-werkende DNS in de containers of een onbereikbare node).

Geplande taken van servers worden niet gestart#

Controleer of de wachtrij draait (systemctl status pteroq), de regel in cron (crontab -l) en de tijdzones: het systeem (timedatectl), het Panel (APP_TIMEZONE in .env). Het helpt ook om de cache van de planner te wissen:

bash
php /var/www/pterodactyl/artisan schedule:clear-cache
systemctl restart pteroq

Nginx start niet: cannot load certificate#

Het certificaat voor het domein in de configuratie bestaat niet: je hebt het niet aangevraagd, of het domein in server_name en in het pad /etc/letsencrypt/live/… wijkt af van het domein waarvoor het is uitgegeven. Een lijst met certificaten krijg je met certbot certificates.

Certbot: Timeout during connect (likely firewall problem)#

Let's Encrypt heeft poort 80 van je VPS niet bereikt. Controleer of het A-record van het domein naar het IPv4-⁠adres van de VPS verwijst, of poort 80 is toegestaan in zowel de firewall van je klantaccount als UFW en of Nginx draait. Heeft het domein een AAAA-record, dan moet dat naar het IPv6-⁠adres van deze VPS verwijzen; Let's Encrypt probeert ook IPv6.

Composer of artisan meldt een verkeerde PHP-versie#

De melding bevat bijvoorbeeld requires php ^8.2 || ^8.3 but your php version (8.4…) does not satisfy that requirement. Het commando php start een andere versie dan 8.3, meestal op Debian 13 na de installatie van het standaardpakket php. Stel PHP 8.3 in als standaard:

bash
update-alternatives --set php /usr/bin/php8.3
php -v
  • update-alternatives --set php … – bepaalt welke versie het commando php start.

Bestaat /usr/bin/php8.3 niet, dan is PHP 8.3 niet geïnstalleerd. Ga terug naar het hoofdstuk Afhankelijkheden installeren.

De pagina blijft achter Cloudflare doorverwijzen (ERR_TOO_MANY_REDIRECTS)#

In Cloudflare staat de modus Flexible ingesteld. Zet die op Full (strict) en controleer ook TRUSTED_PROXIES volgens Het Panel achter Cloudflare.

Achter Cloudflare werkt de console van servers niet#

Het domein van de node loopt via de proxy van Cloudflare (oranje wolkje). Meestal gebeurt dat als de node hetzelfde domein gebruikt als het Panel. Zet het domein van de node op DNS only, of geef de node een eigen subdomein.

Samenvatting

  • Het Panel draait op Nginx + PHP 8.3 (op Debian 13 uit de repository packages.sury.org), MariaDB en Redis.
  • De databasegebruiker van het Panel heeft de host 127.0.0.1 en alleen rechten op de database panel.
  • APP_KEY uit .env heb je buiten de server bewaard; zonder die sleutel zijn versleutelde gegevens niet te herstellen.
  • Cron start schedule:run elke minuut, de service pteroq verwerkt de wachtrij.
  • Het certificaat wordt vanzelf verlengd en Nginx laadt het na de verlenging dankzij de deploy hook.
  • Volgende stap: Pterodactyl Wings en de databasehost voor servers.

Was deze handleiding nuttig?

Geldt voor

  • Ubuntu 24.04
  • Debian 13
  • Pterodactyl Panel 1.x

Diensten

Fout in de handleiding melden

Zoeken in de handleidingen