Post

SFTPGo

SFTPGo

SFTPGo

Self-hosted, multi-protocol file transfer server (SFTP/FTP/FTPS/WebDAV) with a web admin UI, deployed to the default namespace of the k3s cluster.

Deployment

ItemValue
Namespacedefault
Imagedrakkan/sftpgo:latest
StoragePVC sftpgo-data (20Gi, transferred files), PVC sftpgo-config (1Gi, SFTPGo state) — both local-path
Admin credentialsSFTPGO_DEFAULT_ADMIN_USERNAME / SFTPGO_DEFAULT_ADMIN_PASSWORD from Secret sftpgo
Web ingresssftpgo.prod-k3s.iot-proxmox.net / www.sftpgo.prod-k3s.iot-proxmox.net (Traefik → ClusterIP Service sftpgo, port 8080)
External accessService sftpgo-external (LoadBalancer, MetalLB) — 192.168.1.37

reloader.stakater.com/auto: "true" is set on the Deployment.

Exposed Ports

ProtocolContainer portExposed via
Web admin UI8080Traefik ingress (ClusterIP sftpgo)
SFTP2022sftpgo-external LoadBalancer
FTP (plain / explicit FTPS)2121sftpgo-external LoadBalancer
FTPS (implicit)990sftpgo-external LoadBalancer
WebDAV10080sftpgo-external LoadBalancer
FTP passive data range50000–50010sftpgo-external LoadBalancer (11 ports)

FTP/FTPS Configuration

Two FTP bindings are configured via SFTPGO_FTPD__BINDINGS__* environment variables:

  • Binding 0 (port 2121): plain FTP with optional explicit FTPS upgrade (TLS_MODE: 0).
  • Binding 1 (port 990): implicit FTPS only (TLS_MODE: 2).

Both bindings set FORCE_PASSIVE_IP to the external LoadBalancer address (192.168.1.37), so passive-mode clients get a routable data-connection IP instead of the pod’s internal address. The passive port range is pinned to 50000–50010 to match the fixed port list on the sftpgo-external Service.

FTPS/implicit-FTPS TLS uses the cluster’s existing wildcard certificate: the local-example-com-tls Secret is mounted read-only into the pod as ftpd.crt / ftpd.key and referenced via SFTPGO_FTPD__CERTIFICATE_FILE / SFTPGO_FTPD__CERTIFICATE_KEY_FILE.

WebDAV is enabled on port 10080 via SFTPGO_WEBDAVD__BINDINGS__0__PORT.

This post is licensed under CC BY 4.0 by the author.