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ładnik | Do czego Panel go potrzebuje |
|---|---|
| PHP 8.3 + PHP-FPM | Panel jest napisany w PHP. PHP-FPM to proces, który wykonuje kod PHP dla serwera WWW. |
| MariaDB | Baza danych. Przechowuje użytkowników, serwery, ustawienia i szablony gier. |
| Redis | Szybki magazyn w pamięci dla cache, logowań (sesji) i kolejki zadań. |
| Nginx | Serwer WWW. Przyjmuje żądania z przeglądarki i przekazuje je do PHP-FPM. |
| Composer | Menedżer bibliotek PHP. Pobiera biblioteki, których potrzebuje Panel. |
| Cron i usługa pteroq | Cron 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#
| Faza | Co zrobisz |
|---|---|
| 1. Domena | Skierujesz panel.example.cz na adres IP VPS. |
| 2. Firewall | Otworzysz porty 80 i 443. |
| 3. Zależności | Zainstalujesz PHP 8.3, MariaDB, Redis, Nginx i Composer. |
| 4. Panel | Pobierzesz pliki Panelu, utworzysz bazę danych i skonfigurujesz .env. |
| 5. Baza danych i admin | Utworzysz tabele i pierwszego administratora. |
| 6. Tło | Skonfigurujesz cron i usługę kolejki pteroq. |
| 7. HTTPS i Nginx | Uzyskasz certyfikat i skonfigurujesz serwer WWW. |
| 8. Kontrola | Zalogujesz 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.
W strefie klienta otwórz Moje usługi, kliknij swój VPS i w zakładce Sieć skopiuj adres IPv4 (i opcjonalnie adres IPv6).
U dostawcy DNS utwórz rekord
Adlapanel.example.czz adresem IPv4 VPS (na przykład203.0.113.10).Opcjonalnie utwórz też rekord
AAAAz adresem IPv6 VPS (na przykład2001:db8::10). Poniższa konfiguracja Nginx nasłuchuje także na IPv6.Na VPS sprawdź, czy domena już wskazuje we właściwe miejsce:
bash getent hosts panel.example.czgetent 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 (port22) 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/tcpufw 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:
apt update && apt -y upgradeapt update– pobiera aktualną listę pakietów.apt -y upgrade– instaluje dostępne aktualizacje;-yodpowiada „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
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 curlNa 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:
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– narzędzie do ustalenia nazwy wydania systemu, certyfikaty dla HTTPS i narzędzie do pobieraniacurl.curl -sSLo … debsuryorg-archive-keyring.– pobiera pakiet z kluczem podpisującym repozytorium (deb -scicho,-Spokazuj błędy,-Lpodążaj za przekierowaniami,-ozapisz do pliku).dpkg -i …– instaluje klucz do/usr/share/keyrings/; apt używa go potem do weryfikacji pakietów z repozytorium.echo "deb …" > /etc/– zapisuje adres repozytorium.apt/ sources. list. d/ php. list $(lsb_release -sc)zastępuje się nazwą kodową systemu (trixie).apt update– wczytuje pakiety z nowego repozytorium.
Następnie zainstaluj zależności:
apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-serverNa Debianie 13 MariaDB i Redis instaluj z domyślnego repozytorium; nie potrzebują dodatkowego.
Co zawiera polecenie instalacji:
| Pakiet | Do czego służy |
|---|---|
php8.3, php8.3-cli | PHP 8.3 i jego wiersz poleceń (dla poleceń php artisan). |
php8.3-fpm | Proces, 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, -zip | Rozszerzenia 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-server | Serwer bazy danych. |
nginx | Serwer WWW. |
redis-server | Redis. |
tar, unzip, git, curl | Rozpakowywanie archiwów i pobieranie; Composer używa ich przy instalacji bibliotek. |
Sprawdź, czy masz właściwą wersję PHP:
php -vPHP 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ą:
systemctl is-active mariadb redis-server nginx php8.3-fpmsystemctl 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:
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composercurl -sS https://– pobiera skrypt instalacyjny Composera.getcomposer. org/ installer | php --– przekazuje skrypt do wykonania przez PHP;--oddziela parametry PHP od parametrów instalatora.--install-dir=– gdzie Composer się instaluje (katalog, w którym system szuka programów)./usr/ local/ bin --filename=composer– nazwa programu, więc uruchamiasz go potem poleceniemcomposer.
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_ wycisza ostrzeżenie.
Pobieranie Panelu#
Utwórz katalog dla Panelu i przejdź do niego:
bash mkdir -p /var/www/pterodactyl cd /var/www/pterodactylmkdir -p– tworzy katalog (łącznie z nadrzędnymi); jeśli już istnieje, nie wypisuje błędu.cd– przechodzi do katalogu. Wszystkie dalsze poleceniaphp artisanuruchamiaj w nim.
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.gzcurl -Lo panel.tar.gz …– pobiera archiwum najnowszego wydania z GitHuba i zapisuje je jakopanel.tar.gz.tar -xzvf– rozpakowuje archiwum (xrozpakuj,zformat gzip,vwypisuj pliki,fz pliku).
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ć.-Rdotyczy 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.
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.Zaloguj się do MariaDB jako administrator:
bash mariadbmariadb– klient bazy danych. Zarówno na Ubuntu, jak i na Debianie systemowy użytkownikrootloguje się do MariaDB bez hasła (przez uwierzytelnianie unix socket). Zobaczysz znak zachętyMariaDB [(none)]>.
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
| Linia | Co robi |
|---|---|
CREATE USER 'pterodactyl'@'127. | 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. |
exit | Wychodzi 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/. Utworzysz go z szablonu, zainstalujesz biblioteki i wygenerujesz klucz szyfrowania.
Skopiuj szablon:
bash cp .env.example .envZainstaluj biblioteki PHP Panelu:
bash COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloaderCOMPOSER_– pozwala Composerowi działać jako root bez pytania.ALLOW_ SUPERUSER=1 composer install– pobiera biblioteki dokładnie w wersjach określonych przez Panel (plikcomposer.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).
Wygeneruj klucz szyfrowania:
bash php artisan key:generate --forcephp artisan– narzędzie Panelu do zarządzania z wiersza poleceń.key:generate– tworzy losowyAPP_KEYi 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.
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/.envWyniktext APP_KEY=base64:…
Kreator p:environment:setup#
Podstawową konfigurację załatwia kreator. Uruchom go:
php artisan p:environment:setupZadaje po kolei następujące pytania (wartość domyślna jest w nawiasach kwadratowych; potwierdzasz ją klawiszem Enter):
| Pytanie | Co 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 URL | https://panel.example.cz | Adres Panelu łącznie z https://. Używany w linkach w e-mailach i przy generowaniu URL. Bez https:// linki będą błędne. |
Application Timezone | Europe/Prague | Strefa czasowa do wyświetlania czasów i zaplanowanych zadań (dla Polski możesz użyć Europe/Warsaw). |
Cache Driver | redis | Gdzie przechowywać cache. Redis jest najszybszy i zalecany. |
Session Driver | redis | Gdzie przechowywać logowania użytkowników. |
Queue Driver | redis | Gdzie przechowywać kolejkę zadań dla usługi pteroq. |
Enable UI based settings editor? | yes | Niektóre ustawienia (nazwa Panelu, poczta, reCAPTCHA) można wtedy zmieniać w części administracyjnej, nie tylko w .env. |
Enable sending anonymous telemetry data? | Twoja decyzja | Raz dziennie Panel wysyła autorom anonimowe statystyki (liczba serwerów, wersja systemu). Jeśli tego nie chcesz, odpowiedz no. |
Redis Host | 127.0.0.1 | Redis działa na tym samym VPS. |
Redis Password | nic, tylko Enter | Lokalny Redis po instalacji nie ma hasła i nasłuchuje tylko na 127.0.0.1. |
Redis Port | 6379 | Domyślny port Redisa. |
Gdy wpiszesz adres zaczynający się od https://, kreator sam włącza bezpieczne ciasteczka (SESSION_).
Kreator p:environment:database#
php artisan p:environment:database| Pytanie | Co wpisać | Dlaczego |
|---|---|---|
Database Host | 127.0.0.1 | Baza działa na tym samym VPS. Nie wpisuj localhost (zobacz wyżej). |
Database Port | 3306 | Domyślny port MariaDB. |
Database Name | panel | Baza z poprzedniej sekcji. |
Database Username | pterodactyl | Użytkownik z poprzedniej sekcji. |
Database Password | hasł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:
php artisan p:environment:mail| Pytanie | Co wpisać | Dlaczego |
|---|---|---|
Which driver should be used for sending emails? | smtp | Wysyłanie przez serwer SMTP dostawcy poczty jest najpewniejsze. |
SMTP Host | adres serwera SMTP, na przykład smtp.example.cz | Znajdziesz go na stronach pomocy dostawcy poczty. |
SMTP Port | 587 (lub 465) | 587 używa się z szyfrowaniem TLS (STARTTLS), 465 z szyfrowaniem SSL. |
SMTP Username | pełny adres e-mail skrzynki | Nazwa logowania do skrzynki. |
SMTP Password | hasło do skrzynki | Niektóre usługi wymagają osobnego „hasła aplikacji”. |
Encryption method to use | tls dla portu 587, ssl dla 465 | Musi pasować do portu, inaczej połączenie się nie powiedzie. |
Email address emails should originate from | na przykład [email protected] | Adres nadawcy. Powinien należeć do domeny skrzynki, inaczej wiadomości lądują w spamie. |
Name that emails should appear from | na przykład Game Panel | Nazwa 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/); po ręcznej edycji uruchom php artisan config:clear.
| Ustawienie | Co robi | Zalecana wartość | Kiedy zmieniać |
|---|---|---|---|
APP_URL | Publiczny adres Panelu. | https://panel.example.cz | Przy zmianie domeny (wtedy także w Nginx i certyfikacie). |
APP_KEY | Klucz szyfrowania danych w bazie. | wygenerowany, nigdy go nie zmieniaj | Nigdy. Przy przywracaniu z kopii przywróć pierwotny. |
APP_TIMEZONE | Strefa czasowa Panelu. | Europe/Prague | Gdy admini są w innej strefie czasowej. |
APP_ENVIRONMENT_ONLY | true = ustawienia tylko w .env, false = także w części administracyjnej. | false | Gdy chcesz zablokować zmiany ustawień z WWW. |
DB_HOST, DB_PORT | Gdzie działa baza Panelu. | 127.0.0.1, 3306 | Gdy przenosisz bazę gdzie indziej. |
DB_DATABASE, DB_USERNAME, DB_PASSWORD | Baza Panelu i dane logowania. | panel, pterodactyl, silne hasło | Gdy zmienisz hasło użytkownika w MariaDB. |
REDIS_HOST, REDIS_PASSWORD, REDIS_PORT | Połączenie z Redisem. | 127.0.0.1, null, 6379 | Gdy ustawisz hasło Redisa. |
CACHE_DRIVER, SESSION_DRIVER, QUEUE_CONNECTION | Gdzie przechowywane są cache, logowania i kolejka. | redis | Praktycznie nigdy. |
SESSION_SECURE_COOKIE | Ciasteczka logowania wysyłane tylko przez HTTPS. | true | Nigdy, dopóki Panel działa na HTTPS. |
MAIL_* | Wysyłanie e-maili (serwer, port, szyfrowanie, nadawca). | zależnie od dostawcy | Gdy zmienisz skrzynkę. |
MAIL_EHLO_DOMAIN | Nazwa, którą Panel przedstawia się serwerowi SMTP. | panel.example.cz | Gdy na przykład Gmail odrzuca Twoje e-maile z powodu localhost. |
TRUSTED_PROXIES | Adresy proxy, którym Panel ufa (Cloudflare, inny Nginx). | puste | Gdy Panel działa za proxy; zobacz Panel za Cloudflare. |
PTERODACTYL_ | Wysyłanie anonimowej telemetrii. | Twoja decyzja | false wyłącza telemetrię. |
Tabele w bazie danych i pierwszy administrator#
Utwórz tabele i wczytaj dane domyślne:
bash php artisan migrate --seed --forcemigrate– tworzy wszystkie tabele w baziepanel.--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.
Utwórz konto admina:
bash php artisan p:user:make
| Pytanie | Co wpisać |
|---|---|
Is this user an administrator? | yes – konto dostaje dostęp do części administracyjnej. |
Email Address | Twój e-mail; używany do logowania i resetów hasła. |
Username | Nazwa logowania, na przykład jan. |
First Name, Last Name | Imię i nazwisko (pokazywane w Panelu). |
Password | Co 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:
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).
Otwórz crontab roota:
bash crontab -ePrzy pierwszym uruchomieniu pyta, którego edytora użyć. Wybierz
nano(wpisz jego numer i naciśnij Enter). Jeśli system mówicrontab: command not found, brakuje crona. Zainstaluj go przezapt -y install croni powtórz ten krok.Dodaj tę linię na końcu pliku:
text * * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1Zapisz (Ctrl+O, Enter) i zamknij edytor (Ctrl+X). Zobaczysz
crontab: installing new crontab.
| Część linii | Znaczenie |
|---|---|
* * * * * | Minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia. Pięć gwiazdek = co minutę. |
php /var/ | Uruchamia harmonogram Panelu, który sam decyduje, które zadania są na czasie. |
>> /dev/null 2>&1 | Odrzuca 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ą.
Utwórz plik usługi:
bash nano /etc/systemd/system/pteroq.serviceWklej zawartość:
/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.targetZapisz i zamknij edytor.
| Linia | Co robi |
|---|---|
Description= | Opis usługi widoczny w systemctl status. |
After= | Usługa startuje dopiero po Redisie, z którego czyta kolejkę. |
User=www-data, Group=www-data | Kolejka działa jako ten sam użytkownik co strona, więc obie mają te same uprawnienia do plików. |
Restart=always | Gdy proces się zakończy (z błędem lub normalnie), systemd uruchamia go ponownie. |
ExecStart=… queue:work | Rozpoczyna przetwarzanie kolejki. --queue= 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=30 | Jeśli usługa zawiesi się więcej niż 30 razy w 180 sekund, systemd przestaje ją restartować (ochrona przed nieskończoną pętlą). |
RestartSec=5s | Czeka 5 sekund przed restartem. |
WantedBy= | Usługa startuje przy każdym uruchomieniu VPS (po enable). |
Włącz Redisa i kolejkę przy starcie i uruchom je od razu:
bash systemctl enable --now redis-server systemctl enable --now pteroq.serviceenable– włącza automatyczny start po restarcie VPS.--now– uruchamia też usługę natychmiast.
Sprawdź status:
bash systemctl status pteroqZobaczysz
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.
Zainstaluj Certbota i jego wtyczkę Nginx:
bash apt -y install certbot python3-certbot-nginxcertbot– 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.
Uzyskaj certyfikat. Zamień
panel.example.czna swoją domenę:bash certbot certonly --nginx -d panel.example.czcertonly– 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.
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?) – odpowiedzY; 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- E-mail (
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.shcat > … <<'EOF' … EOF– zapisuje linie między<<'EOF'aEOFdo pliku.systemctl reload nginx– wczytuje nową konfigurację i certyfikaty bez zrywania połączeń.chmod 755– czyni skrypt wykonywalnym; Certbot uruchamia w katalogurenewal-hooks/deploytylko pliki wykonywalne.
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-runsystemctl list-timers– wypisuje zaplanowane timery; powinien być wśród nichcertbot.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#
Wyłącz domyślną stronę Nginx:
bash rm /etc/nginx/sites-enabled/default- Usuwa tylko dowiązanie w
sites-enabled; sam plik zostaje wsites-available. Inaczej port 80 obsługiwałaby domyślna strona zamiast Panelu.
- Usuwa tylko dowiązanie w
Utwórz konfigurację Panelu:
bash nano /etc/nginx/sites-available/pterodactyl.confWklej zawartość i zamień wszystkie cztery wystąpienia
panel.example.czna swoją domenę:/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; # 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ęść:
| Dyrektywa | Co robi | Kiedy 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 80 | Przyjmuje żą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_name | Domena, której dotyczy ten blok. | Przy zmianie domeny. |
root /var/ | 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_log | Gdzie 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_ | Dozwolone 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_files | Istnieją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:/ | 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_FILENAME | Standardowe 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_buffers | Rozmiar 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 300 | Jak długo Nginx czeka na PHP (wolne operacje). | Nigdy. |
location ~ /\.ht + deny all | Blokuje 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.
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 nginxln -s– tworzy dowiązanie do pliku wsites-enabled; Nginx wczytuje tylko konfiguracje zsites-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#
- Otwórz w przeglądarce
https://panel.example.cz. Zobaczysz stronę logowania Panelu z kłódką (ważny certyfikat) w pasku adresu. - Zaloguj się nazwą użytkownika lub e-mailem admina i hasłem.
- Kliknij ikonę koła zębatego (część administracyjna) w prawym górnym rogu. W sekcji Settings ustaw nazwę Panelu (Company Name).
- 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ę:
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 -sIpobiera tylko nagłówki odpowiedzi; pierwsza linia toHTTP/2 302(przekierowanie do logowania) lubHTTP/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.
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.
Przełącz rekord
panel.example.czna Proxied.Dodaj zakresy IP Cloudflare do
.envw jednej linii. Za proxy wszystkie żądania docierają do Panelu z adresów Cloudflare. Panel bierze wtedy prawdziwy adres IP odwiedzającego z nagłówkaX-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/ 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– lista adresów i zakresów (oddzielonych przecinkami, bez spacji), od których Panel przyjmuje nagłówkiX-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ć.
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:
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– eksportuje bazępaneldo pliku SQL bez blokowania tabel.$(date +%F)– wstawia do nazwy pliku dzisiejszą datę (na przykład2026-10-01).
Następnie uruchom aktualizację:
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| Polecenie | Co robi |
|---|---|
php artisan down | Włącza tryb konserwacji; użytkownicy widzą podczas aktualizacji stronę konserwacji zamiast błędów. |
curl -L … | tar -xzv | Pobiera 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:clear | Czyści skompilowane szablony i cache konfiguracji, aby wczytały się nowe. |
migrate --seed --force | Aktualizuje 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:restart | Każe usłudze pteroq wczytać nowy kod po zakończeniu bieżącego zadania. |
php artisan up | Wyłą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:
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:
tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).logtail -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 ponowniechown -R www-data:www-data /var/www/pterodactyl/*.No application encryption key has been specified.– brakujeAPP_KEY. Przy pierwszej instalacji uruchomphp 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.envsą 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:
systemctl status pteroq
journalctl -u pteroq -n 50journalctl -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:
php /var/www/pterodactyl/artisan schedule:clear-cache
systemctl restart pteroqNginx 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:
update-alternatives --set php /usr/bin/php8.3
php -vupdate-alternatives --set php …– ustawia, którą wersję uruchamia poleceniephp.
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.1i uprawnienia tylko do bazypanel. APP_KEYz.envmasz zapisany poza serwerem; bez niego zaszyfrowanych danych nie da się przywrócić.- Cron co minutę uruchamia
schedule:run; usługapteroqprzetwarza 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.
Dalsza lektura#
- Pterodactyl: Getting Started (otwiera się w nowym oknie)
- Pterodactyl: Webserver Configuration (otwiera się w nowym oknie)
- Pterodactyl: Updating the Panel (otwiera się w nowym oknie)
- Pterodactyl: Additional Configuration (otwiera się w nowym oknie)
- Pterodactyl: Troubleshooting (otwiera się w nowym oknie)
- Certbot: User Guide (otwiera się w nowym oknie)