Zum Inhalt springen
Aktueller Gutschein:10 % RabattIn der Bestellung einlösen

Pterodactyl Panel: vollständige Installation auf dem eigenen VPS

Installieren Sie Pterodactyl Panel unter Ubuntu 24.04 oder Debian 13: PHP 8.3, MariaDB, Redis, Nginx mit HTTPS, den Queue-Worker, cron und den ersten Admin. Jeder Schritt und jede Option erklärt.

  • Experte
  • ~90 Min.
  • Aktualisiert am 9.10.2026

Wir installieren Pterodactyl Panel, eine Weboberfläche zur Verwaltung von Gameservern, auf Ihrem VPS. Am Ende läuft es unter https://panel.example.cz mit einem Let's-Encrypt-Zertifikat, einer Job-Warteschlange, cron und Ihrem Admin-Konto.

Was Sie brauchen

  • Ein StormHost-VPS mit einer frischen Installation von Ubuntu 24.04 oder Debian 13
  • Eine Domain oder Subdomain für das Panel (in dieser Anleitung panel.example.cz) und Zugang zu ihren DNS-Einstellungen
  • Eine SSH-Verbindung als root (Anleitung)
  • Grundkenntnisse im Terminal: Dateien im Editor nano bearbeiten, Befehle kopieren
  • Etwa 90 Minuten

So funktioniert es#

Pterodactyl hat zwei Teile. Das Panel ist eine Webanwendung (PHP, Framework Laravel), in der Sie Benutzer und Server anlegen und in der Spieler die Konsole steuern. Wings ist der Dienst, der die Gameserver tatsächlich in Docker-Containern betreibt. Panel und Wings können auf demselben VPS laufen. Diese Anleitung installiert das Panel; Wings fügen Sie in der Folgeanleitung Pterodactyl Wings hinzu.

Das Panel braucht mehrere weitere Programme:

KomponenteWofür das Panel sie braucht
PHP 8.3 + PHP-FPMDas Panel ist in PHP geschrieben. PHP-FPM ist der Prozess, der PHP-Code für den Webserver ausführt.
MariaDBDie Datenbank. Speichert Benutzer, Server, Einstellungen und Spielvorlagen.
RedisSchneller In-Memory-Speicher für Cache, Anmeldungen (Sessions) und die Job-Warteschlange.
NginxDer Webserver. Nimmt Anfragen vom Browser entgegen und reicht sie an PHP-FPM weiter.
ComposerDer PHP-Bibliotheksmanager. Lädt die Bibliotheken herunter, die das Panel braucht.
Cron und der Dienst pteroqCron führt jede Minute den Scheduler des Panels aus; pteroq verarbeitet die Job-Warteschlange im Hintergrund (E-Mails, geplante Serveraufgaben).

Das Panel selbst ist leichtgewichtig. Sollen Gameserver auf demselben VPS laufen, planen Sie Ihren RAM vor allem für sie und rechnen Sie eine Reserve für System, Datenbank und Panel ein (grob 1–⁠2 GB).

Brauchen Sie wirklich ein eigenes Panel?

Pterodactyl lohnt sich, wenn Sie mehrere Gameserver auf einem VPS betreiben, sie über das Web verwalten und anderen Personen Zugriff geben möchten. Reicht Ihnen ein Gameserver, können Sie ihn direkt als Gameserver bestellen und im Kundenbereich verwalten, ohne etwas zu installieren.

Installationsplan#

PhaseWas Sie tun
1. Domainpanel.example.cz auf die IP-Adresse des VPS richten.
2. FirewallDie Ports 80 und 443 öffnen.
3. AbhängigkeitenPHP 8.3, MariaDB, Redis, Nginx und Composer installieren.
4. PanelDie Panel-Dateien herunterladen, die Datenbank anlegen und .env einrichten.
5. Datenbank und AdminDie Tabellen und den ersten Administrator anlegen.
6. HintergrundCron und den Warteschlangendienst pteroq einrichten.
7. HTTPS und NginxEin Zertifikat holen und den Webserver konfigurieren.
8. PrüfungAnmelden und prüfen, dass alles läuft.

Domain und DNS#

Das Panel braucht eine eigene Domain oder Subdomain. HTTPS-Zertifikate werden für Domains ausgestellt, nicht für IP-Adressen.

  1. Öffnen Sie im Kundenbereich Meine Dienste, klicken Sie auf Ihren VPS und kopieren Sie in der Registerkarte Netzwerk die IPv4-⁠Adresse (und optional die IPv6-⁠Adresse).

  2. Erstellen Sie bei Ihrem DNS-Anbieter einen A-Eintrag für panel.example.cz mit der IPv4-⁠Adresse des VPS (zum Beispiel 203.0.113.10).

  3. Erstellen Sie optional auch einen AAAA-Eintrag mit der IPv6-⁠Adresse des VPS (zum Beispiel 2001:db8::10). Die Nginx-Konfiguration unten lauscht auch auf IPv6.

  4. Prüfen Sie auf dem VPS, dass die Domain bereits auf die richtige Stelle zeigt:

    bash
    getent hosts panel.example.cz
    • getent hosts – fragt das System-DNS nach der Adresse der Domain und gibt sie aus.

    Sie sehen eine Zeile mit der IP-Adresse Ihres VPS. Wird nichts ausgegeben, warten Sie einige Minuten (je nach TTL des Eintrags) und versuchen Sie es erneut.

Cloudflare: während der Installation nur die graue Wolke

Wird Ihre Domain in Cloudflare verwaltet, lassen Sie den Eintrag auf DNS only (graue Wolke). So können Sie Zertifikat und erste Anmeldung direkt prüfen. Auf Proxied (orangefarbene Wolke) können Sie am Ende umschalten; siehe Panel hinter Cloudflare. Cloudflare-Einrichtung: Domain auf einem VPS und Cloudflare.

Firewall#

Der Browser verbindet sich mit dem Panel auf Port 443 (HTTPS). Port 80 (HTTP) wird für die Domain-Prüfung beim Ausstellen des Zertifikats und für die Weiterleitung auf HTTPS gebraucht.

  • Firewall im Kundenbereich: Steht eingehender Verkehr auf Alles blockieren außer Erlaubtem, fügen Sie die Regeln Eingehend · Erlauben · TCP · Port 80,443 hinzu. Die SSH-Regel (Port 22) muss bleiben. Anleitung: Firewall im Kundenbereich.

  • UFW auf dem VPS: Verwenden Sie es, erlauben Sie die Ports auch dort:

    bash
    ufw allow 80/tcp
    ufw allow 443/tcp
    • ufw allow 80/tcp – erlaubt eingehende TCP-Verbindungen zu Port 80.
    • ufw allow 443/tcp – dasselbe für Port 443.

Die Ports für Wings (8080 und 2022) und für Gameserver öffnen Sie in der Anleitung Pterodactyl Wings.

Abhängigkeiten installieren#

Aktualisieren Sie zuerst das System, damit Sie auf einer aktuellen Basis installieren:

bash
apt update && apt -y upgrade
  • apt update – lädt die aktuelle Paketliste herunter.
  • apt -y upgrade – installiert verfügbare Updates; -y beantwortet die Bestätigung mit „ja“.

Installieren Sie dann die Abhängigkeiten. Die Schritte hängen vom System ab: Ubuntu 24.04 hat PHP 8.3 direkt im Repository, während das Standard-Repository von Debian 13 PHP 8.4 hat, das das Panel nicht unterstützt (das aktuelle Panel erfordert PHP 8.2 oder 8.3). Unter Debian fügen Sie daher das Repository packages.sury.org hinzu, das auch die offizielle Pterodactyl-Dokumentation empfiehlt.

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

Fügen Sie unter Ubuntu 24.04 kein PHP-Repository hinzu. Die offizielle Dokumentation erwähnt das Repository ppa:ondrej/php nur für das ältere Ubuntu 22.04.

Debian 13

Fügen Sie zuerst das Repository mit PHP 8.3 hinzu:

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 – ein Werkzeug zum Ermitteln des Release-Namens des Systems, Zertifikate für HTTPS und das Download-Werkzeug curl.
  • curl -sSLo … debsuryorg-archive-keyring.deb – lädt das Paket mit dem Signaturschlüssel des Repositorys herunter (-s still, -S Fehler anzeigen, -L Weiterleitungen folgen, -o in eine Datei speichern).
  • dpkg -i … – installiert den Schlüssel nach /usr/share/keyrings/; apt prüft damit dann die Pakete aus dem Repository.
  • echo "deb …" > /etc/apt/sources.list.d/php.list – schreibt die Repository-Adresse. $(lsb_release -sc) wird durch den Codenamen des Systems ersetzt (trixie).
  • apt update – lädt die Pakete aus dem neuen Repository.

Installieren Sie dann die Abhängigkeiten:

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

Unter Debian 13 installieren Sie MariaDB und Redis aus dem Standard-Repository; sie brauchen kein zusätzliches Repository.

Was der Installationsbefehl enthält:

PaketWofür
php8.3, php8.3-cliPHP 8.3 und seine Befehlszeile (für die Befehle php artisan).
php8.3-fpmDer Prozess, mit dem Nginx PHP ausführt. Lauscht auf dem Socket /run/php/php8.3-fpm.sock.
php8.3-common, -gd, -mysql, -mbstring, -bcmath, -xml, -curl, -zipPHP-Erweiterungen, die das Panel erfordert: Bilder, MariaDB-Verbindungen, UTF-⁠8-⁠Textverarbeitung, präzise Mathematik, XML, HTTP-Anfragen und ZIP-Archive. Die Schreibweise php8.3-{common,cli,…} ist eine bash-Kurzform, die zu php8.3-common php8.3-cli … expandiert.
mariadb-serverDer Datenbankserver.
nginxDer Webserver.
redis-serverRedis.
tar, unzip, git, curlEntpacken von Archiven und Herunterladen; Composer nutzt sie beim Installieren von Bibliotheken.

Prüfen Sie, dass Sie die richtige PHP-Version haben:

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

Die erste Zeile muss PHP 8.3 lauten. Sehen Sie PHP 8.4, siehe Fehlerbehebung.

Prüfen Sie, dass die Dienste laufen:

bash
systemctl is-active mariadb redis-server nginx php8.3-fpm
  • systemctl is-active – gibt den Zustand jedes aufgeführten Dienstes aus.

Sie sehen viermal active. Ist einer inactive, starten Sie ihn und aktivieren Sie ihn beim Booten mit systemctl enable --now <DIENSTNAME>, zum Beispiel systemctl enable --now redis-server.

Composer#

Composer lädt die PHP-Bibliotheken des Panels herunter. Installieren Sie ihn mit dem offiziellen Installer:

bash
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
  • curl -sS https://getcomposer.org/installer – lädt das Composer-Installationsskript herunter.
  • | php -- – übergibt das Skript zur Ausführung an PHP; -- trennt die Parameter von PHP von denen des Installers.
  • --install-dir=/usr/local/bin – wohin Composer installiert wird (ein Verzeichnis, in dem das System nach Programmen sucht).
  • --filename=composer – der Programmname, sodass Sie ihn dann mit dem Befehl composer ausführen.

Prüfung: composer --version gibt Composer version 2.… aus. Als root sehen Sie auch die Warnung Do not run Composer as root/super user! und möglicherweise die Frage Continue as root/super user [yes]?. Bestätigen Sie sie mit Eingabe. Bei der Panel-Installation unten unterdrückt die Variable COMPOSER_ALLOW_SUPERUSER=1 die Warnung.

Panel herunterladen#

  1. Legen Sie ein Verzeichnis für das Panel an und wechseln Sie hinein:

    bash
    mkdir -p /var/www/pterodactyl
    cd /var/www/pterodactyl
    • mkdir -p – legt das Verzeichnis an (einschließlich übergeordneter); existiert es bereits, gibt es keinen Fehler aus.
    • cd – wechselt in das Verzeichnis. Führen Sie alle weiteren php artisan-Befehle darin aus.
  2. Laden Sie das neueste Panel-Release herunter und entpacken Sie es:

    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 … – lädt das Archiv des neuesten Release von GitHub herunter und speichert es als panel.tar.gz.
    • tar -xzvf – entpackt das Archiv (x entpacken, z gzip-Format, v Dateien auflisten, f aus einer Datei).
  3. Setzen Sie Berechtigungen auf die Verzeichnisse, in die das Panel schreibt:

    bash
    chmod -R 755 storage/* bootstrap/cache/
    • chmod -R 755 – der Besitzer darf die Verzeichnisse lesen, schreiben und betreten; alle anderen nur lesen und betreten. -R gilt für den gesamten Inhalt.
    • storage/ – Logs, Cache und hochgeladene Dateien; bootstrap/cache/ – die kompilierte Konfiguration.

Eine Datenbank für das Panel#

Das Panel braucht eine eigene Datenbank und einen eigenen Benutzer. Die Pterodactyl-Autoren verbieten ausdrücklich, den Datenbankbenutzer root für das Panel zu verwenden: Kompromittierte jemand das Panel, erhielte er Zugriff auf alle Datenbanken auf dem VPS.

  1. Erzeugen Sie ein starkes Passwort für den Datenbankbenutzer, zum Beispiel mit dem Passwortgenerator. Verwenden Sie nur Buchstaben und Ziffern (mindestens 24 Zeichen), damit Sie sich in SQL und in .env nicht mit Sonderzeichen herumschlagen müssen. Speichern Sie das Passwort; Sie brauchen es gleich wieder.

  2. Melden Sie sich als Administrator an MariaDB an:

    bash
    mariadb
    • mariadb – der Datenbankclient. Sowohl unter Ubuntu als auch unter Debian meldet sich der Systembenutzer root ohne Passwort an MariaDB an (über Unix-Socket-Authentifizierung). Sie sehen die Eingabeaufforderung MariaDB [(none)]>.
  3. Legen Sie Benutzer und Datenbank an. Ersetzen Sie <PANEL_DB_PASSWORT> durch das Passwort aus Schritt 1 (behalten Sie die einfachen Anführungszeichen darum):

    SQL
    CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY '<PANEL_DB_PASSWORT>';
    CREATE DATABASE panel;
    GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1';
    exit
ZeileWas sie tut
CREATE USER 'pterodactyl'@'127.0.0.1' …Legt den Benutzer pterodactyl an, der sich nur von 127.0.0.1 anmelden darf, also nur von diesem VPS über TCP. Von außen kann sich niemand mit diesem Konto verbinden.
IDENTIFIED BY '…'Setzt das Passwort des Benutzers.
CREATE DATABASE panel;Legt eine leere Datenbank panel an.
GRANT ALL PRIVILEGES ON panel.* …Gibt dem Benutzer alle Rechte, aber nur auf die Datenbank panel (panel.* = alle ihre Tabellen). Auf andere Datenbanken hat er keinen Zugriff.
exitVerlässt den MariaDB-Client.

Warum 127.0.0.1 und nicht localhost

Das Panel verbindet sich mit der Datenbank über TCP unter 127.0.0.1. Die Pterodactyl-Autoren raten ausdrücklich davon ab, localhost zu verwenden, weil PHP dann eine Socket-Verbindung versucht, was Probleme verursacht. Der Datenbankbenutzer muss daher den Host 127.0.0.1 erlauben.

Umgebungskonfiguration (.env)#

Die Einstellungen des Panels liegen in /var/www/pterodactyl/.env. Sie erstellen sie aus einer Vorlage, installieren die Bibliotheken und erzeugen einen Verschlüsselungsschlüssel.

  1. Kopieren Sie die Vorlage:

    bash
    cp .env.example .env
  2. Installieren Sie die PHP-Bibliotheken des Panels:

    bash
    COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
    • COMPOSER_ALLOW_SUPERUSER=1 – lässt Composer als root laufen, ohne nachzufragen.
    • composer install – lädt die Bibliotheken in genau den Versionen herunter, die das Panel vorgibt (die Datei composer.lock).
    • --no-dev – überspringt Entwicklerwerkzeuge, die Sie auf einem Produktivserver nicht brauchen.
    • --optimize-autoloader – bereitet schnelleres Laden der PHP-Klassen vor.

    Die Installation dauert einige Minuten und endet ohne Fehlermeldungen (eine gelbe Warnung zu veralteten Paketen ist in Ordnung).

  3. Erzeugen Sie den Verschlüsselungsschlüssel:

    bash
    php artisan key:generate --force
    • php artisan – das Befehlszeilen-Verwaltungswerkzeug des Panels.
    • key:generate – erzeugt einen zufälligen APP_KEY und schreibt ihn in .env.
    • --force – führt den Befehl ohne Bestätigung aus (das Panel läuft im Produktionsmodus, wo es sonst nachfragen würde).

Sichern Sie APP_KEY sofort

Das Panel verschlüsselt mit APP_KEY sensible Daten in der Datenbank (zum Beispiel API-Schlüssel und Passwörter von Database Hosts). Verlieren Sie ihn, können Sie die Daten nicht entschlüsseln, auch nicht aus einem Datenbank-Backup. Führen Sie key:generate nur bei der Erstinstallation aus. Bei einem Panel, das bereits Daten hat, würde ein neuer Schlüssel den Verlust des Zugriffs darauf bedeuten.

  1. Zeigen Sie den Schlüssel an und speichern Sie die ganze Zeile irgendwo außerhalb des Servers (in einem Passwort-Manager oder einer verschlüsselten Datei auf Ihrem Computer):

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

Der Assistent p:environment:setup#

Ein Assistent übernimmt die Grundeinrichtung. Führen Sie ihn aus:

bash
php artisan p:environment:setup

Er stellt nacheinander die folgenden Fragen (der Standardwert steht in eckigen Klammern; bestätigen Sie ihn mit Eingabe):

FrageWas eintragenWarum
Autor-E-Mail (… Author Email)Ihre E-Mail-Adresse, zum Beispiel [email protected]Wird als Autor von Spielvorlagen verwendet, die Sie aus dem Panel exportieren. Es muss ein gültiges E-Mail-Format sein, sonst scheitert der Assistent.
Application URLhttps://panel.example.czDie Adresse des Panels einschließlich https://. Wird für Links in E-Mails und beim Erzeugen von URLs verwendet. Ohne https:// sind die Links falsch.
Application TimezoneEurope/PragueDie Zeitzone für die Anzeige von Zeiten und für geplante Aufgaben.
Cache DriverredisWo der Cache gespeichert wird. Redis ist am schnellsten und die empfohlene Option.
Session DriverredisWo Benutzeranmeldungen gespeichert werden.
Queue DriverredisWo die Job-Warteschlange für den Dienst pteroq gespeichert wird.
Enable UI based settings editor?yesManche Einstellungen (Panel-Name, Mail, reCAPTCHA) lassen sich dann im Admin-Bereich ändern, nicht nur in .env.
Enable sending anonymous telemetry data?Ihre EntscheidungEinmal täglich sendet das Panel anonyme Statistiken an seine Autoren (Anzahl der Server, Systemversion). Möchten Sie das nicht, antworten Sie mit no.
Redis Host127.0.0.1Redis läuft auf demselben VPS.
Redis Passwordnichts, nur EingabeEin lokales Redis hat nach der Installation kein Passwort und lauscht nur auf 127.0.0.1.
Redis Port6379Der Standardport von Redis.

Wenn Sie eine mit https:// beginnende Adresse eingeben, schaltet der Assistent von selbst sichere Cookies ein (SESSION_SECURE_COOKIE=true).

Der Assistent p:environment:database#

bash
php artisan p:environment:database
FrageWas eintragenWarum
Database Host127.0.0.1Die Datenbank läuft auf demselben VPS. Geben Sie nicht localhost ein (siehe oben).
Database Port3306Der Standardport von MariaDB.
Database NamepanelDie Datenbank aus dem vorherigen Abschnitt.
Database UsernamepterodactylDer Benutzer aus dem vorherigen Abschnitt.
Database Passworddas Passwort <PANEL_DB_PASSWORT>Es wird bei der Eingabe nicht angezeigt.

Der Assistent versucht sofort, sich zu verbinden. Sind die Angaben falsch, gibt er Unable to connect to the MySQL server… aus, speichert nichts und fragt, ob Sie es erneut versuchen möchten.

Der Assistent p:environment:mail#

Das Panel sendet E-Mails (Einladungen für neue Benutzer, Passwort-Zurücksetzungen). Ohne Mail-Einstellungen funktioniert das Panel, aber diese E-Mails gehen nicht hinaus. Sie können das auch später mit demselben Befehl einrichten:

bash
php artisan p:environment:mail
FrageWas eintragenWarum
Which driver should be used for sending emails?smtpDer Versand über den SMTP-Server Ihres E-Mail-Anbieters ist am zuverlässigsten.
SMTP Hostdie Adresse des SMTP-Servers, zum Beispiel smtp.example.czSie finden sie in den Hilfeseiten Ihres E-Mail-Anbieters.
SMTP Port587 (oder 465)587 wird mit TLS-Verschlüsselung (STARTTLS) verwendet, 465 mit SSL-Verschlüsselung.
SMTP Usernamedie vollständige E-Mail-Adresse des PostfachsDer Anmeldename des Postfachs.
SMTP Passworddas Passwort des PostfachsManche Dienste verlangen ein separates „App-Passwort“.
Encryption method to usetls für Port 587, ssl für 465Muss zum Port passen, sonst scheitert die Verbindung.
Email address emails should originate fromzum Beispiel [email protected]Die Absenderadresse. Sie sollte zur Domain des Postfachs gehören, sonst landen Nachrichten im Spam.
Name that emails should appear fromzum Beispiel Game PanelDer in E-Mails angezeigte Absendername.

Wichtige Schlüssel in .env#

Die Assistenten schreiben diese Werte in .env. Sie können die Datei auch von Hand bearbeiten (nano /var/www/pterodactyl/.env); führen Sie nach einer manuellen Änderung php artisan config:clear aus.

EinstellungWas sie tutEmpfohlener WertWann ändern
APP_URLDie öffentliche Adresse des Panels.https://panel.example.czWenn sich die Domain ändert (dann auch in Nginx und im Zertifikat).
APP_KEYDer Verschlüsselungsschlüssel für Daten in der Datenbank.erzeugt, nie ändernNie. Bei einer Wiederherstellung aus einem Backup den ursprünglichen zurücksetzen.
APP_TIMEZONEDie Zeitzone des Panels.Europe/PragueWenn die Admins in einer anderen Zeitzone sind.
APP_ENVIRONMENT_ONLYtrue = Einstellungen nur in .env, false = auch im Admin-Bereich.falseWenn Sie Einstellungsänderungen über das Web verhindern möchten.
DB_HOST, DB_PORTWo die Datenbank des Panels läuft.127.0.0.1, 3306Wenn Sie die Datenbank woandershin verschieben.
DB_DATABASE, DB_USERNAME, DB_PASSWORDDie Datenbank des Panels und die Zugangsdaten.panel, pterodactyl, ein starkes PasswortWenn Sie das Passwort des Benutzers in MariaDB ändern.
REDIS_HOST, REDIS_PASSWORD, REDIS_PORTDie Redis-Verbindung.127.0.0.1, null, 6379Wenn Sie ein Redis-Passwort setzen.
CACHE_DRIVER, SESSION_DRIVER, QUEUE_CONNECTIONWo Cache, Anmeldungen und Warteschlange gespeichert werden.redisPraktisch nie.
SESSION_SECURE_COOKIEAnmelde-Cookies werden nur über HTTPS gesendet.trueNie, solange das Panel auf HTTPS läuft.
MAIL_*E-Mail-Versand (Server, Port, Verschlüsselung, Absender).je nach AnbieterWenn Sie das Postfach wechseln.
MAIL_EHLO_DOMAINDer Name, mit dem sich das Panel beim SMTP-Server vorstellt.panel.example.czWenn zum Beispiel Gmail Ihre E-Mails wegen localhost ablehnt.
TRUSTED_PROXIESProxy-Adressen, denen das Panel vertraut (Cloudflare, ein weiteres Nginx).leerWenn das Panel hinter einem Proxy läuft; siehe Panel hinter Cloudflare.
PTERODACTYL_TELEMETRY_ENABLEDSenden anonymer Telemetrie.Ihre Entscheidungfalse schaltet die Telemetrie aus.

Datenbanktabellen und der erste Administrator#

  1. Legen Sie die Tabellen an und laden Sie die Standarddaten:

    bash
    php artisan migrate --seed --force
    • migrate – legt alle Tabellen in der Datenbank panel an.
    • --seed – füllt sie mit Standarddaten, einschließlich Spielvorlagen (Minecraft, Rust und andere).
    • --force – führt den Befehl im Produktionsmodus ohne Bestätigung aus.

    Der Befehl kann mehrere Minuten dauern. Unterbrechen Sie ihn nicht, sonst bleibt die Datenbank halb angelegt.

  2. Legen Sie das Admin-Konto an:

    bash
    php artisan p:user:make
FrageWas eintragen
Is this user an administrator?yes – das Konto erhält Zugriff auf den Admin-Bereich.
Email AddressIhre E-Mail-Adresse; wird für Anmeldung und Passwort-Zurücksetzung verwendet.
UsernameDer Anmeldename, zum Beispiel jan.
First Name, Last NameVor- und Nachname (im Panel angezeigt).
PasswordMindestens 8 Zeichen, mindestens ein Großbuchstabe und eine Ziffer. Es wird bei der Eingabe nicht angezeigt.

Am Ende sehen Sie eine Tabelle mit den Kontodaten und der Zeile Admin | Yes.

Dateiberechtigungen#

Die Panel-Dateien gehören jetzt root. Der Webserver läuft als Benutzer www-data und muss in die Verzeichnisse storage und bootstrap/cache schreiben:

bash
chown -R www-data:www-data /var/www/pterodactyl/*
  • chown -R – ändert den Besitzer der Dateien und des gesamten Inhalts der Verzeichnisse.
  • www-data:www-data – Benutzer und Gruppe, unter denen Nginx und PHP-FPM unter Ubuntu und Debian laufen.

Nach jedem als root ausgeführten artisan-Befehl

Als root ausgeführte php artisan-Befehle können Dateien erzeugen (zum Beispiel Logs), die www-data dann nicht überschreiben kann. Erhalten Sie nach der Arbeit im Terminal einen 500-⁠Fehler, führen Sie den chown-Befehl oben erneut aus.

Cron und die Job-Warteschlange#

Cron#

Cron führt jede Minute den Scheduler des Panels aus (Aufräumen alter Anmeldungen, geplante Serveraufgaben).

  1. Öffnen Sie die Crontab von root:

    bash
    crontab -e

    Beim ersten Lauf fragt er, welcher Editor verwendet werden soll. Wählen Sie nano (seine Nummer eingeben und Eingabe drücken). Meldet das System crontab: command not found, fehlt cron. Installieren Sie es mit apt -y install cron und wiederholen Sie diesen Schritt.

  2. Fügen Sie am Ende der Datei diese Zeile hinzu:

    text
    * * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
  3. Speichern Sie (Strg+O, Eingabe) und schließen Sie den Editor (Strg+X). Sie sehen crontab: installing new crontab.

Teil der ZeileBedeutung
* * * * *Minute, Stunde, Tag des Monats, Monat, Wochentag. Fünf Sternchen = jede Minute.
php /var/www/pterodactyl/artisan schedule:runFührt den Scheduler des Panels aus, der selbst entscheidet, welche Aufgaben fällig sind.
>> /dev/null 2>&1Verwirft Ausgabe und Fehler, damit cron nicht jede Minute eine E-Mail sendet.

Der Warteschlangendienst pteroq#

Die Warteschlange erledigt Hintergrundarbeit: das Senden von E-Mails und die Aufgaben, die Benutzer für ihre Server planen (der Bereich Schedules, zum Beispiel ein nächtlicher Neustart oder ein Backup). Ohne sie gehen keine E-Mails hinaus, und geplante Aufgaben laufen nicht.

  1. Erstellen Sie die Dienstdatei:

    bash
    nano /etc/systemd/system/pteroq.service
  2. Fügen Sie den Inhalt ein:

    /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. Speichern und schließen Sie den Editor.

ZeileWas sie tut
Description=Die Dienstbeschreibung, die Sie in systemctl status sehen.
After=redis-server.serviceDer Dienst startet erst nach Redis, aus dem er die Warteschlange liest.
User=www-data, Group=www-dataDie Warteschlange läuft als derselbe Benutzer wie die Website, sodass beide dieselben Dateiberechtigungen haben.
Restart=alwaysEndet der Prozess (mit Fehler oder normal), startet systemd ihn erneut.
ExecStart=… queue:workStartet die Verarbeitung der Warteschlange. --queue=high,standard,low legt die Reihenfolge der Warteschlangen nach Priorität fest, --sleep=3 = bei leerer Warteschlange 3 Sekunden warten, --tries=3 = einen fehlgeschlagenen Job höchstens dreimal wiederholen.
StartLimitInterval=180, StartLimitBurst=30Stürzt der Dienst mehr als 30-⁠mal in 180 Sekunden ab, hört systemd auf, ihn neu zu starten (Schutz vor einer Endlosschleife).
RestartSec=5sWartet 5 Sekunden vor dem Neustart.
WantedBy=multi-user.targetDer Dienst startet bei jedem Booten des VPS (nach enable).
  1. Aktivieren Sie Redis und die Warteschlange beim Booten und starten Sie sie sofort:

    bash
    systemctl enable --now redis-server
    systemctl enable --now pteroq.service
    • enable – schaltet den automatischen Start nach einem Neustart des VPS ein.
    • --now – startet den Dienst auch sofort.
  2. Prüfen Sie den Status:

    bash
    systemctl status pteroq

    Sie sehen Active: active (running). Schließen Sie die Ausgabe mit q.

Das Let's-Encrypt-Zertifikat#

Die Nginx-Konfiguration unten verweist auf die Zertifikatsdateien. Nginx startet damit erst, wenn das Zertifikat existiert, also holen Sie zuerst das Zertifikat.

  1. Installieren Sie Certbot und sein Nginx-Plugin:

    bash
    apt -y install certbot python3-certbot-nginx
    • certbot – das Programm, das Let's-Encrypt-Zertifikate holt und erneuert.
    • python3-certbot-nginx – ein Plugin, das die Domain über das laufende Nginx prüft, ohne es zu stoppen.
  2. Holen Sie das Zertifikat. Ersetzen Sie panel.example.cz durch Ihre Domain:

    bash
    certbot certonly --nginx -d panel.example.cz
    • certonly – holt nur das Zertifikat und speichert es, ohne die Nginx-Konfiguration zu bearbeiten (die schreiben Sie selbst).
    • --nginx – die Domain-Prüfung läuft über Nginx auf Port 80.
    • -d panel.example.cz – die Domain, für die Sie das Zertifikat möchten.
  3. Beantworten Sie beim ersten Lauf die Fragen:

    • E-Mail (Enter email address…) – geben Sie Ihre E-Mail-Adresse ein. Let's Encrypt sendet wichtige Kontohinweise dorthin. Seit 2025 sendet es keine Erinnerungen an ablaufende Zertifikate mehr, die Erneuerung läuft also automatisch (siehe Schritt 5).
    • Nutzungsbedingungen (Please read the Terms of Service… Do you agree?) – antworten Sie mit Y; ohne Zustimmung erhalten Sie kein Zertifikat.
    • Weitergabe Ihrer E-Mail an die EFF (Would you be willing… to share your email address with the Electronic Frontier Foundation…) – Ihre Entscheidung; hat keine Auswirkung auf das Zertifikat.

    Am Ende sehen Sie Successfully received certificate. und die Dateipfade:

    Ausgabetext
    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. Lassen Sie Nginx nach jeder Erneuerung das neue Zertifikat laden. Erstellen Sie einen Deploy-Hook (ein Skript, das Certbot nach einer erfolgreichen Erneuerung ausführt):

    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 – schreibt die Zeilen zwischen <<'EOF' und EOF in die Datei.
    • systemctl reload nginx – lädt die neue Konfiguration und die Zertifikate, ohne Verbindungen abzubrechen.
    • chmod 755 – macht das Skript ausführbar; Certbot führt im Verzeichnis renewal-hooks/deploy nur ausführbare Dateien aus.
  5. Prüfen Sie, dass die automatische Erneuerung funktioniert. Sowohl unter Ubuntu als auch unter Debian enthält das Certbot-Paket einen Timer, der zweimal täglich eine Erneuerung versucht:

    bash
    systemctl list-timers | grep certbot
    certbot renew --dry-run
    • systemctl list-timers – listet geplante Timer auf; certbot.timer sollte darunter sein.
    • certbot renew --dry-run – probiert eine Erneuerung gegen den Staging-Server von Let's Encrypt, ohne das echte Zertifikat anzufassen.

    Der Test endet mit Congratulations, all simulated renewals succeeded.

Das Zertifikat ist 90 Tage gültig (Stand Oktober 2026; Let's Encrypt verkürzt die Gültigkeit schrittweise). Certbot erneuert es von selbst, wenn noch etwa ein Drittel der Gültigkeit übrig ist.

Nginx#

  1. Deaktivieren Sie die Standard-Website von Nginx:

    bash
    rm /etc/nginx/sites-enabled/default
    • Das löscht nur den Link in sites-enabled; die Datei selbst bleibt in sites-available. Andernfalls würde die Standard-Website Port 80 statt des Panels bedienen.
  2. Erstellen Sie die Panel-Konfiguration:

    bash
    nano /etc/nginx/sites-available/pterodactyl.conf
  3. Fügen Sie den Inhalt ein und ersetzen Sie alle vier Vorkommen von panel.example.cz durch Ihre Domain:

    /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;
    
        # groessere Uploads und laengere Skriptlaufzeiten
        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;
        }
    }

Die Konfiguration basiert auf der offiziellen Pterodactyl-Dokumentation. Wir haben das Lauschen auf IPv6 (listen [::]:…) ergänzt und die Nginx-Version verborgen. Was die einzelnen Teile tun:

DirektiveWas sie tutWann ändern
server_tokens off;Nginx verrät seine Version weder in Headern noch auf den Fehlerseiten des Panels. Unter Debian 13 ist das in /etc/nginx/nginx.conf bereits Standard, unter Ubuntu 24.04 nicht.Nie.
erster server-Block mit listen 80Nimmt HTTP-Anfragen an und leitet sie dauerhaft (301) auf HTTPS um.Nie.
listen 443 ssl http2;Lauscht auf Port 443 mit TLS und HTTP/2. [::] ist dasselbe für IPv6.Löschen Sie die Zeilen mit [::], wenn der VPS kein IPv6 hat.
server_nameDie Domain, für die dieser Block gilt.Wenn sich die Domain ändert.
root /var/www/pterodactyl/public;Das Verzeichnis, aus dem Dateien ausgeliefert werden. Nur public; die übrigen Dateien des Panels (einschließlich .env) sind aus dem Web nicht erreichbar.Nie.
index index.php;Welche Datei verwendet wird, wenn die URL mit / endet.Nie.
access_log, error_logWohin Zugriffs- und Fehlerlogs geschrieben werden.Nie.
client_max_body_size 100m;Die maximal erlaubte Upload-Größe (zum Beispiel über den Dateimanager des Panels).Wenn Sie größere Dateien hochladen müssen; ändern Sie dann auch upload_max_filesize und post_max_size unten.
client_body_timeout 120s;Wie lange Nginx bei einem Upload auf weitere Daten vom Browser wartet, damit ein langsamer Upload einer großen Datei nicht abgebrochen wird.Bei Uploads über eine sehr langsame Verbindung.
sendfile off;Schaltet das direkte Senden von Dateien durch den Kernel aus. Aus der offiziellen Pterodactyl-Konfiguration übernommen.Nie.
ssl_certificate, ssl_certificate_keyPfade zu Zertifikat und privatem Schlüssel von Certbot.Wenn sich die Domain ändert.
ssl_session_cache shared:SSL:10m;Speicher (10 MB) für gespeicherte TLS-Sitzungen, damit wiederholte Browserverbindungen schneller aufgebaut werden.Nie.
ssl_protocols TLSv1.2 TLSv1.3;Erlaubte TLS-Versionen; ältere und unsichere sind aus.Nie.
ssl_ciphers, ssl_prefer_server_ciphersErlaubte Cipher und ihre Reihenfolge.Nie.
add_header …Sicherheits-Header: verhindert das Einbetten des Panels in andere Seiten, blockiert die Indexierung durch Suchmaschinen und Ähnliches.Nie.
location / + try_filesSendet vorhandene Dateien direkt und reicht alles andere an index.php (die Anwendung) weiter.Nie.
location ~ \.php$Regeln für alle Anfragen an .php-Dateien.Nie.
fastcgi_pass unix:/run/php/php8.3-fpm.sock;Wie Nginx PHP-Anfragen an PHP-FPM übergibt.Beim Wechsel auf eine andere PHP-Version.
fastcgi_split_path_info, fastcgi_index, include fastcgi_params, fastcgi_param SCRIPT_FILENAMEStandardübergabe der Anfrage an PHP: teilt die URL in Skript und restlichen Pfad, setzt das Standardskript und übergibt die Anfragevariablen an PHP, einschließlich des Pfads zum ausgeführten Skript.Nie.
fastcgi_intercept_errors off;Fehlerseiten kommen direkt vom Panel; Nginx ersetzt sie nicht durch eigene.Nie.
fastcgi_buffer_size, fastcgi_buffersDie Größe des Speichers, mit dem Nginx Antworten von PHP puffert.Nie.
fastcgi_param PHP_VALUE …Erhöht die Upload-Limits von PHP auf 100 MB.Zusammen mit client_max_body_size.
fastcgi_param HTTP_PROXY "";Schutz vor dem Angriff „httpoxy“.Nie.
fastcgi_*_timeout 300Wie lange Nginx auf PHP wartet (langsame Vorgänge).Nie.
location ~ /\.ht + deny allBlockiert den Zugriff auf versteckte .ht…-Dateien.Nie.

http2-⁠Warnung unter Debian 13

Debian 13 liefert Nginx 1.26, in dem die Syntax listen … http2 als veraltet markiert ist. Der Konfigurationstest gibt die Warnung the "listen ... http2" directive is deprecated aus. Sie hat keine Auswirkung. Stört Sie die Warnung, entfernen Sie unter Debian 13 das Wort http2 aus beiden Zeilen listen 443… und fügen Sie darunter die Zeile http2 on; ein. Unter Ubuntu 24.04 (Nginx 1.24) existiert die Direktive http2 on; nicht, behalten Sie dort also die Syntax aus dem Beispiel.

  1. Aktivieren Sie die Konfiguration, testen Sie sie und starten Sie Nginx neu:

    bash
    ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
    nginx -t
    systemctl restart nginx
    • ln -s – erstellt einen Link auf die Datei in sites-enabled; Nginx lädt nur Konfigurationen in sites-enabled.
    • nginx -t – prüft die Syntax. Es muss mit der Zeile test is successful enden. Falls nicht, starten Sie Nginx nicht neu; korrigieren Sie die Zeile, auf die der Fehler zeigt.
    • systemctl restart nginx – lädt die neue Konfiguration.

Erste Anmeldung#

  1. Öffnen Sie https://panel.example.cz in Ihrem Browser. Sie sehen die Anmeldeseite des Panels mit einem Schloss (gültiges Zertifikat) in der Adressleiste.
  2. Melden Sie sich mit Benutzername oder E-Mail-Adresse und Passwort des Admins an.
  3. Klicken Sie oben rechts auf das Zahnradsymbol (Admin-Bereich). Legen Sie im Bereich Settings den Panel-Namen fest (Company Name).
  4. Schalten Sie die Zwei-Faktor-Authentifizierung ein: Klicken Sie oben rechts auf Ihr Konto, öffnen Sie Account und scannen Sie im Zwei-Faktor-Bereich den QR-Code mit einer App (zum Beispiel Google Authenticator oder Aegis). Das Admin-Konto steuert alle Server, schützen Sie es also mit mehr als einem Passwort.

Überprüfung#

Prüfen Sie die gesamte Installation:

bash
systemctl is-active nginx php8.3-fpm mariadb redis-server pteroq
curl -sI https://panel.example.cz | head -n 1
  • Der erste Befehl muss fünfmal active ausgeben.
  • curl -sI lädt nur die Antwort-Header herunter; die erste Zeile lautet HTTP/2 302 (Weiterleitung zur Anmeldung) oder HTTP/2 200.

Das Panel ist bereit. Der nächste Schritt ist das Hinzufügen einer Node mit dem Dienst Wings, auf der die Gameserver laufen: Pterodactyl Wings.

Panel hinter Cloudflare#

Sie können das Panel hinter den Cloudflare-Proxy (orangefarbene Wolke) setzen. Das gilt nur für das Panel, nicht für Wings (siehe Pterodactyl Wings).

Eine Node mit derselben Domain wie das Panel

Haben Sie in der Wings-Anleitung die Domain des Panels (panel.example.cz) als FQDN der Node eingetragen, setzen Sie das Panel nicht hinter den Cloudflare-Proxy. Browser könnten sich nicht mit Wings auf Port 8080 verbinden, und Serverkonsole und Dateien würden nicht funktionieren. Lassen Sie entweder die Domain des Panels auf DNS only, oder geben Sie der Node eine eigene Subdomain (zum Beispiel node.example.cz) mit grauer Wolke und eigenem Zertifikat.

  1. Stellen Sie in Cloudflare den SSL/TLS-Modus auf Full (strict). Cloudflare verbindet sich dann über HTTPS mit dem VPS und prüft Ihr Let's-Encrypt-Zertifikat.

  2. Schalten Sie den Eintrag panel.example.cz auf Proxied.

  3. Fügen Sie die IP-Bereiche von Cloudflare in einer einzigen Zeile zu .env hinzu. Hinter dem Proxy erreichen alle Anfragen das Panel von den Adressen von Cloudflare. Das Panel nimmt die echte IP-Adresse des Besuchers dann aus dem Header X-Forwarded-For, aber nur von Adressen, denen es vertraut. Ohne diese Zeile würde das Panel für alle Benutzer nur die Adressen von Cloudflare sehen, sowohl in Aktivitätsprotokollen als auch im Brute-Force-Schutz, der Versuche pro IP-Adresse zählt. Die Liste unten ist aktuell mit Stand 1. Oktober 2026; die neueste finden Sie unter cloudflare.com/ips (öffnet sich in einem neuen Fenster):

    /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 – eine Liste von Adressen und Bereichen (durch Kommas getrennt, ohne Leerzeichen), von denen das Panel X-Forwarded-*-Header mit der echten IP-Adresse und dem Protokoll des Besuchers akzeptiert. Von jeder anderen Adresse ignoriert es diese Header, sodass niemand sie fälschen kann.
  4. Laden Sie die neue Konfiguration: cd /var/www/pterodactyl && php artisan config:clear.

Verwenden Sie nicht den Modus Flexible

Im Modus Flexible läuft der Verkehr zwischen Cloudflare und dem VPS unverschlüsselt über HTTP, Nginx leitet ihn aber auf HTTPS um. Das Ergebnis ist eine endlose Weiterleitungsschleife (ERR_TOO_MANY_REDIRECTS). Verwenden Sie Full (strict).

Panel aktualisieren#

Neue Panel-Versionen beheben Fehler und Sicherheitslücken, aktualisieren Sie also regelmäßig. Lesen Sie vor dem Update die Versionshinweise auf GitHub und prüfen Sie, welche PHP-Version das neue Release erfordert (php -v).

Zuerst sichern

Sichern Sie vor dem Update die Datenbank und die Datei .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 – exportiert die Datenbank panel in eine SQL-Datei, ohne Tabellen zu sperren.
  • $(date +%F) – fügt das heutige Datum (zum Beispiel 2026-10-01) in den Dateinamen ein.

Führen Sie dann das Update aus:

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
BefehlWas er tut
php artisan downSchaltet den Wartungsmodus ein; Benutzer sehen während des Updates eine Wartungsseite statt Fehlern.
curl -L … | tar -xzvLädt das neueste Release herunter und entpackt es direkt über die bestehenden Dateien. .env wird nicht überschrieben; sie ist nicht im Archiv.
chmod -R 755 …Stellt die Schreibberechtigungen auf den Verzeichnissen wieder her.
composer install …Installiert die Bibliotheken für die neue Version.
view:clear, config:clearLeert kompilierte Vorlagen und den Konfigurationscache, damit die neuen geladen werden.
migrate --seed --forceAktualisiert die Tabellen für die neue Version und erneuert die Standard-Spielvorlagen. Eigene Änderungen an Standardvorlagen werden überschrieben; wenn Sie eine Vorlage ändern, erstellen Sie eine Kopie davon.
chown -R www-data:www-data …Gibt dem Webserver den Besitz der Dateien zurück.
queue:restartWeist den Dienst pteroq an, nach Abschluss seines aktuellen Jobs den neuen Code zu laden.
php artisan upSchaltet den Wartungsmodus aus.

Aktualisieren Sie nach dem Panel auch Wings; die Schritte stehen in der Anleitung Pterodactyl Wings. Die Versionen von Panel und Wings sollten zusammenpassen, verwenden Sie also das neueste Release von beiden.

Panel-Backups#

Zur Wiederherstellung des Panels brauchen Sie zwei Dinge: die Datenbank panel und die Datei .env (vor allem APP_KEY). Gameserver-Daten liegen auf der Wings-Node, nicht im Panel, sichern Sie sie also separat. Wie Sie Backups automatisieren und vom Server wegbekommen, behandelt Backups auf einem VPS.

Fehlerbehebung#

502 Bad Gateway#

Nginx konnte PHP-FPM nicht erreichen. Prüfen Sie, dass PHP-FPM läuft und der Socket-Pfad passt:

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

Die Ausgabe von ls muss php8.3-fpm.sock enthalten, und derselbe Pfad muss in der Direktive fastcgi_pass stehen. Läuft der Dienst nicht, starten Sie ihn: systemctl enable --now php8.3-fpm.

Fehler 500 oder eine leere Seite#

Sehen Sie in das Log des Panels:

bash
tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log
  • tail -n 100 – gibt die letzten 100 Zeilen des heutigen Logs aus.

Suchen Sie eine Zeile mit Datum und dem Wort ERROR. Die häufigsten Ursachen:

  • Permission denied – falscher Dateibesitzer. Führen Sie chown -R www-data:www-data /var/www/pterodactyl/* erneut aus.
  • No application encryption key has been specified. – APP_KEY fehlt. Führen Sie bei der Erstinstallation php artisan key:generate --force aus. Hat das Panel bereits Daten, stellen Sie den ursprünglichen Schlüssel aus Ihrem Backup wieder her.
  • SQLSTATE[HY000] [1045] Access denied – Datenbankpasswort oder -benutzer in .env ist falsch.

The MAC is invalid#

Die Datenbank wurde mit einem anderen APP_KEY verschlüsselt als dem, der jetzt in .env steht. Das passiert typischerweise nach der Wiederherstellung der Datenbank auf einer neuen Installation. Die einzige Lösung ist, den ursprünglichen APP_KEY wieder in .env einzutragen. Ohne ihn lassen sich die verschlüsselten Daten nicht wiederherstellen.

E-Mails werden nicht gesendet#

Meist läuft die Warteschlange nicht. Prüfen Sie den Dienst und sein Log:

bash
systemctl status pteroq
journalctl -u pteroq -n 50
  • journalctl -u pteroq -n 50 – die letzten 50 Zeilen des Dienst-Logs.

Prüfen Sie auch, dass Redis läuft (systemctl status redis-server). Führen Sie nach der Behebung systemctl restart pteroq aus. Läuft die Warteschlange, prüfen Sie die Mail-Einstellungen (php artisan p:environment:mail) und Fehler im Panel-Log (siehe Fehler 500).

Ein Server hängt bei der Installation#

Die Serverinstallation erledigt Wings, nicht das Panel. Siehe den Abschnitt „Fehlerbehebung“ der Anleitung Pterodactyl Wings (meist kaputtes DNS in Containern oder eine unerreichbare Node).

Geplante Serveraufgaben laufen nicht#

Prüfen Sie, dass die Warteschlange läuft (systemctl status pteroq), die Cron-Zeile (crontab -l) und die Zeitzonen: die des Systems (timedatectl) und die des Panels (APP_TIMEZONE in .env). Auch das Leeren des Scheduler-Caches kann helfen:

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

Nginx startet nicht: cannot load certificate#

Das Zertifikat für die Domain in der Konfiguration existiert nicht: Sie haben es nicht geholt, oder die Domain in server_name und im Pfad /etc/letsencrypt/live/… unterscheidet sich von der, für die es ausgestellt wurde. certbot certificates listet Ihre Zertifikate auf.

Certbot: Timeout during connect (likely firewall problem)#

Let's Encrypt konnte Port 80 Ihres VPS nicht erreichen. Prüfen Sie, dass der A-Eintrag der Domain auf die IPv4-⁠Adresse des VPS zeigt, dass Port 80 sowohl in der Firewall des Kundenbereichs als auch in UFW erlaubt ist und dass Nginx läuft. Hat die Domain einen AAAA-Eintrag, muss er auf die IPv6-⁠Adresse dieses VPS zeigen, weil Let's Encrypt auch IPv6 versucht.

Composer oder artisan meldet die falsche PHP-Version#

Die Meldung lautet etwa requires php ^8.2 || ^8.3 but your php version (8.4…) does not satisfy that requirement. Der Befehl php führt eine andere Version als 8.3 aus, typischerweise unter Debian 13, nachdem das Standardpaket php installiert wurde. Setzen Sie das Standard-PHP auf 8.3:

bash
update-alternatives --set php /usr/bin/php8.3
php -v
  • update-alternatives --set php … – legt fest, welche Version der Befehl php ausführt.

Existiert /usr/bin/php8.3 nicht, ist PHP 8.3 nicht installiert. Gehen Sie zurück zu Abhängigkeiten installieren.

Die Seite dreht sich hinter Cloudflare in Weiterleitungen (ERR_TOO_MANY_REDIRECTS)#

Cloudflare steht im Modus Flexible. Schalten Sie es auf Full (strict) und prüfen Sie auch TRUSTED_PROXIES, wie unter Panel hinter Cloudflare beschrieben.

Die Serverkonsole funktioniert hinter Cloudflare nicht#

Die Domain der Node läuft über den Cloudflare-Proxy (orangefarbene Wolke). Das passiert typischerweise, wenn die Node dieselbe Domain wie das Panel verwendet. Schalten Sie die Domain der Node auf DNS only oder geben Sie der Node eine eigene Subdomain.

Zusammenfassung

  • Das Panel läuft auf Nginx + PHP 8.3 (unter Debian 13 aus dem Repository packages.sury.org), MariaDB und Redis.
  • Der Datenbankbenutzer des Panels hat den Host 127.0.0.1 und Rechte nur auf die Datenbank panel.
  • Sie haben APP_KEY aus .env außerhalb des Servers gespeichert; ohne ihn lassen sich verschlüsselte Daten nicht wiederherstellen.
  • Cron führt jede Minute schedule:run aus; der Dienst pteroq verarbeitet die Warteschlange.
  • Das Zertifikat erneuert sich selbst, und Nginx lädt es nach der Erneuerung dank des Deploy-Hooks.
  • Nächster Schritt: Pterodactyl Wings und der Database Host für Server.

War diese Anleitung hilfreich?

Gilt für

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

Dienste

Fehler in der Anleitung melden

Anleitungen durchsuchen