> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Transfer Family (SFTP)

> The SFTP capability of AWS Transfer Family: managed file transfers into and out of S3 and EFS. This entry covers SFTP only, not FTPS, FTP or AS2.

This bounded SFTP mapping also serves the [Transfer Family deployment](/service-adapters/aws/other-services/transfer-family-sftp-family) and [Transfer server](/service-adapters/aws/other-services/transfer-server-sftp) entries.

Infrastructure only: SFTP with SERVICE\_MANAGED users and startup SSH keys. Cluster deployments use a single-writer server; user changes are not a live Transfer management API. Approved no-cluster designs use mounted object storage on Google Cloud and OCI; Azure Container Apps uses Azure Files rather than Blob storage. Capacity, private client routing and host-key trust require configuration; custom identity providers, multiple home-directory mappings and AWS IAM path-policy enforcement are not reproduced. AWS Transfer management APIs, managed workflows, FTPS, FTP and AS2 are not provided by this mapping.

**On this page**

* [Coverage by target cloud](#coverage-by-target-cloud)
* [How the targets compare](#how-the-targets-compare)
  * [Infrastructure-only adaptation](#infrastructure-only-adaptation)
* [On Google Cloud, Azure, OCI, and Private Kubernetes](#on-google-cloud-azure-oci-and-private-kubernetes)

## Coverage by target cloud

| Target             | Available |
| ------------------ | --------- |
| Google Cloud       | ✓         |
| Azure              | ✓         |
| OCI                | ✓         |
| Private Kubernetes | ✓         |

## How the targets compare

Each row compares a capability of Transfer Family (SFTP) with its adaptation on each target.
A dash means this row is not stated for that target.

### Infrastructure-only adaptation

| Capability                                  | Transfer Family (SFTP)            | Google Cloud, Azure, OCI, and Private Kubernetes         |
| ------------------------------------------- | --------------------------------- | -------------------------------------------------------- |
| SFTP (SSH file transfer)                    | Yes - managed endpoint            | Yes - atmoz/sftp on :22                                  |
| User identity (name / posix uid-gid / home) | Yes - SERVICE\_MANAGED directory  | Yes - startup user configuration                         |
| SSH public-key login                        | Yes - aws\_transfer\_ssh\_key     | Yes - authorized-key configuration                       |
| Object-store backing                        | Yes - S3 bucket                   | Yes - mapped object store; Azure Files on Container Apps |
| Endpoint reach · public / internal          | public / VPC (managed)            | host-specific public/private endpoint                    |
| Live user-management API                    | Yes - add/remove a user via API   | No - startup config; update + restart                    |
| FTPS / FTP                                  | Yes - SFTP + FTPS + FTP           | No - SFTP only; FTPS/FTP refused                         |
| Custom identity provider                    | Yes - AWS\_LAMBDA / API\_GATEWAY  | No - SERVICE\_MANAGED only                               |
| Operations model · who runs it              | AWS-managed, transparently scaled | self-operated single deployment                          |
| Transfer logging · audit trail              | logging\_role → CloudWatch        | gateway stdout → target logging                          |
| API coverage                                | full                              | high (SFTP and configuration)                            |

## On Google Cloud, Azure, OCI, and Private Kubernetes

| Operation                                                                         | Area          | Support      | Depth        | Notes                                                                                                                                                        |
| --------------------------------------------------------------------------------- | ------------- | ------------ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| SSH key (aws\_transfer\_ssh\_key)                                                 | Auth          | Supported    | Common       | the user's public key becomes authorized-key configuration loaded at startup; key-based login needs no change                                                |
| Managed operations (security\_policy\_name / logging\_role / transparent scaling) | Control plane | Out of scope | Full surface | you configure sshd security, image updates, logging and capacity for the single-instance gateway                                                             |
| FTPS / FTP protocols                                                              | Data plane    | Out of scope | Full surface | only SFTP is supported; FTPS or FTP configurations return a build error                                                                                      |
| SFTP session + file operations                                                    | Data plane    | Supported    | Common       | SFTP over SSH supports list, get, put, rename, mkdir and rm; backing-store filesystem differences apply                                                      |
| Endpoint type (public / VPC)                                                      | Endpoint      | Supported    | Most usage   | public or private exposure uses the host's network endpoint; Kubernetes ClusterIP is cluster-local, so VPC clients need a suitable private access path       |
| Custom identity provider (AWS\_LAMBDA / API\_GATEWAY)                             | Identity      | Out of scope | Full surface | a self-hosted key-based directory cannot call a Transfer custom-IdP hook; only a SERVICE\_MANAGED directory is supported                                     |
| SFTP user (aws\_transfer\_user, SERVICE\_MANAGED)                                 | Identity      | Supported    | Common       | the user name, POSIX uid/gid and home\_directory become SFTP\_USERS startup user configuration; the account is key-only                                      |
| SFTP server (aws\_transfer\_server)                                               | Provisioning  | Supported    | Common       | uses atmoz/sftp in the target environment: Kubernetes when a cluster is present, otherwise the cloud-specific VM pool or Container Apps host described below |
| Object-store backing                                                              | Storage       | Supported    | Common       | Kubernetes and VM hosts mount the mapped object store; Azure Container Apps uses an Azure Files share instead                                                |

#### How it works

The target uses an `atmoz/sftp` gateway on port 22 for AWS Transfer Family SFTP clients. Usernames, SSH public keys and home-directory configuration come from `aws_transfer_user` and `aws_transfer_ssh_key`. Clients keep their SFTP tools and user credentials; configure trust for the target server's host key.

The platform team operates the gateway in the customer's environment. Its host depends on the available compute: Kubernetes, a Google Cloud Managed Instance Group, an OCI Instance Pool or an Azure Container App. Most hosts mount the mapped object store; Azure Container Apps uses Azure Files, as described below.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgdGFyZ2V0IHJ1bnMgYW4gYXRtb3ovc2Z0cCBnYXRld2F5LiBDbGllbnRzIHJldGFpbiBTRlRQIHRvb2xzLCB1c2VybmFtZXMgYW5kIFNTSCBrZXlzOyBjb25maWd1cmUgdGFyZ2V0IGhvc3Qta2V5IHRydXN0LiBNb3N0IGhvc3RzIHVzZSBvYmplY3Qgc3RvcmFnZSwgd2hpbGUgQXp1cmUgQ29udGFpbmVyIEFwcHMgdXNlcyBBenVyZSBGaWxlcy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEyNCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjYyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+T04gQVdTPC90ZXh0Pgo8cmVjdCB4PSIzNCIgeT0iODIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjQiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDkiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPlNGVFAgY2xpZW50PC90ZXh0Pgo8dGV4dCB4PSIxMDkiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmxvZ3MgaW4gb3ZlciBTU0g8L3RleHQ+CjxsaW5lIHgxPSIxODQiIHkxPSIxMTQiIHgyPSIyMjIiIHkyPSIxMTQiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzMSkiLz4KPHRleHQgeD0iMjAzIiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OC41cHgiPlNGVFAgOjIyPC90ZXh0Pgo8cmVjdCB4PSIyMjQiIHk9IjgyIiB3aWR0aD0iMTU4IiBoZWlnaHQ9IjY0IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzAzIiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTJweCI+QVdTIFRyYW5zZmVyPC90ZXh0Pgo8dGV4dCB4PSIzMDMiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPm1hbmFnZWQgwrcgUzMtYmFja2VkPC90ZXh0Pgo8cmVjdCB4PSI0MzYiIHk9IjQwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEyNCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDUyIiB5PSI2MiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+SU4gVEhFIFRBUkdFVCBFTlZJUk9OTUVOVDwvdGV4dD4KPHJlY3QgeD0iNDU0IiB5PSI4MiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI2NCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUyOSIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+U0ZUUCBjbGllbnQ8L3RleHQ+Cjx0ZXh0IHg9IjUyOSIgeT0iMTI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNTk2NjkiPnNhbWUgdXNlciBrZXk8L3RleHQ+CjxsaW5lIHgxPSI2MDQiIHkxPSIxMTQiIHgyPSI2NDIiIHkyPSIxMTQiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzMSkiLz4KPHRleHQgeD0iNjIzIiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OC41cHgiPlNGVFAgOjIyPC90ZXh0Pgo8cmVjdCB4PSI2NDQiIHk9IjgyIiB3aWR0aD0iMTU4IiBoZWlnaHQ9IjY0IiByeD0iMTEiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNzIzIiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTJweCI+U0ZUUCBnYXRld2F5PC90ZXh0Pgo8dGV4dCB4PSI3MjMiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+dGFyZ2V0IHN0b3JhZ2UgbW91bnQ8L3RleHQ+Cjwvc3ZnPg==" alt="The target runs an atmoz/sftp gateway. Clients retain SFTP tools, usernames and SSH keys; configure target host-key trust. Most hosts use object storage, while Azure Container Apps uses Azure Files." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTgwIiB2aWV3Qm94PSIwIDAgODM2IDE4MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgdGFyZ2V0IHJ1bnMgYW4gYXRtb3ovc2Z0cCBnYXRld2F5LiBDbGllbnRzIHJldGFpbiBTRlRQIHRvb2xzLCB1c2VybmFtZXMgYW5kIFNTSCBrZXlzOyBjb25maWd1cmUgdGFyZ2V0IGhvc3Qta2V5IHRydXN0LiBNb3N0IGhvc3RzIHVzZSBvYmplY3Qgc3RvcmFnZSwgd2hpbGUgQXp1cmUgQ29udGFpbmVyIEFwcHMgdXNlcyBBenVyZSBGaWxlcy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzMSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEyNCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzIiIHk9IjYyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiOCI+T04gQVdTPC90ZXh0Pgo8cmVjdCB4PSIzNCIgeT0iODIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjQiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIxMDkiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPlNGVFAgY2xpZW50PC90ZXh0Pgo8dGV4dCB4PSIxMDkiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmxvZ3MgaW4gb3ZlciBTU0g8L3RleHQ+CjxsaW5lIHgxPSIxODQiIHkxPSIxMTQiIHgyPSIyMjIiIHkyPSIxMTQiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzMSkiLz4KPHRleHQgeD0iMjAzIiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OC41cHgiPlNGVFAgOjIyPC90ZXh0Pgo8cmVjdCB4PSIyMjQiIHk9IjgyIiB3aWR0aD0iMTU4IiBoZWlnaHQ9IjY0IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMzAzIiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+QVdTIFRyYW5zZmVyPC90ZXh0Pgo8dGV4dCB4PSIzMDMiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPm1hbmFnZWQgwrcgUzMtYmFja2VkPC90ZXh0Pgo8cmVjdCB4PSI0MzYiIHk9IjQwIiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEyNCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDUyIiB5PSI2MiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPklOIFRIRSBUQVJHRVQgRU5WSVJPTk1FTlQ8L3RleHQ+CjxyZWN0IHg9IjQ1NCIgeT0iODIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjQiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1MjkiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPlNGVFAgY2xpZW50PC90ZXh0Pgo8dGV4dCB4PSI1MjkiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM2Ij5zYW1lIHVzZXIga2V5PC90ZXh0Pgo8bGluZSB4MT0iNjA0IiB5MT0iMTE0IiB4Mj0iNjQyIiB5Mj0iMTE0IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczEpIi8+Cjx0ZXh0IHg9IjYyMyIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjguNXB4Ij5TRlRQIDoyMjwvdGV4dD4KPHJlY3QgeD0iNjQ0IiB5PSI4MiIgd2lkdGg9IjE1OCIgaGVpZ2h0PSI2NCIgcng9IjExIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjcyMyIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEycHgiPlNGVFAgZ2F0ZXdheTwvdGV4dD4KPHRleHQgeD0iNzIzIiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPnRhcmdldCBzdG9yYWdlIG1vdW50PC90ZXh0Pgo8L3N2Zz4=" alt="The target runs an atmoz/sftp gateway. Clients retain SFTP tools, usernames and SSH keys; configure target host-key trust. Most hosts use object storage, while Azure Container Apps uses Azure Files." />
</div>

<p className="t9-caption">The platform team operates an SFTP gateway in the target environment. Clients retain their tools and user keys; server host-key trust and data placement need review.</p>

#### Where the gateway runs, per environment

When the environment has GKE, AKS or OKE, the gateway runs as a Kubernetes Deployment behind a Service. Without a cluster, it runs on the cloud-specific compute described below.

The no-cluster Google Cloud target uses a Managed Instance Group with one VM; OCI uses an Instance Pool with one VM. Azure uses Container Apps with TCP ingress. Each host runs `atmoz/sftp` and provides storage, network access and restart handling.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjYyIiB2aWV3Qm94PSIwIDAgODM2IDI2MiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJLdWJlcm5ldGVzIGVudmlyb25tZW50cyBydW4gYSBEZXBsb3ltZW50IGFuZCBTZXJ2aWNlLiBXaXRob3V0IGEgY2x1c3RlciwgR29vZ2xlIENsb3VkIHVzZXMgYSBNYW5hZ2VkIEluc3RhbmNlIEdyb3VwLCBPQ0kgYW4gSW5zdGFuY2UgUG9vbCBhbmQgQXp1cmUgYSBDb250YWluZXIgQXBwLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJ0ZnMyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjE4IiB5PSI4NiIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5MCIgcng9IjEzIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjEwNiIgeT0iMTIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEzcHgiPlNGVFAgZ2F0ZXdheTwvdGV4dD4KPHRleHQgeD0iMTA2IiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPmF0bW96L3NmdHAgwrcgOjIyPC90ZXh0Pgo8dGV4dCB4PSIxMDYiIHk9IjE1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9uZSBkZWZpbml0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzMDAiIHk9IjMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5DSE9TRU4gQlkgVEhFIFRBUkdFVCBFTlZJUk9OTUVOVDwvdGV4dD4KPGxpbmUgeDE9IjE5NCIgeTE9IjExOCIgeDI9IjM1NiIgeTI9IjY2IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS42IiBtYXJrZXItZW5kPSJ1cmwoI3RmczIpIi8+CjxsaW5lIHgxPSIxOTQiIHkxPSIxMjgiIHgyPSIzNTYiIHkyPSIxMTYiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjdGZzMikiLz4KPGxpbmUgeDE9IjE5NCIgeTE9IjEzNCIgeDI9IjM1NiIgeTI9IjE2NiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuNiIgbWFya2VyLWVuZD0idXJsKCN0ZnMyKSIvPgo8bGluZSB4MT0iMTk0IiB5MT0iMTQ0IiB4Mj0iMzU2IiB5Mj0iMjE2IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS42IiBtYXJrZXItZW5kPSJ1cmwoI3RmczIpIi8+CjxyZWN0IHg9IjM1OCIgeT0iNDQiIHdpZHRoPSI0NjIiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYTdmM2QwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIzNzQiIHk9IjY0IiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+QSBjbHVzdGVyIGlzIHByZXNlbnQgwrcgR0tFIC8gQUtTIC8gT0tFPC90ZXh0Pgo8dGV4dCB4PSIzNzQiIHk9IjgwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMDQ3ODU3Ij5rdWJlcm5ldGVzX2RlcGxveW1lbnQgKyBTZXJ2aWNlPC90ZXh0Pgo8cmVjdCB4PSIzNTgiIHk9Ijk0IiB3aWR0aD0iNDYyIiBoZWlnaHQ9IjQ0IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzc0IiB5PSIxMTQiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTEuNXB4Ij5ObyBjbHVzdGVyIMK3IEdvb2dsZSBDbG91ZDwvdGV4dD4KPHRleHQgeD0iMzc0IiB5PSIxMzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5Ij5HQ0UgTWFuYWdlZCBJbnN0YW5jZSBHcm91cDwvdGV4dD4KPHJlY3QgeD0iMzU4IiB5PSIxNDQiIHdpZHRoPSI0NjIiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIzNzQiIHk9IjE2NCIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPk5vIGNsdXN0ZXIgwrcgT0NJPC90ZXh0Pgo8dGV4dCB4PSIzNzQiIHk9IjE4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPk9DSSBJbnN0YW5jZSBQb29sPC90ZXh0Pgo8cmVjdCB4PSIzNTgiIHk9IjE5NCIgd2lkdGg9IjQ2MiIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjM3NCIgeT0iMjE0IiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+Tm8gY2x1c3RlciDCtyBBenVyZTwvdGV4dD4KPHRleHQgeD0iMzc0IiB5PSIyMzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5Ij5henVyZXJtX2NvbnRhaW5lcl9hcHA8L3RleHQ+Cjwvc3ZnPg==" alt="Kubernetes environments run a Deployment and Service. Without a cluster, Google Cloud uses a Managed Instance Group, OCI an Instance Pool and Azure a Container App." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjYyIiB2aWV3Qm94PSIwIDAgODM2IDI2MiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJLdWJlcm5ldGVzIGVudmlyb25tZW50cyBydW4gYSBEZXBsb3ltZW50IGFuZCBTZXJ2aWNlLiBXaXRob3V0IGEgY2x1c3RlciwgR29vZ2xlIENsb3VkIHVzZXMgYSBNYW5hZ2VkIEluc3RhbmNlIEdyb3VwLCBPQ0kgYW4gSW5zdGFuY2UgUG9vbCBhbmQgQXp1cmUgYSBDb250YWluZXIgQXBwLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJ0ZnMyIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjE4IiB5PSI4NiIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5MCIgcng9IjEzIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjEwNiIgeT0iMTIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEzcHgiPlNGVFAgZ2F0ZXdheTwvdGV4dD4KPHRleHQgeD0iMTA2IiB5PSIxNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPmF0bW96L3NmdHAgwrcgOjIyPC90ZXh0Pgo8dGV4dCB4PSIxMDYiIHk9IjE1OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBkZWZpbml0aW9uPC90ZXh0Pgo8dGV4dCB4PSIzMDAiIHk9IjMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwZGVjOCI+Q0hPU0VOIEJZIFRIRSBUQVJHRVQgRU5WSVJPTk1FTlQ8L3RleHQ+CjxsaW5lIHgxPSIxOTQiIHkxPSIxMTgiIHgyPSIzNTYiIHkyPSI2NiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuNiIgbWFya2VyLWVuZD0idXJsKCN0ZnMyKSIvPgo8bGluZSB4MT0iMTk0IiB5MT0iMTI4IiB4Mj0iMzU2IiB5Mj0iMTE2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS42IiBtYXJrZXItZW5kPSJ1cmwoI3RmczIpIi8+CjxsaW5lIHgxPSIxOTQiIHkxPSIxMzQiIHgyPSIzNTYiIHkyPSIxNjYiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjdGZzMikiLz4KPGxpbmUgeDE9IjE5NCIgeTE9IjE0NCIgeDI9IjM1NiIgeTI9IjIxNiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuNiIgbWFya2VyLWVuZD0idXJsKCN0ZnMyKSIvPgo8cmVjdCB4PSIzNTgiIHk9IjQ0IiB3aWR0aD0iNDYyIiBoZWlnaHQ9IjQ0IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzc0IiB5PSI2NCIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMS41cHgiPkEgY2x1c3RlciBpcyBwcmVzZW50IMK3IEdLRSAvIEFLUyAvIE9LRTwvdGV4dD4KPHRleHQgeD0iMzc0IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICM5MGRlYzgiPmt1YmVybmV0ZXNfZGVwbG95bWVudCArIFNlcnZpY2U8L3RleHQ+CjxyZWN0IHg9IjM1OCIgeT0iOTQiIHdpZHRoPSI0NjIiIGhlaWdodD0iNDQiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8dGV4dCB4PSIzNzQiIHk9IjExNCIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMS41cHgiPk5vIGNsdXN0ZXIgwrcgR29vZ2xlIENsb3VkPC90ZXh0Pgo8dGV4dCB4PSIzNzQiIHk9IjEzMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPkdDRSBNYW5hZ2VkIEluc3RhbmNlIEdyb3VwPC90ZXh0Pgo8cmVjdCB4PSIzNTgiIHk9IjE0NCIgd2lkdGg9IjQ2MiIgaGVpZ2h0PSI0NCIgcng9IjEwIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjM3NCIgeT0iMTY0IiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+Tm8gY2x1c3RlciDCtyBPQ0k8L3RleHQ+Cjx0ZXh0IHg9IjM3NCIgeT0iMTgwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkOCI+T0NJIEluc3RhbmNlIFBvb2w8L3RleHQ+CjxyZWN0IHg9IjM1OCIgeT0iMTk0IiB3aWR0aD0iNDYyIiBoZWlnaHQ9IjQ0IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzc0IiB5PSIyMTQiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5ObyBjbHVzdGVyIMK3IEF6dXJlPC90ZXh0Pgo8dGV4dCB4PSIzNzQiIHk9IjIzMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDgiPmF6dXJlcm1fY29udGFpbmVyX2FwcDwvdGV4dD4KPC9zdmc+" alt="Kubernetes environments run a Deployment and Service. Without a cluster, Google Cloud uses a Managed Instance Group, OCI an Instance Pool and Azure a Container App." />
</div>

<p className="t9-caption">Use Kubernetes when a cluster exists; otherwise use a Google Managed Instance Group, OCI Instance Pool or Azure Container App.</p>

#### On a Kubernetes cluster

A Kubernetes Deployment runs `atmoz/sftp` on port 22. A LoadBalancer Service exposes public endpoints; ClusterIP provides cluster-internal access. Clients elsewhere in the VPC need a private route or suitable internal endpoint rather than assuming ClusterIP is VPC-wide. The pod reads users from a ConfigMap and SSH public keys from a Secret at startup.

An object-store CSI driver mounts the mapped bucket below the user's home directory: `gcsfuse.csi` on GKE, `blob.csi` on AKS or the OCI Object Storage CSI driver on OKE. The driver presents object data as files; review its filesystem semantics for the client's upload and rename behavior.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIEt1YmVybmV0ZXMgU2VydmljZSBleHBvc2VzIHBvcnQgMjIgdG8gYW4gYXRtb3ovc2Z0cCBEZXBsb3ltZW50LiBMb2FkQmFsYW5jZXIgY2FuIHByb3ZpZGUgcHVibGljIGFjY2VzczsgQ2x1c3RlcklQIGlzIGNsdXN0ZXItbG9jYWwuIFVzZXJzIGFuZCBrZXlzIGxvYWQgYXQgc3RhcnR1cDsgYSBDU0kgZHJpdmVyIG1vdW50cyBvYmplY3QgZGF0YS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzMyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJ0ZnMzdiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI1IiByZWZZPSIyIiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI4MjAiIGhlaWdodD0iMTg0IiByeD0iMTYiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIyNiIgeT0iNTIiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPkdLRSAvIEFLUyAvIE9LRSDCtyBBIENMVVNURVIgSVMgUFJFU0VOVDwvdGV4dD4KPHJlY3QgeD0iMjQiIHk9Ijk2IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjYwIiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iODQiIHk9IjEyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5TRlRQIGNsaWVudDwvdGV4dD4KPHRleHQgeD0iODQiIHk9IjEzOSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm92ZXIgOjIyPC90ZXh0Pgo8bGluZSB4MT0iMTQ0IiB5MT0iMTI2IiB4Mj0iMTc0IiB5Mj0iMTI2IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczMpIi8+CjxyZWN0IHg9IjE3NiIgeT0iOTYiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyNDYiIHk9IjEyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5TZXJ2aWNlPC90ZXh0Pgo8dGV4dCB4PSIyNDYiIHk9IjEzOSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1NjkiPkxCIG9yIENsdXN0ZXJJUDwvdGV4dD4KPGxpbmUgeDE9IjMxNiIgeTE9IjEyNiIgeDI9IjM0NiIgeTI9IjEyNiIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnMzKSIvPgo8cmVjdCB4PSIzNDgiIHk9Ijg4IiB3aWR0aD0iMTUyIiBoZWlnaHQ9Ijc4IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNDI0IiB5PSIxMTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTIuNXB4Ij5hdG1vei9zZnRwPC90ZXh0Pgo8dGV4dCB4PSI0MjQiIHk9IjEzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+RGVwbG95bWVudCDCtyA6MjI8L3RleHQ+CjxsaW5lIHgxPSI1MDAiIHkxPSIxMjYiIHgyPSI1MzAiIHkyPSIxMjYiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzMykiLz4KPHJlY3QgeD0iNTMyIiB5PSI5NiIgd2lkdGg9IjE1MiIgaGVpZ2h0PSI2MCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjYwOCIgeT0iMTIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPm9iamVjdCBzdG9yZTwvdGV4dD4KPHRleHQgeD0iNjA4IiB5PSIxMzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5DU0kgbW91bnQ8L3RleHQ+CjxyZWN0IHg9IjM1MiIgeT0iMTgwIiB3aWR0aD0iNzAiIGhlaWdodD0iMjgiIHJ4PSI4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjM4NyIgeT0iMTk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZm9udC1zaXplOjlweCI+Y29uZmlnX21hcDwvdGV4dD4KPHJlY3QgeD0iNDMwIiB5PSIxODAiIHdpZHRoPSI3MCIgaGVpZ2h0PSIyOCIgcng9IjgiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2E3ZjNkMCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNDY1IiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmb250LXNpemU6OXB4Ij5zZWNyZXQ8L3RleHQ+CjxsaW5lIHgxPSIzODciIHkxPSIxODAiIHgyPSI0MDUiIHkyPSIxNjgiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjdGZzM3YpIi8+CjxsaW5lIHgxPSI0NjUiIHkxPSIxODAiIHgyPSI0NDciIHkyPSIxNjgiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjdGZzM3YpIi8+Cjx0ZXh0IHg9IjcyNiIgeT0iMTE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjEwcHgiPnVzZXJzICsga2V5czwvdGV4dD4KPHRleHQgeD0iNzI2IiB5PSIxMzQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6MTBweCI+cmVhZCBhdCBib290PC90ZXh0Pgo8L3N2Zz4=" alt="A Kubernetes Service exposes port 22 to an atmoz/sftp Deployment. LoadBalancer can provide public access; ClusterIP is cluster-local. Users and keys load at startup; a CSI driver mounts object data." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIEt1YmVybmV0ZXMgU2VydmljZSBleHBvc2VzIHBvcnQgMjIgdG8gYW4gYXRtb3ovc2Z0cCBEZXBsb3ltZW50LiBMb2FkQmFsYW5jZXIgY2FuIHByb3ZpZGUgcHVibGljIGFjY2VzczsgQ2x1c3RlcklQIGlzIGNsdXN0ZXItbG9jYWwuIFVzZXJzIGFuZCBrZXlzIGxvYWQgYXQgc3RhcnR1cDsgYSBDU0kgZHJpdmVyIG1vdW50cyBvYmplY3QgZGF0YS4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzMyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPgo8bWFya2VyIGlkPSJ0ZnMzdiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI1IiByZWZZPSIyIiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI4MjAiIGhlaWdodD0iMTg0IiByeD0iMTYiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIyNiIgeT0iNTIiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5HS0UgLyBBS1MgLyBPS0UgwrcgQSBDTFVTVEVSIElTIFBSRVNFTlQ8L3RleHQ+CjxyZWN0IHg9IjI0IiB5PSI5NiIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI2MCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijg0IiB5PSIxMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+U0ZUUCBjbGllbnQ8L3RleHQ+Cjx0ZXh0IHg9Ijg0IiB5PSIxMzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vdmVyIDoyMjwvdGV4dD4KPGxpbmUgeDE9IjE0NCIgeTE9IjEyNiIgeDI9IjE3NCIgeTI9IjEyNiIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnMzKSIvPgo8cmVjdCB4PSIxNzYiIHk9Ijk2IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYwIiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjQ2IiB5PSIxMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+U2VydmljZTwvdGV4dD4KPHRleHQgeD0iMjQ2IiB5PSIxMzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4Ij5MQiBvciBDbHVzdGVySVA8L3RleHQ+CjxsaW5lIHgxPSIzMTYiIHkxPSIxMjYiIHgyPSIzNDYiIHkyPSIxMjYiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzMykiLz4KPHJlY3QgeD0iMzQ4IiB5PSI4OCIgd2lkdGg9IjE1MiIgaGVpZ2h0PSI3OCIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjQyNCIgeT0iMTE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEyLjVweCI+YXRtb3ovc2Z0cDwvdGV4dD4KPHRleHQgeD0iNDI0IiB5PSIxMzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPkRlcGxveW1lbnQgwrcgOjIyPC90ZXh0Pgo8bGluZSB4MT0iNTAwIiB5MT0iMTI2IiB4Mj0iNTMwIiB5Mj0iMTI2IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczMpIi8+CjxyZWN0IHg9IjUzMiIgeT0iOTYiIHdpZHRoPSIxNTIiIGhlaWdodD0iNjAiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2MDgiIHk9IjEyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5vYmplY3Qgc3RvcmU8L3RleHQ+Cjx0ZXh0IHg9IjYwOCIgeT0iMTM5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Q1NJIG1vdW50PC90ZXh0Pgo8cmVjdCB4PSIzNTIiIHk9IjE4MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI4IiByeD0iOCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIzODciIHk9IjE5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo5cHgiPmNvbmZpZ19tYXA8L3RleHQ+CjxyZWN0IHg9IjQzMCIgeT0iMTgwIiB3aWR0aD0iNzAiIGhlaWdodD0iMjgiIHJ4PSI4IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDY2NTMiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQ2NSIgeT0iMTk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjlweCI+c2VjcmV0PC90ZXh0Pgo8bGluZSB4MT0iMzg3IiB5MT0iMTgwIiB4Mj0iNDA1IiB5Mj0iMTY4IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI3RmczN2KSIvPgo8bGluZSB4MT0iNDY1IiB5MT0iMTgwIiB4Mj0iNDQ3IiB5Mj0iMTY4IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI3RmczN2KSIvPgo8dGV4dCB4PSI3MjYiIHk9IjExOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZToxMHB4Ij51c2VycyArIGtleXM8L3RleHQ+Cjx0ZXh0IHg9IjcyNiIgeT0iMTM0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPnJlYWQgYXQgYm9vdDwvdGV4dD4KPC9zdmc+" alt="A Kubernetes Service exposes port 22 to an atmoz/sftp Deployment. LoadBalancer can provide public access; ClusterIP is cluster-local. Users and keys load at startup; a CSI driver mounts object data." />
</div>

<p className="t9-caption">A Deployment serves SFTP behind a Service. ClusterIP is cluster-local; private VPC clients need an appropriate access path.</p>

#### On a no-cluster Google Cloud stack: a Managed Instance Group

The Google Cloud target uses a one-instance Managed Instance Group. A `google_compute_instance_template` defines startup of the `atmoz/sftp` container and a `gcsfuse` bucket mount. A network tag selects the firewall rule for port 22.

`target_size = 1` provides one gateway instance. A port-22 health check drives autohealing, which replaces an unresponsive instance. The replacement reconnects to the bucket; active SSH sessions are lost. A TCP load balancer with a `google_compute_forwarding_rule` and reserved `google_compute_address` gives clients a stable endpoint during replacement.

△ One thing to know about this host

* **Object-backed mount behavior:** gcsfuse presents object storage as files. Review listing, rename, write visibility and locking for the selected driver and client workflow; CSI integration alone does not establish stronger filesystem guarantees.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjQ0IiB2aWV3Qm94PSIwIDAgODM2IDI0NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIG9uZS1pbnN0YW5jZSBHb29nbGUgTWFuYWdlZCBJbnN0YW5jZSBHcm91cCBydW5zIGF0bW96L3NmdHAgYW5kIGdjc2Z1c2UuIEEgcG9ydC0yMiBoZWFsdGggY2hlY2sgZHJpdmVzIHJlcGxhY2VtZW50OyB0aGUgbG9hZCBiYWxhbmNlciBwcmVzZXJ2ZXMgdGhlIGVuZHBvaW50IHdoaWxlIGFjdGl2ZSBzZXNzaW9ucyBhcmUgaW50ZXJydXB0ZWQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9InRmczQiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjgiIHk9IjMwIiB3aWR0aD0iODIwIiBoZWlnaHQ9IjIwNCIgcng9IjE2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMjYiIHk9IjUyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5HT09HTEUgQ0xPVUQgwrcgTk8gQ0xVU1RFUjwvdGV4dD4KPHJlY3QgeD0iMjIiIHk9Ijk4IiB3aWR0aD0iMTA0IiBoZWlnaHQ9IjU4IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzQiIHk9IjEyMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPlNGVFAgY2xpZW50PC90ZXh0Pgo8dGV4dCB4PSI3NCIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3ZlciA6MjI8L3RleHQ+CjxsaW5lIHgxPSIxMjYiIHkxPSIxMjciIHgyPSIxNTIiIHkyPSIxMjciIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNCkiLz4KPHJlY3QgeD0iMTU0IiB5PSI5MiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI3MCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIyOSIgeT0iMTE2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+Zm9yd2FyZGluZyBydWxlPC90ZXh0Pgo8dGV4dCB4PSIyMjkiIHk9IjEzMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZToxMHB4Ij5UQ1AgTEI8L3RleHQ+Cjx0ZXh0IHg9IjIyOSIgeT0iMTUwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjEwcHgiPnJlc2VydmVkIHN0YXRpYyBJUDwvdGV4dD4KPGxpbmUgeDE9IjMwNCIgeTE9IjEyNyIgeDI9IjMzMCIgeTI9IjEyNyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM0KSIvPgo8cmVjdCB4PSIzMzIiIHk9Ijg0IiB3aWR0aD0iMjEyIiBoZWlnaHQ9IjEwMiIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjQzOCIgeT0iMTA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC1zaXplOjEyLjVweCI+TWFuYWdlZCBJbnN0YW5jZSBHcm91cDwvdGV4dD4KPHRleHQgeD0iNDM4IiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPnRhcmdldF9zaXplID0gMSDCtyBhdXRvaGVhbGluZzwvdGV4dD4KPHJlY3QgeD0iMzQ4IiB5PSIxMzQiIHdpZHRoPSIxODAiIGhlaWdodD0iNDIiIHJ4PSI5IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNhN2YzZDAiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQzOCIgeT0iMTUyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZm9udC1zaXplOjkuNXB4Ij5pbnN0YW5jZSB0ZW1wbGF0ZTwvdGV4dD4KPHRleHQgeD0iNDM4IiB5PSIxNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OS41cHgiPmF0bW96L3NmdHAgKyBnY3NmdXNlPC90ZXh0Pgo8bGluZSB4MT0iNTQ0IiB5MT0iMTI3IiB4Mj0iNTcwIiB5Mj0iMTI3IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczQpIi8+CjxyZWN0IHg9IjU3MiIgeT0iOTIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNzAiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2NDciIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5HQ1MgYnVja2V0PC90ZXh0Pgo8dGV4dCB4PSI2NDciIHk9IjEzOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnRoZSBtYXBwZWQgc3RvcmU8L3RleHQ+CjxyZWN0IHg9IjE1NCIgeT0iMTk2IiB3aWR0aD0iMzkwIiBoZWlnaHQ9IjI4IiByeD0iOCIgZmlsbD0iI2ZmZmJlYiIgc3Ryb2tlPSIjZmRlNjhhIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIzNDkiIHk9IjIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYjQ1MzA5OyBmb250LXNpemU6MTBweCI+aGVhbHRoIGNoZWNrIG9uIDoyMiBmYWlscyDihpIgdGhlIGdyb3VwIHJlY3JlYXRlcyB0aGUgb25lIGluc3RhbmNlPC90ZXh0Pgo8L3N2Zz4=" alt="A one-instance Google Managed Instance Group runs atmoz/sftp and gcsfuse. A port-22 health check drives replacement; the load balancer preserves the endpoint while active sessions are interrupted." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjQ0IiB2aWV3Qm94PSIwIDAgODM2IDI0NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIG9uZS1pbnN0YW5jZSBHb29nbGUgTWFuYWdlZCBJbnN0YW5jZSBHcm91cCBydW5zIGF0bW96L3NmdHAgYW5kIGdjc2Z1c2UuIEEgcG9ydC0yMiBoZWFsdGggY2hlY2sgZHJpdmVzIHJlcGxhY2VtZW50OyB0aGUgbG9hZCBiYWxhbmNlciBwcmVzZXJ2ZXMgdGhlIGVuZHBvaW50IHdoaWxlIGFjdGl2ZSBzZXNzaW9ucyBhcmUgaW50ZXJydXB0ZWQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9InRmczQiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjgiIHk9IjMwIiB3aWR0aD0iODIwIiBoZWlnaHQ9IjIwNCIgcng9IjE2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMjYiIHk9IjUyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwZGVjOCI+R09PR0xFIENMT1VEIMK3IE5PIENMVVNURVI8L3RleHQ+CjxyZWN0IHg9IjIyIiB5PSI5OCIgd2lkdGg9IjEwNCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc0IiB5PSIxMjMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5TRlRQIGNsaWVudDwvdGV4dD4KPHRleHQgeD0iNzQiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm92ZXIgOjIyPC90ZXh0Pgo8bGluZSB4MT0iMTI2IiB5MT0iMTI3IiB4Mj0iMTUyIiB5Mj0iMTI3IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczQpIi8+CjxyZWN0IHg9IjE1NCIgeT0iOTIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNzAiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMjkiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMS41cHgiPmZvcndhcmRpbmcgcnVsZTwvdGV4dD4KPHRleHQgeD0iMjI5IiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+VENQIExCPC90ZXh0Pgo8dGV4dCB4PSIyMjkiIHk9IjE1MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZToxMHB4Ij5yZXNlcnZlZCBzdGF0aWMgSVA8L3RleHQ+CjxsaW5lIHgxPSIzMDQiIHkxPSIxMjciIHgyPSIzMzAiIHkyPSIxMjciIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNCkiLz4KPHJlY3QgeD0iMzMyIiB5PSI4NCIgd2lkdGg9IjIxMiIgaGVpZ2h0PSIxMDIiIHJ4PSIxMiIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSI0MzgiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtc2l6ZToxMi41cHgiPk1hbmFnZWQgSW5zdGFuY2UgR3JvdXA8L3RleHQ+Cjx0ZXh0IHg9IjQzOCIgeT0iMTI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4Ij50YXJnZXRfc2l6ZSA9IDEgwrcgYXV0b2hlYWxpbmc8L3RleHQ+CjxyZWN0IHg9IjM0OCIgeT0iMTM0IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjQyIiByeD0iOSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q2NjUzIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI0MzgiIHk9IjE1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo5LjVweCI+aW5zdGFuY2UgdGVtcGxhdGU8L3RleHQ+Cjx0ZXh0IHg9IjQzOCIgeT0iMTY3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjkuNXB4Ij5hdG1vei9zZnRwICsgZ2NzZnVzZTwvdGV4dD4KPGxpbmUgeDE9IjU0NCIgeTE9IjEyNyIgeDI9IjU3MCIgeTI9IjEyNyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM0KSIvPgo8cmVjdCB4PSI1NzIiIHk9IjkyIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjcwIiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNjQ3IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+R0NTIGJ1Y2tldDwvdGV4dD4KPHRleHQgeD0iNjQ3IiB5PSIxMzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij50aGUgbWFwcGVkIHN0b3JlPC90ZXh0Pgo8cmVjdCB4PSIxNTQiIHk9IjE5NiIgd2lkdGg9IjM5MCIgaGVpZ2h0PSIyOCIgcng9IjgiIGZpbGw9IiMzMTJkMWEiIHN0cm9rZT0iIzY2NWQzZCIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iMzQ5IiB5PSIyMTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2RlYjI5MDsgZm9udC1zaXplOjEwcHgiPmhlYWx0aCBjaGVjayBvbiA6MjIgZmFpbHMg4oaSIHRoZSBncm91cCByZWNyZWF0ZXMgdGhlIG9uZSBpbnN0YW5jZTwvdGV4dD4KPC9zdmc+" alt="A one-instance Google Managed Instance Group runs atmoz/sftp and gcsfuse. A port-22 health check drives replacement; the load balancer preserves the endpoint while active sessions are interrupted." />
</div>

<p className="t9-caption">A one-instance Managed Instance Group uses a port-22 health check and a load balancer with a stable endpoint.</p>

#### On a no-cluster OCI stack: an Instance Pool

The OCI target uses an Instance Pool with one VM defined by `oci_core_instance_configuration`. Cloud-init starts `atmoz/sftp` and mounts Object Storage through `s3fs` or `rclone` using the S3-compatible endpoint.

The pool uses `size = 1` and replacement on failure. A security list or network security group permits port 22. An `oci_network_load_balancer` provides a stable endpoint across instance replacement. An OCI environment with OKE uses the Kubernetes deployment instead.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjQ0IiB2aWV3Qm94PSIwIDAgODM2IDI0NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIG9uZS1pbnN0YW5jZSBPQ0kgcG9vbCBydW5zIGF0bW96L3NmdHAgYW5kIGFuIHMzZnMgb3IgcmNsb25lIG1vdW50LiBBIG5ldHdvcmsgbG9hZCBiYWxhbmNlciBwcm92aWRlcyBhIHN0YWJsZSBlbmRwb2ludCBhY3Jvc3MgcmVwbGFjZW1lbnQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9InRmczUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjgiIHk9IjMwIiB3aWR0aD0iODIwIiBoZWlnaHQ9IjIwNCIgcng9IjE2IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMjYiIHk9IjUyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojMDQ3ODU3Ij5PQ0kgwrcgTk8gQ0xVU1RFUjwvdGV4dD4KPHJlY3QgeD0iMjIiIHk9Ijk4IiB3aWR0aD0iMTA0IiBoZWlnaHQ9IjU4IiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNzQiIHk9IjEyMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPlNGVFAgY2xpZW50PC90ZXh0Pgo8dGV4dCB4PSI3NCIgeT0iMTQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b3ZlciA6MjI8L3RleHQ+CjxsaW5lIHgxPSIxMjYiIHkxPSIxMjciIHgyPSIxNTIiIHkyPSIxMjciIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNSkiLz4KPHJlY3QgeD0iMTU0IiB5PSI5MiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI3MCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIyOSIgeT0iMTE2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+bmV0d29yayBMQjwvdGV4dD4KPHRleHQgeD0iMjI5IiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmb250LXNpemU6MTBweCI+TkxCPC90ZXh0Pgo8dGV4dCB4PSIyMjkiIHk9IjE1MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZToxMHB4Ij5yZXNlcnZlZCBwdWJsaWMgSVA8L3RleHQ+CjxsaW5lIHgxPSIzMDQiIHkxPSIxMjciIHgyPSIzMzAiIHkyPSIxMjciIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNSkiLz4KPHJlY3QgeD0iMzMyIiB5PSI4NCIgd2lkdGg9IjIxMiIgaGVpZ2h0PSIxMDIiIHJ4PSIxMiIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSI0MzgiIHk9IjEwOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtc2l6ZToxMi41cHgiPkluc3RhbmNlIFBvb2w8L3RleHQ+Cjx0ZXh0IHg9IjQzOCIgeT0iMTI2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3Ij5zaXplID0gMSDCtyBhdXRvLWhlYWxpbmc8L3RleHQ+CjxyZWN0IHg9IjM0OCIgeT0iMTM0IiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjQyIiByeD0iOSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjYTdmM2QwIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI0MzgiIHk9IjE1MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZTo5LjVweCI+aW5zdGFuY2UgY29uZmlndXJhdGlvbjwvdGV4dD4KPHRleHQgeD0iNDM4IiB5PSIxNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OS41cHgiPmF0bW96L3NmdHAgKyBzM2ZzPC90ZXh0Pgo8bGluZSB4MT0iNTQ0IiB5MT0iMTI3IiB4Mj0iNTcwIiB5Mj0iMTI3IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczUpIi8+CjxyZWN0IHg9IjU3MiIgeT0iOTIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNzAiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2NDciIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPk9iamVjdCBTdG9yYWdlPC90ZXh0Pgo8dGV4dCB4PSI2NDciIHk9IjEzMyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZToxMHB4Ij5TMy1jb21wYXRpYmlsaXR5PC90ZXh0Pgo8dGV4dCB4PSI2NDciIHk9IjE1MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZvbnQtc2l6ZToxMHB4Ij5lbmRwb2ludDwvdGV4dD4KPHJlY3QgeD0iMTU0IiB5PSIxOTYiIHdpZHRoPSIzOTAiIGhlaWdodD0iMjgiIHJ4PSI4IiBmaWxsPSIjZmZmYmViIiBzdHJva2U9IiNmZGU2OGEiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjM0OSIgeT0iMjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNiNDUzMDk7IGZvbnQtc2l6ZToxMHB4Ij5hdXRvLWhlYWxpbmcgcmVjcmVhdGVzIHRoZSBvbmUgaW5zdGFuY2Ugb24gZmFpbHVyZTogYSBjb2xkIHJlc3RhcnQ8L3RleHQ+Cjwvc3ZnPg==" alt="A one-instance OCI pool runs atmoz/sftp and an s3fs or rclone mount. A network load balancer provides a stable endpoint across replacement." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjQ0IiB2aWV3Qm94PSIwIDAgODM2IDI0NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBIG9uZS1pbnN0YW5jZSBPQ0kgcG9vbCBydW5zIGF0bW96L3NmdHAgYW5kIGFuIHMzZnMgb3IgcmNsb25lIG1vdW50LiBBIG5ldHdvcmsgbG9hZCBiYWxhbmNlciBwcm92aWRlcyBhIHN0YWJsZSBlbmRwb2ludCBhY3Jvc3MgcmVwbGFjZW1lbnQuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9InRmczUiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjgiIHk9IjMwIiB3aWR0aD0iODIwIiBoZWlnaHQ9IjIwNCIgcng9IjE2IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMjYiIHk9IjUyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwZGVjOCI+T0NJIMK3IE5PIENMVVNURVI8L3RleHQ+CjxyZWN0IHg9IjIyIiB5PSI5OCIgd2lkdGg9IjEwNCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijc0IiB5PSIxMjMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5TRlRQIGNsaWVudDwvdGV4dD4KPHRleHQgeD0iNzQiIHk9IjE0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm92ZXIgOjIyPC90ZXh0Pgo8bGluZSB4MT0iMTI2IiB5MT0iMTI3IiB4Mj0iMTUyIiB5Mj0iMTI3IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczUpIi8+CjxyZWN0IHg9IjE1NCIgeT0iOTIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNzAiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMjkiIHk9IjExNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMS41cHgiPm5ldHdvcmsgTEI8L3RleHQ+Cjx0ZXh0IHg9IjIyOSIgeT0iMTMzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPk5MQjwvdGV4dD4KPHRleHQgeD0iMjI5IiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+cmVzZXJ2ZWQgcHVibGljIElQPC90ZXh0Pgo8bGluZSB4MT0iMzA0IiB5MT0iMTI3IiB4Mj0iMzMwIiB5Mj0iMTI3IiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczUpIi8+CjxyZWN0IHg9IjMzMiIgeT0iODQiIHdpZHRoPSIyMTIiIGhlaWdodD0iMTAyIiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNDM4IiB5PSIxMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTIuNXB4Ij5JbnN0YW5jZSBQb29sPC90ZXh0Pgo8dGV4dCB4PSI0MzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjOCI+c2l6ZSA9IDEgwrcgYXV0by1oZWFsaW5nPC90ZXh0Pgo8cmVjdCB4PSIzNDgiIHk9IjEzNCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI0MiIgcng9IjkiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNjY1MyIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNDM4IiB5PSIxNTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OS41cHgiPmluc3RhbmNlIGNvbmZpZ3VyYXRpb248L3RleHQ+Cjx0ZXh0IHg9IjQzOCIgeT0iMTY3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjkuNXB4Ij5hdG1vei9zZnRwICsgczNmczwvdGV4dD4KPGxpbmUgeDE9IjU0NCIgeTE9IjEyNyIgeDI9IjU3MCIgeTI9IjEyNyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM1KSIvPgo8cmVjdCB4PSI1NzIiIHk9IjkyIiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjcwIiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNjQ3IiB5PSIxMTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5PYmplY3QgU3RvcmFnZTwvdGV4dD4KPHRleHQgeD0iNjQ3IiB5PSIxMzMiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+UzMtY29tcGF0aWJpbGl0eTwvdGV4dD4KPHRleHQgeD0iNjQ3IiB5PSIxNTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+ZW5kcG9pbnQ8L3RleHQ+CjxyZWN0IHg9IjE1NCIgeT0iMTk2IiB3aWR0aD0iMzkwIiBoZWlnaHQ9IjI4IiByeD0iOCIgZmlsbD0iIzMxMmQxYSIgc3Ryb2tlPSIjNjY1ZDNkIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSIzNDkiIHk9IjIxNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjZGViMjkwOyBmb250LXNpemU6MTBweCI+YXV0by1oZWFsaW5nIHJlY3JlYXRlcyB0aGUgb25lIGluc3RhbmNlIG9uIGZhaWx1cmU6IGEgY29sZCByZXN0YXJ0PC90ZXh0Pgo8L3N2Zz4=" alt="A one-instance OCI pool runs atmoz/sftp and an s3fs or rclone mount. A network load balancer provides a stable endpoint across replacement." />
</div>

<p className="t9-caption">A one-instance OCI pool runs the gateway and object mount behind a network load balancer.</p>

#### On a no-cluster Azure stack: a Container App

Without AKS, the Azure target runs `atmoz/sftp` in the shared Container Apps environment. TCP ingress exposes port 22 publicly or internally as required. SSH public keys use a secret block, and `min_replicas = 1` keeps an instance running. That minimum alone does not enforce one instance; the deployment's maximum replica count and rollout settings must also preserve the single-instance design.

The Container App mounts Azure Files over SMB for the user's home data. This differs from the Blob container mounted on AKS. Files uploaded here are not automatically visible to applications reading the mapped Blob container. Plan the data location and any required transfer explicitly.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBenVyZSBDb250YWluZXIgQXBwcyBydW5zIGF0bW96L3NmdHAgd2l0aCBUQ1AgaW5ncmVzcyBhbmQgYW4gQXp1cmUgRmlsZXMgdm9sdW1lLiBtaW5fcmVwbGljYXMgb25lIGtlZXBzIGFuIGluc3RhbmNlIHJ1bm5pbmcgYnV0IGRvZXMgbm90IGNhcCBzY2FsaW5nOyBjb25maWd1cmUgYSBtYXhpbXVtIGZvciB0aGUgc2luZ2xlLWluc3RhbmNlIGRlc2lnbi4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI4MjAiIGhlaWdodD0iMTUwIiByeD0iMTYiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iI2NiZDVlMSIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIyNiIgeT0iNTIiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiMwNDc4NTciPkFaVVJFIMK3IE5PIENMVVNURVI8L3RleHQ+CjxyZWN0IHg9IjI0IiB5PSI4NiIgd2lkdGg9IjExOCIgaGVpZ2h0PSI2MiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjgzIiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTEuNXB4Ij5TRlRQIGNsaWVudDwvdGV4dD4KPHRleHQgeD0iODMiIHk9IjEyOSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm92ZXIgOjIyPC90ZXh0Pgo8bGluZSB4MT0iMTQyIiB5MT0iMTE3IiB4Mj0iMTcwIiB5Mj0iMTE3IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczYpIi8+CjxyZWN0IHg9IjE3MiIgeT0iODYiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjIiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyNDciIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPlRDUCBpbmdyZXNzPC90ZXh0Pgo8dGV4dCB4PSIyNDciIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZToxMHB4Ij5leHBvc2VkX3BvcnQgPSAyMjwvdGV4dD4KPGxpbmUgeDE9IjMyMiIgeTE9IjExNyIgeDI9IjM1MCIgeTI9IjExNyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM2KSIvPgo8cmVjdCB4PSIzNTIiIHk9IjgwIiB3aWR0aD0iMTY0IiBoZWlnaHQ9Ijc0IiByeD0iMTIiIGZpbGw9IiNlY2ZkZjUiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHRleHQgeD0iNDM0IiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTIuNXB4Ij5Db250YWluZXIgQXBwPC90ZXh0Pgo8dGV4dCB4PSI0MzQiIHk9IjEyNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+YXRtb3ovc2Z0cDwvdGV4dD4KPHRleHQgeD0iNDM0IiB5PSIxNDEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OS41cHgiPm1pbl9yZXBsaWNhcyA9IDEgwrcgc2VjcmV0PC90ZXh0Pgo8bGluZSB4MT0iNTE2IiB5MT0iMTE3IiB4Mj0iNTQ0IiB5Mj0iMTE3IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI3RmczYpIi8+CjxyZWN0IHg9IjU0NiIgeT0iODYiIHdpZHRoPSIxNzYiIGhlaWdodD0iNjIiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2MzQiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPkF6dXJlIEZpbGVzIHZvbHVtZTwvdGV4dD4KPHRleHQgeD0iNjM0IiB5PSIxMjkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6MTBweCI+dGhlIHVzZXIncyBob21lPC90ZXh0Pgo8cmVjdCB4PSIxNzIiIHk9IjE5MCIgd2lkdGg9IjU1MCIgaGVpZ2h0PSIyOCIgcng9IjgiIGZpbGw9IiNmZmZiZWIiIHN0cm9rZT0iI2ZkZTY4YSIgc3Ryb2tlLXdpZHRoPSIxLjMiLz4KPHRleHQgeD0iNDQ3IiB5PSIyMDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2I0NTMwOTsgZm9udC1zaXplOjEwcHgiPkF6dXJlIEZpbGVzLCBub3QgdGhlIEJsb2IgY29udGFpbmVyIHRoZSBTMyBiYWNraW5nIG1hcHMgdG8gb24gQUtTOiBhIGRpZmZlcmVudCBzdG9yZTwvdGV4dD4KPC9zdmc+" alt="Azure Container Apps runs atmoz/sftp with TCP ingress and an Azure Files volume. min_replicas one keeps an instance running but does not cap scaling; configure a maximum for the single-instance design." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjI2IiB2aWV3Qm94PSIwIDAgODM2IDIyNiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJBenVyZSBDb250YWluZXIgQXBwcyBydW5zIGF0bW96L3NmdHAgd2l0aCBUQ1AgaW5ncmVzcyBhbmQgYW4gQXp1cmUgRmlsZXMgdm9sdW1lLiBtaW5fcmVwbGljYXMgb25lIGtlZXBzIGFuIGluc3RhbmNlIHJ1bm5pbmcgYnV0IGRvZXMgbm90IGNhcCBzY2FsaW5nOyBjb25maWd1cmUgYSBtYXhpbXVtIGZvciB0aGUgc2luZ2xlLWluc3RhbmNlIGRlc2lnbi4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzNiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iOCIgeT0iMzAiIHdpZHRoPSI4MjAiIGhlaWdodD0iMTUwIiByeD0iMTYiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzNkNGY2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPgo8dGV4dCB4PSIyNiIgeT0iNTIiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5BWlVSRSDCtyBOTyBDTFVTVEVSPC90ZXh0Pgo8cmVjdCB4PSIyNCIgeT0iODYiIHdpZHRoPSIxMTgiIGhlaWdodD0iNjIiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4MyIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+U0ZUUCBjbGllbnQ8L3RleHQ+Cjx0ZXh0IHg9IjgzIiB5PSIxMjkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5vdmVyIDoyMjwvdGV4dD4KPGxpbmUgeDE9IjE0MiIgeTE9IjExNyIgeDI9IjE3MCIgeTI9IjExNyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM2KSIvPgo8cmVjdCB4PSIxNzIiIHk9Ijg2IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjYyIiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjQ3IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5UQ1AgaW5ncmVzczwvdGV4dD4KPHRleHQgeD0iMjQ3IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+ZXhwb3NlZF9wb3J0ID0gMjI8L3RleHQ+CjxsaW5lIHgxPSIzMjIiIHkxPSIxMTciIHgyPSIzNTAiIHkyPSIxMTciIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNikiLz4KPHJlY3QgeD0iMzUyIiB5PSI4MCIgd2lkdGg9IjE2NCIgaGVpZ2h0PSI3NCIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjQzNCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEyLjVweCI+Q29udGFpbmVyIEFwcDwvdGV4dD4KPHRleHQgeD0iNDM0IiB5PSIxMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPmF0bW96L3NmdHA8L3RleHQ+Cjx0ZXh0IHg9IjQzNCIgeT0iMTQxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjkuNXB4Ij5taW5fcmVwbGljYXMgPSAxIMK3IHNlY3JldDwvdGV4dD4KPGxpbmUgeDE9IjUxNiIgeTE9IjExNyIgeDI9IjU0NCIgeTI9IjExNyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM2KSIvPgo8cmVjdCB4PSI1NDYiIHk9Ijg2IiB3aWR0aD0iMTc2IiBoZWlnaHQ9IjYyIiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNjM0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5BenVyZSBGaWxlcyB2b2x1bWU8L3RleHQ+Cjx0ZXh0IHg9IjYzNCIgeT0iMTI5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPnRoZSB1c2VyJ3MgaG9tZTwvdGV4dD4KPHJlY3QgeD0iMTcyIiB5PSIxOTAiIHdpZHRoPSI1NTAiIGhlaWdodD0iMjgiIHJ4PSI4IiBmaWxsPSIjMzEyZDFhIiBzdHJva2U9IiM2NjVkM2QiIHN0cm9rZS13aWR0aD0iMS4zIi8+Cjx0ZXh0IHg9IjQ0NyIgeT0iMjA4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNkZWIyOTA7IGZvbnQtc2l6ZToxMHB4Ij5BenVyZSBGaWxlcywgbm90IHRoZSBCbG9iIGNvbnRhaW5lciB0aGUgUzMgYmFja2luZyBtYXBzIHRvIG9uIEFLUzogYSBkaWZmZXJlbnQgc3RvcmU8L3RleHQ+Cjwvc3ZnPg==" alt="Azure Container Apps runs atmoz/sftp with TCP ingress and an Azure Files volume. min_replicas one keeps an instance running but does not cap scaling; configure a maximum for the single-instance design." />
</div>

<p className="t9-caption">Azure Container Apps serves TCP port 22 and mounts Azure Files. Configure replica limits to preserve the single-instance design.</p>

#### The bucket as the SFTP home

On Kubernetes and the VM hosts, the gateway exposes the mapped object store as files. File uploads become objects, and object contents can be read through SFTP. The Azure Container Apps target instead stores files in Azure Files. That exception matters when another application expects to read the mapped object bucket.

Kubernetes uses an object-store CSI driver; Google Cloud VMs use `gcsfuse`; OCI VMs use `s3fs` or `rclone`. Object-backed mounts can differ from POSIX filesystems in locking, rename atomicity and write visibility. Azure Files is an SMB file share and has its own semantics. Test the relevant mount with the client's transfer workflow.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTk0IiB2aWV3Qm94PSIwIDAgODM2IDE5NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJLdWJlcm5ldGVzIGFuZCBWTSBob3N0cyBtb3VudCBvYmplY3Qgc3RvcmFnZSB0aHJvdWdoIENTSSwgZ2NzZnVzZSwgczNmcyBvciByY2xvbmUuIEF6dXJlIENvbnRhaW5lciBBcHBzIHVzZXMgYW4gU01CIEF6dXJlIEZpbGVzIHNoYXJlLiBSZXZpZXcgZmlsZXN5c3RlbSBiZWhhdmlvciBmb3IgZWFjaCBtb3VudC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzNyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMjQiIHk9IjQyIiB3aWR0aD0iMTg4IiBoZWlnaHQ9IjExMCIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjExOCIgeT0iNzQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTIuNXB4Ij5TRlRQIGdhdGV3YXk8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTciPmhvbWUgPSAvZGF0YTwvdGV4dD4KPHRleHQgeD0iMTE4IiB5PSIxMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6MTBweCI+d3JpdGVzIHVzZSB0aGU8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjEwcHgiPnNlbGVjdGVkIG1vdW50PC90ZXh0Pgo8bGluZSB4MT0iMjEyIiB5MT0iOTciIHgyPSIyNTYiIHkyPSI5NyIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM3KSIvPgo8dGV4dCB4PSIyMzQiIHk9Ijg4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjhweCI+bW91bnQ8L3RleHQ+CjxyZWN0IHg9IjI1OCIgeT0iNDgiIHdpZHRoPSIzMDAiIGhlaWdodD0iOTgiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI0MDgiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+YnkgaG9zdDwvdGV4dD4KPHRleHQgeD0iMjcyIiB5PSI5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZToxMHB4Ij5jbHVzdGVyICAgIOKGkiBvYmplY3Qtc3RvcmUgQ1NJPC90ZXh0Pgo8dGV4dCB4PSIyNzIiIHk9IjExMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZToxMHB4Ij5HQ0UgTUlHICAgIOKGkiBnY3NmdXNlIGJpbmFyeTwvdGV4dD4KPHRleHQgeD0iMjcyIiB5PSIxMzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmb250LXNpemU6MTBweCI+T0NJIHBvb2wgICDihpIgczNmcyAvIHJjbG9uZTwvdGV4dD4KPGxpbmUgeDE9IjU1OCIgeTE9Ijk3IiB4Mj0iNjAyIiB5Mj0iOTciIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNykiLz4KPHJlY3QgeD0iNjA0IiB5PSI0OCIgd2lkdGg9IjIwNCIgaGVpZ2h0PSI5OCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjcwNiIgeT0iODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTJweCI+YmFja2luZyBzdG9yYWdlPC90ZXh0Pgo8dGV4dCB4PSI3MDYiIHk9IjEwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPkdDUyAvIE9iamVjdCBTdG9yYWdlIC88L3RleHQ+Cjx0ZXh0IHg9IjcwNiIgeT0iMTIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+QXp1cmUgRmlsZXMgLyBNaW5JTzwvdGV4dD4KPC9zdmc+" alt="Kubernetes and VM hosts mount object storage through CSI, gcsfuse, s3fs or rclone. Azure Container Apps uses an SMB Azure Files share. Review filesystem behavior for each mount." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTk0IiB2aWV3Qm94PSIwIDAgODM2IDE5NCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJLdWJlcm5ldGVzIGFuZCBWTSBob3N0cyBtb3VudCBvYmplY3Qgc3RvcmFnZSB0aHJvdWdoIENTSSwgZ2NzZnVzZSwgczNmcyBvciByY2xvbmUuIEF6dXJlIENvbnRhaW5lciBBcHBzIHVzZXMgYW4gU01CIEF6dXJlIEZpbGVzIHNoYXJlLiBSZXZpZXcgZmlsZXN5c3RlbSBiZWhhdmlvciBmb3IgZWFjaCBtb3VudC4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzNyIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMjQiIHk9IjQyIiB3aWR0aD0iMTg4IiBoZWlnaHQ9IjExMCIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjExOCIgeT0iNzQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjOTBkZWM4OyBmb250LXNpemU6MTIuNXB4Ij5TRlRQIGdhdGV3YXk8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPmhvbWUgPSAvZGF0YTwvdGV4dD4KPHRleHQgeD0iMTE4IiB5PSIxMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+d3JpdGVzIHVzZSB0aGU8L3RleHQ+Cjx0ZXh0IHg9IjExOCIgeT0iMTM4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPnNlbGVjdGVkIG1vdW50PC90ZXh0Pgo8bGluZSB4MT0iMjEyIiB5MT0iOTciIHgyPSIyNTYiIHkyPSI5NyIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCN0ZnM3KSIvPgo8dGV4dCB4PSIyMzQiIHk9Ijg4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjhweCI+bW91bnQ8L3RleHQ+CjxyZWN0IHg9IjI1OCIgeT0iNDgiIHdpZHRoPSIzMDAiIGhlaWdodD0iOTgiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI0MDgiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+YnkgaG9zdDwvdGV4dD4KPHRleHQgeD0iMjcyIiB5PSI5NCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZToxMHB4Ij5jbHVzdGVyICAgIOKGkiBvYmplY3Qtc3RvcmUgQ1NJPC90ZXh0Pgo8dGV4dCB4PSIyNzIiIHk9IjExMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZToxMHB4Ij5HQ0UgTUlHICAgIOKGkiBnY3NmdXNlIGJpbmFyeTwvdGV4dD4KPHRleHQgeD0iMjcyIiB5PSIxMzAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6MTBweCI+T0NJIHBvb2wgICDihpIgczNmcyAvIHJjbG9uZTwvdGV4dD4KPGxpbmUgeDE9IjU1OCIgeTE9Ijk3IiB4Mj0iNjAyIiB5Mj0iOTciIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjdGZzNykiLz4KPHJlY3QgeD0iNjA0IiB5PSI0OCIgd2lkdGg9IjIwNCIgaGVpZ2h0PSI5OCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjcwNiIgeT0iODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+YmFja2luZyBzdG9yYWdlPC90ZXh0Pgo8dGV4dCB4PSI3MDYiIHk9IjEwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkdDUyAvIE9iamVjdCBTdG9yYWdlIC88L3RleHQ+Cjx0ZXh0IHg9IjcwNiIgeT0iMTIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+QXp1cmUgRmlsZXMgLyBNaW5JTzwvdGV4dD4KPC9zdmc+" alt="Kubernetes and VM hosts mount object storage through CSI, gcsfuse, s3fs or rclone. Azure Container Apps uses an SMB Azure Files share. Review filesystem behavior for each mount." />
</div>

<p className="t9-caption">Object-store mounts expose bucket data on Kubernetes and VM hosts. Azure Container Apps uses Azure Files instead.</p>

#### Users and SSH keys

The user name, POSIX UID/GID and home path become an `SFTP_USERS` entry, such as `ada::e:1001:1001:/data`. The SSH public key becomes an authorized key. In atmoz syntax, `e` marks an encrypted password field; it is not a key-only switch. The empty password and supplied public key support key-based login. Configure writable subdirectories below the user's chroot home as required by atmoz.

Kubernetes uses a ConfigMap and Secret; the VM hosts use startup or cloud-init configuration; Container Apps uses environment variables and secret entries. The uploaded SSH keys are public keys. Object-store credentials are separate from client authentication: use the host's supported workload identity or credential configuration for mounting storage.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUcmFuc2ZlciB1c2VycyBhbmQgcHVibGljIGtleXMgYmVjb21lIFNGVFBfVVNFUlMgYW5kIGF1dGhvcml6ZWQta2V5IGNvbmZpZ3VyYXRpb24gb24gdGhlIHNlbGVjdGVkIGhvc3QuIFRoZSBlIG1hcmtlciBtZWFucyBlbmNyeXB0ZWQgcGFzc3dvcmQ7IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGggYSBwdWJsaWMga2V5IHN1cHBvcnRzIGtleS1iYXNlZCBsb2dpbi4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzOCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzA1OTY2OSIvPjwvbWFya2VyPjwvZGVmcz4KPHRleHQgeD0iMTgwIiB5PSIyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkFXUyBUUkFOU0ZFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjM2IiB3aWR0aD0iMzAwIiBoZWlnaHQ9Ijk2IiByeD0iMTIiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNDYiIHk9IjYwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1O2ZvbnQtc2l6ZToxMC41cHgiPmF3c190cmFuc2Zlcl91c2VyICJhZGEiPC90ZXh0Pgo8dGV4dCB4PSI0NiIgeT0iODIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiM0NzU1Njk7Zm9udC1zaXplOjEwLjVweCI+cG9zaXggJiMxMjM7IHVpZCA9IDEwMDEsIGdpZCA9IDEwMDEgJiMxMjU7PC90ZXh0Pgo8dGV4dCB4PSI0NiIgeT0iMTAyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojNDc1NTY5O2ZvbnQtc2l6ZToxMC41cHgiPmhvbWVfZGlyZWN0b3J5ID0gIi9kYXRhIjwvdGV4dD4KPHRleHQgeD0iNDYiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzQ3NTU2OTtmb250LXNpemU6MTAuNXB4Ij5zc2hfa2V5ID0gc3NoLWVkMjU1MTkg4oCmPC90ZXh0Pgo8bGluZSB4MT0iMzMwIiB5MT0iODQiIHgyPSIzNzgiIHkyPSI4NCIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjdGZzOCkiLz4KPHRleHQgeD0iMzU0IiB5PSI3NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NzsgZm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZTo5cHgiPnJlc29sdmU8L3RleHQ+CjxyZWN0IHg9IjM4MiIgeT0iMzYiIHdpZHRoPSI0MjQiIGhlaWdodD0iOTYiIHJ4PSIxMiIgZmlsbD0iI2VjZmRmNSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8dGV4dCB4PSIzOTgiIHk9IjU4IiBzdHlsZT0iZm9udDogMTAuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXdlaWdodDo3MDAiPlNGVFBfVVNFUlM8L3RleHQ+Cjx0ZXh0IHg9IjM5OCIgeT0iNzgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTc7Zm9udC1zaXplOjEwLjVweCI+YWRhOjplOjEwMDE6MTAwMTovZGF0YTwvdGV4dD4KPHRleHQgeD0iMzk4IiB5PSIxMDIiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+YXV0aG9yaXplZF9rZXlzPC90ZXh0Pgo8dGV4dCB4PSIzOTgiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1Nztmb250LXNpemU6MTAuNXB4Ij5zc2gtZWQyNTUxOSBBQUFBQzNOemHigKYgYWRhPC90ZXh0Pgo8cmVjdCB4PSIzMCIgeT0iMTUwIiB3aWR0aD0iNzc2IiBoZWlnaHQ9IjM4IiByeD0iOSIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI0NiIgeT0iMTY3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjEwcHgiPnJlbmRlcmVkIHBlciBob3N0OjwvdGV4dD4KPHRleHQgeD0iNDYiIHk9IjE4MiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZTo5LjVweCI+Y2x1c3RlciDihpIgY29uZmlnX21hcCArIHNlY3JldCAgIMK3ICAgTUlHIOKGkiBzdGFydHVwIHNjcmlwdCAgIMK3ICAgT0NJIHBvb2wg4oaSIGNsb3VkLWluaXQgICDCtyAgIENvbnRhaW5lciBBcHAg4oaSIGVudiArIHNlY3JldDwvdGV4dD4KPC9zdmc+" alt="Transfer users and public keys become SFTP_USERS and authorized-key configuration on the selected host. The e marker means encrypted password; an empty password with a public key supports key-based login." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjAwIiB2aWV3Qm94PSIwIDAgODM2IDIwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUcmFuc2ZlciB1c2VycyBhbmQgcHVibGljIGtleXMgYmVjb21lIFNGVFBfVVNFUlMgYW5kIGF1dGhvcml6ZWQta2V5IGNvbmZpZ3VyYXRpb24gb24gdGhlIHNlbGVjdGVkIGhvc3QuIFRoZSBlIG1hcmtlciBtZWFucyBlbmNyeXB0ZWQgcGFzc3dvcmQ7IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGggYSBwdWJsaWMga2V5IHN1cHBvcnRzIGtleS1iYXNlZCBsb2dpbi4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzOCIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNi41IiBtYXJrZXJIZWlnaHQ9IjYuNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzIwZjdiNCIvPjwvbWFya2VyPjwvZGVmcz4KPHRleHQgeD0iMTgwIiB5PSIyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPkFXUyBUUkFOU0ZFUjwvdGV4dD4KPHJlY3QgeD0iMzAiIHk9IjM2IiB3aWR0aD0iMzAwIiBoZWlnaHQ9Ijk2IiByeD0iMTIiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNDYiIHk9IjYwIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkODtmb250LXNpemU6MTAuNXB4Ij5hd3NfdHJhbnNmZXJfdXNlciAiYWRhIjwvdGV4dD4KPHRleHQgeD0iNDYiIHk9IjgyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkODtmb250LXNpemU6MTAuNXB4Ij5wb3NpeCAmIzEyMzsgdWlkID0gMTAwMSwgZ2lkID0gMTAwMSAmIzEyNTs8L3RleHQ+Cjx0ZXh0IHg9IjQ2IiB5PSIxMDIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4O2ZvbnQtc2l6ZToxMC41cHgiPmhvbWVfZGlyZWN0b3J5ID0gIi9kYXRhIjwvdGV4dD4KPHRleHQgeD0iNDYiIHk9IjEyMiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDg7Zm9udC1zaXplOjEwLjVweCI+c3NoX2tleSA9IHNzaC1lZDI1NTE5IOKApjwvdGV4dD4KPGxpbmUgeDE9IjMzMCIgeTE9Ijg0IiB4Mj0iMzc4IiB5Mj0iODQiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI3RmczgpIi8+Cjx0ZXh0IHg9IjM1NCIgeT0iNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6OXB4Ij5yZXNvbHZlPC90ZXh0Pgo8cmVjdCB4PSIzODIiIHk9IjM2IiB3aWR0aD0iNDI0IiBoZWlnaHQ9Ijk2IiByeD0iMTIiIGZpbGw9IiMxYTMxMjYiIHN0cm9rZT0iIzA1OTY2OSIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHRleHQgeD0iMzk4IiB5PSI1OCIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5TRlRQX1VTRVJTPC90ZXh0Pgo8dGV4dCB4PSIzOTgiIHk9Ijc4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjODtmb250LXNpemU6MTAuNXB4Ij5hZGE6OmU6MTAwMToxMDAxOi9kYXRhPC90ZXh0Pgo8dGV4dCB4PSIzOTgiIHk9IjEwMiIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC13ZWlnaHQ6NzAwIj5hdXRob3JpemVkX2tleXM8L3RleHQ+Cjx0ZXh0IHg9IjM5OCIgeT0iMTIyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogIzkwZGVjODtmb250LXNpemU6MTAuNXB4Ij5zc2gtZWQyNTUxOSBBQUFBQzNOemHigKYgYWRhPC90ZXh0Pgo8cmVjdCB4PSIzMCIgeT0iMTUwIiB3aWR0aD0iNzc2IiBoZWlnaHQ9IjM4IiByeD0iOSIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuMyIvPgo8dGV4dCB4PSI0NiIgeT0iMTY3IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPnJlbmRlcmVkIHBlciBob3N0OjwvdGV4dD4KPHRleHQgeD0iNDYiIHk9IjE4MiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo5LjVweCI+Y2x1c3RlciDihpIgY29uZmlnX21hcCArIHNlY3JldCAgIMK3ICAgTUlHIOKGkiBzdGFydHVwIHNjcmlwdCAgIMK3ICAgT0NJIHBvb2wg4oaSIGNsb3VkLWluaXQgICDCtyAgIENvbnRhaW5lciBBcHAg4oaSIGVudiArIHNlY3JldDwvdGV4dD4KPC9zdmc+" alt="Transfer users and public keys become SFTP_USERS and authorized-key configuration on the selected host. The e marker means encrypted password; an empty password with a public key supports key-based login." />
</div>

<p className="t9-caption">User names, numeric identities, home paths and SSH public keys become host-specific gateway configuration.</p>

#### Reachability on :22

Map public endpoints to the host's public Service, forwarding rule, network load balancer or TCP ingress. Private endpoints require the corresponding internal network configuration. On Kubernetes, ClusterIP limits access to the cluster; VPC clients outside it need an additional private access path.

Verify reachability from the actual client networks. A public endpoint and a private endpoint require different load-balancer and firewall settings. On VM hosts, the load balancer also preserves the endpoint address while a failed instance is replaced.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA0IiB2aWV3Qm94PSIwIDAgODM2IDIwNCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaWMgZW5kcG9pbnRzIHVzZSBwdWJsaWMgbmV0d29yayBjb25maWd1cmF0aW9uLiBQcml2YXRlIGNsaWVudHMgbmVlZCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJuYWwgZW5kcG9pbnQgYW5kIHJvdXRpbmc7IEt1YmVybmV0ZXMgQ2x1c3RlcklQIGFsb25lIGlzIGNsdXN0ZXItbG9jYWwuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxyZWN0IHg9IjI0IiB5PSIzNCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSI3MiIgcng9IjEyIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQyIiB5PSI1NiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPlBVQkxJQyDCtyBpbnRlcm5ldC1yZWFjaGFibGU8L3RleHQ+Cjx0ZXh0IHg9IjQyIiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZToxMHB4Ij5MQiBTZXJ2aWNlIMK3IGV4dGVybmFsIGZvcndhcmRpbmcgcnVsZTwvdGV4dD4KPHRleHQgeD0iNDIiIHk9Ijk3IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZm9udC1zaXplOjEwcHgiPmV4dGVybmFsIE5MQiDCtyBleHRlcm5hbCBUQ1AgaW5ncmVzczwvdGV4dD4KPHJlY3QgeD0iNDI4IiB5PSIzNCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSI3MiIgcng9IjEyIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQ0NiIgeT0iNTYiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5QUklWQVRFIMK3IHZlcmlmeSBjbGllbnQgcm91dGluZzwvdGV4dD4KPHRleHQgeD0iNDQ2IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZvbnQtc2l6ZToxMHB4Ij5DbHVzdGVySVAgwrcgaW50ZXJuYWwgZm9yd2FyZGluZyBydWxlPC90ZXh0Pgo8dGV4dCB4PSI0NDYiIHk9Ijk3IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZm9udC1zaXplOjEwcHgiPmludGVybmFsIE5MQiDCtyBpbnRlcm5hbCBUQ1AgaW5ncmVzczwvdGV4dD4KPHJlY3QgeD0iMjQiIHk9IjEyMiIgd2lkdGg9Ijc4OCIgaGVpZ2h0PSI2NiIgcng9IjEyIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQyIiB5PSIxNDQiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwNDc4NTc7IGZvbnQtd2VpZ2h0OjcwMCI+cHJpdmF0ZSByZWFjaCBuZWVkcyBob3N0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb248L3RleHQ+Cjx0ZXh0IHg9IjQyIiB5PSIxNjYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMwNDc4NTc7Zm9udC1zaXplOjEwcHgiPmNsdXN0ZXI6IFNlcnZpY2UgKExCIC8gQ2x1c3RlcklQKSAgIMK3ICAgTUlHOiBmb3J3YXJkaW5nIHJ1bGUgb24gYSByZXNlcnZlZCBJUCAgIMK3ICAgT0NJOiBOTEIgb24gYSByZXNlcnZlZCBJUDwvdGV4dD4KPHRleHQgeD0iNDIiIHk9IjE4MiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzA0Nzg1Nztmb250LXNpemU6MTBweCI+Q29udGFpbmVyIEFwcDogVENQIGluZ3Jlc3MgKGV4dGVybmFsIC8gaW50ZXJuYWwpICAgwrcgICBwcml2YXRlIGVuZHBvaW50cyByZXF1aXJlIGludGVybmFsIHJvdXRpbmcgYW5kIGZpcmV3YWxsIHJ1bGVzPC90ZXh0Pgo8L3N2Zz4=" alt="Public endpoints use public network configuration. Private clients need the appropriate internal endpoint and routing; Kubernetes ClusterIP alone is cluster-local." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjA0IiB2aWV3Qm94PSIwIDAgODM2IDIwNCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQdWJsaWMgZW5kcG9pbnRzIHVzZSBwdWJsaWMgbmV0d29yayBjb25maWd1cmF0aW9uLiBQcml2YXRlIGNsaWVudHMgbmVlZCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJuYWwgZW5kcG9pbnQgYW5kIHJvdXRpbmc7IEt1YmVybmV0ZXMgQ2x1c3RlcklQIGFsb25lIGlzIGNsdXN0ZXItbG9jYWwuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxyZWN0IHg9IjI0IiB5PSIzNCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSI3MiIgcng9IjEyIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQyIiB5PSI1NiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPlBVQkxJQyDCtyBpbnRlcm5ldC1yZWFjaGFibGU8L3RleHQ+Cjx0ZXh0IHg9IjQyIiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZToxMHB4Ij5MQiBTZXJ2aWNlIMK3IGV4dGVybmFsIGZvcndhcmRpbmcgcnVsZTwvdGV4dD4KPHRleHQgeD0iNDIiIHk9Ijk3IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPmV4dGVybmFsIE5MQiDCtyBleHRlcm5hbCBUQ1AgaW5ncmVzczwvdGV4dD4KPHJlY3QgeD0iNDI4IiB5PSIzNCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSI3MiIgcng9IjEyIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+Cjx0ZXh0IHg9IjQ0NiIgeT0iNTYiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4Ij5QUklWQVRFIMK3IHZlcmlmeSBjbGllbnQgcm91dGluZzwvdGV4dD4KPHRleHQgeD0iNDQ2IiB5PSI4MCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZToxMHB4Ij5DbHVzdGVySVAgwrcgaW50ZXJuYWwgZm9yd2FyZGluZyBydWxlPC90ZXh0Pgo8dGV4dCB4PSI0NDYiIHk9Ijk3IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPmludGVybmFsIE5MQiDCtyBpbnRlcm5hbCBUQ1AgaW5ncmVzczwvdGV4dD4KPHJlY3QgeD0iMjQiIHk9IjEyMiIgd2lkdGg9Ijc4OCIgaGVpZ2h0PSI2NiIgcng9IjEyIiBmaWxsPSIjMWEzMTI2IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS42Ii8+Cjx0ZXh0IHg9IjQyIiB5PSIxNDQiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzg7IGZvbnQtd2VpZ2h0OjcwMCI+cHJpdmF0ZSByZWFjaCBuZWVkcyBob3N0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb248L3RleHQ+Cjx0ZXh0IHg9IjQyIiB5PSIxNjYiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4O2ZvbnQtc2l6ZToxMHB4Ij5jbHVzdGVyOiBTZXJ2aWNlIChMQiAvIENsdXN0ZXJJUCkgICDCtyAgIE1JRzogZm9yd2FyZGluZyBydWxlIG9uIGEgcmVzZXJ2ZWQgSVAgICDCtyAgIE9DSTogTkxCIG9uIGEgcmVzZXJ2ZWQgSVA8L3RleHQ+Cjx0ZXh0IHg9IjQyIiB5PSIxODIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjOTBkZWM4O2ZvbnQtc2l6ZToxMHB4Ij5Db250YWluZXIgQXBwOiBUQ1AgaW5ncmVzcyAoZXh0ZXJuYWwgLyBpbnRlcm5hbCkgICDCtyAgIHByaXZhdGUgZW5kcG9pbnRzIHJlcXVpcmUgaW50ZXJuYWwgcm91dGluZyBhbmQgZmlyZXdhbGwgcnVsZXM8L3RleHQ+Cjwvc3ZnPg==" alt="Public endpoints use public network configuration. Private clients need the appropriate internal endpoint and routing; Kubernetes ClusterIP alone is cluster-local." />
</div>

<p className="t9-caption">Choose public or private endpoints for the client network. Kubernetes ClusterIP alone does not provide VPC-wide reachability.</p>

#### Availability and concurrent transfers

The gateway uses a single-instance design to reduce concurrent writes through object-backed mounts. Kubernetes uses `replicas = 1`, the Google group uses `target_size = 1`, and the OCI pool uses `size = 1`. For Container Apps, configure the maximum replica count as well as `min_replicas = 1`. One server can still handle concurrent sessions, so test conflicting uploads and rename behavior; a single instance does not provide filesystem locking.

Recovery replaces the gateway and reconnects it to its backing storage. Active SSH sessions are interrupted, and clients must retry or resume transfers as supported. This is not active-active availability. Size the server for peak connections and throughput, and persist host keys if clients must retain the same server fingerprint after replacement.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTk2IiB2aWV3Qm94PSIwIDAgODM2IDE5NiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgZ2F0ZXdheSB1c2VzIGEgc2luZ2xlLWluc3RhbmNlIGRlc2lnbiBhbmQgcmVwbGFjZW1lbnQgb24gZmFpbHVyZS4gU2Vzc2lvbnMgYXJlIGludGVycnVwdGVkLiBDb25jdXJyZW50IHRyYW5zZmVycyBzdGlsbCBuZWVkIHJldmlldyBmb3IgdGhlIG1vdW50IHNlbWFudGljczsgb25lIGluc3RhbmNlIGRvZXMgbm90IGd1YXJhbnRlZSBzZXJpYWxpemVkIHdyaXRlcy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjE2IiB5PSIzNCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSIxMjAiIHJ4PSIxNCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjY2JkNWUxIiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjMyIiB5PSI1NiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPk9OIEFXUzwvdGV4dD4KPHJlY3QgeD0iMzQiIHk9IjcyIiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjY2IiByeD0iMTAiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjA5IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5tYW5hZ2VkIGZsZWV0PC90ZXh0Pgo8dGV4dCB4PSIyMDkiIHk9IjExOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnNjYWxlZCB0cmFuc3BhcmVudGx5PC90ZXh0Pgo8cmVjdCB4PSI0MjgiIHk9IjM0IiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjEyMCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDQ0IiB5PSI1NiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+T04gVEhFIFRBUkdFVDwvdGV4dD4KPHJlY3QgeD0iNDQ0IiB5PSI3MiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI2NiIgcng9IjEwIiBmaWxsPSIjZWNmZGY1IiBzdHJva2U9IiMwNTk2NjkiIHN0cm9rZS13aWR0aD0iMS43Ii8+Cjx0ZXh0IHg9IjUxOSIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA3MDAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDQ3ODU3OyBmb250LXNpemU6MTJweCI+b25lIGluc3RhbmNlPC90ZXh0Pgo8dGV4dCB4PSI1MTkiIHk9IjExOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA0Nzg1NyI+Y29uY3VycmVudCBzZXNzaW9uczwvdGV4dD4KPGxpbmUgeDE9IjU5NCIgeTE9IjEwNSIgeDI9IjYyOCIgeTI9IjEwNSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjEuOCIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBtYXJrZXItZW5kPSJ1cmwoI3RmczEwKSIvPgo8dGV4dCB4PSI2MTEiIHk9Ijk3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjhweCI+aGVhbDwvdGV4dD4KPHJlY3QgeD0iNjMyIiB5PSI3MiIgd2lkdGg9IjE3MiIgaGVpZ2h0PSI2NiIgcng9IjEwIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNmZGU2OGEiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjcxOCIgeT0iOTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTFweCI+cmVjcmVhdGUgb24gZmFpbHVyZTwvdGV4dD4KPHRleHQgeD0iNzE4IiB5PSIxMTUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiOyBmaWxsOiNiNDUzMDk7Zm9udC1zaXplOjEwcHgiPnNhbWUgYmFja2luZyBzdG9yYWdlPC90ZXh0Pgo8dGV4dCB4PSI3MTgiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6I2I0NTMwOTtmb250LXNpemU6MTBweCI+bm90IGFjdGl2ZS1hY3RpdmU8L3RleHQ+CjxyZWN0IHg9IjE2IiB5PSIxNjYiIHdpZHRoPSI4MDQiIGhlaWdodD0iMjQiIHJ4PSI3IiBmaWxsPSIjZmZmYmViIiBzdHJva2U9IiNmZGU2OGEiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjQxOCIgeT0iMTgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNiNDUzMDk7IGZvbnQtc2l6ZToxMHB4Ij5zaW5nbGUgaW5zdGFuY2U7IHZlcmlmeSBjb25jdXJyZW50IHVwbG9hZHMgYW5kIG1vdW50IHNlbWFudGljczwvdGV4dD4KPC9zdmc+" alt="The gateway uses a single-instance design and replacement on failure. Sessions are interrupted. Concurrent transfers still need review for the mount semantics; one instance does not guarantee serialized writes." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTk2IiB2aWV3Qm94PSIwIDAgODM2IDE5NiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgZ2F0ZXdheSB1c2VzIGEgc2luZ2xlLWluc3RhbmNlIGRlc2lnbiBhbmQgcmVwbGFjZW1lbnQgb24gZmFpbHVyZS4gU2Vzc2lvbnMgYXJlIGludGVycnVwdGVkLiBDb25jdXJyZW50IHRyYW5zZmVycyBzdGlsbCBuZWVkIHJldmlldyBmb3IgdGhlIG1vdW50IHNlbWFudGljczsgb25lIGluc3RhbmNlIGRvZXMgbm90IGd1YXJhbnRlZSBzZXJpYWxpemVkIHdyaXRlcy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0idGZzMTAiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYuNSIgbWFya2VySGVpZ2h0PSI2LjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48L2RlZnM+CjxyZWN0IHg9IjE2IiB5PSIzNCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSIxMjAiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjMyIiB5PSI1NiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjgiPk9OIEFXUzwvdGV4dD4KPHJlY3QgeD0iMzQiIHk9IjcyIiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjY2IiByeD0iMTAiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjA5IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5tYW5hZ2VkIGZsZWV0PC90ZXh0Pgo8dGV4dCB4PSIyMDkiIHk9IjExOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnNjYWxlZCB0cmFuc3BhcmVudGx5PC90ZXh0Pgo8cmVjdCB4PSI0MjgiIHk9IjM0IiB3aWR0aD0iMzkyIiBoZWlnaHQ9IjEyMCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDQ0IiB5PSI1NiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICM5MGRlYzgiPk9OIFRIRSBUQVJHRVQ8L3RleHQ+CjxyZWN0IHg9IjQ0NCIgeT0iNzIiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjYiIHJ4PSIxMCIgZmlsbD0iIzFhMzEyNiIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8dGV4dCB4PSI1MTkiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNzAwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzkwZGVjODsgZm9udC1zaXplOjEycHgiPm9uZSBpbnN0YW5jZTwvdGV4dD4KPHRleHQgeD0iNTE5IiB5PSIxMTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMC41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzgiPmNvbmN1cnJlbnQgc2Vzc2lvbnM8L3RleHQ+CjxsaW5lIHgxPSI1OTQiIHkxPSIxMDUiIHgyPSI2MjgiIHkyPSIxMDUiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIxLjgiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgbWFya2VyLWVuZD0idXJsKCN0ZnMxMCkiLz4KPHRleHQgeD0iNjExIiB5PSI5NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4cHgiPmhlYWw8L3RleHQ+CjxyZWN0IHg9IjYzMiIgeT0iNzIiIHdpZHRoPSIxNzIiIGhlaWdodD0iNjYiIHJ4PSIxMCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjNjY1ZDNkIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI3MTgiIHk9Ijk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExcHgiPnJlY3JlYXRlIG9uIGZhaWx1cmU8L3RleHQ+Cjx0ZXh0IHg9IjcxOCIgeT0iMTE1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MDtmb250LXNpemU6MTBweCI+c2FtZSBiYWNraW5nIHN0b3JhZ2U8L3RleHQ+Cjx0ZXh0IHg9IjcxOCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MDtmb250LXNpemU6MTBweCI+bm90IGFjdGl2ZS1hY3RpdmU8L3RleHQ+CjxyZWN0IHg9IjE2IiB5PSIxNjYiIHdpZHRoPSI4MDQiIGhlaWdodD0iMjQiIHJ4PSI3IiBmaWxsPSIjMzEyZDFhIiBzdHJva2U9IiM2NjVkM2QiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjQxOCIgeT0iMTgzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNkZWIyOTA7IGZvbnQtc2l6ZToxMHB4Ij5zaW5nbGUgaW5zdGFuY2U7IHZlcmlmeSBjb25jdXJyZW50IHVwbG9hZHMgYW5kIG1vdW50IHNlbWFudGljczwvdGV4dD4KPC9zdmc+" alt="The gateway uses a single-instance design and replacement on failure. Sessions are interrupted. Concurrent transfers still need review for the mount semantics; one instance does not guarantee serialized writes." />
</div>

<p className="t9-caption">Recovery restarts a single gateway against its storage and interrupts SSH sessions. Size the gateway for peak load.</p>

#### Limitations

Review protocol support, identity-provider limits, storage semantics, private reachability and gateway operation before migration.

△ Where AWS Transfer Family and a self-hosted SFTP gateway diverge

* **User updates need restart.** Update the `SFTP_USERS` and SSH-key configuration and restart the gateway; there is no Transfer user-management API.
* **Unsupported protocols and identity providers.** FTPS, FTP, `AWS_LAMBDA` and `API_GATEWAY` identity providers return build errors. The target supports SFTP with its configured user directory.
* **Security and logging are operational responsibilities.** Configure sshd policy and image updates in place of `security_policy_name`. Collect gateway stdout through the target environment's logging in place of `logging_role` and CloudWatch.

#### Other considerations

Before cutover, transfer bucket data through the backing-store migration, or provision the separate Azure Files share where applicable. Active SFTP sessions do not transfer. Configure persistent server host keys if clients must keep the same fingerprint across gateway restarts.

Assign responsibility for gateway updates, capacity, user changes and log collection. Configure backup, versioning and retention on the actual backing store. A restart can preserve completed files without preserving an in-flight upload.

[Service Catalog](/service-adapters/catalog).
