- Go 99.2%
- Shell 0.5%
- Nix 0.1%
- Makefile 0.1%
|
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Docker / Build and Push (push) Waiting to run
Push / Build and Test (push) Waiting to run
Push / Build and Test-1 (push) Waiting to run
Push / Build and Test-2 (push) Waiting to run
Push / Build and Test-3 (push) Waiting to run
tokens 74 to 91 percent, middleware 57 to 82. Two bugs: RemoteDownloadEnabled read the config once at router build time, so /api/update could not switch it, and postTransfers compared the Bearer scheme case-sensitively while the middleware accepts any case. |
||
|---|---|---|
| .github | ||
| cmd | ||
| config | ||
| environment | ||
| events | ||
| internal | ||
| loggers/cli | ||
| parser | ||
| remote | ||
| router | ||
| scripts | ||
| server | ||
| sftp | ||
| system | ||
| .dockerignore | ||
| .editorconfig | ||
| .gitignore | ||
| CHANGELOG.md | ||
| docker-compose.example.yml | ||
| Dockerfile | ||
| flake.lock | ||
| flake.nix | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
| superdaemon.go | ||
SuperDaemon
SuperDaemon is a fork of Pterodactyl Wings. It provides the same HTTP API and SFTP access to manage game-server containers, but is developed independently.
SuperDaemon provides an HTTP API allowing you to interface directly with running server instances, fetch server logs, generate backups, and control all aspects of the server lifecycle.
In addition, SuperDaemon ships with a built-in SFTP server allowing your system to remain free of Pterodactyl-specific dependencies, and allowing users to authenticate with the same credentials they would normally use to access the Panel.
Migrating from Wings
SuperDaemon is a drop-in replacement for Wings in most setups. The binary name is superdaemon
instead of wings, but the configuration layout and paths intentionally stay compatible:
| Wings | SuperDaemon |
|---|---|
wings |
superdaemon |
/etc/pterodactyl/config.yml |
/etc/pterodactyl/config.yml (same location) |
/var/lib/pterodactyl |
/var/lib/pterodactyl |
/var/log/pterodactyl |
/var/log/pterodactyl |
To migrate from an existing Wings installation:
- Download the
superdaemon_linux_amd64orsuperdaemon_linux_arm64release asset for your platform. - Stop the running
wingsservice. - Replace the binary path in your systemd unit (or container image) with
superdaemon. - Start the
superdaemonservice. Your existingconfig.ymland server data continue to work unchanged.
Server websocket
The panel connects to GET /api/servers/{server}/ws. The handshake carries no token — the first
auth message on the socket does — so this is the one route where a request without credentials
still reaches a handler. An id this node does not host gets the same handshake and the same answers
as a real one, so the endpoint cannot be used to find out which servers are hosted here.
Status codes before the upgrade
| Status | Body / header | When |
|---|---|---|
101 |
Handshake accepted, including for an id this node does not host. That socket then answers every token with jwt: server uuid mismatch, exactly like a real socket given a token for another server. |
|
400 |
Too many open websocket connections. |
The id already holds 30 authenticated sockets. This is answered to every caller for that id, whether or not it has a token. |
400 |
Bad Request |
Not a websocket handshake: missing Connection: upgrade or Upgrade: websocket, unsupported Sec-WebSocket-Version, malformed Sec-WebSocket-Key. |
403 |
Forbidden |
Origin is neither panel_location nor listed in allowed_origins. |
429 |
Too many pending websocket connections., Retry-After: 1 |
This address already has 5 sockets that have not authenticated. |
429 |
Too many connection attempts, slow down., Retry-After: 1 |
The address used up its handshake rate: 5 in a burst, refilled at one per second. Checked before the server id is looked up. |
The rate limit and the per-address budget apply to real and unknown ids alike; the 400 for a full
server does not, because an unknown id can never authenticate a socket.
Budgets
- 30 authenticated sockets per server, across all users. Only sockets that completed
authcount. - 5 unauthenticated sockets per client address, per server and for unknown ids alike.
- 30 unauthenticated sockets in total per server (and for the shared bag of unknown ids). At that ceiling one unauthenticated socket is dropped to accept the new handshake, because the newcomer may be the panel's console and an unauthenticated socket never is. The check runs before the upgrade, so a concurrent burst can overshoot it briefly.
After the upgrade
- A socket that has not authenticated within 10 seconds is closed and its slot returned. The deadline is cleared by the first valid token and is not extended by other traffic.
authwith a token that verifies but names another server is answered withjwt: server uuid mismatch; the socket is not authenticated and no listeners are registered.- A message is limited to 4 KiB on the wire; a text frame that exceeds 32 KiB after decompression is
dropped without an answer. More than 10 messages within 200 ms triggers a single
throttledevent and the excess messages are dropped. - Close codes:
4409 server is suspendedis sent right after the upgrade if the server is suspended.1009is sent when a message exceeds the 4 KiB read limit. No other close code comes from the daemon — a socket dropped for the pre-auth deadline is closed without a close frame (clients see1006), and1000,1001,1005,1006and1012are treated as normal client disconnects and not logged as warnings.
Releases
Pre-built binaries are attached to each GitHub Release. The release names use the SuperDaemon binary name:
superdaemon_linux_amd64superdaemon_linux_arm64
Documentation
Upstream Wings documentation is a good starting point because SuperDaemon keeps the same configuration format and API surface:
For SuperDaemon-specific issues, please use this repository.
Reporting Issues
Please use the MrSchnirschuh/SuperDaemon repository to report issues or make feature requests for SuperDaemon.
Security issues should be reported privately to the repository maintainer.
Development
SuperDaemon is written in Go 1.26+. To run the test suite locally, use
make test
This executes go vet ./... and go test ./.... If you do not have Go installed, you can run bash scripts/run-tests.sh, which downloads Go 1.27.3 into ~/.local/go-download automatically.
To build release binaries, run make build; it cross-compiles linux/amd64 and linux/arm64 into build/.