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
nanobearbeiten, 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:
| Komponente | Wofür das Panel sie braucht |
|---|---|
| PHP 8.3 + PHP-FPM | Das Panel ist in PHP geschrieben. PHP-FPM ist der Prozess, der PHP-Code für den Webserver ausführt. |
| MariaDB | Die Datenbank. Speichert Benutzer, Server, Einstellungen und Spielvorlagen. |
| Redis | Schneller In-Memory-Speicher für Cache, Anmeldungen (Sessions) und die Job-Warteschlange. |
| Nginx | Der Webserver. Nimmt Anfragen vom Browser entgegen und reicht sie an PHP-FPM weiter. |
| Composer | Der PHP-Bibliotheksmanager. Lädt die Bibliotheken herunter, die das Panel braucht. |
| Cron und der Dienst pteroq | Cron 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#
| Phase | Was Sie tun |
|---|---|
| 1. Domain | panel.example.cz auf die IP-Adresse des VPS richten. |
| 2. Firewall | Die Ports 80 und 443 öffnen. |
| 3. Abhängigkeiten | PHP 8.3, MariaDB, Redis, Nginx und Composer installieren. |
| 4. Panel | Die Panel-Dateien herunterladen, die Datenbank anlegen und .env einrichten. |
| 5. Datenbank und Admin | Die Tabellen und den ersten Administrator anlegen. |
| 6. Hintergrund | Cron und den Warteschlangendienst pteroq einrichten. |
| 7. HTTPS und Nginx | Ein Zertifikat holen und den Webserver konfigurieren. |
| 8. Prüfung | Anmelden 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.
Ö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).
Erstellen Sie bei Ihrem DNS-Anbieter einen
A-Eintrag fürpanel.example.czmit der IPv4-Adresse des VPS (zum Beispiel203.0.113.10).Erstellen Sie optional auch einen
AAAA-Eintrag mit der IPv6-Adresse des VPS (zum Beispiel2001:db8::10). Die Nginx-Konfiguration unten lauscht auch auf IPv6.Prüfen Sie auf dem VPS, dass die Domain bereits auf die richtige Stelle zeigt:
bash getent hosts panel.example.czgetent 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,443hinzu. Die SSH-Regel (Port22) 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/tcpufw 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:
apt update && apt -y upgradeapt update– lädt die aktuelle Paketliste herunter.apt -y upgrade– installiert verfügbare Updates;-ybeantwortet 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
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 curlFü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:
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 updateapt -y install lsb-release ca-certificates curl– ein Werkzeug zum Ermitteln des Release-Namens des Systems, Zertifikate für HTTPS und das Download-Werkzeugcurl.curl -sSLo … debsuryorg-archive-keyring.– lädt das Paket mit dem Signaturschlüssel des Repositorys herunter (deb -sstill,-SFehler anzeigen,-LWeiterleitungen folgen,-oin 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/– schreibt die Repository-Adresse.apt/ sources. list. d/ php. list $(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:
apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-serverUnter Debian 13 installieren Sie MariaDB und Redis aus dem Standard-Repository; sie brauchen kein zusätzliches Repository.
Was der Installationsbefehl enthält:
| Paket | Wofür |
|---|---|
php8.3, php8.3-cli | PHP 8.3 und seine Befehlszeile (für die Befehle php artisan). |
php8.3-fpm | Der 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, -zip | PHP-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-server | Der Datenbankserver. |
nginx | Der Webserver. |
redis-server | Redis. |
tar, unzip, git, curl | Entpacken von Archiven und Herunterladen; Composer nutzt sie beim Installieren von Bibliotheken. |
Prüfen Sie, dass Sie die richtige PHP-Version haben:
php -vPHP 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:
systemctl is-active mariadb redis-server nginx php8.3-fpmsystemctl 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:
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composercurl -sS https://– lädt das Composer-Installationsskript herunter.getcomposer. org/ installer | php --– übergibt das Skript zur Ausführung an PHP;--trennt die Parameter von PHP von denen des Installers.--install-dir=– wohin Composer installiert wird (ein Verzeichnis, in dem das System nach Programmen sucht)./usr/ local/ bin --filename=composer– der Programmname, sodass Sie ihn dann mit dem Befehlcomposerausfü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_ die Warnung.
Panel herunterladen#
Legen Sie ein Verzeichnis für das Panel an und wechseln Sie hinein:
bash mkdir -p /var/www/pterodactyl cd /var/www/pterodactylmkdir -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 weiterenphp artisan-Befehle darin aus.
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.gzcurl -Lo panel.tar.gz …– lädt das Archiv des neuesten Release von GitHub herunter und speichert es alspanel.tar.gz.tar -xzvf– entpackt das Archiv (xentpacken,zgzip-Format,vDateien auflisten,faus einer Datei).
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.-Rgilt 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.
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
.envnicht mit Sonderzeichen herumschlagen müssen. Speichern Sie das Passwort; Sie brauchen es gleich wieder.Melden Sie sich als Administrator an MariaDB an:
bash mariadbmariadb– der Datenbankclient. Sowohl unter Ubuntu als auch unter Debian meldet sich der Systembenutzerrootohne Passwort an MariaDB an (über Unix-Socket-Authentifizierung). Sie sehen die EingabeaufforderungMariaDB [(none)]>.
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
| Zeile | Was sie tut |
|---|---|
CREATE USER 'pterodactyl'@'127. | 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. |
exit | Verlä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/. Sie erstellen sie aus einer Vorlage, installieren die Bibliotheken und erzeugen einen Verschlüsselungsschlüssel.
Kopieren Sie die Vorlage:
bash cp .env.example .envInstallieren Sie die PHP-Bibliotheken des Panels:
bash COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloaderCOMPOSER_– lässt Composer als root laufen, ohne nachzufragen.ALLOW_ SUPERUSER=1 composer install– lädt die Bibliotheken in genau den Versionen herunter, die das Panel vorgibt (die Dateicomposer.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).
Erzeugen Sie den Verschlüsselungsschlüssel:
bash php artisan key:generate --forcephp artisan– das Befehlszeilen-Verwaltungswerkzeug des Panels.key:generate– erzeugt einen zufälligenAPP_KEYund 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.
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/.envAusgabetext APP_KEY=base64:…
Der Assistent p:environment:setup#
Ein Assistent übernimmt die Grundeinrichtung. Führen Sie ihn aus:
php artisan p:environment:setupEr stellt nacheinander die folgenden Fragen (der Standardwert steht in eckigen Klammern; bestätigen Sie ihn mit Eingabe):
| Frage | Was eintragen | Warum |
|---|---|---|
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 URL | https://panel.example.cz | Die 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 Timezone | Europe/Prague | Die Zeitzone für die Anzeige von Zeiten und für geplante Aufgaben. |
Cache Driver | redis | Wo der Cache gespeichert wird. Redis ist am schnellsten und die empfohlene Option. |
Session Driver | redis | Wo Benutzeranmeldungen gespeichert werden. |
Queue Driver | redis | Wo die Job-Warteschlange für den Dienst pteroq gespeichert wird. |
Enable UI based settings editor? | yes | Manche Einstellungen (Panel-Name, Mail, reCAPTCHA) lassen sich dann im Admin-Bereich ändern, nicht nur in .env. |
Enable sending anonymous telemetry data? | Ihre Entscheidung | Einmal täglich sendet das Panel anonyme Statistiken an seine Autoren (Anzahl der Server, Systemversion). Möchten Sie das nicht, antworten Sie mit no. |
Redis Host | 127.0.0.1 | Redis läuft auf demselben VPS. |
Redis Password | nichts, nur Eingabe | Ein lokales Redis hat nach der Installation kein Passwort und lauscht nur auf 127.0.0.1. |
Redis Port | 6379 | Der Standardport von Redis. |
Wenn Sie eine mit https:// beginnende Adresse eingeben, schaltet der Assistent von selbst sichere Cookies ein (SESSION_).
Der Assistent p:environment:database#
php artisan p:environment:database| Frage | Was eintragen | Warum |
|---|---|---|
Database Host | 127.0.0.1 | Die Datenbank läuft auf demselben VPS. Geben Sie nicht localhost ein (siehe oben). |
Database Port | 3306 | Der Standardport von MariaDB. |
Database Name | panel | Die Datenbank aus dem vorherigen Abschnitt. |
Database Username | pterodactyl | Der Benutzer aus dem vorherigen Abschnitt. |
Database Password | das 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:
php artisan p:environment:mail| Frage | Was eintragen | Warum |
|---|---|---|
Which driver should be used for sending emails? | smtp | Der Versand über den SMTP-Server Ihres E-Mail-Anbieters ist am zuverlässigsten. |
SMTP Host | die Adresse des SMTP-Servers, zum Beispiel smtp.example.cz | Sie finden sie in den Hilfeseiten Ihres E-Mail-Anbieters. |
SMTP Port | 587 (oder 465) | 587 wird mit TLS-Verschlüsselung (STARTTLS) verwendet, 465 mit SSL-Verschlüsselung. |
SMTP Username | die vollständige E-Mail-Adresse des Postfachs | Der Anmeldename des Postfachs. |
SMTP Password | das Passwort des Postfachs | Manche Dienste verlangen ein separates „App-Passwort“. |
Encryption method to use | tls für Port 587, ssl für 465 | Muss zum Port passen, sonst scheitert die Verbindung. |
Email address emails should originate from | zum Beispiel [email protected] | Die Absenderadresse. Sie sollte zur Domain des Postfachs gehören, sonst landen Nachrichten im Spam. |
Name that emails should appear from | zum Beispiel Game Panel | Der 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/); führen Sie nach einer manuellen Änderung php artisan config:clear aus.
| Einstellung | Was sie tut | Empfohlener Wert | Wann ändern |
|---|---|---|---|
APP_URL | Die öffentliche Adresse des Panels. | https://panel.example.cz | Wenn sich die Domain ändert (dann auch in Nginx und im Zertifikat). |
APP_KEY | Der Verschlüsselungsschlüssel für Daten in der Datenbank. | erzeugt, nie ändern | Nie. Bei einer Wiederherstellung aus einem Backup den ursprünglichen zurücksetzen. |
APP_TIMEZONE | Die Zeitzone des Panels. | Europe/Prague | Wenn die Admins in einer anderen Zeitzone sind. |
APP_ENVIRONMENT_ONLY | true = Einstellungen nur in .env, false = auch im Admin-Bereich. | false | Wenn Sie Einstellungsänderungen über das Web verhindern möchten. |
DB_HOST, DB_PORT | Wo die Datenbank des Panels läuft. | 127.0.0.1, 3306 | Wenn Sie die Datenbank woandershin verschieben. |
DB_DATABASE, DB_USERNAME, DB_PASSWORD | Die Datenbank des Panels und die Zugangsdaten. | panel, pterodactyl, ein starkes Passwort | Wenn Sie das Passwort des Benutzers in MariaDB ändern. |
REDIS_HOST, REDIS_PASSWORD, REDIS_PORT | Die Redis-Verbindung. | 127.0.0.1, null, 6379 | Wenn Sie ein Redis-Passwort setzen. |
CACHE_DRIVER, SESSION_DRIVER, QUEUE_CONNECTION | Wo Cache, Anmeldungen und Warteschlange gespeichert werden. | redis | Praktisch nie. |
SESSION_SECURE_COOKIE | Anmelde-Cookies werden nur über HTTPS gesendet. | true | Nie, solange das Panel auf HTTPS läuft. |
MAIL_* | E-Mail-Versand (Server, Port, Verschlüsselung, Absender). | je nach Anbieter | Wenn Sie das Postfach wechseln. |
MAIL_EHLO_DOMAIN | Der Name, mit dem sich das Panel beim SMTP-Server vorstellt. | panel.example.cz | Wenn zum Beispiel Gmail Ihre E-Mails wegen localhost ablehnt. |
TRUSTED_PROXIES | Proxy-Adressen, denen das Panel vertraut (Cloudflare, ein weiteres Nginx). | leer | Wenn das Panel hinter einem Proxy läuft; siehe Panel hinter Cloudflare. |
PTERODACTYL_ | Senden anonymer Telemetrie. | Ihre Entscheidung | false schaltet die Telemetrie aus. |
Datenbanktabellen und der erste Administrator#
Legen Sie die Tabellen an und laden Sie die Standarddaten:
bash php artisan migrate --seed --forcemigrate– legt alle Tabellen in der Datenbankpanelan.--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.
Legen Sie das Admin-Konto an:
bash php artisan p:user:make
| Frage | Was eintragen |
|---|---|
Is this user an administrator? | yes – das Konto erhält Zugriff auf den Admin-Bereich. |
Email Address | Ihre E-Mail-Adresse; wird für Anmeldung und Passwort-Zurücksetzung verwendet. |
Username | Der Anmeldename, zum Beispiel jan. |
First Name, Last Name | Vor- und Nachname (im Panel angezeigt). |
Password | Mindestens 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:
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).
Öffnen Sie die Crontab von root:
bash crontab -eBeim ersten Lauf fragt er, welcher Editor verwendet werden soll. Wählen Sie
nano(seine Nummer eingeben und Eingabe drücken). Meldet das Systemcrontab: command not found, fehlt cron. Installieren Sie es mitapt -y install cronund wiederholen Sie diesen Schritt.Fügen Sie am Ende der Datei diese Zeile hinzu:
text * * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1Speichern Sie (Strg+O, Eingabe) und schließen Sie den Editor (Strg+X). Sie sehen
crontab: installing new crontab.
| Teil der Zeile | Bedeutung |
|---|---|
* * * * * | Minute, Stunde, Tag des Monats, Monat, Wochentag. Fünf Sternchen = jede Minute. |
php /var/ | Führt den Scheduler des Panels aus, der selbst entscheidet, welche Aufgaben fällig sind. |
>> /dev/null 2>&1 | Verwirft 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.
Erstellen Sie die Dienstdatei:
bash nano /etc/systemd/system/pteroq.serviceFügen Sie den Inhalt ein:
/etc/ systemd/ inisystem/ pteroq.service # 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.targetSpeichern und schließen Sie den Editor.
| Zeile | Was sie tut |
|---|---|
Description= | Die Dienstbeschreibung, die Sie in systemctl status sehen. |
After= | Der Dienst startet erst nach Redis, aus dem er die Warteschlange liest. |
User=www-data, Group=www-data | Die Warteschlange läuft als derselbe Benutzer wie die Website, sodass beide dieselben Dateiberechtigungen haben. |
Restart=always | Endet der Prozess (mit Fehler oder normal), startet systemd ihn erneut. |
ExecStart=… queue:work | Startet die Verarbeitung der Warteschlange. --queue= 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=30 | Stürzt der Dienst mehr als 30-mal in 180 Sekunden ab, hört systemd auf, ihn neu zu starten (Schutz vor einer Endlosschleife). |
RestartSec=5s | Wartet 5 Sekunden vor dem Neustart. |
WantedBy= | Der Dienst startet bei jedem Booten des VPS (nach enable). |
Aktivieren Sie Redis und die Warteschlange beim Booten und starten Sie sie sofort:
bash systemctl enable --now redis-server systemctl enable --now pteroq.serviceenable– schaltet den automatischen Start nach einem Neustart des VPS ein.--now– startet den Dienst auch sofort.
Prüfen Sie den Status:
bash systemctl status pteroqSie 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.
Installieren Sie Certbot und sein Nginx-Plugin:
bash apt -y install certbot python3-certbot-nginxcertbot– 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.
Holen Sie das Zertifikat. Ersetzen Sie
panel.example.czdurch Ihre Domain:bash certbot certonly --nginx -d panel.example.czcertonly– 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.
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 mitY; 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- E-Mail (
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.shcat > … <<'EOF' … EOF– schreibt die Zeilen zwischen<<'EOF'undEOFin 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 Verzeichnisrenewal-hooks/deploynur ausführbare Dateien aus.
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-runsystemctl list-timers– listet geplante Timer auf;certbot.timersollte 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#
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 insites-available. Andernfalls würde die Standard-Website Port 80 statt des Panels bedienen.
- Das löscht nur den Link in
Erstellen Sie die Panel-Konfiguration:
bash nano /etc/nginx/sites-available/pterodactyl.confFügen Sie den Inhalt ein und ersetzen Sie alle vier Vorkommen von
panel.example.czdurch Ihre Domain:/etc/ nginx/ nginxsites-available/ pterodactyl.conf 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:
| Direktive | Was sie tut | Wann ä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 80 | Nimmt 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_name | Die Domain, für die dieser Block gilt. | Wenn sich die Domain ändert. |
root /var/ | 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_log | Wohin 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_key | Pfade 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_ | Erlaubte 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_files | Sendet 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:/ | 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_FILENAME | Standardü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_buffers | Die 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 300 | Wie lange Nginx auf PHP wartet (langsame Vorgänge). | Nie. |
location ~ /\.ht + deny all | Blockiert 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.
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 nginxln -s– erstellt einen Link auf die Datei insites-enabled; Nginx lädt nur Konfigurationen insites-enabled.nginx -t– prüft die Syntax. Es muss mit der Zeiletest is successfulenden. 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#
- Öffnen Sie
https://panel.example.czin Ihrem Browser. Sie sehen die Anmeldeseite des Panels mit einem Schloss (gültiges Zertifikat) in der Adressleiste. - Melden Sie sich mit Benutzername oder E-Mail-Adresse und Passwort des Admins an.
- Klicken Sie oben rechts auf das Zahnradsymbol (Admin-Bereich). Legen Sie im Bereich Settings den Panel-Namen fest (Company Name).
- 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:
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
activeausgeben. curl -sIlädt nur die Antwort-Header herunter; die erste Zeile lautetHTTP/2 302(Weiterleitung zur Anmeldung) oderHTTP/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.
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.
Schalten Sie den Eintrag
panel.example.czauf Proxied.Fügen Sie die IP-Bereiche von Cloudflare in einer einzigen Zeile zu
.envhinzu. 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 HeaderX-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/ inipterodactyl/ .env 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::/32TRUSTED_PROXIES– eine Liste von Adressen und Bereichen (durch Kommas getrennt, ohne Leerzeichen), von denen das PanelX-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.
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:
mariadb-dump --single-transaction panel > /root/panel-$(date +%F).sql
cp /var/www/pterodactyl/.env /root/pterodactyl-env-$(date +%F).bakmariadb-dump --single-transaction panel– exportiert die Datenbankpanelin eine SQL-Datei, ohne Tabellen zu sperren.$(date +%F)– fügt das heutige Datum (zum Beispiel2026-10-01) in den Dateinamen ein.
Führen Sie dann das Update aus:
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| Befehl | Was er tut |
|---|---|
php artisan down | Schaltet den Wartungsmodus ein; Benutzer sehen während des Updates eine Wartungsseite statt Fehlern. |
curl -L … | tar -xzv | Lä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:clear | Leert kompilierte Vorlagen und den Konfigurationscache, damit die neuen geladen werden. |
migrate --seed --force | Aktualisiert 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:restart | Weist den Dienst pteroq an, nach Abschluss seines aktuellen Jobs den neuen Code zu laden. |
php artisan up | Schaltet 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:
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:
tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).logtail -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 Siechown -R www-data:www-data /var/www/pterodactyl/*erneut aus.No application encryption key has been specified.–APP_KEYfehlt. Führen Sie bei der Erstinstallationphp artisan key:generate --forceaus. 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.envist 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:
systemctl status pteroq
journalctl -u pteroq -n 50journalctl -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:
php /var/www/pterodactyl/artisan schedule:clear-cache
systemctl restart pteroqNginx 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:
update-alternatives --set php /usr/bin/php8.3
php -vupdate-alternatives --set php …– legt fest, welche Version der Befehlphpausfü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.1und Rechte nur auf die Datenbankpanel. - Sie haben
APP_KEYaus.envaußerhalb des Servers gespeichert; ohne ihn lassen sich verschlüsselte Daten nicht wiederherstellen. - Cron führt jede Minute
schedule:runaus; der Dienstpteroqverarbeitet 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.
Weiterführende Links#
- Pterodactyl: Getting Started (öffnet sich in einem neuen Fenster)
- Pterodactyl: Webserver Configuration (öffnet sich in einem neuen Fenster)
- Pterodactyl: Updating the Panel (öffnet sich in einem neuen Fenster)
- Pterodactyl: Additional Configuration (öffnet sich in einem neuen Fenster)
- Pterodactyl: Troubleshooting (öffnet sich in einem neuen Fenster)
- Certbot: User Guide (öffnet sich in einem neuen Fenster)