Nainstalujeme Pterodactyl Panel, webové rozhraní pro správu herních serverů, na vaši VPS. Na konci poběží na adrese https://panel.example.cz s certifikátem Let's Encrypt, frontou úloh, cronem a vaším administrátorským účtem.
Co budete potřebovat
- VPS u StormHostu s čistou instalací Ubuntu 24.04 nebo Debianu 13
- Doménu nebo subdoménu pro panel (v návodu
panel.example.cz) a přístup k jejímu nastavení DNS - Připojení přes SSH jako root (návod)
- Základní práci v terminálu: úpravy souborů v editoru
nano, kopírování příkazů - Asi 90 minut
Jak to funguje#
Pterodactyl má dvě části. Panel je webová aplikace (PHP, framework Laravel), ve které zakládáte uživatele a servery a kde hráči ovládají konzoli. Wings je služba, která na serveru skutečně spouští herní servery v kontejnerech Dockeru. Panel i Wings můžou běžet na stejné VPS. Tento návod instaluje Panel, Wings přidáte v navazujícím návodu Pterodactyl Wings.
Panel potřebuje několik dalších programů:
| Součást | K čemu ji Panel potřebuje |
|---|---|
| PHP 8.3 + PHP-FPM | Panel je napsaný v PHP. PHP-FPM je proces, který PHP kód spouští pro webový server. |
| MariaDB | Databáze. Ukládá uživatele, servery, nastavení a šablony her. |
| Redis | Rychlé úložiště v paměti pro cache, přihlášení (session) a frontu úloh. |
| Nginx | Webový server. Přijímá požadavky z prohlížeče a předává je PHP-FPM. |
| Composer | Správce knihoven pro PHP. Stáhne knihovny, které Panel potřebuje. |
| Cron a služba pteroq | Cron každou minutu spouští plánovač Panelu, pteroq zpracovává frontu úloh na pozadí (e-maily, naplánované úlohy serverů). |
Panel samotný je nenáročný. Pokud na stejné VPS poběží i herní servery, plánujte RAM hlavně podle nich a připočtěte rezervu pro systém, databázi a Panel (orientačně 1–2 GB).
Potřebujete opravdu vlastní panel?
Pterodactyl se vyplatí, když chcete na jedné VPS provozovat víc herních serverů, spravovat je přes web a dávat přístup dalším lidem. Pokud vám stačí jeden herní server, můžete si ho objednat přímo jako herní server a spravovat ho v zákaznické zóně bez instalace čehokoli.
Plán instalace#
| Fáze | Co uděláte |
|---|---|
| 1. Doména | Nasměrujete panel.example.cz na IP adresu VPS. |
| 2. Firewall | Otevřete porty 80 a 443. |
| 3. Závislosti | Nainstalujete PHP 8.3, MariaDB, Redis, Nginx a Composer. |
| 4. Panel | Stáhnete soubory Panelu, založíte databázi a nastavíte .env. |
| 5. Databáze a admin | Vytvoříte tabulky a prvního administrátora. |
| 6. Pozadí | Nastavíte cron a službu fronty pteroq. |
| 7. HTTPS a Nginx | Získáte certifikát a nastavíte webový server. |
| 8. Kontrola | Přihlásíte se a ověříte, že vše běží. |
Doména a DNS#
Panel potřebuje vlastní doménu nebo subdoménu. Certifikát pro HTTPS se vydává na doménu, ne na IP adresu.
V zákaznické zóně otevřete Moje služby, klikněte na VPS a v záložce Síť zkopírujte IPv4 adresu (a případně IPv6 adresu).
U svého DNS hostingu vytvořte záznam typu
Apropanel.example.czs hodnotou IPv4 adresy VPS (například203.0.113.10).Volitelně vytvořte i záznam
AAAAs IPv6 adresou VPS (například2001:db8::10). Konfigurace Nginx níže naslouchá i na IPv6.Na VPS ověřte, že doména už ukazuje správně:
bash getent hosts panel.example.czgetent hosts– zeptá se systémového DNS na adresu domény a vypíše ji.
Uvidíte řádek s IP adresou vaší VPS. Když se nic nevypíše, počkejte pár minut (podle TTL záznamu) a zkuste to znovu.
Cloudflare: během instalace jen šedý mráček
Pokud doménu spravujete v Cloudflare, nechte záznam ve stavu DNS only (šedý mráček). Certifikát i první přihlášení tak ověříte napřímo. Na Proxied (oranžový mráček) můžete přepnout až na konci, viz Panel za Cloudflare. Postup s Cloudflare: Doména na VPS a Cloudflare.
Firewall#
Prohlížeč se k Panelu připojí na port 443 (HTTPS). Port 80 (HTTP) je potřeba pro ověření domény při vydání certifikátu a pro přesměrování na HTTPS.
Firewall v zákaznické zóně: pokud máte příchozí provoz v režimu Blokovat vše kromě povoleného, přidejte pravidla Příchozí · Povolit · TCP · port
80,443. Pravidlo pro SSH (port22) musí zůstat. Návod: Firewall v zákaznické zóně.UFW ve VPS: pokud ho používáte, povolte porty i v něm:
bash ufw allow 80/tcp ufw allow 443/tcpufw allow 80/tcp– povolí příchozí TCP spojení na port 80.ufw allow 443/tcp– totéž pro port 443.
Porty pro Wings (8080 a 2022) a pro herní servery otevřete až v návodu Pterodactyl Wings.
Instalace závislostí#
Nejdřív aktualizujte systém, ať instalujete na aktuální základ:
apt update && apt -y upgradeapt update– stáhne aktuální seznam balíčků.apt -y upgrade– nainstaluje dostupné aktualizace;-yodpoví „ano“ na potvrzení.
Pak nainstalujte závislosti. Postup se liší podle systému: Ubuntu 24.04 má PHP 8.3 přímo v repozitáři, Debian 13 má ve výchozím repozitáři PHP 8.4, které Panel nepodporuje (aktuální Panel vyžaduje PHP 8.2 nebo 8.3). Na Debianu proto přidáte repozitář packages.sury.org, který doporučuje i oficiální dokumentace Pterodactylu.
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 nepřidávejte žádný repozitář pro PHP. Oficiální dokumentace zmiňuje repozitář ppa:ondrej/php jen pro starší Ubuntu 22.04.
Debian 13
Nejdřív přidejte repozitář s 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– nástroj pro zjištění názvu verze systému, certifikáty pro HTTPS a stahovací programcurl.curl -sSLo … debsuryorg-archive-keyring.– stáhne balíček s podpisovým klíčem repozitáře (deb -stiše,-Sukázat chyby,-Lnásledovat přesměrování,-ouložit do souboru).dpkg -i …– nainstaluje klíč do/usr/share/keyrings/, apt jím pak ověřuje balíčky z repozitáře.echo "deb …" > /etc/– zapíše adresu repozitáře.apt/ sources. list. d/ php. list $(lsb_release -sc)se nahradí kódovým názvem systému (trixie).apt update– načte balíčky z nového repozitáře.
Pak nainstalujte závislosti:
apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-serverMariaDB a Redis na Debianu 13 instalujte z výchozího repozitáře, žádný další repozitář nepotřebují.
Co instalační příkaz obsahuje:
| Balíček | K čemu je |
|---|---|
php8.3, php8.3-cli | PHP 8.3 a jeho příkazová řádka (pro příkazy php artisan). |
php8.3-fpm | Proces, přes který Nginx spouští PHP. Naslouchá na socketu /run/php/php8.3-fpm.sock. |
php8.3-common, -gd, -mysql, -mbstring, -bcmath, -xml, -curl, -zip | Rozšíření PHP, která Panel vyžaduje: obrázky, připojení k MariaDB, práce s texty v UTF-8, přesná matematika, XML, HTTP požadavky a ZIP archivy. Zápis php8.3-{common,cli,…} je zkratka shellu bash, rozepíše se na php8.3-common php8.3-cli …. |
mariadb-server | Databázový server. |
nginx | Webový server. |
redis-server | Redis. |
tar, unzip, git, curl | Rozbalování archivů a stahování; Composer je používá při instalaci knihoven. |
Ověřte, že máte správnou verzi PHP:
php -vPHP 8.3.x (cli) …Na prvním řádku musí být PHP 8.3. Pokud vidíte PHP 8.4, podívejte se do části Když něco nefunguje.
Zkontrolujte, že běží služby:
systemctl is-active mariadb redis-server nginx php8.3-fpmsystemctl is-active– vypíše stav každé uvedené služby.
Uvidíte čtyřikrát active. Pokud je některá inactive, spusťte ji a zapněte po startu příkazem systemctl enable --now <NAZEV_SLUZBY>, například systemctl enable --now redis-server.
Composer#
Composer stáhne PHP knihovny Panelu. Nainstalujte ho oficiálním instalátorem:
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composercurl -sS https://– stáhne instalační skript Composeru.getcomposer. org/ installer | php --– předá skript PHP ke spuštění;--odděluje parametry PHP od parametrů instalátoru.--install-dir=– kam se Composer nainstaluje (složka, ve které systém hledá programy)./usr/ local/ bin --filename=composer– název programu, takže ho pak spustíte příkazemcomposer.
Ověření: composer --version vypíše Composer version 2.…. Jako root uvidíte i varování Do not run Composer as root/super user! a možná otázku Continue as root/super user [yes]?. Potvrďte ji klávesou Enter. Při instalaci Panelu níže varování potlačí proměnná COMPOSER_.
Stažení Panelu#
Vytvořte složku pro Panel a přejděte do ní:
bash mkdir -p /var/www/pterodactyl cd /var/www/pterodactylmkdir -p– vytvoří složku (i s nadřazenými); když už existuje, nevypíše chybu.cd– přepne do složky. Všechny další příkazyphp artisanspouštějte v ní.
Stáhněte a rozbalte nejnovější verzi 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 …– stáhne archiv nejnovějšího vydání z GitHubu a uloží ho jakopanel.tar.gz.tar -xzvf– rozbalí archiv (xrozbalit,zformát gzip,vvypisovat soubory,fze souboru).
Nastavte práva složek, do kterých Panel zapisuje:
bash chmod -R 755 storage/* bootstrap/cache/chmod -R 755– vlastník smí číst, zapisovat a vstupovat do složek, ostatní jen číst a vstupovat.-Rplatí pro celý obsah.storage/– logy, cache a nahrané soubory;bootstrap/cache/– zkompilovaná konfigurace.
Databáze pro Panel#
Panel potřebuje vlastní databázi a vlastního uživatele. Databázového uživatele root autoři Pterodactylu pro Panel výslovně zakazují: kdyby někdo Panel napadl, získal by přístup ke všem databázím na VPS.
Vygenerujte si silné heslo pro databázového uživatele, například v generátoru hesel. Použijte jen písmena a číslice (aspoň 24 znaků), ať nemusíte řešit speciální znaky v SQL a v
.env. Heslo si uložte, budete ho za chvíli zadávat znovu.Přihlaste se do MariaDB jako správce:
bash mariadbmariadb– klient databáze. Uživatelrootsystému se na Ubuntu i Debianu přihlásí do MariaDB bez hesla (ověřením přes unix socket). Uvidíte výzvuMariaDB [(none)]>.
Vytvořte uživatele a databázi. Za
<HESLO_DB_PANELU>dosaďte heslo z kroku 1 (apostrofy kolem hesla ponechte):SQL CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY '<HESLO_DB_PANELU>'; CREATE DATABASE panel; GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1'; exit
| Řádek | Co dělá |
|---|---|
CREATE USER 'pterodactyl'@'127. | Založí uživatele pterodactyl, který se smí přihlásit jen z adresy 127.0.0.1, tedy jen z této VPS přes TCP. Zvenku se tímto účtem připojit nejde. |
IDENTIFIED BY '…' | Nastaví uživateli heslo. |
CREATE DATABASE panel; | Vytvoří prázdnou databázi panel. |
GRANT ALL PRIVILEGES ON panel.* … | Dá uživateli všechna práva, ale jen k databázi panel (panel.* = všechny tabulky v ní). K jiným databázím přístup nemá. |
exit | Ukončí klienta MariaDB. |
Proč 127.0.0.1, a ne localhost
Panel se k databázi připojuje přes TCP na adresu 127.0.0.1. Autoři Pterodactylu výslovně nedoporučují zadávat localhost, protože s ním PHP zkouší spojení přes socket a dochází k potížím. Uživatel v databázi proto musí mít povolený host 127.0.0.1.
Konfigurace prostředí (.env)#
Nastavení Panelu je v souboru /var/. Vytvoříte ho z předlohy, nainstalujete knihovny a vygenerujete šifrovací klíč.
Zkopírujte předlohu:
bash cp .env.example .envNainstalujte PHP knihovny Panelu:
bash COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloaderCOMPOSER_– povolí spuštění Composeru jako root bez dotazu.ALLOW_ SUPERUSER=1 composer install– stáhne knihovny přesně ve verzích, které určuje Panel (souborcomposer.lock).--no-dev– vynechá nástroje pro vývojáře, na produkčním serveru je nepotřebujete.--optimize-autoloader– připraví rychlejší načítání tříd PHP.
Instalace trvá jednotky minut a končí bez chybových hlášek (žluté varování o zastaralých balíčcích nevadí).
Vygenerujte šifrovací klíč:
bash php artisan key:generate --forcephp artisan– nástroj Panelu pro správu z příkazové řádky.key:generate– vytvoří náhodný klíčAPP_KEYa zapíše ho do.env.--force– provede příkaz bez potvrzení (Panel běží v produkčním režimu, kde se jinak ptá).
Zálohujte APP_KEY hned teď
Klíčem APP_KEY Panel šifruje citlivá data v databázi (například API klíče a hesla databázových hostitelů). Když ho ztratíte, data nerozšifrujete ani ze zálohy databáze. Příkaz key:generate spusťte jen při první instalaci. Na Panelu, který už má data, by nový klíč znamenal ztrátu přístupu k nim.
Zobrazte klíč a uložte si celý řádek mimo server (do správce hesel nebo šifrovaného souboru v počítači):
bash grep APP_KEY /var/www/pterodactyl/.envVýstuptext APP_KEY=base64:…
Průvodce p:environment:setup#
Základní nastavení provede průvodce. Spusťte ho:
php artisan p:environment:setupPostupně se zeptá na tyto věci (výchozí hodnota je v hranatých závorkách, potvrdíte ji klávesou Enter):
| Otázka | Co zadat | Proč |
|---|---|---|
E-mail autora (… Author Email) | Váš e-mail, například [email protected] | Uvádí se jako autor šablon her, které z Panelu exportujete. Musí to být platný tvar e-mailu, jinak průvodce skončí chybou. |
Application URL | https://panel.example.cz | Adresa Panelu včetně https://. Používá se v odkazech v e-mailech a při generování adres. Bez https:// budou odkazy vést špatně. |
Application Timezone | Europe/Prague | Časové pásmo pro zobrazení časů a pro plánované úlohy. |
Cache Driver | redis | Kam ukládat cache. Redis je nejrychlejší a doporučený. |
Session Driver | redis | Kam ukládat přihlášení uživatelů. |
Queue Driver | redis | Kam ukládat frontu úloh pro službu pteroq. |
Enable UI based settings editor? | yes | Část nastavení (název Panelu, pošta, reCAPTCHA) půjde měnit v administraci, ne jen v .env. |
Enable sending anonymous telemetry data? | podle vás | Panel jednou denně posílá autorům anonymní statistiky (počet serverů, verze systému). Nechcete-li, odpovězte no. |
Redis Host | 127.0.0.1 | Redis běží na stejné VPS. |
Redis Password | nic, jen Enter | Lokální Redis po instalaci heslo nemá a naslouchá jen na 127.0.0.1. |
Redis Port | 6379 | Výchozí port Redisu. |
Když zadáte adresu začínající https://, průvodce sám zapne bezpečné cookies (SESSION_).
Průvodce p:environment:database#
php artisan p:environment:database| Otázka | Co zadat | Proč |
|---|---|---|
Database Host | 127.0.0.1 | Databáze běží na stejné VPS. Nezadávejte localhost (viz výše). |
Database Port | 3306 | Výchozí port MariaDB. |
Database Name | panel | Databáze z předchozí kapitoly. |
Database Username | pterodactyl | Uživatel z předchozí kapitoly. |
Database Password | heslo <HESLO_DB_PANELU> | Při psaní se nezobrazuje. |
Průvodce se hned zkusí připojit. Když údaje nesedí, vypíše Unable to connect to the MySQL server…, nic neuloží a zeptá se, jestli to chcete zkusit znovu.
Průvodce p:environment:mail#
Panel posílá e-maily (pozvánky nových uživatelů, obnova hesla). Bez nastavené pošty Panel funguje, jen tyto e-maily neodejdou. Nastavení můžete udělat i později, stejným příkazem:
php artisan p:environment:mail| Otázka | Co zadat | Proč |
|---|---|---|
Which driver should be used for sending emails? | smtp | Odesílání přes SMTP server vašeho e-mailového poskytovatele je nejspolehlivější. |
SMTP Host | adresa SMTP serveru, například smtp.example.cz | Najdete ji v nápovědě svého poskytovatele e-mailu. |
SMTP Port | 587 (nebo 465) | 587 se používá se šifrováním TLS (STARTTLS), 465 se šifrováním SSL. |
SMTP Username | celá e-mailová adresa schránky | Přihlašovací jméno ke schránce. |
SMTP Password | heslo ke schránce | Některé služby vyžadují zvláštní „heslo pro aplikace“. |
Encryption method to use | tls pro port 587, ssl pro 465 | Musí odpovídat portu, jinak se spojení nenaváže. |
Email address emails should originate from | například [email protected] | Adresa odesílatele. Má patřit k doméně schránky, jinak zprávy skončí ve spamu. |
Name that emails should appear from | například Herní panel | Jméno odesílatele v e-mailu. |
Důležité klíče v .env#
Průvodci zapisují do .env tyto hodnoty. Soubor můžete upravit i ručně (nano /var/); po ruční úpravě spusťte php artisan config:clear.
| Nastavení | Co dělá | Doporučená hodnota | Kdy změnit |
|---|---|---|---|
APP_URL | Veřejná adresa Panelu. | https://panel.example.cz | Při změně domény (a pak i v Nginx a certifikátu). |
APP_KEY | Šifrovací klíč dat v databázi. | vygenerovaný, nikdy neměnit | Nikdy. Při obnově ze zálohy vraťte původní. |
APP_TIMEZONE | Časové pásmo Panelu. | Europe/Prague | Když jsou správci v jiném pásmu. |
APP_ENVIRONMENT_ONLY | true = nastavení jen v .env, false = i v administraci. | false | Když chcete zakázat změny nastavení z webu. |
DB_HOST, DB_PORT | Kde běží databáze Panelu. | 127.0.0.1, 3306 | Když databázi přesunete jinam. |
DB_DATABASE, DB_USERNAME, DB_PASSWORD | Databáze a přihlašovací údaje Panelu. | panel, pterodactyl, silné heslo | Při změně hesla uživatele v MariaDB. |
REDIS_HOST, REDIS_PASSWORD, REDIS_PORT | Připojení k Redisu. | 127.0.0.1, null, 6379 | Když Redisu nastavíte heslo. |
CACHE_DRIVER, SESSION_DRIVER, QUEUE_CONNECTION | Kam se ukládá cache, přihlášení a fronta. | redis | Prakticky nikdy. |
SESSION_SECURE_COOKIE | Cookies přihlášení se posílají jen přes HTTPS. | true | Nikdy, pokud Panel běží na HTTPS. |
MAIL_* | Odesílání e-mailů (server, port, šifrování, odesílatel). | podle poskytovatele | Při změně schránky. |
MAIL_EHLO_DOMAIN | Jméno, kterým se Panel představí SMTP serveru. | panel.example.cz | Když vám e-maily odmítá například Gmail kvůli localhost. |
TRUSTED_PROXIES | Adresy proxy, kterým Panel věří (Cloudflare, další Nginx). | nevyplněno | Když Panel běží za proxy, viz Panel za Cloudflare. |
PTERODACTYL_ | Odesílání anonymní telemetrie. | podle vás | false vypne telemetrii. |
Tabulky v databázi a první administrátor#
Vytvořte tabulky a nahrajte výchozí data:
bash php artisan migrate --seed --forcemigrate– vytvoří v databázipanelvšechny tabulky.--seed– naplní je výchozími daty, mimo jiné šablonami her (Minecraft, Rust a další).--force– spustí příkaz bez potvrzení v produkčním režimu.
Příkaz může běžet i několik minut. Nepřerušujte ho, jinak zůstane databáze napůl vytvořená.
Vytvořte administrátorský účet:
bash php artisan p:user:make
| Otázka | Co zadat |
|---|---|
Is this user an administrator? | yes – účet bude mít přístup do administrace. |
Email Address | Váš e-mail; slouží k přihlášení a obnově hesla. |
Username | Přihlašovací jméno, například jan. |
First Name, Last Name | Jméno a příjmení (zobrazuje se v Panelu). |
Password | Aspoň 8 znaků, aspoň jedno velké písmeno a jedna číslice. Při psaní se nezobrazuje. |
Na konci uvidíte tabulku s údaji účtu a řádkem Admin | Yes.
Oprávnění souborů#
Soubory Panelu teď patří uživateli root. Webový server běží jako uživatel www-data a musí do složek storage a bootstrap/cache zapisovat:
chown -R www-data:www-data /var/www/pterodactyl/*chown -R– změní vlastníka souborů i celého obsahu složek.www-data:www-data– uživatel a skupina, pod kterými na Ubuntu a Debianu běží Nginx a PHP-FPM.
Po každém příkazu artisan jako root
Příkazy php artisan spouštěné jako root můžou vytvořit soubory (například logy), které pak www-data nesmí přepsat. Když po práci v terminálu uvidíte chybu 500, spusťte znovu příkaz chown výše.
Cron a fronta úloh#
Cron#
Cron spouští plánovač Panelu každou minutu (mazání starých přihlášení, plánované úlohy serverů).
Otevřete crontab uživatele root:
bash crontab -ePři prvním spuštění se zeptá na editor. Zvolte
nano(napište jeho číslo a stiskněte Enter). Pokud systém hlásícrontab: command not found, cron chybí. Nainstalujte ho příkazemapt -y install crona krok zopakujte.Na konec souboru vložte řádek:
text * * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1Uložte (Ctrl+O, Enter) a zavřete editor (Ctrl+X). Uvidíte
crontab: installing new crontab.
| Část řádku | Význam |
|---|---|
* * * * * | Minuta, hodina, den v měsíci, měsíc, den v týdnu. Pět hvězdiček = každou minutu. |
php /var/ | Spustí plánovač Panelu; ten sám rozhodne, které úlohy je čas provést. |
>> /dev/null 2>&1 | Zahodí výstup i chyby, aby cron neposílal e-maily každou minutu. |
Služba fronty pteroq#
Fronta zpracovává práci na pozadí: odesílání e-mailů a úlohy, které si uživatelé naplánují u serverů (sekce Schedules, například noční restart nebo záloha). Bez ní e-maily neodcházejí a naplánované úlohy se neprovedou.
Vytvořte soubor služby:
bash nano /etc/systemd/system/pteroq.serviceVložte obsah:
/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.targetUložte a zavřete editor.
| Řádek | Co dělá |
|---|---|
Description= | Popis služby, který uvidíte ve výpisu systemctl status. |
After= | Služba se spustí až po Redisu, ze kterého čte frontu. |
User=www-data, Group=www-data | Fronta běží pod stejným uživatelem jako web, ať mají oba stejná práva k souborům. |
Restart=always | Když proces skončí (chybou i normálně), systemd ho spustí znovu. |
ExecStart=… queue:work | Spustí zpracování fronty. --queue= určuje pořadí front podle priority, --sleep=3 = při prázdné frontě počkat 3 sekundy, --tries=3 = neúspěšnou úlohu zkusit nejvýš třikrát. |
StartLimitInterval=180, StartLimitBurst=30 | Pokud služba spadne víc než 30× za 180 sekund, systemd ji přestane restartovat (ochrana před nekonečnou smyčkou). |
RestartSec=5s | Před restartem počká 5 sekund. |
WantedBy= | Služba se spustí při každém startu VPS (po enable). |
Zapněte Redis i frontu po startu a hned je spusťte:
bash systemctl enable --now redis-server systemctl enable --now pteroq.serviceenable– zapne automatické spuštění po restartu VPS.--now– zároveň službu hned spustí.
Zkontrolujte stav:
bash systemctl status pteroqUvidíte
Active: active (running). Výpis zavřete klávesou q.
Certifikát Let's Encrypt#
Konfigurace Nginx níže odkazuje na soubory certifikátu. Nginx s ní nenastartuje, dokud certifikát neexistuje, proto ho získáte jako první.
Nainstalujte Certbot a jeho doplněk pro Nginx:
bash apt -y install certbot python3-certbot-nginxcertbot– program, který získává a obnovuje certifikáty Let's Encrypt.python3-certbot-nginx– doplněk, který ověří doménu přes běžící Nginx bez jeho vypnutí.
Získejte certifikát. Za
panel.example.czdosaďte svou doménu:bash certbot certonly --nginx -d panel.example.czcertonly– jen získá certifikát a uloží ho, konfiguraci Nginx neupravuje (tu napíšete sami).--nginx– ověření domény proběhne přes Nginx na portu 80.-d panel.example.cz– doména, pro kterou certifikát chcete.
Při prvním spuštění odpovězte na otázky:
- E-mail (
Enter email address…) – zadejte svůj e-mail. Let's Encrypt na něj posílá důležitá oznámení o účtu. Upozornění na vypršení certifikátu od roku 2025 neposílá, obnovu proto hlídá automatika (viz krok 5). - Podmínky služby (
Please read the Terms of Service… Do you agree?) – odpovězteY, bez souhlasu certifikát nedostanete. - Sdílení e-mailu s EFF (
Would you be willing… to share your email address with the Electronic Frontier Foundation…) – podle vás, na vydání certifikátu nemá vliv.
Na konci uvidíte
Successfully received certificate.a cesty k souborům:Výstuptext 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 (
Nastavte, aby Nginx po každé obnově certifikátu načetl nový. Vytvořte takzvaný deploy hook (skript, který Certbot spustí po úspěšné obnově):
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– zapíše řádky mezi<<'EOF'aEOFdo souboru.systemctl reload nginx– načte novou konfiguraci a certifikáty bez přerušení spojení.chmod 755– udělá skript spustitelným; Certbot spouští jen spustitelné soubory ve složcerenewal-hooks/deploy.
Ověřte, že automatická obnova funguje. Balíček Certbotu na Ubuntu i Debianu obsahuje časovač, který obnovu zkouší dvakrát denně:
bash systemctl list-timers | grep certbot certbot renew --dry-runsystemctl list-timers– vypíše naplánované časovače; mezi nimi má býtcertbot.timer.certbot renew --dry-run– vyzkouší obnovu proti testovacímu serveru Let's Encrypt, skutečný certifikát nemění.
Test skončí hláškou
Congratulations, all simulated renewals succeeded.
Certifikát platí 90 dní (stav k říjnu 2026; Let's Encrypt platnost postupně zkracuje). Certbot ho obnovuje sám, když zbývá zhruba třetina platnosti.
Nginx#
Vypněte výchozí web Nginxu:
bash rm /etc/nginx/sites-enabled/default- Smaže jen odkaz v
sites-enabled, samotný soubor vsites-availablezůstane. Výchozí web by jinak obsluhoval port 80 místo Panelu.
- Smaže jen odkaz v
Vytvořte konfiguraci Panelu:
bash nano /etc/nginx/sites-available/pterodactyl.confVložte obsah a všechny čtyři výskyty
panel.example.cznahraďte svou doménou:/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; # větší nahrávané soubory a delší běh skriptů 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; } }
Konfigurace vychází z oficiální dokumentace Pterodactylu. Doplnili jsme naslouchání na IPv6 (listen [::]:…) a skrytí verze Nginxu. Co jednotlivé části dělají:
| Direktiva | Co dělá | Kdy změnit |
|---|---|---|
server_tokens off; | Nginx neprozradí svou verzi v hlavičkách a chybových stránkách Panelu. Na Debianu 13 je to už výchozí nastavení v /etc/nginx/nginx.conf, na Ubuntu 24.04 ne. | Nikdy. |
první blok server s listen 80 | Přijme požadavky přes HTTP a trvale (301) je přesměruje na HTTPS. | Nikdy. |
listen 443 ssl http2; | Naslouchá na portu 443 s TLS a HTTP/2. [::] je totéž pro IPv6. | Řádky s [::] smažte, pokud VPS nemá IPv6. |
server_name | Doména, pro kterou blok platí. | Při změně domény. |
root /var/ | Složka, ze které se servírují soubory. Jen public, ostatní soubory Panelu (včetně .env) nejsou z webu dostupné. | Nikdy. |
index index.php; | Který soubor použít, když adresa končí /. | Nikdy. |
access_log, error_log | Kam se zapisuje přístupový a chybový log. | Nikdy. |
client_max_body_size 100m; | Největší povolený nahrávaný soubor (například přes správce souborů v Panelu). | Když potřebujete nahrávat větší soubory; změňte i upload_max_filesize a post_max_size níže. |
client_body_timeout 120s; | Jak dlouho Nginx čeká na další data od prohlížeče při nahrávání. Pomalé nahrávání velkého souboru se tak nepřeruší. | Při nahrávání přes velmi pomalé připojení. |
sendfile off; | Vypne posílání souborů přímo jádrem systému. Převzato z oficiální konfigurace Pterodactylu. | Nikdy. |
ssl_certificate, ssl_certificate_key | Cesta k certifikátu a soukromému klíči od Certbotu. | Při změně domény. |
ssl_session_cache shared:SSL:10m; | Paměť (10 MB) pro uložené relace TLS. Opakované připojení prohlížeče se tak naváže rychleji. | Nikdy. |
ssl_protocols TLSv1.2 TLSv1.3; | Povolené verze TLS; starší a nebezpečné jsou vypnuté. | Nikdy. |
ssl_ciphers, ssl_ | Povolené šifry a jejich pořadí. | Nikdy. |
add_header … | Bezpečnostní hlavičky: zákaz vkládání Panelu do cizích stránek, zákaz indexace vyhledávači a podobně. | Nikdy. |
location / + try_files | Existující soubor pošle rovnou, vše ostatní předá index.php (aplikaci). | Nikdy. |
location ~ \.php$ | Pravidla pro všechny požadavky na soubory .php. | Nikdy. |
fastcgi_pass unix:/ | Kudy Nginx předává PHP požadavky PHP-FPM. | Při přechodu na jinou verzi PHP. |
fastcgi_split_path_info, fastcgi_index, include fastcgi_params, fastcgi_param SCRIPT_FILENAME | Standardní předání požadavku PHP: rozdělí adresu na skript a zbytek cesty, určí výchozí skript a předá PHP proměnné požadavku včetně cesty ke spouštěnému souboru. | Nikdy. |
fastcgi_intercept_errors off; | Chybové stránky posílá přímo Panel, Nginx je nenahrazuje vlastními. | Nikdy. |
fastcgi_buffer_size, fastcgi_buffers | Velikost paměti, do které Nginx ukládá odpověď z PHP. | Nikdy. |
fastcgi_param PHP_VALUE … | Zvýší limity PHP pro nahrávání na 100 MB. | Společně s client_max_body_size. |
fastcgi_param HTTP_PROXY ""; | Ochrana proti útoku „httpoxy“. | Nikdy. |
fastcgi_*_timeout 300 | Jak dlouho Nginx čeká na PHP (pomalé operace). | Nikdy. |
location ~ /\.ht + deny all | Zakáže přístup ke skrytým souborům .ht…. | Nikdy. |
Varování o http2 na Debianu 13
Debian 13 má Nginx 1.26, ve kterém je zápis listen … http2 označený jako zastaralý. Test konfigurace vypíše varování the "listen ... http2" directive is deprecated. Funkčnost to neovlivní. Pokud vám varování vadí, na Debianu 13 smažte z obou řádků listen 443… slovo http2 a pod ně přidejte řádek http2 on;. Na Ubuntu 24.04 (Nginx 1.24) direktiva http2 on; neexistuje, tam ponechte zápis z ukázky.
Zapněte konfiguraci, otestujte ji a restartujte Nginx:
bash ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf nginx -t systemctl restart nginxln -s– vytvoří vsites-enabledodkaz na soubor; Nginx načítá jen konfigurace vsites-enabled.nginx -t– zkontroluje syntaxi. Musí skončit řádkemtest is successful. Pokud ne, Nginx nerestartujte a opravte řádek, který chyba uvádí.systemctl restart nginx– načte novou konfiguraci.
První přihlášení#
- V prohlížeči otevřete
https://panel.example.cz. Uvidíte přihlašovací stránku Panelu se zámkem (platný certifikát) v adresním řádku. - Přihlaste se jménem nebo e-mailem a heslem administrátora.
- Vpravo nahoře klikněte na ikonu ozubeného kola (administrace). V sekci Settings nastavte název Panelu (Company Name).
- Zapněte si dvoufázové ověření: klikněte na svůj účet vpravo nahoře, otevřete Account a v části dvoufázového ověření naskenujte QR kód aplikací (například Google Authenticator nebo Aegis). Účet administrátora ovládá všechny servery, proto ho chraňte víc než heslem.
Ověření#
Zkontrolujte celou instalaci:
systemctl is-active nginx php8.3-fpm mariadb redis-server pteroq
curl -sI https://panel.example.cz | head -n 1- První příkaz musí vypsat pětkrát
active. curl -sIstáhne jen hlavičky odpovědi; první řádek budeHTTP/2 302(přesměrování na přihlášení) neboHTTP/2 200.
Panel je hotový. Další krok je přidat nod se službou Wings, na kterém poběží herní servery: Pterodactyl Wings.
Panel za Cloudflare#
Panel můžete schovat za proxy Cloudflare (oranžový mráček). Platí to jen pro Panel, ne pro Wings (viz Pterodactyl Wings).
Nod se stejnou doménou jako Panel
Pokud jste v návodu k Wings zadali jako FQDN nodu doménu Panelu (panel.example.cz), Panel přes proxy Cloudflare nepouštějte. Prohlížeče by se k Wings na portu 8080 nepřipojily a nefungovala by konzole ani soubory serverů. Buď nechte doménu Panelu na DNS only, nebo dejte nodu samostatnou subdoménu (například node.example.cz) s šedým mráčkem a vlastním certifikátem.
V Cloudflare nastavte režim SSL/TLS na Full (strict). Cloudflare se pak k VPS připojuje přes HTTPS a ověřuje váš certifikát Let's Encrypt.
Přepněte záznam
panel.example.czna Proxied.Do
.envdoplňte na jeden řádek rozsahy IP adres Cloudflare. Za proxy se k Panelu všechny požadavky připojují z adres Cloudflare. Panel pak skutečnou IP adresu návštěvníka převezme z hlavičkyX-Forwarded-For, ale jen od adres, kterým věří. Bez tohoto řádku by Panel u všech uživatelů viděl jen adresy Cloudflare, a to v záznamech aktivit i v ochraně proti zkoušení hesel, která počítá pokusy podle IP adresy. Seznam níže odpovídá stavu k 1. 10. 2026, aktuální najdete na stránce cloudflare.com/ips (otevře se v novém okně):/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– seznam adres a rozsahů (oddělených čárkou bez mezer), od kterých Panel přijme hlavičkyX-Forwarded-*se skutečnou IP adresou návštěvníka a protokolem. Od jiných adres tyto hlavičky ignoruje, takže si je nikdo nemůže podvrhnout.
Načtěte novou konfiguraci:
cd /var/www/pterodactyl && php artisan config:clear.
Nepoužívejte režim Flexible
V režimu Flexible jde provoz mezi Cloudflare a VPS nešifrovaně přes HTTP, ale Nginx ho přesměruje na HTTPS. Výsledkem je nekonečné přesměrování (ERR_TOO_MANY_REDIRECTS). Použijte Full (strict).
Aktualizace Panelu#
Nové verze Panelu opravují chyby i bezpečnostní díry, aktualizujte proto pravidelně. Před aktualizací si přečtěte poznámky k vydání na GitHubu a zkontrolujte, jakou verzi PHP nová verze vyžaduje (php -v).
Nejdřív záloha
Před aktualizací zazálohujte databázi a soubor .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– vyexportuje databázipaneldo SQL souboru bez zamykání tabulek.$(date +%F)– vloží dnešní datum (například2026-10-01) do názvu souboru.
Pak proveďte aktualizaci:
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| Příkaz | Co dělá |
|---|---|
php artisan down | Zapne režim údržby; uživatelé uvidí stránku údržby místo chyb během aktualizace. |
curl -L … | tar -xzv | Stáhne nejnovější vydání a rovnou ho rozbalí přes stávající soubory. .env se nepřepíše, v archivu není. |
chmod -R 755 … | Obnoví práva složek pro zápis. |
composer install … | Nainstaluje knihovny pro novou verzi. |
view:clear, config:clear | Smaže zkompilované šablony a cache konfigurace, aby se načetly nové. |
migrate --seed --force | Upraví tabulky pro novou verzi a aktualizuje výchozí šablony her. Vlastní úpravy výchozích šablon se přepíšou; pokud nějakou šablonu měníte, vytvořte si její kopii. |
chown -R www-data:www-data … | Vrátí vlastnictví souborů webovému serveru. |
queue:restart | Řekne službě pteroq, ať po dokončení aktuální úlohy načte nový kód. |
php artisan up | Vypne režim údržby. |
Po aktualizaci Panelu aktualizujte i Wings, postup je v návodu Pterodactyl Wings. Verze Panelu a Wings mají jít ruku v ruce, používejte nejnovější vydání obou.
Zálohy Panelu#
Pro obnovu Panelu potřebujete dvě věci: databázi panel a soubor .env (hlavně APP_KEY). Data herních serverů leží na nodu s Wings, ne v Panelu, zálohujte je zvlášť. Jak zálohy automatizovat a dostat mimo server, popisuje návod Zálohy na VPS.
Když něco nefunguje#
502 Bad Gateway#
Nginx se nedostal k PHP-FPM. Zkontrolujte, že PHP-FPM běží a že cesta k socketu sedí:
systemctl status php8.3-fpm
ls /run/php/Ve výpisu ls musí být php8.3-fpm.sock a stejná cesta musí být v direktivě fastcgi_pass. Pokud služba neběží, spusťte ji: systemctl enable --now php8.3-fpm.
Chyba 500 nebo prázdná stránka#
Podívejte se do logu Panelu:
tail -n 100 /var/www/pterodactyl/storage/logs/laravel-$(date +%F).logtail -n 100– vypíše posledních 100 řádků logu z dnešního dne.
Hledejte řádek s datem a slovem ERROR. Nejčastější příčiny:
Permission denied– špatný vlastník souborů. Spusťte znovuchown -R www-data:www-data /var/www/pterodactyl/*.No application encryption key has been specified.– chybíAPP_KEY. Při první instalaci spusťtephp artisan key:generate --force. Pokud Panel už data má, vraťte původní klíč ze zálohy.SQLSTATE[HY000] [1045] Access denied– nesedí heslo nebo uživatel databáze v.env.
The MAC is invalid#
Databáze byla zašifrovaná jiným APP_KEY, než je teď v .env. Typicky po obnově databáze na novou instalaci. Jediná oprava je vrátit do .env původní APP_KEY. Bez něj se šifrovaná data obnovit nedají.
E-maily nechodí#
Nejčastěji neběží fronta. Zkontrolujte službu a její log:
systemctl status pteroq
journalctl -u pteroq -n 50journalctl -u pteroq -n 50– posledních 50 řádků logu služby.
Ověřte také, že běží Redis (systemctl status redis-server). Po opravě spusťte systemctl restart pteroq. Pokud fronta běží, zkontrolujte nastavení pošty (php artisan p:environment:mail) a chyby v logu Panelu (kapitola Chyba 500).
Server visí na instalaci#
Instalaci serveru provádí Wings, ne Panel. Postup je v návodu Pterodactyl Wings v části „Když něco nefunguje“ (nejčastěji nefunkční DNS v kontejnerech nebo nedostupný nod).
Naplánované úlohy serverů se nespouštějí#
Zkontrolujte, že běží fronta (systemctl status pteroq), řádek v cronu (crontab -l) a časová pásma: systém (timedatectl), Panel (APP_TIMEZONE v .env). Pomůže i vymazání cache plánovače:
php /var/www/pterodactyl/artisan schedule:clear-cache
systemctl restart pteroqNginx nenastartuje: cannot load certificate#
Certifikát pro doménu v konfiguraci neexistuje: nezískali jste ho, nebo se doména v server_name a v cestě /etc/letsencrypt/live/… liší od té, pro kterou byl vydán. Seznam certifikátů vypíše certbot certificates.
Certbot: Timeout during connect (likely firewall problem)#
Let's Encrypt se nedostal na port 80 vaší VPS. Zkontrolujte, že A záznam domény ukazuje na IPv4 adresu VPS, že je port 80 povolený ve firewallu zákaznické zóny i v UFW a že Nginx běží. Pokud má doména záznam AAAA, musí ukazovat na IPv6 adresu této VPS, Let's Encrypt zkouší i IPv6.
Composer nebo artisan hlásí špatnou verzi PHP#
Hláška obsahuje například requires php ^8.2 || ^8.3 but your php version (8.4…) does not satisfy that requirement. Příkaz php spouští jinou verzi než 8.3, typicky na Debianu 13 po instalaci výchozího balíčku php. Nastavte výchozí PHP na 8.3:
update-alternatives --set php /usr/bin/php8.3
php -vupdate-alternatives --set php …– určí, kterou verzi spouští příkazphp.
Pokud /usr/bin/php8.3 neexistuje, PHP 8.3 není nainstalované. Vraťte se ke kapitole Instalace závislostí.
Stránka se za Cloudflare točí v přesměrování (ERR_TOO_MANY_REDIRECTS)#
V Cloudflare je režim Flexible. Přepněte ho na Full (strict) a zkontrolujte i TRUSTED_PROXIES podle Panel za Cloudflare.
Za Cloudflare nefunguje konzole serverů#
Doména nodu jde přes proxy Cloudflare (oranžový mráček). Typicky když nod používá stejnou doménu jako Panel. Přepněte doménu nodu na DNS only, nebo nodu dejte samostatnou subdoménu.
Shrnutí
- Panel běží na Nginx + PHP 8.3 (na Debianu 13 z repozitáře
packages.sury.org), MariaDB a Redisu. - Databázový uživatel Panelu má host
127.0.0.1a práva jen k databázipanel. APP_KEYz.envmáte uložený mimo server, bez něj nejde obnovit šifrovaná data.- Cron spouští
schedule:runkaždou minutu, službapteroqzpracovává frontu. - Certifikát se obnovuje sám a Nginx ho po obnově načte díky deploy hooku.
- Další krok: Pterodactyl Wings a databázový host pro servery.
Další zdroje#
- Pterodactyl: Getting Started (otevře se v novém okně)
- Pterodactyl: Webserver Configuration (otevře se v novém okně)
- Pterodactyl: Updating the Panel (otevře se v novém okně)
- Pterodactyl: Additional Configuration (otevře se v novém okně)
- Pterodactyl: Troubleshooting (otevře se v novém okně)
- Certbot: User Guide (otevře se v novém okně)