Blame
|
1 | # Game Servers |
||||||
| 2 | ||||||||
| 3 | ← [[Home]] |
|||||||
| 4 | ||||||||
| 5 | Game servers managed via Pterodactyl. Panel on PCT 300, Wings daemon on PCT 301. |
|||||||
| 6 | ||||||||
| 7 | --- |
|||||||
| 8 | ||||||||
| 9 | ## Access |
|||||||
| 10 | ||||||||
| 11 | | Service | URL | IP | |
|||||||
| 12 | |---------|-----|----| |
|||||||
| 13 | | Pterodactyl Panel | `pterodactyl.carr-family.org` | `192.168.2.136` (lan-only) | |
|||||||
| 14 | | Panel admin | admin / `[email protected]` | — | |
|||||||
| 15 | | Wings API | — | `192.168.2.134:8080` | |
|||||||
| 16 | ||||||||
| 17 | --- |
|||||||
| 18 | ||||||||
| 19 | ## PCT 300 — Pterodactyl Panel |
|||||||
| 20 | ||||||||
| 21 | Apache2 + MariaDB + Redis. Not a Swarm node. |
|||||||
| 22 | ||||||||
| 23 | ||||||||
| 24 | - **Redis:** `redis-server` |
|||||||
| 25 | - **Queue worker:** `pteroq.service` |
|||||||
| 26 | - **Application API key:** `ptcl1234567890abSetupSecretKey345678901234567890` |
|||||||
| 27 | ||||||||
| 28 | **Important:** always use `pct exec 300 -- env -i HOME=/root PATH=... TMPDIR=/tmp LANG=en_US.UTF-8 bash -c` to avoid inheriting `TMPDIR=/tmp/claude-0` from the Proxmox host (breaks MariaDB). |
|||||||
| 29 | ||||||||
| 30 | --- |
|||||||
| 31 | ||||||||
| 32 | ## PCT 301 — Pterodactyl Wings |
|||||||
| 33 | ||||||||
| 34 | Wings daemon v1.12 + Docker. |
|||||||
| 35 | ||||||||
| 36 | - **Config:** `/etc/pterodactyl/config.yml` — `remote: http://192.168.2.136`, token_id `08ifx4nsAOfSdrlK` |
|||||||
| 37 | - **Game server volumes:** `/var/lib/pterodactyl/volumes/<uuid>/` owned `999:988` |
|||||||
| 38 | - **Local registry:** `192.168.2.134:5000` (auto-restart container `registry`) |
|||||||
| 39 | ||||||||
| 40 | **Wings API power commands:** |
|||||||
| 41 | ```bash |
|||||||
| 42 | WINGS_TOKEN="hy92RMjddu3CIrGPCm3F7tBDSfl1BREKpAw4hkXuSC0F3vVBKxd6SFPW1UrGG4Zz" |
|||||||
| 43 | curl -s -X POST http://192.168.2.134:8080/api/servers/<uuid>/power \ |
|||||||
| 44 | -H "Authorization: Bearer $WINGS_TOKEN" \ |
|||||||
| 45 | -H "Content-Type: application/json" \ |
|||||||
| 46 | -d '{"action": "start|stop|kill|restart"}' |
|||||||
| 47 | ``` |
|||||||
| 48 | ||||||||
| 49 | **Manage Wings:** |
|||||||
| 50 | ```bash |
|||||||
| 51 | pct exec 301 -- env -i HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TMPDIR=/tmp bash -c "systemctl restart wings" |
|||||||
| 52 | pct exec 301 -- env -i HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TMPDIR=/tmp bash -c "journalctl -u wings --no-pager -n 50" |
|||||||
| 53 | ``` |
|||||||
| 54 | ||||||||
| 55 | ### Custom Docker Image |
|||||||
| 56 | ||||||||
| 57 | `localhost:5000/pterodactyl-steamcmd:latest` — based on `cm2network/steamcmd:latest`, adds pterodactyl user (999:988). CMD: `["/bin/bash", "/home/container/start.sh"]`. |
|||||||
| 58 | ||||||||
| 59 | **Image rebuild workflow:** |
|||||||
| 60 | ```bash |
|||||||
| 61 | # On PCT 301 — build and push to local registry, then kill+start the server |
|||||||
| 62 | docker build -t localhost:5000/pterodactyl-steamcmd:latest /tmp/ptero-steamcmd/ |
|||||||
| 63 | docker push localhost:5000/pterodactyl-steamcmd:latest |
|||||||
| 64 | ``` |
|||||||
| 65 | ||||||||
| 66 | ### SteamCMD Update Pattern |
|||||||
| 67 | ||||||||
| 68 | Wings can't pull `localhost:5000/` images during install. Always update manually: |
|||||||
| 69 | ```bash |
|||||||
| 70 | WINGS_TOKEN="hy92RMjddu3CIrGPCm3F7tBDSfl1BREKpAw4hkXuSC0F3vVBKxd6SFPW1UrGG4Zz" |
|||||||
| 71 | curl -s -X POST http://192.168.2.134:8080/api/servers/<uuid>/power \ |
|||||||
| 72 | -H "Authorization: Bearer $WINGS_TOKEN" -H "Content-Type: application/json" -d '{"action":"kill"}' |
|||||||
| 73 | ||||||||
| 74 | pct exec 301 -- env -i HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TMPDIR=/tmp bash -c " |
|||||||
| 75 | docker run --rm -u 999:988 \ |
|||||||
| 76 | -v /var/lib/pterodactyl/volumes/<uuid>:/home/container \ |
|||||||
| 77 | localhost:5000/pterodactyl-steamcmd:latest \ |
|||||||
| 78 | bash -c 'cd /home/container && ./steamcmd/steamcmd.sh \ |
|||||||
| 79 | +@sSteamCmdForcePlatformType linux +force_install_dir /home/container \ |
|||||||
| 80 | +login anonymous +app_update <appid> validate +quit'" |
|||||||
| 81 | ||||||||
| 82 | curl -s -X POST http://192.168.2.134:8080/api/servers/<uuid>/power \ |
|||||||
| 83 | -H "Authorization: Bearer $WINGS_TOKEN" -H "Content-Type: application/json" -d '{"action":"start"}' |
|||||||
| 84 | ``` |
|||||||
| 85 | ||||||||
| 86 | --- |
|||||||
| 87 | ||||||||
| 88 | ## Port Allocations (PCT 301) |
|||||||
| 89 | ||||||||
| 90 | | Port(s) | Game | |
|||||||
| 91 | |---------|------| |
|||||||
| 92 | | 7777 TCP+UDP, 8888 TCP | Satisfactory | |
|||||||
| 93 | | 25565–25566 | Minecraft Java | |
|||||||
| 94 | | 27015–27020 | Source/Valve (CS2, TF2, L4D2) | |
|||||||
| 95 | | 2456–2458 | Valheim | |
|||||||
| 96 | | 19132 | Minecraft Bedrock | |
|||||||
| 97 | | 30000–30010 | Custom | |
|||||||
| 98 | ||||||||
| 99 | --- |
|||||||
| 100 | ||||||||
| 101 | ## Satisfactory |
|||||||
| 102 | ||||||||
| 103 | Server ID 1, UUID `949251ef-944e-44f4-8b20-60be34b0120a`. Steam App ID: 1690800. |
|||||||
| 104 | ||||||||
| 105 | - **Image:** `localhost:5000/pterodactyl-steamcmd:latest` |
|||||||
| 106 | - **Ports:** 7777 TCP+UDP (game traffic), 8888 TCP (ReliableMessaging — **required for external clients**) |
|||||||
| 107 | - **RAM:** 6 GB | **Disk:** 20 GB |
|||||||
| 108 | - **Volume:** `/var/lib/pterodactyl/volumes/949251ef-944e-44f4-8b20-60be34b0120a/` |
|||||||
| 109 | - **Connect:** `192.168.2.134:7777` |
|||||||
| 110 | - **Save files:** `<volume>/.config/Epic/FactoryGame/Saved/SaveGames/server/` |
|||||||
| 111 | ||||||||
| 112 | **DNS:** `satisfactory.carr-family.org` → public IP `174.95.181.77` (grey cloud, proxy off). Router port forwards TCP+UDP 7777 and TCP 8888 to `192.168.2.134`. |
|||||||
| 113 | ||||||||
| 114 | **Known gotchas:** |
|||||||
| 115 | - **TCP 8888 is required** — without it, external clients join but are kicked exactly 20 seconds later (`LogReliableMessaging: Handshake timed out`) |
|||||||
| 116 | - **Ports 15000/15777 are obsolete** — removed since Patch 1.0 |
|||||||
| 117 | - **Version must match client exactly** — mismatches show as `ConnectionTimeout`, not an explicit error |
|||||||
| 118 | - **Auto-pause causes join timeouts during startup** — disable auto-pause after claiming the server |
|||||||
| 119 | - **First-time setup** — wait 35+ seconds after start before connecting to an unclaimed server |
|||||||
| 120 | ||||||||
| 121 | **Update:** |
|||||||
| 122 | ```bash |
|||||||
| 123 | WINGS_TOKEN="hy92RMjddu3CIrGPCm3F7tBDSfl1BREKpAw4hkXuSC0F3vVBKxd6SFPW1UrGG4Zz" |
|||||||
| 124 | curl -s -X POST http://192.168.2.134:8080/api/servers/949251ef-944e-44f4-8b20-60be34b0120a/power \ |
|||||||
| 125 | -H "Authorization: Bearer $WINGS_TOKEN" -H "Content-Type: application/json" -d '{"action":"kill"}' |
|||||||
| 126 | pct exec 301 -- env -i HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TMPDIR=/tmp bash -c " |
|||||||
| 127 | docker run --rm -u 999:988 \ |
|||||||
| 128 | -v /var/lib/pterodactyl/volumes/949251ef-944e-44f4-8b20-60be34b0120a:/home/container \ |
|||||||
| 129 | localhost:5000/pterodactyl-steamcmd:latest \ |
|||||||
| 130 | bash -c 'cd /home/container && ./steamcmd/steamcmd.sh +@sSteamCmdForcePlatformType linux +force_install_dir /home/container +login anonymous +app_update 1690800 validate +quit'" |
|||||||
| 131 | curl -s -X POST http://192.168.2.134:8080/api/servers/949251ef-944e-44f4-8b20-60be34b0120a/power \ |
|||||||
| 132 | -H "Authorization: Bearer $WINGS_TOKEN" -H "Content-Type: application/json" -d '{"action":"start"}' |
|||||||
| 133 | ``` |
|||||||
