Skip to content

SSH Workspace

The projects you run locally have to ship somewhere. PortBay gives you a real SSH client for the servers on the other end, so you don't keep a second app open just to reach them. Save a connection once and open a workspace for it:

  • an interactive terminal — a real PTY on the host, not a command builder;
  • an SFTP file browser with an inline code editor: open a remote file, edit it, and save with ⌘S straight back over SFTP;
  • port-forward tunnels you start and stop with a click;
  • snapshot, processes, and listening-ports panels read straight off the host;
  • a saved deploy step list and a one-look health probe with latency and host-key trust.
PortBay's SSH workspace — terminal, SFTP file browser, and tunnels for a remote hostPortBay's SSH workspace — terminal, SFTP file browser, and tunnels for a remote host

Tunnels are one part of that workspace. An SSH tunnel pulls a remote service onto your machine — the inverse of Cloudflare Tunnels, which share a local project outward to the public internet. Reach for a tunnel when a service should stay private on a remote network but you need to inspect it locally:

WorkflowExample
Vibe coder / indie VPSForward Postgres or MySQL from a Hetzner, DigitalOcean, cPanel, or shared-hosting SSH account to 127.0.0.1.
Senior / DevOps developerSave a bastion profile for staging or production and keep the exact equivalent ssh command visible for auditability.
LLM / ML researcherRe-point a saved Jupyter, TensorBoard, Ray, MLflow, or vLLM tunnel to the current Slurm compute node while keeping the login or bastion leg.
Cloud VM userUse the same SSH config entries and keys you already use for AWS EC2, Google Compute Engine, Azure VMs, OCI, Fly, Render, or other Linux hosts.
Enterprise access userUse the Host alias generated by Teleport, Boundary, Cloudflare Access, AWS SSM Session Manager, VPN/ZTNA tooling, or your internal platform team.

Provider Support

PortBay is provider-agnostic. The key-auth path uses system OpenSSH, so it inherits the user's existing ~/.ssh/config, IdentityFile, Host aliases, ProxyJump, ProxyCommand, agent, cloud-managed keys, certificates, and known-host behavior.

That means there is no separate PortBay-specific provider adapter for AWS, GCP, Azure, DigitalOcean, Hetzner, cPanel, academic clusters, or private Linux servers. If ssh host-alias works in Terminal, PortBay can use the same host alias and layer tunnel management on top.

Provider / environmentPortBay strategy
AWS EC2Use the same Linux SSH username, key pair, EC2 Instance Connect-generated key, or Host alias you already use with OpenSSH.
Google Compute EngineUse gcloud compute ssh --dry-run output or a Host alias created from it; PortBay then uses that alias like any other SSH target.
Azure Linux VMsUse the VM username, public IP/DNS, key, and port from Azure's SSH instructions or a saved Host alias.
DigitalOcean / Hetzner / Linode / Vultr / generic VPSUse the server IP or DNS name, Linux username, key path, and optional nonstandard SSH port.
cPanel / Plesk / shared hostingUse the panel-created/imported SSH key and account username; remote paths are often under the account home directory, public_html, httpdocs, or the provider's chrooted site root.
Academic / enterprise HPCSave the login node or bastion as the SSH host / ProxyJump; re-point the remote host to the current compute node when a new job is allocated.
TeleportRun tsh config, append or reference the generated OpenSSH config, then use the resulting Host alias in PortBay.
HashiCorp BoundaryConfigure the documented OpenSSH ProxyCommand host entry that invokes boundary connect, then use that target alias.
Cloudflare Access / Zero TrustUse WARP/private-network hostnames directly, Access for Infrastructure SSH clients, or the documented cloudflared access ssh ProxyCommand host entry.
AWS SSM Session Manager SSHPut AWS's aws ssm start-session ProxyCommand entry in ~/.ssh/config, then use the EC2 instance ID / host alias as PortBay's SSH host.
Tailscale / ZeroTier / VPN / private DNSUse the MagicDNS/private hostname or normal SSH Host alias once the client network is connected.

Cloud CLIs still matter. Some providers mint short-lived keys or generate provider-specific SSH config. Let those CLIs write or print the OpenSSH configuration, then use the resulting Host alias in PortBay.

Host Alias Workflow

Host aliases are the production integration point for complex SSH environments. They let PortBay avoid storing provider-specific scripts, tokens, or shell fragments while still supporting the full OpenSSH surface.

Use this pattern for:

  • Teleport, Boundary, Cloudflare Access, AWS SSM, corporate bastions, and any provider that requires ProxyCommand.
  • Certificate-based SSH, short-lived identities, hardware-backed keys, and agent-driven auth.
  • Remote-SSH editors, rsync, scp, and Git deploys that must use the same SSH route as the tunnel.

In PortBay, set SSH host to the alias, for example teleport-prod or i-0123456789abcdef0. Leave User blank when the alias already defines User; otherwise fill it normally. Password auth is the exception: it uses the internal password path and therefore needs an explicit SSH user.

PortBay also generates a small Host portbay-* block for direct key, port, and ProxyJump profiles. Add that block to ~/.ssh/config when VS Code, Cursor, rsync, or scp need the same non-default transport settings.

Forward Types

TypeCommand shapeUse it for
Local forwardssh -N -L 127.0.0.1:15432:db.internal:5432 user@bastionRemote databases, admin dashboards, private APIs. Included in the community tier.
Reverse forwardssh -N -R 8080:127.0.0.1:3000 user@vpsWebhook testing through a VPS or remote callback endpoint. Pro profile feature.
SOCKS proxyssh -N -D 127.0.0.1:1080 user@hostBrowser or tool traffic through a remote network. Pro profile feature.

Single-hop and one ProxyJump bastion are included for the core remote database workflow. Comma-separated multi-hop chains, keep-alive, and auto-reconnect are Pro profile features.

Security Model

PortBay stores saved tunnel profile coordinates in the registry: hostnames, ports, usernames, forward type, jump host, and optional key path. It does not store private key material in the registry.

Password auth is stored through the OS keychain under PortBay SSH and is used only for the pure-Rust password path. Key auth stays on system OpenSSH so your agent, cloud keys, hardware-backed keys, and ~/.ssh/config keep working.

Host-key handling follows OpenSSH trust-on-first-use for system SSH (StrictHostKeyChecking=accept-new) and rejects changed keys. Do not work around host-key failures with StrictHostKeyChecking=no; fix the stale known_hosts entry only after verifying the server really changed.

Remote DB Handoff

After a local forward is live, click Open DB client. PortBay registers a database instance pointed at 127.0.0.1:<local_port> and opens the existing DB client flow. The database commands do not need to know whether the port belongs to a local daemon or an SSH tunnel.

Remote Files, Uploads, and Git Deploys

The workspace's SFTP browser has an inline editor for quick changes — open a remote file, edit it, and save with ⌘S over SFTP. For heavier or repeatable work, PortBay does not try to reimplement full remote-development tooling; it generates the exact commands for the tools that already understand every SSH edge case:

TaskRecommended handoff
Browse/edit remote filesFor direct profiles with a non-default port, key, jump host, or keep-alive, copy PortBay's SSH config host block first; for enterprise ProxyCommand products, use the provider-generated Host alias directly. Then copy the VS Code or Cursor Remote-SSH command.
Upload changed filesCopy the generated rsync -az --progress -e "ssh ..." command. rsync is repeatable and transfers changed files efficiently.
One-off upload fallbackCopy the generated scp -r command when rsync is unavailable on the local machine.
Git-based deployCopy the remote git pull --ff-only command when the server checks out the app from Git. This updates the remote checkout without copying uncommitted local files.

Do not mix strategies blindly. Use rsync for direct file deploys, or Git on the server for repository deploys. If both are used against the same directory, keep clear ownership rules so generated files, user uploads, and uncommitted changes are not overwritten.

ML Cluster Notes

For Slurm-style clusters, save the login node or bastion in the SSH host / ProxyJump fields and put the current compute node in Remote host. When a new job lands on a different node, use Edit / re-point, change only the remote host, and save the profile.

This keeps the tunnel lifecycle separate from the job lifecycle: the job can keep running on the cluster while PortBay restarts or re-points the laptop-side tunnel.

What the SSH workspace does not do

The workspace is not a VPN replacement, cloud GPU provisioning, or Slurm job submission. It gives you an interactive terminal and an inline SFTP editor for quick work, but for heavy remote development it hands off to the right tool rather than replacing it — PortBay generates the Remote-SSH, rsync, scp, and remote Git commands instead of reimplementing them.

References

PortBay is pre-MVP software. Use the docs as an operating guide, not a stability guarantee.