## The problem

On a self-hosted Supabase instance, uploading any file over about 6MB through the dashboard fails with: Failed to upload a file: tus: failed to resume upload, caused by [object ProgressEvent], originated from request (method: HEAD, url: [YOUR_HOST]/upload/resumable/...). Small uploads work. The browser console shows HEAD [YOUR_HOST]/upload/resumable/... net::ERR_CONNECTION_REFUSED, with the port missing from the URL. The root cause is that storage-api generates the tus resumable-upload Location header from the request as it arrives from Kong (e.g. [host:8000]/upload/resumable/...), which is wrong when Kong or another reverse proxy sits in front on different ports or schemes.

## What works

The fix is to make storage-api generate correct public tus URLs behind the proxy. In docker-compose.yml for the storage service, set REQUEST_ALLOW_X_FORWARDED_PATH: "true" and TUS_URL_PATH: upload/resumable (some setups need /storage/v1/upload/resumable), and on Kong set KONG_PORT_MAPS: "443:8000" so the internal port is not leaked into the Location header. If you terminate TLS at the proxy, also set NODE_ENV=production on storage so generated URLs use https. Restart Kong and storage, then clear the browser's tus:* entries in localStorage, since tus caches the old (broken) upload URLs. Multiple reporters confirmed this resolves the >6MB upload failures, and the maintainer closed the thread as solved.

Source: https://github.com/supabase/storage/issues/538