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.com

Authentication

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:

KeyDefaultBehavior
authentication_password_attempts3Failed password attempts per cooldown window
authentication_pubkey_attempts20Failed public key attempts per window
authentication_cooldown60Seconds to cool down after hitting a limit (sliding window)
max_connections_per_user10Concurrent connections per user
max_channels_per_connection10Channels per connection
max_handles_per_channel32Open files per channel
max_handles_total1024Open 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.