Wings SFTP
How SFTP works on Panasaurus Wings — authentication, host keys, rate limits, extensions, and the .wings shell.
Every Wings node runs a built-in SFTP server, so file access works with any SSH/SFTP client without giving users shell accounts on the host. By default it listens on all interfaces at port 2022 (system.sftp.bind_address and bind_port in the config).
sftp -P 2022 user@node.example.comAuthentication
Log in with your panel credentials, using a username of the form username.serveridentifier — the panel shows the exact string to use on each server's settings page. The password is the one from your panel account, and the daemon validates it against the panel in real time. Permissions are per-server: a user sees only the servers the panel's ACLs allow, and file operations are validated against the egg's denylist before they touch disk.
Operators can disable password authentication entirely (system.sftp.disable_password_auth: true) and rely on key-based access, and read_only: true turns the whole SFTP surface into a read-only view for a node.
Host keys
The server key uses ssh-ed25519 by default (system.sftp.key_algorithm). It is generated once and persisted with the node's configuration, so clients see a stable host key across daemon restarts and upgrades. Pin it on first connect the usual way:
ssh-keyscan -p 2022 node.example.com 2>/dev/null | ssh-keygen -lf -Rate limits
SFTP brute-force and connection abuse are handled inside the daemon — system.sftp.limits in the config:
| Key | Default | Behavior |
|---|---|---|
authentication_password_attempts | 3 | Failed password attempts per cooldown window |
authentication_pubkey_attempts | 20 | Failed public key attempts per window |
authentication_cooldown | 60 | Seconds to cool down after hitting a limit (sliding window) |
max_connections_per_user | 10 | Concurrent connections per user |
max_channels_per_connection | 10 | Channels per connection |
max_handles_per_channel | 32 | Open files per channel |
max_handles_total | 1024 | Open files per server |
The cooldown is sliding, not fixed: three failures in one minute do not reset at the next minute boundary — you wait 60 seconds from the last failure.
Protocol extensions
Beyond stock SFTP, the daemon implements the extensions modern clients actually use: check-file, copy-file, and space-available from the SFTP draft extensions, plus OpenSSH's limits@openssh.com, statvfs@openssh.com, fsync@openssh.com, posix-rename@openssh.com, and friends. GUI clients like WinSCP and FileZilla pick these up automatically; anything that speaks SFTP v3 or later works.
The .wings shell
Users who connect with an SSH client (rather than an SFTP client) get a minimal management shell instead of a system shell. It is disabled by default under system.sftp.shell.enabled; when enabled, server power actions are available through the .wings command (.wings help lists them). This is a deliberate sandbox — there is no path from the shell to the host.