Log inStart free
← Blog
networking

Private networking with .internal

Every Aloof account gets a private network where apps reach each other as .internal. How it works, how it's isolated, and its current limits.

Most backends are several processes: a web frontend, an API, a worker and a database. They should talk privately, without a public hop and without hard-coded IPs. On Aloof every app, worker and managed database of an account joins that account's private network, and each is reachable by name:

http://api.internal:8080           # another app
http://api-worker.internal:9090    # a process group's metrics port
postgres://...@pg-mydb:5432/...    # injected as DATABASE_URL

How it works

Each account has its own bridge network on the host. When an instance starts, it's attached with two DNS aliases, <app> and <app>.internal, resolved by the network's embedded DNS. All instances of an app share the alias, so the name keeps working across redeploys and scaling. One-off machines (release commands and cron jobs) join the same network, so a migration can reach your database and a cron job can call your API.

Isolation

Networks are per account, so another account's containers have no route to yours and can't resolve your names. Our integration test checks exactly this on a real Docker host: an app in account A fetches from another app in A by .internal name, and the same request from account B fails. Public traffic only reaches an app through the edge proxy on its HTTP port. Other ports you open are private.

Reaching private ports from your laptop

$ aloof proxy 5432 -a reports-db
proxying 127.0.0.1:5432 -> reports-db:5432 (Ctrl-C to stop)

aloof proxy tunnels TCP over an authenticated WebSocket to the instance's private address. Use it for psql, admin UIs and debugging. Sessions are audited.

Current limits

Try it

Free tier, hard-capped at $1 of usage. No card needed.

More posts