Load-balanced Endpoints
A load-balanced endpoint is one stable HTTPS URL backed by local ports on two or more devices. The endpoint’s URL, access policy, firewall rules, and traffic limits live in the Uplink dashboard. Each device contributes only a local port.
This is a managed Uplink feature. It is useful when an app already runs on several machines and you want simple availability or capacity without configuring a public reverse proxy, DNS, or TLS on those machines.
visitor ──▶ endpoint policy ──▶ ready backend ──▶ encrypted tunnel ──▶ local port
Create and attach
- Open Load Balance in the dashboard.
- Create an endpoint with a name and location. Its HTTPS URL is reserved even before a backend connects.
- Configure access, firewall rules, and optional endpoint-wide traffic limits.
- On every device that runs the app, attach that device’s local port:
uplink managed list
uplink managed attach <url> 8080
The ports do not need to be the same on every device. Repeat the attach command on each machine; the dashboard shows every logical device-and-port backend and its current state.
To stop sending new work to one device and remove its attachment:
uplink managed detach <url>
Detaching first marks the backend as draining. The edge stops selecting it for new requests while already-open request streams finish, then the local attachment is removed. Deleting or disabling the endpoint itself is managed in the dashboard.
Routing and readiness
The connector checks whether its local TCP port accepts connections every three seconds, with a 400 ms timeout. A backend becomes ready after one successful check, becomes unhealthy after two consecutive failures, and recovers after one success. This is TCP readiness, not an HTTP health-path check.
For each new request, the edge chooses the ready backend with the fewest active
streams and rotates ties. WebSocket and server-sent-event connections stay on the
backend selected when the connection began. If no backend is ready, the durable URL
returns 503 Service Unavailable.
The edge may select one different backend only when opening the first tunnel stream fails before it begins writing the OpenSession envelope. It never replays a request that may have reached an app. There are no general HTTP retries.
Current scope
The first version deliberately has no weights, session affinity, HTTP health checks, cross-location pool, or autoscaling control. All backends share one endpoint policy and one location. Uplink provides the durable ingress and a small readiness-aware pool; your process manager or deployment system remains responsible for starting, updating, and replacing the app instances.