Przejdź do treści
Aktualny kupon:10% zniżkiUżyj w zamówieniu

Pterodactyl Panel: kompletna instalacja na własnym VPS

Zainstaluj Pterodactyl Panel na Ubuntu 24.04 lub Debianie 13: PHP 8.3, MariaDB, Redis, Nginx z HTTPS, worker kolejki, cron i pierwszy admin. Każdy krok i opcja objaśnione.

  • ekspert
  • ~90 min
  • Zaktualizowano 9.10.2026

Zainstalujemy na Twoim VPS Pterodactyl Panel, interfejs WWW do zarządzania serwerami gier. Po zakończeniu będzie działać pod https://panel.example.cz z certyfikatem Let's Encrypt, kolejką zadań, cronem i Twoim kontem admina.

Czego potrzebujesz

  • VPS w StormHost ze świeżą instalacją Ubuntu 24.04 lub Debiana 13
  • Domena lub subdomena dla panelu (w tym poradniku panel.example.cz) i dostęp do jej ustawień DNS
  • Połączenie SSH jako root (poradnik)
  • Podstawowa obsługa terminala: edycja plików w edytorze nano, kopiowanie poleceń
  • Około 90 minut

Jak to działa#

Pterodactyl ma dwie części. Panel to aplikacja WWW (PHP, framework Laravel), w której tworzysz użytkowników i serwery i w której gracze sterują konsolą. Wings to usługa, która faktycznie uruchamia serwery gier w kontenerach Dockera. Panel i Wings mogą działać na tym samym VPS. Ten poradnik instaluje Panel; Wings dodasz w kolejnym poradniku Pterodactyl Wings.

Panel potrzebuje kilku innych programów:

SkładnikDo czego Panel go potrzebuje
PHP 8.3 + PHP-FPMPanel jest napisany w PHP. PHP-FPM to proces, który wykonuje kod PHP dla serwera WWW.
MariaDBBaza danych. Przechowuje użytkowników, serwery, ustawienia i szablony gier.
RedisSzybki magazyn w pamięci dla cache, logowań (sesji) i kolejki zadań.
NginxSerwer WWW. Przyjmuje żądania z przeglądarki i przekazuje je do PHP-FPM.
ComposerMenedżer bibliotek PHP. Pobiera biblioteki, których potrzebuje Panel.
Cron i usługa pteroqCron co minutę uruchamia harmonogram Panelu; pteroq przetwarza w tle kolejkę zadań (e-maile, zaplanowane zadania serwerów).

Sam Panel jest lekki. Jeśli na tym samym VPS będą działać serwery gier, RAM planuj głównie pod nie i dodaj rezerwę na system, bazę danych i Panel (mniej więcej 1–⁠2 GB).

Czy naprawdę potrzebujesz własnego panelu?

Pterodactyl opłaca się, gdy chcesz prowadzić kilka serwerów gier na jednym VPS, zarządzać nimi przez WWW i dawać dostęp innym osobom. Jeśli wystarczy Ci jeden serwer gier, możesz zamówić go bezpośrednio jako serwer gier i zarządzać nim w strefie klienta bez instalowania czegokolwiek.

Plan instalacji#

FazaCo zrobisz
1. DomenaSkierujesz panel.example.cz na adres IP VPS.
2. FirewallOtworzysz porty 80 i 443.
3. ZależnościZainstalujesz PHP 8.3, MariaDB, Redis, Nginx i Composer.
4. PanelPobierzesz pliki Panelu, utworzysz bazę danych i skonfigurujesz .env.
5. Baza danych i adminUtworzysz tabele i pierwszego administratora.
6. TłoSkonfigurujesz cron i usługę kolejki pteroq.
7. HTTPS i NginxUzyskasz certyfikat i skonfigurujesz serwer WWW.
8. KontrolaZalogujesz się i sprawdzisz, że wszystko działa.

Domena i DNS#

Panel potrzebuje własnej domeny lub subdomeny. Certyfikaty HTTPS są wystawiane dla domen, nie dla adresów IP.

  1. W strefie klienta otwórz Moje usługi, kliknij swój VPS i w zakładce Sieć skopiuj adres IPv4 (i opcjonalnie adres IPv6).

  2. U dostawcy DNS utwórz rekord A dla panel.example.cz z adresem IPv4 VPS (na przykład 203.0.113.10).

  3. Opcjonalnie utwórz też rekord AAAA z adresem IPv6 VPS (na przykład 2001:db8::10). Poniższa konfiguracja Nginx nasłuchuje także na IPv6.

  4. Na VPS sprawdź, czy domena już wskazuje we właściwe miejsce:

    bash
    getent hosts panel.example.cz
    • getent hosts – pyta systemowy DNS o adres domeny i go wypisuje.

    Zobaczysz linię z adresem IP swojego VPS. Jeśli nic się nie wypisuje, poczekaj kilka minut (zależnie od TTL rekordu) i spróbuj ponownie.

Cloudflare: szara chmurka tylko podczas instalacji

Jeśli domeną zarządzasz w Cloudflare, zostaw rekord ustawiony na DNS only (szara chmurka). Zweryfikujesz tak certyfikat i pierwsze logowanie bezpośrednio. Na Proxied (pomarańczowa chmurka) możesz przełączyć na końcu; zobacz Panel za Cloudflare. Konfiguracja Cloudflare: Domena na VPS i Cloudflare.

Firewall#

Przeglądarka łączy się z Panelem na porcie 443 (HTTPS). Port 80 (HTTP) jest potrzebny do walidacji domeny przy wystawianiu certyfikatu i do przekierowania na HTTPS.

  • Firewall w strefie klienta: jeśli ruch przychodzący jest ustawiony na Blokuj wszystko poza dozwolonym, dodaj reguły Przychodzący · Zezwól · TCP · port 80,443. Reguła SSH (port 22) musi zostać. Poradnik: Firewall w strefie klienta.

  • UFW na VPS: jeśli go używasz, zezwól na porty także tam:

    bash
    ufw allow 80/tcp
    ufw allow 443/tcp
    • ufw allow 80/tcp – zezwala na przychodzące połączenia TCP na port 80.
    • ufw allow 443/tcp – to samo dla portu 443.

Porty dla Wings (8080 i 2022) i serwerów gier otworzysz w poradniku Pterodactyl Wings.

Instalacja zależności#

Najpierw zaktualizuj system, aby instalować na aktualnej bazie:

bash
apt update && apt -y upgrade
  • apt update – pobiera aktualną listę pakietów.
  • apt -y upgrade – instaluje dostępne aktualizacje; -y odpowiada „tak” na potwierdzenie.

Następnie zainstaluj zależności. Kroki zależą od systemu: Ubuntu 24.04 ma PHP 8.3 bezpośrednio w repozytorium, natomiast domyślne repozytorium Debiana 13 ma PHP 8.4, którego Panel nie obsługuje (aktualny Panel wymaga PHP 8.2 lub 8.3). Na Debianie dodasz więc repozytorium packages.sury.org, które zaleca także oficjalna dokumentacja Pterodactyla.

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

Na Ubuntu 24.04 nie dodawaj żadnego repozytorium PHP. Oficjalna dokumentacja wspomina repozytorium ppa:ondrej/php tylko dla starszego Ubuntu 22.04.

Debian 13

Najpierw dodaj repozytorium z PHP 8.3:

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 – narzędzie do ustalenia nazwy wydania systemu, certyfikaty dla HTTPS i narzędzie do pobierania curl.
  • curl -sSLo … debsuryorg-archive-keyring.deb – pobiera pakiet z kluczem podpisującym repozytorium (-s cicho, -S pokazuj błędy, -L podążaj za przekierowaniami, -o zapisz do pliku).
  • dpkg -i … – instaluje klucz do /usr/share/keyrings/; apt używa go potem do weryfikacji pakietów z repozytorium.
  • echo "deb …" > /etc/apt/sources.list.d/php.list – zapisuje adres repozytorium. $(lsb_release -sc) zastępuje się nazwą kodową systemu (trixie).
  • apt update – wczytuje pakiety z nowego repozytorium.

Następnie zainstaluj zależności:

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

Na Debianie 13 MariaDB i Redis instaluj z domyślnego repozytorium; nie potrzebują dodatkowego.

Co zawiera polecenie instalacji:

PakietDo czego służy
php8.3, php8.3-cliPHP 8.3 i jego wiersz poleceń (dla poleceń php artisan).
php8.3-fpmProces, przez który Nginx wykonuje PHP. Nasłuchuje na sockecie /run/php/php8.3-fpm.sock.
php8.3-common, -gd, -mysql, -mbstring, -bcmath, -xml, -curl, -zipRozszerzenia PHP wymagane przez Panel: obrazy, połączenia z MariaDB, obsługa tekstu UTF-⁠8, precyzyjna matematyka, XML, żądania HTTP i archiwa ZIP. Zapis php8.3-{common,cli,…} to skrót basha rozwijany do php8.3-common php8.3-cli ….
mariadb-serverSerwer bazy danych.
nginxSerwer WWW.
redis-serverRedis.
tar, unzip, git, curlRozpakowywanie archiwów i pobieranie; Composer używa ich przy instalacji bibliotek.

Sprawdź, czy masz właściwą wersję PHP:

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

Pierwsza linia musi mówić PHP 8.3. Jeśli widzisz PHP 8.4, zobacz Rozwiązywanie problemów.

Sprawdź, czy usługi działają:

bash
systemctl is-active mariadb redis-server nginx php8.3-fpm
  • systemctl is-active – wypisuje stan każdej wymienionej usługi.

Zobaczysz cztery razy active. Jeśli któraś jest inactive, uruchom ją i włącz przy starcie przez systemctl enable --now <NAZWA_USLUGI>, na przykład systemctl enable --now redis-server.

Composer#

Composer pobiera biblioteki PHP Panelu. Zainstaluj go oficjalnym instalatorem:

bash
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
  • curl -sS https://getcomposer.org/installer – pobiera skrypt instalacyjny Composera.
  • | php -- – przekazuje skrypt do wykonania przez PHP; -- oddziela parametry PHP od parametrów instalatora.
  • --install-dir=/usr/local/bin – gdzie Composer się instaluje (katalog, w którym system szuka programów).
  • --filename=composer – nazwa programu, więc uruchamiasz go potem poleceniem composer.

Kontrola: composer --version wypisuje Composer version 2.…. Jako root zobaczysz też ostrzeżenie Do not run Composer as root/super user! i ewentualnie pytanie Continue as root/super user [yes]?. Potwierdź je klawiszem Enter. Podczas instalacji Panelu niżej zmienna COMPOSER_ALLOW_SUPERUSER=1 wycisza ostrzeżenie.

Pobieranie Panelu#

  1. Utwórz katalog dla Panelu i przejdź do niego:

    bash
    mkdir -p /var/www/pterodactyl
    cd /var/www/pterodactyl
    • mkdir -p – tworzy katalog (łącznie z nadrzędnymi); jeśli już istnieje, nie wypisuje błędu.
    • cd – przechodzi do katalogu. Wszystkie dalsze polecenia php artisan uruchamiaj w nim.
  2. Pobierz i rozpakuj najnowsze wydanie Panelu:

    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 … – pobiera archiwum najnowszego wydania z GitHuba i zapisuje je jako panel.tar.gz.
    • tar -xzvf – rozpakowuje archiwum (x rozpakuj, z format gzip, v wypisuj pliki, f z pliku).
  3. Ustaw uprawnienia katalogów, do których Panel pisze:

    bash
    chmod -R 755 storage/* bootstrap/cache/
    • chmod -R 755 – właściciel może czytać, pisać i wchodzić do katalogów; wszyscy pozostali tylko czytać i wchodzić. -R dotyczy całej zawartości.
    • storage/ – logi, cache i przesłane pliki; bootstrap/cache/ – skompilowana konfiguracja.

Baza danych dla Panelu#

Panel potrzebuje własnej bazy danych i własnego użytkownika. Autorzy Pterodactyla wprost zabraniają używania dla Panelu użytkownika bazy root: gdyby ktoś przejął Panel, dostałby dostęp do wszystkich baz na VPS.

  1. Wygeneruj silne hasło dla użytkownika bazy, na przykład generatorem haseł. Używaj tylko liter i cyfr (co najmniej 24 znaki), aby nie borykać się ze znakami specjalnymi w SQL i w .env. Zapisz hasło; za chwilę będzie znów potrzebne.

  2. Zaloguj się do MariaDB jako administrator:

    bash
    mariadb
    • mariadb – klient bazy danych. Zarówno na Ubuntu, jak i na Debianie systemowy użytkownik root loguje się do MariaDB bez hasła (przez uwierzytelnianie unix socket). Zobaczysz znak zachęty MariaDB [(none)]>.
  3. Utwórz użytkownika i bazę danych. Zamiast <HASLO_DB_PANELU> wstaw hasło z kroku 1 (zachowaj pojedyncze cudzysłowy wokół niego):

    SQL
    CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY '<HASLO_DB_PANELU>';
    CREATE DATABASE panel;
    GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1';
    exit
LiniaCo robi
CREATE USER 'pterodactyl'@'127.0.0.1' …Tworzy użytkownika pterodactyl, który może logować się tylko z 127.0.0.1, czyli tylko z tego VPS przez TCP. Nikt nie połączy się tym kontem z zewnątrz.
IDENTIFIED BY '…'Ustawia hasło użytkownika.
CREATE DATABASE panel;Tworzy pustą bazę panel.
GRANT ALL PRIVILEGES ON panel.* …Daje użytkownikowi wszystkie uprawnienia, ale tylko do bazy panel (panel.* = wszystkie jej tabele). Nie ma dostępu do innych baz.
exitWychodzi z klienta MariaDB.

Dlaczego 127.0.0.1, a nie localhost

Panel łączy się z bazą przez TCP pod 127.0.0.1. Autorzy Pterodactyla wprost odradzają localhost, bo PHP próbuje wtedy połączenia przez socket, co powoduje problemy. Użytkownik bazy musi więc dopuszczać host 127.0.0.1.

Konfiguracja środowiska (.env)#

Ustawienia Panelu są w /var/www/pterodactyl/.env. Utworzysz go z szablonu, zainstalujesz biblioteki i wygenerujesz klucz szyfrowania.

  1. Skopiuj szablon:

    bash
    cp .env.example .env
  2. Zainstaluj biblioteki PHP Panelu:

    bash
    COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
    • COMPOSER_ALLOW_SUPERUSER=1 – pozwala Composerowi działać jako root bez pytania.
    • composer install – pobiera biblioteki dokładnie w wersjach określonych przez Panel (plik composer.lock).
    • --no-dev – pomija narzędzia deweloperskie niepotrzebne na serwerze produkcyjnym.
    • --optimize-autoloader – przygotowuje szybsze wczytywanie klas PHP.

    Instalacja trwa kilka minut i kończy się bez komunikatów o błędach (żółte ostrzeżenie o przestarzałych pakietach jest w porządku).

  3. Wygeneruj klucz szyfrowania:

    bash
    php artisan key:generate --force
    • php artisan – narzędzie Panelu do zarządzania z wiersza poleceń.
    • key:generate – tworzy losowy APP_KEY i zapisuje go w .env.
    • --force – wykonuje polecenie bez potwierdzenia (Panel działa w trybie produkcyjnym, gdzie inaczej by zapytał).

Od razu zarchiwizuj APP_KEY

Panel używa APP_KEY do szyfrowania wrażliwych danych w bazie (na przykład kluczy API i haseł database hostów). Jeśli go stracisz, danych nie da się odszyfrować, nawet z kopii zapasowej bazy. key:generate uruchamiaj tylko przy pierwszej instalacji. Na Panelu, który ma już dane, nowy klucz oznaczałby utratę dostępu do nich.

  1. Wyświetl klucz i zapisz całą linię gdzieś poza serwerem (w menedżerze haseł lub zaszyfrowanym pliku na komputerze):

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

Kreator p:environment:setup#

Podstawową konfigurację załatwia kreator. Uruchom go:

bash
php artisan p:environment:setup

Zadaje po kolei następujące pytania (wartość domyślna jest w nawiasach kwadratowych; potwierdzasz ją klawiszem Enter):

PytanieCo wpisaćDlaczego
E-mail autora (… Author Email)Twój e-mail, na przykład [email protected]Używany jako autor szablonów gier eksportowanych z Panelu. Musi mieć poprawny format e-maila, inaczej kreator się nie powiedzie.
Application URLhttps://panel.example.czAdres Panelu łącznie z https://. Używany w linkach w e-mailach i przy generowaniu URL. Bez https:// linki będą błędne.
Application TimezoneEurope/PragueStrefa czasowa do wyświetlania czasów i zaplanowanych zadań (dla Polski możesz użyć Europe/Warsaw).
Cache DriverredisGdzie przechowywać cache. Redis jest najszybszy i zalecany.
Session DriverredisGdzie przechowywać logowania użytkowników.
Queue DriverredisGdzie przechowywać kolejkę zadań dla usługi pteroq.
Enable UI based settings editor?yesNiektóre ustawienia (nazwa Panelu, poczta, reCAPTCHA) można wtedy zmieniać w części administracyjnej, nie tylko w .env.
Enable sending anonymous telemetry data?Twoja decyzjaRaz dziennie Panel wysyła autorom anonimowe statystyki (liczba serwerów, wersja systemu). Jeśli tego nie chcesz, odpowiedz no.
Redis Host127.0.0.1Redis działa na tym samym VPS.
Redis Passwordnic, tylko EnterLokalny Redis po instalacji nie ma hasła i nasłuchuje tylko na 127.0.0.1.
Redis Port6379Domyślny port Redisa.

Gdy wpiszesz adres zaczynający się od https://, kreator sam włącza bezpieczne ciasteczka (SESSION_SECURE_COOKIE=true).

Kreator p:environment:database#

bash
php artisan p:environment:database
PytanieCo wpisaćDlaczego
Database Host127.0.0.1Baza działa na tym samym VPS. Nie wpisuj localhost (zobacz wyżej).
Database Port3306Domyślny port MariaDB.
Database NamepanelBaza z poprzedniej sekcji.
Database UsernamepterodactylUżytkownik z poprzedniej sekcji.
Database Passwordhasło <HASLO_DB_PANELU>Nie wyświetla się podczas wpisywania.

Kreator od razu próbuje się połączyć. Jeśli dane są błędne, wypisuje Unable to connect to the MySQL server…, niczego nie zapisuje i pyta, czy chcesz spróbować ponownie.

Kreator p:environment:mail#

Panel wysyła e-maile (zaproszenia dla nowych użytkowników, resety haseł). Bez ustawień poczty Panel działa, ale te e-maile nie wyjdą. Możesz skonfigurować to także później tym samym poleceniem:

bash
php artisan p:environment:mail
PytanieCo wpisaćDlaczego
Which driver should be used for sending emails?smtpWysyłanie przez serwer SMTP dostawcy poczty jest najpewniejsze.
SMTP Hostadres serwera SMTP, na przykład smtp.example.czZnajdziesz go na stronach pomocy dostawcy poczty.
SMTP Port587 (lub 465)587 używa się z szyfrowaniem TLS (STARTTLS), 465 z szyfrowaniem SSL.
SMTP Usernamepełny adres e-mail skrzynkiNazwa logowania do skrzynki.
SMTP Passwordhasło do skrzynkiNiektóre usługi wymagają osobnego „hasła aplikacji”.
Encryption method to usetls dla portu 587, ssl dla 465Musi pasować do portu, inaczej połączenie się nie powiedzie.
Email address emails should originate fromna przykład [email protected]Adres nadawcy. Powinien należeć do domeny skrzynki, inaczej wiadomości lądują w spamie.
Name that emails should appear fromna przykład Game PanelNazwa nadawcy widoczna w e-mailach.

Ważne klucze w .env#

Kreatory zapisują te wartości w .env. Plik możesz też edytować ręcznie (nano /var/www/pterodactyl/.env); po ręcznej edycji uruchom php artisan config:clear.

UstawienieCo robiZalecana wartośćKiedy zmieniać
APP_URLPubliczny adres Panelu.https://panel.example.czPrzy zmianie domeny (wtedy także w Nginx i certyfikacie).
APP_KEYKlucz szyfrowania danych w bazie.wygenerowany, nigdy go nie zmieniajNigdy. Przy przywracaniu z kopii przywróć pierwotny.
APP_TIMEZONEStrefa czasowa Panelu.Europe/PragueGdy admini są w innej strefie czasowej.
APP_ENVIRONMENT_ONLYtrue = ustawienia tylko w .env, false = także w części administracyjnej.falseGdy chcesz zablokować zmiany ustawień z WWW.
DB_HOST, DB_PORTGdzie działa baza Panelu.127.0.0.1, 3306Gdy przenosisz bazę gdzie indziej.
DB_DATABASE, DB_USERNAME, DB_PASSWORDBaza Panelu i dane logowania.panel, pterodactyl, silne hasłoGdy zmienisz hasło użytkownika w MariaDB.
REDIS_HOST, REDIS_PASSWORD, REDIS_PORTPołączenie z Redisem.127.0.0.1, null, 6379Gdy ustawisz hasło Redisa.
CACHE_DRIVER, SESSION_DRIVER, QUEUE_CONNECTIONGdzie przechowywane są cache, logowania i kolejka.redisPraktycznie nigdy.
SESSION_SECURE_COOKIECiasteczka logowania wysyłane tylko przez HTTPS.trueNigdy, dopóki Panel działa na HTTPS.
MAIL_*Wysyłanie e-maili (serwer, port, szyfrowanie, nadawca).zależnie od dostawcyGdy zmienisz skrzynkę.
MAIL_EHLO_DOMAINNazwa, którą Panel przedstawia się serwerowi SMTP.panel.example.czGdy na przykład Gmail odrzuca Twoje e-maile z powodu localhost.
TRUSTED_PROXIESAdresy proxy, którym Panel ufa (Cloudflare, inny Nginx).pusteGdy Panel działa za proxy; zobacz Panel za Cloudflare.
PTERODACTYL_TELEMETRY_ENABLEDWysyłanie anonimowej telemetrii.Twoja decyzjafalse wyłącza telemetrię.

Tabele w bazie danych i pierwszy administrator#

  1. Utwórz tabele i wczytaj dane domyślne:

    bash
    php artisan migrate --seed --force
    • migrate – tworzy wszystkie tabele w bazie panel.
    • --seed – wypełnia je danymi domyślnymi, łącznie z szablonami gier (Minecraft, Rust i inne).
    • --force – wykonuje polecenie bez potwierdzenia w trybie produkcyjnym.

    Polecenie może trwać kilka minut. Nie przerywaj go, inaczej baza zostanie utworzona w połowie.

  2. Utwórz konto admina:

    bash
    php artisan p:user:make
PytanieCo wpisać
Is this user an administrator?yes – konto dostaje dostęp do części administracyjnej.
Email AddressTwój e-mail; używany do logowania i resetów hasła.
UsernameNazwa logowania, na przykład jan.
First Name, Last NameImię i nazwisko (pokazywane w Panelu).
PasswordCo najmniej 8 znaków, co najmniej jedna wielka litera i jedna cyfra. Nie wyświetla się podczas wpisywania.

Na końcu zobaczysz tabelę z danymi konta i wierszem Admin | Yes.

Uprawnienia plików#

Pliki Panelu należą teraz do roota. Serwer WWW działa jako użytkownik www-data i musi pisać do katalogów storage i bootstrap/cache:

bash
chown -R www-data:www-data /var/www/pterodactyl/*
  • chown -R – zmienia właściciela plików i całej zawartości katalogów.
  • www-data:www-data – użytkownik i grupa, jako które na Ubuntu i Debianie działają Nginx i PHP-FPM.

Po każdym poleceniu artisan uruchomionym jako root

Polecenia php artisan uruchomione jako root mogą tworzyć pliki (na przykład logi), których www-data potem nie może nadpisać. Jeśli po pracy w terminalu dostaniesz błąd 500, uruchom ponownie powyższe polecenie chown.

Cron i kolejka zadań#

Cron#

Cron co minutę uruchamia harmonogram Panelu (czyszczenie starych logowań, zaplanowane zadania serwerów).

  1. Otwórz crontab roota:

    bash
    crontab -e

    Przy pierwszym uruchomieniu pyta, którego edytora użyć. Wybierz nano (wpisz jego numer i naciśnij Enter). Jeśli system mówi crontab: command not found, brakuje crona. Zainstaluj go przez apt -y install cron i powtórz ten krok.

  2. Dodaj tę linię na końcu pliku:

    text
    * * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1
  3. Zapisz (Ctrl+O, Enter) i zamknij edytor (Ctrl+X). Zobaczysz crontab: installing new crontab.

Część liniiZnaczenie
* * * * *Minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia. Pięć gwiazdek = co minutę.
php /var/www/pterodactyl/artisan schedule:runUruchamia harmonogram Panelu, który sam decyduje, które zadania są na czasie.
>> /dev/null 2>&1Odrzuca wyjście i błędy, aby cron nie wysyłał e-maila co minutę.

Usługa kolejki pteroq#

Kolejka obsługuje pracę w tle: wysyłanie e-maili i zadania, które użytkownicy planują dla swoich serwerów (sekcja Schedules, na przykład nocny restart lub kopia zapasowa). Bez niej e-maile nie wychodzą, a zaplanowane zadania się nie uruchamiają.

  1. Utwórz plik usługi:

    bash
    nano /etc/systemd/system/pteroq.service
  2. Wklej zawartość:

    /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. Zapisz i zamknij edytor.

LiniaCo robi
Description=Opis usługi widoczny w systemctl status.
After=redis-server.serviceUsługa startuje dopiero po Redisie, z którego czyta kolejkę.
User=www-data, Group=www-dataKolejka działa jako ten sam użytkownik co strona, więc obie mają te same uprawnienia do plików.
Restart=alwaysGdy proces się zakończy (z błędem lub normalnie), systemd uruchamia go ponownie.
ExecStart=… queue:workRozpoczyna przetwarzanie kolejki. --queue=high,standard,low ustala kolejność kolejek według priorytetu, --sleep=3 = czekaj 3 sekundy, gdy kolejka jest pusta, --tries=3 = nieudane zadanie powtórz najwyżej trzy razy.
StartLimitInterval=180, StartLimitBurst=30Jeśli usługa zawiesi się więcej niż 30 razy w 180 sekund, systemd przestaje ją restartować (ochrona przed nieskończoną pętlą).
RestartSec=5sCzeka 5 sekund przed restartem.
WantedBy=multi-user.targetUsługa startuje przy każdym uruchomieniu VPS (po enable).
  1. Włącz Redisa i kolejkę przy starcie i uruchom je od razu:

    bash
    systemctl enable --now redis-server
    systemctl enable --now pteroq.service
    • enable – włącza automatyczny start po restarcie VPS.
    • --now – uruchamia też usługę natychmiast.
  2. Sprawdź status:

    bash
    systemctl status pteroq

    Zobaczysz Active: active (running). Wyjście zamknij klawiszem q.

Certyfikat Let's Encrypt#

Poniższa konfiguracja Nginx odwołuje się do plików certyfikatu. Nginx nie wystartuje z nią, dopóki certyfikat nie istnieje, więc najpierw go uzyskasz.

  1. Zainstaluj Certbota i jego wtyczkę Nginx:

    bash
    apt -y install certbot python3-certbot-nginx
    • certbot – program uzyskujący i odnawiający certyfikaty Let's Encrypt.
    • python3-certbot-nginx – wtyczka, która weryfikuje domenę przez działający Nginx bez jego zatrzymywania.
  2. Uzyskaj certyfikat. Zamień panel.example.cz na swoją domenę:

    bash
    certbot certonly --nginx -d panel.example.cz
    • certonly – tylko uzyskuje certyfikat i go zapisuje, bez edycji konfiguracji Nginx (tę napiszesz sam).
    • --nginx – walidacja domeny przechodzi przez Nginx na porcie 80.
    • -d panel.example.cz – domena, dla której chcesz certyfikat.
  3. Przy pierwszym uruchomieniu odpowiedz na pytania:

    • E-mail (Enter email address…) – wpisz swój e-mail. Let's Encrypt wysyła tam ważne powiadomienia o koncie. Od 2025 nie wysyła już przypomnień o wygaśnięciu certyfikatu, więc odnawianie jest automatyczne (zobacz krok 5).
    • Warunki usługi (Please read the Terms of Service… Do you agree?) – odpowiedz Y; bez zgody nie dostaniesz certyfikatu.
    • Udostępnienie e-maila EFF (Would you be willing… to share your email address with the Electronic Frontier Foundation…) – Twoja decyzja; nie wpływa na certyfikat.

    Na końcu zobaczysz Successfully received certificate. i ścieżki plików:

    Wyniktext
    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. Spraw, aby Nginx wczytywał nowy certyfikat po każdym odnowieniu. Utwórz deploy hook (skrypt uruchamiany przez Certbota po udanym odnowieniu):

    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 – zapisuje linie między <<'EOF' a EOF do pliku.
    • systemctl reload nginx – wczytuje nową konfigurację i certyfikaty bez zrywania połączeń.
    • chmod 755 – czyni skrypt wykonywalnym; Certbot uruchamia w katalogu renewal-hooks/deploy tylko pliki wykonywalne.
  5. Sprawdź, czy automatyczne odnawianie działa. Zarówno na Ubuntu, jak i na Debianie pakiet Certbota zawiera timer, który dwa razy dziennie próbuje odnowienia:

    bash
    systemctl list-timers | grep certbot
    certbot renew --dry-run
    • systemctl list-timers – wypisuje zaplanowane timery; powinien być wśród nich certbot.timer.
    • certbot renew --dry-run – próbuje odnowienia na serwerze testowym Let's Encrypt bez dotykania prawdziwego certyfikatu.

    Test kończy się Congratulations, all simulated renewals succeeded.

Certyfikat jest ważny 90 dni (stan na październik 2026; Let's Encrypt stopniowo skraca ważność). Certbot odnawia go sam, gdy zostaje mniej więcej jedna trzecia ważności.

Nginx#

  1. Wyłącz domyślną stronę Nginx:

    bash
    rm /etc/nginx/sites-enabled/default
    • Usuwa tylko dowiązanie w sites-enabled; sam plik zostaje w sites-available. Inaczej port 80 obsługiwałaby domyślna strona zamiast Panelu.
  2. Utwórz konfigurację Panelu:

    bash
    nano /etc/nginx/sites-available/pterodactyl.conf
  3. Wklej zawartość i zamień wszystkie cztery wystąpienia panel.example.cz na swoją domenę:

    /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;
    
        # wieksze przesylki i dluzszy czas dzialania skryptow
        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;
        }
    }

Konfiguracja opiera się na oficjalnej dokumentacji Pterodactyla. Dodaliśmy nasłuchiwanie na IPv6 (listen [::]:…) i ukryliśmy wersję Nginx. Co robi każda część:

DyrektywaCo robiKiedy zmieniać
server_tokens off;Nginx nie zdradza swojej wersji w nagłówkach i na stronach błędów Panelu. Na Debianie 13 to już domyślne w /etc/nginx/nginx.conf, na Ubuntu 24.04 nie.Nigdy.
pierwszy blok server z listen 80Przyjmuje żądania HTTP i trwale (301) przekierowuje je na HTTPS.Nigdy.
listen 443 ssl http2;Nasłuchuje na porcie 443 z TLS i HTTP/2. [::] to to samo dla IPv6.Usuń linie z [::], jeśli VPS nie ma IPv6.
server_nameDomena, której dotyczy ten blok.Przy zmianie domeny.
root /var/www/pterodactyl/public;Katalog, z którego serwowane są pliki. Tylko public; pozostałe pliki Panelu (łącznie z .env) nie są dostępne z WWW.Nigdy.
index index.php;Którego pliku użyć, gdy URL kończy się na /.Nigdy.
access_log, error_logGdzie zapisywane są logi dostępu i błędów.Nigdy.
client_max_body_size 100m;Maksymalny dozwolony rozmiar przesyłki (na przykład przez menedżer plików Panelu).Gdy musisz przesyłać większe pliki; zmień też upload_max_filesize i post_max_size niżej.
client_body_timeout 120s;Jak długo Nginx czeka na kolejne dane z przeglądarki podczas przesyłania, aby wolne przesyłanie dużego pliku nie zostało przerwane.Przy przesyłaniu przez bardzo wolne łącze.
sendfile off;Wyłącza wysyłanie plików bezpośrednio przez jądro. Przejęte z oficjalnej konfiguracji Pterodactyla.Nigdy.
ssl_certificate, ssl_certificate_keyŚcieżki do certyfikatu i klucza prywatnego z Certbota.Przy zmianie domeny.
ssl_session_cache shared:SSL:10m;Pamięć (10 MB) na zapisane sesje TLS, aby kolejne połączenia przeglądarki nawiązywały się szybciej.Nigdy.
ssl_protocols TLSv1.2 TLSv1.3;Dozwolone wersje TLS; starsze i niebezpieczne są wyłączone.Nigdy.
ssl_ciphers, ssl_prefer_server_ciphersDozwolone szyfry i ich kolejność.Nigdy.
add_header …Nagłówki bezpieczeństwa: zapobiegają osadzaniu Panelu w innych stronach, blokują indeksowanie przez wyszukiwarki i podobne.Nigdy.
location / + try_filesIstniejące pliki wysyła bezpośrednio, a wszystko inne przekazuje do index.php (aplikacji).Nigdy.
location ~ \.php$Reguły dla wszystkich żądań do plików .php.Nigdy.
fastcgi_pass unix:/run/php/php8.3-fpm.sock;Jak Nginx przekazuje żądania PHP do PHP-FPM.Przy przejściu na inną wersję PHP.
fastcgi_split_path_info, fastcgi_index, include fastcgi_params, fastcgi_param SCRIPT_FILENAMEStandardowe przekazanie żądania do PHP: dzieli URL na skrypt i resztę ścieżki, ustawia domyślny skrypt i przekazuje PHP zmienne żądania, łącznie ze ścieżką do uruchamianego skryptu.Nigdy.
fastcgi_intercept_errors off;Strony błędów pochodzą bezpośrednio z Panelu; Nginx nie zastępuje ich własnymi.Nigdy.
fastcgi_buffer_size, fastcgi_buffersRozmiar pamięci, w której Nginx buforuje odpowiedzi z PHP.Nigdy.
fastcgi_param PHP_VALUE …Podnosi limity przesyłania PHP do 100 MB.Razem z client_max_body_size.
fastcgi_param HTTP_PROXY "";Ochrona przed atakiem „httpoxy”.Nigdy.
fastcgi_*_timeout 300Jak długo Nginx czeka na PHP (wolne operacje).Nigdy.
location ~ /\.ht + deny allBlokuje dostęp do ukrytych plików .ht….Nigdy.

Ostrzeżenie o http2 na Debianie 13

Debian 13 dostarcza Nginx 1.26, w którym składnia listen … http2 jest oznaczona jako przestarzała. Test konfiguracji wypisuje ostrzeżenie the "listen ... http2" directive is deprecated. Na nic nie wpływa. Jeśli ostrzeżenie Ci przeszkadza, na Debianie 13 usuń słowo http2 z obu linii listen 443… i dodaj pod nimi linię http2 on;. Na Ubuntu 24.04 (Nginx 1.24) dyrektywa http2 on; nie istnieje, więc tam zostaw składnię z przykładu.

  1. Włącz konfigurację, przetestuj ją i zrestartuj Nginx:

    bash
    ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
    nginx -t
    systemctl restart nginx
    • ln -s – tworzy dowiązanie do pliku w sites-enabled; Nginx wczytuje tylko konfiguracje z sites-enabled.
    • nginx -t – sprawdza składnię. Musi zakończyć się linią test is successful. Jeśli nie, nie restartuj Nginx; popraw linię wskazaną w błędzie.
    • systemctl restart nginx – wczytuje nową konfigurację.

Pierwsze logowanie#

  1. Otwórz w przeglądarce https://panel.example.cz. Zobaczysz stronę logowania Panelu z kłódką (ważny certyfikat) w pasku adresu.
  2. Zaloguj się nazwą użytkownika lub e-mailem admina i hasłem.
  3. Kliknij ikonę koła zębatego (część administracyjna) w prawym górnym rogu. W sekcji Settings ustaw nazwę Panelu (Company Name).
  4. Włącz uwierzytelnianie dwuskładnikowe: kliknij swoje konto w prawym górnym rogu, otwórz Account i w sekcji dwuskładnikowej zeskanuj kod QR aplikacją (na przykład Google Authenticator lub Aegis). Konto admina steruje wszystkimi serwerami, więc chroń je czymś więcej niż hasłem.

Weryfikacja#

Sprawdź całą instalację:

bash
systemctl is-active nginx php8.3-fpm mariadb redis-server pteroq
curl -sI https://panel.example.cz | head -n 1
  • Pierwsze polecenie musi wypisać pięć razy active.
  • curl -sI pobiera tylko nagłówki odpowiedzi; pierwsza linia to HTTP/2 302 (przekierowanie do logowania) lub HTTP/2 200.

Panel jest gotowy. Następny krok to dodanie węzła z usługą Wings, na którym będą działać serwery gier: Pterodactyl Wings.

Panel za Cloudflare#

Panel możesz postawić za proxy Cloudflare (pomarańczowa chmurka). Dotyczy to tylko Panelu, nie Wings (zobacz Pterodactyl Wings).

Węzeł z tą samą domeną co Panel

Jeśli w poradniku o Wings jako FQDN węzła wpisano domenę Panelu (panel.example.cz), nie stawiaj Panelu za proxy Cloudflare. Przeglądarki nie połączyłyby się z Wings na porcie 8080, a konsola serwera i pliki by nie działały. Albo zostaw domenę Panelu na DNS only, albo daj węzłowi własną subdomenę (na przykład node.example.cz) z szarą chmurką i własnym certyfikatem.

  1. W Cloudflare ustaw tryb SSL/TLS na Full (strict). Cloudflare łączy się wtedy z VPS przez HTTPS i weryfikuje Twój certyfikat Let's Encrypt.

  2. Przełącz rekord panel.example.cz na Proxied.

  3. Dodaj zakresy IP Cloudflare do .env w jednej linii. Za proxy wszystkie żądania docierają do Panelu z adresów Cloudflare. Panel bierze wtedy prawdziwy adres IP odwiedzającego z nagłówka X-Forwarded-For, ale tylko od adresów, którym ufa. Bez tej linii Panel widziałby dla wszystkich użytkowników tylko adresy Cloudflare, zarówno w logach aktywności, jak i w ochronie przed brute force, która liczy próby na adres IP. Poniższa lista jest aktualna na 1 października 2026; najnowszą znajdziesz na cloudflare.com/ips (otwiera się w nowym oknie):

    /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 – lista adresów i zakresów (oddzielonych przecinkami, bez spacji), od których Panel przyjmuje nagłówki X-Forwarded-* z prawdziwym adresem IP i protokołem odwiedzającego. Od każdego innego adresu te nagłówki ignoruje, więc nikt nie może ich podrobić.
  4. Wczytaj nową konfigurację: cd /var/www/pterodactyl && php artisan config:clear.

Nie używaj trybu Flexible

W trybie Flexible ruch między Cloudflare a VPS idzie nieszyfrowanym HTTP, ale Nginx przekierowuje go na HTTPS. Wynikiem jest niekończąca się pętla przekierowań (ERR_TOO_MANY_REDIRECTS). Używaj Full (strict).

Aktualizacja Panelu#

Nowe wersje Panelu naprawiają błędy i luki bezpieczeństwa, więc aktualizuj regularnie. Przed aktualizacją przeczytaj informacje o wydaniu na GitHubie i sprawdź, jakiej wersji PHP wymaga nowe wydanie (php -v).

Najpierw kopia zapasowa

Przed aktualizacją zarchiwizuj bazę danych i plik .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 – eksportuje bazę panel do pliku SQL bez blokowania tabel.
  • $(date +%F) – wstawia do nazwy pliku dzisiejszą datę (na przykład 2026-10-01).

Następnie uruchom aktualizację:

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
PolecenieCo robi
php artisan downWłącza tryb konserwacji; użytkownicy widzą podczas aktualizacji stronę konserwacji zamiast błędów.
curl -L … | tar -xzvPobiera najnowsze wydanie i rozpakowuje je bezpośrednio na istniejące pliki. .env nie jest nadpisywany; nie ma go w archiwum.
chmod -R 755 …Przywraca uprawnienia zapisu do katalogów.
composer install …Instaluje biblioteki dla nowej wersji.
view:clear, config:clearCzyści skompilowane szablony i cache konfiguracji, aby wczytały się nowe.
migrate --seed --forceAktualizuje tabele dla nowej wersji i odświeża domyślne szablony gier. Własne zmiany w domyślnych szablonach są nadpisywane; jeśli zmieniasz szablon, zrób jego kopię.
chown -R www-data:www-data …Oddaje własność plików serwerowi WWW.
queue:restartKaże usłudze pteroq wczytać nowy kod po zakończeniu bieżącego zadania.
php artisan upWyłącza tryb konserwacji.

Po aktualizacji Panelu zaktualizuj też Wings; kroki są w poradniku Pterodactyl Wings. Wersje Panelu i Wings powinny iść w parze, więc używaj najnowszego wydania obu.

Kopie zapasowe Panelu#

Do przywrócenia Panelu potrzebujesz dwóch rzeczy: bazy panel i pliku .env (przede wszystkim APP_KEY). Dane serwerów gier leżą na węźle Wings, nie w Panelu, więc archiwizuj je osobno. Jak zautomatyzować kopie i wynieść je poza serwer, opisuje artykuł Kopie zapasowe na VPS.

Rozwiązywanie problemów#

502 Bad Gateway#

Nginx nie mógł dotrzeć do PHP-FPM. Sprawdź, czy PHP-FPM działa i czy ścieżka socketu się zgadza:

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

Wyjście ls musi zawierać php8.3-fpm.sock, a ta sama ścieżka musi być w dyrektywie fastcgi_pass. Jeśli usługa nie działa, uruchom ją: systemctl enable --now php8.3-fpm.

Błąd 500 lub pusta strona#

Zajrzyj do logu Panelu:

bash
tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).log
  • tail -n 100 – wypisuje ostatnie 100 linii dzisiejszego logu.

Szukaj linii z datą i słowem ERROR. Najczęstsze przyczyny:

  • Permission denied – zły właściciel plików. Uruchom ponownie chown -R www-data:www-data /var/www/pterodactyl/*.
  • No application encryption key has been specified. – brakuje APP_KEY. Przy pierwszej instalacji uruchom php artisan key:generate --force. Jeśli Panel ma już dane, przywróć pierwotny klucz z kopii zapasowej.
  • SQLSTATE[HY000] [1045] Access denied – hasło lub użytkownik bazy w .env są błędne.

The MAC is invalid#

Baza została zaszyfrowana innym APP_KEY niż ten, który jest teraz w .env. Zwykle dzieje się to po przywróceniu bazy na nową instalację. Jedyną naprawą jest przywrócenie pierwotnego APP_KEY w .env. Bez niego zaszyfrowanych danych nie da się odzyskać.

E-maile nie są wysyłane#

Najczęściej nie działa kolejka. Sprawdź usługę i jej log:

bash
systemctl status pteroq
journalctl -u pteroq -n 50
  • journalctl -u pteroq -n 50 – ostatnie 50 linii logu usługi.

Sprawdź też, czy działa Redis (systemctl status redis-server). Po naprawie uruchom systemctl restart pteroq. Jeśli kolejka działa, sprawdź ustawienia poczty (php artisan p:environment:mail) i błędy w logu Panelu (zobacz Błąd 500).

Serwer wisi na instalacji#

Instalację serwera wykonuje Wings, nie Panel. Zobacz sekcję „Rozwiązywanie problemów” poradnika Pterodactyl Wings (najczęściej zepsuty DNS w kontenerach albo nieosiągalny węzeł).

Zaplanowane zadania serwerów się nie uruchamiają#

Sprawdź, czy działa kolejka (systemctl status pteroq), linię crona (crontab -l) i strefy czasowe: systemu (timedatectl) i Panelu (APP_TIMEZONE w .env). Pomóc może też wyczyszczenie cache harmonogramu:

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

Nginx nie startuje: cannot load certificate#

Certyfikat dla domeny z konfiguracji nie istnieje: nie uzyskano go albo domena w server_name i w ścieżce /etc/letsencrypt/live/… różni się od tej, dla której go wystawiono. certbot certificates wypisuje Twoje certyfikaty.

Certbot: Timeout during connect (likely firewall problem)#

Let's Encrypt nie mógł dotrzeć do portu 80 Twojego VPS. Sprawdź, czy rekord A domeny wskazuje na adres IPv4 VPS, czy port 80 jest dozwolony zarówno w firewallu strefy klienta, jak i w UFW, i czy Nginx działa. Jeśli domena ma rekord AAAA, musi wskazywać na adres IPv6 tego VPS, bo Let's Encrypt próbuje też IPv6.

Composer lub artisan zgłasza złą wersję PHP#

Komunikat brzmi mniej więcej requires php ^8.2 || ^8.3 but your php version (8.4…) does not satisfy that requirement. Polecenie php uruchamia inną wersję niż 8.3, zwykle na Debianie 13 po zainstalowaniu domyślnego pakietu php. Ustaw domyślne PHP na 8.3:

bash
update-alternatives --set php /usr/bin/php8.3
php -v
  • update-alternatives --set php … – ustawia, którą wersję uruchamia polecenie php.

Jeśli /usr/bin/php8.3 nie istnieje, PHP 8.3 nie jest zainstalowane. Wróć do sekcji Instalacja zależności.

Strona za Cloudflare kręci się w przekierowaniach (ERR_TOO_MANY_REDIRECTS)#

Cloudflare jest w trybie Flexible. Przełącz go na Full (strict) i sprawdź też TRUSTED_PROXIES zgodnie z sekcją Panel za Cloudflare.

Za Cloudflare nie działa konsola serwera#

Domena węzła przechodzi przez proxy Cloudflare (pomarańczowa chmurka). Zwykle dzieje się to, gdy węzeł używa tej samej domeny co Panel. Przełącz domenę węzła na DNS only albo daj węzłowi własną subdomenę.

Podsumowanie

  • Panel działa na Nginx + PHP 8.3 (na Debianie 13 z repozytorium packages.sury.org), MariaDB i Redisie.
  • Użytkownik bazy Panelu ma host 127.0.0.1 i uprawnienia tylko do bazy panel.
  • APP_KEY z .env masz zapisany poza serwerem; bez niego zaszyfrowanych danych nie da się przywrócić.
  • Cron co minutę uruchamia schedule:run; usługa pteroq przetwarza kolejkę.
  • Certyfikat odnawia się sam, a Nginx wczytuje go po odnowieniu dzięki deploy hookowi.
  • Następny krok: Pterodactyl Wings i database host dla serwerów.

Czy ten poradnik był pomocny?

Dotyczy

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

Usługi

Zgłoś błąd w poradniku

Wyszukiwanie w poradnikach