Pterodactyl Panel¶
LXC: game panel (CT 400) - web frontend for managing game servers.
Instance¶
| Setting | Value |
|---|---|
| Port | 80 (Apache) |
| Panel dir | /opt/pterodactyl-panel/ (symlink → /data/panel) |
| PHP | 8.4-FPM |
| Web server | Apache2 |
| URL | https://game-panel.home.example.com (user-facing, :443) |
| Tailscale | http://<panel-ts-ip> |
| Managed as | Komodo Periphery binary (no Docker) |
CT 400 runs Apache + PHP directly (no Docker). Komodo manages the binary Periphery agent only.
Database¶
| Setting | Value |
|---|---|
| Engine | MariaDB |
| Data dir | /data/mysql/ (bind-mounted from host) |
| Ownership | 999:999 (MySQL container UID) |
Bind Mount Ownership¶
| Path | Owner | Notes |
|---|---|---|
/data/panel/ |
33:33 (www-data) |
Panel application files |
/data/mysql/ |
999:999 |
MariaDB data directory |
Permission Requirements¶
php artisancommands must run aswww-data- running as root creates root-owned cache files that break the web server- Bind-mounted files cannot be edited with tools that use atomic rename (e.g.
sed -i) - edit in-place - After reinstall: re-run
php artisan key:generateandphp artisan p:environment:setup - After composer update: run
php artisan optimize:clearas www-data .envmust be ownedwww-data:www-datawith mode640
Traefik Route¶
stacks/game-panel/traefik-route.yml on CT 100.
Key Takeaways¶
- Panel
artisancommands always aswww-data:sudo -u www-data php artisan <cmd> - Database bind mount ownership is
999:999- not the CT 400 idmap scheme - CT 400
onboot = no- start manually when needed