Documentation/the foundations
THE FOUNDATIONS

One filesystem, everywhere.

Understand the shared VFS, storage backends and the boundaries that apply to your data.

Kervan · v0.9.0Read the upstream source

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.

kervan.yamlyaml
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.

kervan.yamlyaml
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.

kervan.yamlyaml
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