Skip to content
Hoody.com

SSH gives you command-line access to a container. It is optional: hoody-terminal opens a shell in the browser with no SSH configuration at all.


SSH configuration is part of container creation and updates:

Alternative access:


SSH is not required to reach a container. The two paths differ in setup, session lifetime, and which local tools can attach.

FeatureSSHhoody-terminal
SetupGenerate keys, configure clientVisit the URL
AccessDesktop and mobile SSH clientsAny web browser
SessionCloses when you disconnectPersists when you leave
Background processesNeed screen or tmuxRun directly, session maintained
PerformanceSSH protocolHTTP/2 (faster)
File transferSFTP, rsync, scphoody-files HTTP API
Use casesVS Code Remote, SFTP, local toolsQuick access, mobile, no setup

You can also run the Hoody CLI itself over SSH, with nothing installed and nothing running on your machine. See Run the Hoody CLI over SSH below.


SSH uses the same address as every other service on your container. Only the protocol differs.

Terminal window
ssh -i ~/.ssh/key root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com

This is the address to use. It is the same {projectId}-{containerId}-{service}.{serverName}.containers.hoody.com shape you already use for terminal, files, and the rest, so once you can build one service URL you can build this one. The only difference from the others is that ssh carries no instance number: a container has exactly one SSH endpoint, so there is no -1 to append.

Terminal window
ssh -i ~/.ssh/key root@ssh.{serverName}.containers.hoody.com

One hostname covers every container on a server. The proxy reads your public key from the SSH handshake and routes on that alone, so this name carries no project or container identifier and an observer at the endpoint cannot tell which container a connection is for.

It works, and it is useful when you want the connection string itself to reveal nothing. But it is not the address to build on: its shape is not guaranteed to stay as it is, while the container hostname follows the same rule as every other service and will not move. Prefer the container hostname in scripts, config files, and anything you hand to someone else.

Routing is by public key either way. Whichever name you use, you land in the container that owns the key.


Your SSH Client
ssh -i ~/.ssh/key root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com
Hoody SSH proxy (the hostname is not what selects the container)
├─ Reads public key from SSH handshake
├─ Matches key to container (one-to-one mapping)
└─ Routes connection to that specific container
Container with matching public key

Each container needs its own public key.


Terminal window
# Generate key (ed25519 recommended)
ssh-keygen -t ed25519 -f ~/.ssh/hoody-container-1 -C "container-1" -N ""
# View public key
cat ~/.ssh/hoody-container-1.pub
# Copy the entire line starting with "ssh-ed25519..."

Set ssh_public_key when you create the container:

Terminal window
# Create container with SSH key
hoody containers create --project $PROJECT_ID \
--server-id $SERVER_ID \
--name "dev-container" \
--dev-kit \
--ssh-public-key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMx... container-1"

To change it later, PATCH the container’s ssh_public_key. The key rotates immediately; the container does not need a stop and start.


Through the container’s own hostname:

Terminal window
ssh -i ~/.ssh/hoody-container-1 root@{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com

Or through the shared endpoint, where the SSH proxy picks the container from your public key:

Terminal window
ssh -i ~/.ssh/hoody-container-1 root@ssh.us-west-1.containers.hoody.com
Terminal window
# Container hostname
ssh -i ~/.ssh/hoody-container-1 root@{projectId}-{containerId}-ssh.us-west-1.containers.hoody.com
# Or the shared endpoint
ssh -i ~/.ssh/hoody-container-1 root@ssh.us-west-1.containers.hoody.com

~/.ssh/config:

Host dev-container
HostName {projectId}-{containerId}-ssh.us-west-1.containers.hoody.com
User root
IdentityFile ~/.ssh/hoody-container-1

Then: ssh dev-container


Every SSH connection also serves SFTP, with the same key and the same routing, so any SFTP client works.

  1. File → Site Manager → New Site
  2. Protocol: SFTP - SSH File Transfer Protocol
  3. Host: {projectId}-{containerId}-ssh.us-west-1.containers.hoody.com (replace with your ids and server)
  4. Port: 22
  5. Logon Type: Key file
  6. User: root
  7. Key file: Browse to ~/.ssh/hoody-container-1 (private key)
  8. Connect

Other SFTP clients:

  • Cyberduck: New Connection → SFTP → Server: ssh.$serverName.containers.hoody.com → Private Key: (browse)
  • WinSCP: New Site → SFTP → Host: ssh.$serverName.containers.hoody.com → Advanced → Private key file
  • Command-line: sftp -i ~/.ssh/hoody-container-1 root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com

You don’t need to install anything to drive Hoody from a terminal. SSH into the gateway with a token as the username and you land in the Hoody CLI, running remotely in a locked-down sandbox and already signed in:

Terminal window
ssh -tt hdy_xxxxxxxx@hoody.com
  • Your token (hdy_…) is the SSH username. There is no password and no key.
  • -tt requests the interactive terminal the gateway needs; you can then run commands right away (hoody servers list, hoody containers create …).
  • gateway.hoody.com works too. Both names reach the same gateway.
  • The gateway is a free, best-effort service, so responsiveness can vary with distance and load.

This opens the Hoody CLI, not a shell inside one of your containers. The two are different destinations: hoody.com reaches the CLI gateway, while a container shell comes from ssh.$serverName.containers.hoody.com or the container’s own hostname, as described above.


Terminal window
# Correct: one key per container
ssh-keygen -t ed25519 -f ~/.ssh/hoody-container-1
ssh-keygen -t ed25519 -f ~/.ssh/hoody-container-2
# Wrong: reusing the same key breaks routing
Terminal window
# Modern, secure, fast
ssh-keygen -t ed25519 -f ~/.ssh/hoody-container-1
# Legacy (use only if ed25519 not supported)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/hoody-container-1
~/.ssh/config
Host dev
HostName {projectId}-{containerId}-ssh.us-west-1.containers.hoody.com
User root
IdentityFile ~/.ssh/hoody-container-1
Host prod
HostName {projectId}-{containerId}-ssh.us-west-1.containers.hoody.com
User root
IdentityFile ~/.ssh/hoody-container-2

Now connect with ssh dev or ssh prod. Same hostname, different keys: the SSH proxy routes by public key.

Terminal window
# Ensure correct permissions
chmod 600 ~/.ssh/hoody-container-*
# Never share private keys
# Never commit to version control
# Store securely (password manager, encrypted disk)

Don’t configure SSH just for occasional commands; save the setup for when you need SFTP, VS Code Remote, or rsync. Open the terminal URL instead:

https://{project}-{container}-terminal-1.{server}.containers.hoody.com

Can I SSH to a container without configuring keys?

Section titled “Can I SSH to a container without configuring keys?”

No. The proxy authenticates by public key only. You don’t need SSH at all, though: the hoody-terminal web interface needs no key and no client.

That state cannot be reached: the API rejects a key that already belongs to another container with a conflict error, so every key maps to exactly one container. Generate a fresh key per container.

Do I need SSH if I only use hoody-terminal?

Section titled “Do I need SSH if I only use hoody-terminal?”

No. If you only reach containers through a browser, SSH keys are not required.

Yes. From container A, ssh -i /path/to/key root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com reaches container B, selected by the key you present.

Can the terminal SSH out to a non-Hoody server?

Section titled “Can the terminal SSH out to a non-Hoody server?”

Yes. hoody-terminal acts as an HTTP-to-SSH bridge. Add ssh_host and ssh_user parameters to any terminal URL or execute request, and the container opens the SSH connection for you. You need no SSH client on your device. See the callout at the top of this page, or Terminals: SSH to Remote Servers for full details.

Does SSH work with containers in “block” network mode?

Section titled “Does SSH work with containers in “block” network mode?”

Yes. SSH into a container is inbound traffic, and block mode stops outbound traffic only. The SSH bridge is the exception: the terminal connecting out to a remote server needs outbound access.

Can an in-container VPN lock me out of SSH?

Section titled “Can an in-container VPN lock me out of SSH?”

No. The host brokers SSH through the container runtime, so there is no routing lookup and no in-container firewall between you and your shell. It keeps working with a tunnel up, kill switch and all, which makes SSH the recovery path when a VPN has taken your published URLs dark. See VPN Inside a Container.

root by default. Containers run as the root user.

Can I disable SSH and only use hoody-terminal?

Section titled “Can I disable SSH and only use hoody-terminal?”

Yes. SSH configuration is optional: create the container without ssh_public_key and only the hoody-terminal URL is available. Sending ssh_public_key: null to clear an already-assigned key is not applied by the API today, so retire a key by rotating it to one you control instead.

Does FileZilla support both SFTP and hoody-files?

Section titled “Does FileZilla support both SFTP and hoody-files?”

No. FileZilla speaks SFTP over the SSH protocol only. For hoody-files, which is HTTP-based, use a browser.


Problem: ssh returns “Connection refused”

Solutions:

  1. Verify container is running: GET /api/v1/containers/{id} → check "status": "running"
  2. Test SSH proxy connectivity: telnet ssh.$serverName.containers.hoody.com 22
  3. Check key permissions: chmod 600 ~/.ssh/hoody-container-1

Problem: “Permission denied (publickey)”

Solutions:

  1. Verify correct key: cat ~/.ssh/hoody-container-1.pub matches container’s ssh_public_key
  2. Check key format: Must start with ssh-ed25519, ssh-rsa, or ecdsa-sha2-nistp*
  3. Use verbose logging: ssh -v -i ~/.ssh/hoody-container-1 root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com

Problem: SSH sometimes connects to wrong container

Cause: Duplicate public keys across containers

Solution: Generate unique keys for each container, update via API

Problem: FileZilla says “No supported authentication methods available”

Solutions:

  1. Import key first: FileZilla → Edit → Settings → Connection → SFTP → Add key file
  2. Use Interactive logon: Logon Type: Interactive (FileZilla uses imported key automatically)
  3. On macOS: Use Cmd+Shift+G → Type ~/.ssh when browsing for key

Step 1: Generate a new key locally:

Terminal window
ssh-keygen -t ed25519 -f ~/.ssh/hoody-container-new -N ""

Step 2: Update the key (works while the container is running):

Terminal window
# Update SSH public key
hoody containers update $CONTAINER_ID \
--ssh-public-key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... (new key)"

Step 3: Test with the new key:

Terminal window
ssh -i ~/.ssh/hoody-container-new root@{projectId}-{containerId}-ssh.{serverName}.containers.hoody.com

Complete your networking setup:

Alternative access methods: