quarkus.http.proxy.proxy-address-forwarding=true
quarkus.http.proxy.trusted-proxies=10.0.0.1
All configuration properties are under the quarkus.tus prefix.
Build Time Properties
Build time properties are fixed at application build and cannot be changed at runtime.
| Property | Type | Default | Description |
|---|---|---|---|
|
|
|
Whether SSE (Server-Sent Events) endpoints and beans are registered. When disabled, the |
|
|
|
Whether the authentication filter is registered. When enabled, all TUS endpoints (except OPTIONS) require an authenticated user principal. |
|
|
|
Whether the per-client token-bucket throttle is registered. Applies to POST and PATCH only. See Rate Limiting Behind a Proxy before enabling it behind a reverse proxy. |
|
|
|
Whether the |
|
|
|
Path prefix used when building |
|
Note
|
Authorization is per upload. When quarkus.tus.auth-enabled is true, the principal that created an upload is recorded, and HEAD, PATCH, DELETE and concatenation requests from any other principal are answered with 404 Not Found. Uploads created while auth was disabled have no recorded owner and stay accessible to everyone.
|
Runtime Properties
Runtime properties can be overridden at startup via application.properties, environment variables, or system properties.
| Property | Type | Default | Description |
|---|---|---|---|
|
|
|
TUS protocol version reported in |
|
|
|
Maximum upload size in bytes. Reported in the |
|
|
|
Comma-separated list of active TUS protocol extensions. Reported in the |
|
|
|
Hours after creation at which an upload expires, reported in |
|
|
|
Hours without activity after which an incomplete upload is removed by the stale-upload scheduler (runs hourly), independently of its expiry deadline; activity is any committed chunk. |
|
|
|
Comma-separated list of supported checksum algorithms. Reported in the |
|
|
|
Directory where the default local file store writes upload data. Created automatically if it does not exist. The default lives under |
|
|
|
Maximum chunk size per PATCH request in bytes. Enforced on both PATCH uploads and creation-with-upload POST requests. Requests exceeding this limit receive a 413 response. Raising it above 10 MB also requires raising Quarkus’s own body limit, |
|
|
|
Seconds of inactivity after which an upload’s lock is considered abandoned and may be reclaimed. The lock is held for the whole of a chunk transfer and refreshed as bytes arrive, so this only bounds a holder that died or stalled; set it above the longest pause a healthy client may make mid-chunk. A holder whose lock was reclaimed is fenced: anything it still writes, commits or rolls back is refused, so a stalled request that wakes up cannot damage what the reclaimer stored. |
|
|
|
Seconds a held-open SSE events stream may outlive its upload’s completion before the server closes it anyway. Only affects uploads for which |
|
|
|
Maximum number of partial uploads a single |
|
|
|
Sustained request rate allowed per client, for POST and PATCH only. |
|
|
|
Number of requests a client may make back-to-back before the sustained rate applies. |
Extensions and Your Store
quarkus.tus.extensions is a promise made to clients on behalf of whatever UploadStore is installed, and the extension does not check the two against each other at boot. With the bundled local file store every extension works. With a custom store, drop any extension the store cannot honour, because a client that reads it from Tus-Extension will rely on it:
| Extension | What it needs from the store |
|---|---|
|
|
|
A working |
|
|
|
Nothing beyond the base contract; every store gets these from the framework. |
Checksum Trailers
The checksum-trailer extension lets a client send Upload-Checksum as an HTTP trailer, after the
body, instead of as a header — useful for clients that stream a large chunk and cannot compute its
hash before sending it.
It is not supported and deliberately not advertised, because reading HTTP request trailers
requires eclipse-vertx/vert.x#5253, which Vert.x
does not yet ship. Clients should send Upload-Checksum as a request header, which is fully
supported.
The implementation exists on the checksum-trailer branch, which builds against a patched
vertx-core; it will be merged once the upstream change is released.
Rate Limiting Behind a Proxy
Rate limiting is off by default; enable it with quarkus.tus.rate-limit-enabled=true (build time). Clients are identified by the authenticated principal when there is one, and otherwise by the peer address of the connection.
Forwarding headers such as X-Forwarded-For are not trusted by default, because anyone can set them: a client that varied the value per request would get a fresh burst allowance every time and defeat the limiter entirely.
If the application runs behind a reverse proxy, tell Quarkus to resolve the forwarded address, and restrict which peers may do so:
Quarkus verifies the immediate peer is a trusted proxy before rewriting the request’s remote address, and the throttle then applies per forwarded client.
|
Warning
|
Without proxy-address-forwarding, every request arriving through a proxy carries the proxy’s address, so all clients share a single bucket and throttle each other. Enable it whenever a proxy sits in front of the application.
|
Environment Variable Mapping
Quarkus maps configuration properties to environment variables using the standard convention. Replace dots with underscores and convert to uppercase:
export QUARKUS_TUS_MAX_SIZE=1073741824
export QUARKUS_TUS_STORE_LOCAL_UPLOAD_DIR=/var/uploads
export QUARKUS_TUS_EXPIRATION_HOURS=48
Example Configuration
# Limit uploads to 1 GB
quarkus.tus.max-size=1073741824
# Store uploads in a dedicated directory
quarkus.tus.store.local.upload-dir=/var/data/uploads
# Remove uploads, finished or not, 12 hours after creation
quarkus.tus.expiration-hours=12
# Only support creation and termination extensions
quarkus.tus.extensions=creation,termination
# Disable SSE progress endpoints
quarkus.tus.sse-enabled=false
# Enable authentication
quarkus.tus.auth-enabled=true