One filesystem, everywhere.
Understand the shared VFS, storage backends and the boundaries that apply to your data.
A shared virtual filesystem
Protocol handlers use a common VFS layer. Each session resolves paths inside the user’s home directory, with path normalization and symlink containment on local storage. Mount resolution can compose directory roots from different backends.
Permissions, storage quotas, file-count quotas and bandwidth policy are shared across protocols and WebUI/API transfers. A user’s parallel sessions do not get independent quota or bandwidth allowances.
Local disk
The local backend stores files underneath a configured root. In the default configuration that root is ./data/files. Persist both application state and file storage when deploying in containers.
storage:
default_backend: local
backends:
local:
type: local
options:
root: ./data/files
In-memory storage
The memory backend is useful for ephemeral workloads and testing. Its files live inside the server process and are lost when it stops. Choose durable local or object storage for files that must survive a restart.
storage:
default_backend: ephemeral
backends:
ephemeral:
type: memory
S3-compatible object storage
The S3 backend uses Kervan’s own SigV4 client and can connect to compatible object stores. Configure the endpoint, region, bucket and credential options for your provider. Each user’s home becomes a key prefix; directories are represented by marker objects.
An object is downloaded to a local temporary file on open. A written file is uploaded in a single PutObject when closed. Large files therefore require local temporary space and are limited to S3’s 5 GB single-PUT maximum. Multipart uploads remain planned.
The S3 backend does not store POSIX permissions or timestamps and does not support symlinks. Validate those semantics against your workflow.
- Supported options: endpoint, region, bucket, prefix, access_key, secret_key, force_path_style, disable_ssl.
- Keep object-store credentials out of source control and restrict their bucket access.
- Local and S3 backends have different metadata semantics; do not assume a complete POSIX filesystem.
Groups, quotas and bandwidth
A primary group supplies permission and quota defaults. Users can receive explicit overrides. Secondary groups record membership only. Storage and file-count quotas apply to regular users when quotas are enabled; administrators are exempt.
Bandwidth can be limited globally and per user or group. A user’s connections share the allowance, including FTP, FTPS, SFTP, SCP and WebUI/API transfers.
quota:
enabled: true
default_max_storage: 1073741824
default_max_files: 0
check_interval: 60s
bandwidth:
max_total: 104857600
default_user_rate: 0
These sizes and rates are bytes and bytes per second. A zero default_max_files or max_total means unlimited. Inspect the full schema for inheritance and per-user override semantics.
Found something to improve? Open a website issue