Det här sätter du upp
Pterodactyl är en panel för spelservrar. Du skapar en server i webbläsaren, väljer ett spel som Minecraft, och Pterodactyl installerar och kör det i en egen Docker-container, med gränser för minne, processor och disk. Du, och de spelare du ger tillgång, får en konsol, en filhanterare, scheman och säkerhetskopior för varje server.
Pterodactyl består av två delar. Panelen är webbplatsen, en PHP-app med en MariaDB-databas. Wings körs på varje maskin som har spelservrar och startar containrarna. I den här guiden ligger båda på samma server. Wings går inte att köra med Podman utan root: den styr Dockers root-tjänst direkt, skapar en container för varje spelserver och byter ägare på deras filer, så den körs som root och behöver en egen server. Pelican är en nyare fork av Pterodactyl, om du vill jämföra.
Varje steg nedan har körts på en nyinstallerad VC-P Alloy (2 vCPU, 8 GB) hos Melonslab med Debian 13:
- Pterodactyls dokumentation anger Debian 13 som stödd. Panelen kördes på Debians egna PHP 8.4, MariaDB 11.8 och Redis 8.0, utan de extra paketförråd som dokumentationen lägger till. Steg 1 visar vad mer som justerades.
- Administratören skapades på kommandoraden. Båda webbservrarna testades på samma server: Caddy, och före den nginx med Certbot. Båda fick certifikat från Let's Encrypt för panelen och för Wings och omdirigerade HTTP till HTTPS. Med Caddy startade Wings om av sig själv när dess certifikat byttes ut. Med Certbot gick en testförnyelse igenom.
- Panelen loggade varje besökares riktiga adress.
- En plats, en nod och allokeringar skapades, och en Minecraft-server från standardägget Paper var installerad och igång inom en minut. En statusförfrågan utifrån nådde den över IPv4. Över IPv6 svarade den från själva servern, eftersom vår testdator saknar IPv6.
- Konsolen fungerade, och en säkerhetskopia av spelservern togs och återställdes med båda. Filhanteraren och SFTP testades med Caddy, även efter en omstart av servern.
- Från internet var bara SSH, webbplatsen, Wings portar 8080 och 2022 och spelporten öppna. Databasen och Redis var det inte.
- Panelen och Wings uppdaterades, och allt startade igen av sig självt efter en omstart av servern, även spelservern.
Med en Minecraft-server utan spelare använde hela servern omkring 1,5 GB minne med Caddy och 1,6 GB med nginx, varav Minecraft-servern omkring 820 MB.
Innan du börjar
Du behöver:
- en nyinstallerad server hos Melonslab med Debian 13 och inget annat installerat. Varje spelserver behöver eget minne utöver panelen, så välj storlek efter de spel du vill köra;
- två namn med A- och AAAA-poster som pekar på servern: ett för panelen, till exempel
panel.example.com, och ett för Wings, till exempelwings.example.com.
Sätt upp SSH-nycklar och automatiska säkerhetsuppdateringar enligt steg 1 till 3 i säkerhetsguiden, och hoppa över steg 4: steg 10 här sätter upp brandväggen med de portar Pterodactyl behöver.
Exemplen använder panel.example.com och wings.example.com, och 203.0.113.10 och 2001:db8::10 som serverns adresser. Byt genomgående ut dem mot dina egna.
Panelen behöver en webbserver, och den här guiden tar upp två. Caddy hämtar och förnyar certifikat av sig själv. nginx med Certbot är det Pterodactyls dokumentation visar först. Välj en, så följer stegen nedan den:
1. Installera det panelen behöver
Panelen behöver PHP, en webbserver, MariaDB och Redis. Pterodactyls guide för Debian lägger till ett paketförråd för PHP 8.3, och på äldre Debianversioner även för MariaDB och Redis. Debian 13 har tillräckligt nya versioner av allihop. Som root:
Med Caddy
apt update
apt install -y php8.4 php8.4-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server caddy tar unzip git redis-server curl composer
Det här installerar PHP 8.4, som Pterodactyls dokumentation inte nämner. Panelens egna krav tillåter det, och inget steg nedan visade något fel eller någon varning med det. De andra ändringarna jämfört med dokumentationen, för Debian 13 och för den här installationen, är:
- den schemalagda uppgiften i steg 4 körs som webbserverns användare, inte som root;
.env, som innehåller databasens lösenord och krypteringsnyckeln, går bara att läsa för webbserverns PHP efter steg 3;- Composer kommer från Debians paket i stället för från sitt eget installationsprogram.
Med Caddy
Webbservern är Caddy från Debians eget paket, med Pterodactyls egen Caddy-konfiguration pekad mot PHP 8.4 i steg 5.
2. Ladda ner panelen och skapa dess databas
mkdir -p /var/www/pterodactyl
cd /var/www/pterodactyl
curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
tar -xzvf panel.tar.gz
chmod -R 755 storage/* bootstrap/cache/
Öppna databasens skal med mariadb, och skapa en användare och en databas för panelen, med ett eget lösenord:
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'Choose-a-long-password';
CREATE DATABASE panel;
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;
exit
Installera sedan panelens PHP-bibliotek och skapa dess krypteringsnyckel:
cp .env.example .env
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
php artisan key:generate --force
Nyckeln är raden som börjar med APP_KEY= i /var/www/pterodactyl/.env. Panelen krypterar hemligheter som API-nycklar med den, och en säkerhetskopia av databasen går inte att läsa utan den. Spara en kopia av raden utanför servern och förvara den säkert, till exempel i en lösenordshanterare.
3. Konfigurera panelen och skapa administratören
php artisan p:environment:setup
Kommandot ställer några frågor. Svara så här:
| Fråga | Svar |
|---|---|
| Egg Author Email | din e-postadress |
| Application URL | https://panel.example.com |
| Application Timezone | din tidszon, till exempel Europe/Stockholm |
| Cache Driver, Session Driver och Queue Driver | redis för alla tre |
| Enable UI based settings editor? | yes |
| Enable sending anonymous telemetry data? | no, eller yes om du vill hjälpa till |
Behåll standardvärdena för frågorna om Redis. Telemetrin är anonym: en gång om dagen skickar den ett slumpat id, versionerna av panelen, PHP, databasen och Docker, och antalet servrar, användare och säkerhetskopior till telemetry.pterodactyl.io, utan namn, e-postadresser eller IP-adresser i uppgifterna.
Anslut sedan panelen till databasen. Behåll standardvärdena och ange lösenordet från steg 2:
php artisan p:environment:database
Skapa tabellerna och läs in standardäggen, mallarna för varje spel:
php artisan migrate --seed --force
Pterodactyl har ingen registreringssida för den första administratören, så ingen annan kan ta över panelen före dig. Skapa din administratör på kommandoraden:
php artisan p:user:make
Svara yes på Is this user an administrator?, och ange sedan en e-postadress, ett användarnamn, för- och efternamn och ett lösenord med minst 8 tecken, en stor bokstav och en siffra.
Ge till sist filerna till webbservern, och skydda .env mot andra användare på servern:
chown -R www-data:www-data /var/www/pterodactyl/*
chown www-data:www-data /var/www/pterodactyl/.env
chmod 600 /var/www/pterodactyl/.env
Panelen skickar e-post för nya lösenord och nya användare. Det satte vi inte upp för den här guiden. Har du en SMTP-server frågar php artisan p:environment:mail efter dess uppgifter. Fram till dess visar panelens logg ett fel varje gång den försöker skicka.
4. Starta bakgrundsjobben
Panelen kör schemalagda uppgifter varje minut och en kö för arbete i bakgrunden. Lägg den schemalagda uppgiften i webbserverns crontab, så att filerna den skapar tillhör webbservern:
echo "* * * * * php /var/www/pterodactyl/artisan schedule:run >> /dev/null 2>&1" | crontab -u www-data -
Skapa /etc/systemd/system/pteroq.service för kön:
[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
Starta den sedan:
systemctl enable --now redis-server pteroq.service
5. Skaffa certifikat och sätt upp webbservern
Med Caddy
Caddy tar emot besökarna till panelen, hämtar dess certifikat från Let's Encrypt, förnyar det och omdirigerar HTTP till HTTPS, helt av sig själv. Den hämtar också certifikatet för Wings namn, som steg 8 pekar Wings mot. Debians Caddy är version 2.6.2, som är äldre än Caddys egna versioner men förstår varje rad i Pterodactyls konfiguration, och den får säkerhetsuppdateringar från Debian.
Ersätt /etc/caddy/Caddyfile med det här. Det är Pterodactyls egen Caddy-konfiguration med PHP 8.4, och ett andra block i slutet som bara finns för att hämta certifikatet för wings.example.com:
{
servers :443 {
timeouts {
read_body 120s
}
}
}
panel.example.com {
root * /var/www/pterodactyl/public
file_server
php_fastcgi unix//run/php/php8.4-fpm.sock {
root /var/www/pterodactyl/public
index index.php
env PHP_VALUE "upload_max_filesize = 100M
post_max_size = 100M"
env HTTP_PROXY ""
env HTTPS "on"
read_timeout 300s
dial_timeout 300s
write_timeout 300s
}
header Strict-Transport-Security "max-age=16768000; preload;"
header X-Content-Type-Options "nosniff"
header X-XSS-Protection "1; mode=block;"
header X-Robots-Tag "none"
header Content-Security-Policy "frame-ancestors 'self'"
header X-Frame-Options "DENY"
header Referrer-Policy "same-origin"
request_body {
max_size 100m
}
respond /.ht* 403
log {
output file /var/log/caddy/pterodactyl.log {
roll_size 100MiB
roll_keep_for 7d
}
level INFO
}
}
wings.example.com {
respond 404
}
Starta sedan om Caddy:
systemctl restart caddy
Inom en minut svarar https://panel.example.com med ett certifikat, över IPv4 och IPv6. Headern Strict-Transport-Security säger åt webbläsare att bara använda HTTPS för panelens namn det närmaste halvåret.
Caddy pratar direkt med PHP, inte som en proxy framför en annan webbserver, så panelen ser varje besökares riktiga adress utan någon inställning för betrodda proxyer. Debians Caddy-paket lägger till användaren caddy i gruppen www-data, så att den når PHP. Det är också därför bara ägaren kan läsa .env.
6. Logga in och stäng av reCAPTCHA
Öppna https://panel.example.com och logga in med administratören från steg 3. Kugghjulet uppe till höger öppnar administrationen, på https://panel.example.com/admin.
Från början använder inloggningssidan Googles reCAPTCHA, med nycklar som följer med varje installation av Pterodactyl, så varje besökares webbläsare hämtar den från Google. Inloggningen är begränsad även utan den: efter några misslyckade försök spärras den en stund. Stäng av den genom att öppna Settings och sedan Advanced, ställa in Status under reCAPTCHA på Disabled och välja Save. Vill du behålla den skapar du egna nycklar hos Google och anger dem där.
Under Settings och General kan du ställa in Require 2-Factor Authentication på Admin Only eller All Users.
7. Installera Docker och Wings
Installera Docker med Dockers eget skript, som Pterodactyls dokumentation gör. Det ställer in Docker att starta vid uppstart:
curl -sSL https://get.docker.com/ | CHANNEL=stable bash
Ladda sedan ner Wings:
mkdir -p /etc/pterodactyl
curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")"
chmod u+x /usr/local/bin/wings
Skapa /etc/systemd/system/wings.service:
[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service
Requires=docker.service
PartOf=docker.service
[Service]
User=root
WorkingDirectory=/etc/pterodactyl
LimitNOFILE=4096
PIDFile=/var/run/wings/daemon.pid
ExecStart=/usr/local/bin/wings
Restart=on-failure
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s
[Install]
WantedBy=multi-user.target
Starta den inte än. Den behöver först sin konfiguration från panelen.
8. Skapa en plats och en nod
En nod är en maskin som kör Wings, och varje nod hör till en plats. Gör så här i administrationen:
- Öppna Locations och välj Create New. Ange en Short Code, till exempel
se-sto, och en Description, till exempelStockholm, och välj Create. - Öppna Nodes och välj Create New. Ange ett Name, välj Location och ange
wings.example.comsom FQDN. Behåll Use SSL Connection och Not Behind Proxy. - Ange under Configuration hur mycket minne och disk spelservrarna får använda totalt, i MiB, till exempel
6144för Total Memory och30720för Total Disk Space, och0för båda överallokeringarna. Lämna lite minne åt panelen. Behåll Daemon Port8080och Daemon SFTP Port2022, och välj Create Node.
Öppna nodens flik Configuration och välj Generate Token. Panelen visar ett kommando som börjar med cd /etc/pterodactyl && sudo wings configure. Kör det på servern. Som root kan du ta bort sudo. Det skriver /etc/pterodactyl/config.yml och avslutas med Successfully configured wings.
Med Caddy
Filen räknar med att certifikatet ligger där Certbot skulle lägga det, under /etc/letsencrypt. Peka den i stället mot Caddys certifikat för wings.example.com. Wings körs som root och kan därför läsa Caddys filer:
C=/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wings.example.com
sed -i "s#cert: /etc/letsencrypt/live/wings.example.com/fullchain.pem#cert: $C/wings.example.com.crt#; s#key: /etc/letsencrypt/live/wings.example.com/privkey.pem#key: $C/wings.example.com.key#" /etc/pterodactyl/config.yml
grep -A4 "ssl:" /etc/pterodactyl/config.yml
Det sista kommandot visar de två nya sökvägarna under cert: och key:. Wings behåller dem när du senare ändrar noden i panelen.
Wings läser certifikatet bara när den startar, och Caddy förnyar det ungefär en månad innan det går ut. Låt därför systemd starta om Wings varje gång Caddy skriver ett nytt. Skapa /etc/systemd/system/wings-cert.path:
[Unit]
Description=Restart Wings when Caddy renews its certificate
[Path]
PathChanged=/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wings.example.com/wings.example.com.crt
[Install]
WantedBy=multi-user.target
Och /etc/systemd/system/wings-cert.service, som väntar tio sekunder så att Caddy hinner skriva nyckeln också:
[Unit]
Description=Restart Wings for a renewed certificate
[Service]
ExecStartPre=/bin/sleep 10
Type=oneshot
ExecStart=/usr/bin/systemctl restart wings.service
En omstart av Wings stoppar inte spelservrarna. Starta sedan Wings och bevakningen:
systemctl daemon-reload
systemctl enable --now wings wings-cert.path
Token är en API-nyckel med åtkomst till dina noder, och kommandot skriver också ut den i sin helhet. Wings behöver den inte när den väl är konfigurerad, så ta bort den: öppna Application API och ta bort nyckeln med anteckningen Automatically generated node deployment key.
9. Lägg till allokeringar
En allokering är en adress och en port som en spelserver kan använda. Öppna nodens flik Allocation. Under Assign New Allocations:
- Ange
0.0.0.0som IP Address,25565i Ports och ett namn som pekar på servern som IP Alias, till exempelwings.example.com, och välj Submit. Aliaset är adressen spelarna ser i panelen. - Lägg till samma port igen med
::som IP Address, för IPv6.
0.0.0.0 tar emot spelare på alla serverns IPv4-adresser och :: på alla dess IPv6-adresser. Ports tar också ett intervall, till exempel 25565-25570, för fler servrar.
10. Öppna brandväggen
Wings API på port 8080 är det din webbläsare ansluter till för konsolen, och port 2022 är dess SFTP-server för spelservrarnas filer. Båda måste gå att nå, liksom SSH och webbplatsen.
Med Caddy
Caddy svarar också på UDP-port 443 för HTTP/3:
apt install -y ufw
ufw allow 22/tcp
ufw allow 80,443/tcp
ufw allow 443/udp
ufw allow 8080,2022/tcp
ufw enable
Spelportarna behöver ingen regel. Docker öppnar de portar den publicerar förbi ufw, så en spelport är öppen mot internet så snart en server använder dess allokering, och stängd igen när ingen server gör det. Portar utan server förblir stängda. MariaDB och Redis lyssnar bara på själva servern.
11. Skapa en spelserver
Öppna Servers i administrationen och välj Create New:
- Ange ett Server Name, och skriv din e-postadress i Server Owner för att välja ditt konto.
- Välj noden, och
0.0.0.0:25565som Default Allocation. - Ställ under Application Feature Limits in Backup Limit på antalet säkerhetskopior som ska sparas, till exempel
2. Från början är den0, vilket betyder inga säkerhetskopior för servern. - Ange Memory och Disk Space i MiB, till exempel
2048och5120. - Välj Minecraft och ägget Paper under Nest Configuration. Standardvärdena under Docker Configuration och Service Variables installerar den senaste versionen av Minecraft.
- Välj Create Server.
För IPv6 öppnar du serverns flik Build Configuration, väljer :::25565 under Assign Additional Ports och väljer Update Build Configuration.
Öppna sedan servern från din egen lista på https://panel.example.com. Installationen tog några sekunder på vår testserver. Välj Start. Minecraft stannar först tills du godkänner licensen, och panelen ber dig göra det: läs den och välj I Accept. Servern startar, och konsolen visar vad den skriver ut.
Spelarna ansluter till wings.example.com, adressen under Address. Minecrafts standardport, 25565, behöver de inte skriva.
12. Säkerhetskopiera
Välj Create backup på serverns flik Backups, ge den ett Backup name och välj Start backup. Säkerhetskopian av vår Minecraft-server var 208 MB. För att återställa öppnar du menyn bredvid en säkerhetskopia, väljer Restore och kryssar i Delete all files before restoring backup för att få tillbaka exakt de filer som säkerhetskopierades. Servern stannar medan den återställs. Schedules kan skapa säkerhetskopior av sig själva.
Säkerhetskopiorna sparas i /var/lib/pterodactyl/backups på samma server, så de hjälper inte om servern går förlorad. Pterodactyl kan också lagra dem i en S3-bucket, vilket vi inte testade. För att kunna bygga upp själva panelen igen sparar du en kopia av det här utanför servern:
- en dump av databasen, från
mariadb-dump --single-transaction panel | gzip > panel.sql.gz; /var/www/pterodactyl/.env, med krypteringsnyckeln;/etc/pterodactyl/config.yml;- spelservrarnas filer i
/var/lib/pterodactyl/volumes, eller deras säkerhetskopior.
13. Uppdateringar
Läs Pterodactyls versionsinformation innan du uppdaterar. Så här uppdaterar du panelen:
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
För att uppdatera Wings stoppar du den, laddar ner den igen och startar den. Spelservrarna fortsätter att köra medan Wings är stoppad:
systemctl stop wings
curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")"
chmod u+x /usr/local/bin/wings
systemctl restart wings
PHP, webbservern, MariaDB, Redis och Docker är paket från Debian och Docker, och täcks av de automatiska säkerhetsuppdateringarna från säkerhetsguiden.
Felsökning
Konsolen kan inte ansluta, eller visar ingen statistik. Din webbläsare ansluter till Wings på wings.example.com och port 8080. Kontrollera att Wings körs med systemctl status wings, att port 8080 är tillåten i ufw och att nodens FQDN stämmer med namnet på Wings certifikat. journalctl -u wings visar varför Wings stannade.
Med Caddy
Wings startar inte, och journalctl -u wings visar failed to configure HTTPS server med no such file or directory. Caddy har inte fått certifikatet för wings.example.com än, oftast för att dess A- eller AAAA-post inte pekar på servern. journalctl -u caddy visar varför. När filen finns i katalogen från steg 8 startar du Wings med systemctl restart wings.
Spelarna kan inte ansluta över IPv6. Servern saknar en allokering på ::. Lägg till en som i steg 9, tilldela den som i steg 11 och starta om spelservern från dess konsol.
Fliken Backups visar "Backups cannot be created for this server because the backup limit is set to 0." Höj Backup Limit på serverns flik Build Configuration i administrationen och välj Update Build Configuration.