Skip to main content

Overview

SFTPGo is an SFTP server backed by object storage. Clients speak standard SFTP; files land in your bucket, with per-user folder isolation and declarative user management. This template offers a choice between an always-on server and a scale-to-zero mode that suspends the server when idle behind a tiny always-on proxy.

Architecture

  • SFTPGo — A single-replica stateful workload serving SFTP on port 2022. An embedded bolt database and the SSH host keys persist on a volume set so host keys stay stable across restarts and wakes.
  • Scale-to-zero proxy (scale_to_zero mode only) — An always-on activator workload that accepts client connections while SFTPGo sleeps, wakes it via the platform API, splices traffic through, and suspends it again after an idle window.

What Gets Created

  • Stateful SFTPGo Workload — Serves SFTP on port 2022; holds the embedded database and SSH host keys.
  • Standard Scale-to-Zero Proxy Workload (scale_to_zero mode only) — Always-on TCP activator that fronts SFTPGo and manages suspend/wake.
  • Volume Set — 10 GiB persistent storage for the embedded database and SSH host keys.
  • Secrets — A dictionary secret with the admin bootstrap credentials and an opaque secret with the declared-users file.
  • Identity & Policy — An identity bound to the workloads with reveal access to the secrets, keyless cloud storage access for AWS and GCP backends, and a least-privilege policy letting the proxy’s identity suspend and wake exactly the SFTPGo workload — nothing else.
This template does not create a GVC. You must deploy it into an existing GVC.

Prerequisites

SFTPGo requires an existing bucket in one of the supported backends and the access setup for it. Complete the steps for your chosen backend before installing.
AWS S3 uses a Control Plane cloud identity — no credentials are stored; the workload’s identity vends temporary credentials at runtime.
1

Create a bucket

Create an S3 bucket. Set storage.aws.bucket and storage.aws.region to match.
2

Set up a Cloud Account

If you do not have one, create a Cloud Account for your AWS account. Set storage.aws.cloudAccountName to its name.
3

Create a bucket-scoped IAM policy

Create an AWS IAM policy with the JSON below (replace YOUR_BUCKET), then set storage.aws.policyName to the policy’s name (bare name, not ARN):
Once your backend is ready, install the template using your preferred method:

UI

Browse, install, and manage templates visually

CLI

Manage templates from your terminal

Terraform

Declare templates in your Terraform configurations
Pulumi Icon Streamline Icon: https://streamlinehq.com

Pulumi

Declare templates in your Pulumi programs

Choosing a Mode

The mode value selects how SFTPGo runs. scale_to_zero (the default) suspends the server when idle to save cost; always_warm keeps it running for instant connections.
scale_to_zero (default)always_warm
Cost when idleProxy (~100m/128Mi) + the dedicated load balancerFull SFTPGo replica + load balancer
First connect after idle~30s cold start (occasionally up to ~75s)Instant
Client requirementsTimeout ≥120s or retry (see below)None — works unchanged
Best forCost-sensitive, periodic transfers, cooperative clientsStrict SLAs, arbitrary third-party clients

Configuration

The default values.yaml for this template:

Mode

  • modescale_to_zero (default) or always_warm. See Choosing a Mode.
  • scaleToZero.idleHold — Suspend SFTPGo after this window with no active connections (e.g. 90s, 5m, 1h). Used only in scale_to_zero mode.
  • scaleToZero.proxy.image / scaleToZero.proxy.resources — Image and resources for the always-on activator proxy. All SFTP traffic flows through the proxy, so provision its CPU accordingly.

SFTPGo

  • image — The SFTPGo container image.
  • resources — CPU and memory for the SFTPGo container. CPU governs transfer throughput and wake speed.
  • admin.username / admin.password — The SFTPGo administrator, created on first boot for the REST API and optional web admin. Change the password before installing.
  • volumeset.capacity — Volume size in GiB (minimum 10) for the embedded database and SSH host keys.
  • webAdmin.enabled — Declare SFTPGo’s web admin / REST API on port 8080. Reachable via the canonical endpoint in always_warm mode when publicAccess is enabled.

Storage Backend

Set storage.type to aws, gcp, or minio, and configure that block. AWS and GCP use a Control Plane cloud identity — no credentials are stored; the workload’s identity vends temporary credentials at runtime. See Prerequisites for the per-backend setup steps.
FieldBackendsDescription
bucketallTarget bucket. Must already exist.
regionaws, minioBucket region.
keyPrefixallOptional bucket-wide folder prefix, e.g. sftp/.
cloudAccountNameaws, gcpControl Plane cloud account for keyless access.
policyNameawsBare name of the custom bucket-scoped IAM policy.
endpointminioS3 API address including port.
accessKey / accessSecretminioStatic credentials with access to the bucket.

Users

Declared users are re-applied on every start; each is isolated to the bucket folder {keyPrefix}{username}/ unless overridden per user. Provide a password, one or more publicKeys, or both.
  • users[].username — Login name.
  • users[].password — Password. Omit when publicKeys is set.
  • users[].publicKeys — SSH public keys, e.g. ["ssh-ed25519 AAAA... user@laptop"].
  • users[].keyPrefix — Optional per-user bucket folder override.

Access

  • publicAccess.enabled — Expose a public SFTP endpoint on the client-facing workload via a dedicated direct load balancer, required for raw-TCP protocols like SFTP. Set to false for an internal-only endpoint (no load balancer; clients reach SFTPGo over the GVC network).
  • internalAccess.type — Internal firewall scope of the SFTPGo workload:
TypeDescription
noneNo internal access. Not allowed in scale_to_zero mode (the proxy must reach SFTPGo).
same-gvcAllow access from all workloads in the same GVC.
same-orgAllow access from all workloads in the same organization.
workload-listAllow access only from workloads listed in internalAccess.workloads. The scale-to-zero proxy is added automatically.

Connecting

WhatValue
Public SFTP endpointtcp://...cpln.app:2022status.endpoint of {release}-sftpgo-proxy (scale_to_zero) or {release}-sftpgo (always_warm)
Connectsftp -P 2022 {username}@{endpoint-host}
In-GVC (internal){release}-sftpgo-proxy:2022 (scale_to_zero) or {release}-sftpgo:2022 (always_warm)
Web admin (if enabled)Canonical *.cpln.app endpoint of {release}-sftpgo (always_warm + publicAccess)
Credentialsusers[] entries; admin per admin.*

Cold Starts and Client Configuration

In scale_to_zero mode, the first connection after an idle period wakes the server (measured ~30s, occasionally up to ~75s — the persistent volume attaches on each wake). The proxy holds the TCP connection so nothing is refused, but clients with short SSH banner timeouts (~15s in several libraries) give up right at the finish line. Configure clients generously:
  • paramikoconnect(..., banner_timeout=120, timeout=120)
  • WinSCP — Session → Timeout ≥ 120s
  • OpenSSH CLI — Tolerant by default; no change needed
  • Unattended jobs — Retry with backoff. The first (even failed) attempt triggers the wake, and idleHold keeps the server warm so the retry lands instantly.
  • Right after install — The load balancer needs a few minutes to warm up; the very first cold connect may time out once, then succeed on retry.
For third-party clients you cannot configure, use always_warm.

Important Notes

  • Change the default admin and user passwords before installing. The admin bootstrap only applies on first boot; changing admin.* later requires the REST API.
  • Declared users are authoritative — edits made to them via the admin API/UI are overwritten on the next restart or wake. Users created via the API are untouched.
  • Upgrading while suspended wakes the server; it re-suspends after the next connection comes and goes.
  • First install: the public endpoint’s DNS takes a few minutes to propagate after the load balancer is created.
  • Switching modes moves the client-facing endpoint (proxy ↔ SFTPGo) — plan a client cutover if you change modes on a live install.
  • The dedicated load balancer is the dominant idle cost in scale_to_zero mode, not the proxy’s compute.

External References

SFTPGo Documentation

Official SFTPGo documentation

S3 Storage Backend

SFTPGo S3-compatible storage backend guide

Environment Variables

SFTPGo environment variables reference

Scale-to-Zero Proxy

Source for the always-on TCP activator proxy

SFTPGo Template

View the source files, default values, and chart definition