Uplink Docs
Troubleshooting & FAQ
Documentation

Troubleshooting & FAQ

Troubleshooting

CLI and desktop disagree

They share one uplink-core state, so a mismatch usually means a stale agent. Inspect it without starting it:

uplink agent status

Check the state directory, socket path, log path, sidecar path, protocol version, and live snapshot.

Empty reply on a local dev server

Some dev servers (e.g. Astro) bind only IPv6 loopback by default while the connector dials IPv4 loopback. Bind your upstream explicitly to 127.0.0.1.

A self-hosted edge misbehaves

From the self-host deployment directory, inspect Compose and run the built-in diagnostics:

docker compose ps
docker compose logs --tail=100 uplink-edge caddy certificate-renewal
docker compose run --rm operator doctor --domain <edge-host>
docker compose run --rm operator --output=json doctor --domain <edge-host>

doctor validates DNS, TLS, configured providers, and the edge health endpoint. The published operator service also reads the host’s memory and UDP-buffer values through three narrow, read-only procfs mounts. It cannot inspect host or cloud firewall rules from inside a container, so its firewall warning is a prompt to verify 80/tcp, 443/tcp, 443/udp, and 4100/udp manually. Supply the edge server’s public IP to make the DNS comparison explicit, or disable local public-IP detection:

docker compose run --rm operator doctor \
  --domain <edge-host> --no-public-ip-detect
docker compose run --rm operator doctor \
  --domain <edge-host> --public-ip <edge-server-ip>

For a custom-domain failure, leave alias DNS unchanged and confirm that the edge loaded configuration/aliases.yaml before changing records.

A private route denies everyone on a self-hosted edge

Account-based access (owning-account membership and share) needs an identity provider with visitor SSO. Key-only self-hosted edges support public and bearer access, allowed IPs, base request limits, and firewall rules, but not account identity. Use a bearer token there instead.

Bot protection is rejected on an edge

The edge must have a configured challenge provider before it can enforce a service-level managed_challenge or firewall challenge action. Configure both UPLINK_CHALLENGE_PROVIDER_URL and UPLINK_CHALLENGE_PROVIDER_TOKEN on the edge, then record that provider with uplink edge add --challenge-provider or refresh an existing entry with uplink edge refresh. Otherwise turn bot protection off or choose a provider-capable edge. Other firewall actions remain available.

A bearer-token route keeps prompting

Bearer-token browser unlocks use the up_bearer grant, which is separate from account session cookies. Re-entering the token issues a fresh grant.

A response dies mid-transfer with “transfer closed with outstanding read data”

The edge forwards Transfer-Encoding: chunked bodies but deliberately rejects two optional parts of the chunked grammar: chunk extensions and HTTP trailers. Forwarding framing the edge doesn’t itself validate is a request-smuggling primitive, and trailers would bypass the header sanitizing every response goes through, so an origin response that uses either is cut off at the offending byte. Plain chunked responses (no extensions, terminated with a bare 0\r\n\r\n) pass through unchanged. This means protocols that depend on trailers — notably gRPC over HTTP/1.1 — can’t be served through a tunnel; gRPC-Web, WebSockets, SSE, and ordinary HTTP APIs are unaffected.

FAQ

Is the control plane on the request path? No. Visitors hit the edge, and the edge forwards over the connector tunnel to your app. The control plane issues identity and managed capabilities, distributes managed policy, and receives metadata, but it never proxies visitor traffic.

Can I self-host without logging in? Yes. The guided Compose setup mints an edge API key; add the edge on each connector machine with that key. No Uplink account is required. See Self-Hosting.

Can I use my own domain? Yes. On a managed edge, add and verify it in the dashboard, then assign it with the publish picker or custom_domain in uplink.yaml. On a standalone key-mode edge, the operator maps it to the generated host in the edge’s YAML alias policy and owns its DNS. See Custom Domains.

What’s private by default? uplink serve <port> and any service without public: true are private and identity-gated at the edge. Every verified member of the owning personal or organization account gets access, plus any invited emails or valid bearer-token holders. Account identity needs a managed edge; a standalone edge requires an explicit bearer token or public access and rejects an unsupported identity-only route before publishing.

Do edge metrics include request bodies? No. Edge metering is metadata-only; headers and bodies never leave the request path.

Search across 15 pages.
↑↓ navigate openEsc close