UPVALE / GUIDES
Routes and traffic
Connect domains, enable HTTPS, rewrite paths, protect applications, and customize Traefik.
On this page
An application route sends an HTTP request to a container. It connects a public hostname and path to the application's internal port. Traefik runs on your selected ingress nodes and handles that routing, HTTPS, and any configured middleware.
For a normal website, select ingress nodes once, add a domain and target port to the application, and enable an automatic certificate. Use the advanced options when the application needs path changes, traffic restrictions, or custom proxy behavior.
Set up cluster ingress
- Open Fleet → cluster → Ingress & TLS.
- Select one or more Ingress nodes. These nodes receive public HTTP traffic.
- For automatic HTTPS, add an ACME account email.
- Select Use Let's Encrypt production for browser-trusted certificates. Leave it unchecked only for testing.
- Select Save and apply and wait for the operation to finish.
- Allow TCP
80and443to the selected ingress nodes, directly or through your load balancer.
One node can serve traffic directly. With several nodes, point each domain to a selected node or put your own load balancer or floating IP in front of the pool. Selecting nodes does not provision a load balancer at your hosting provider.
Every ingress setting
| Setting | What it does |
|---|---|
| Ingress nodes | Servers where Traefik accepts public traffic. Select eligible joined nodes; a node without a public IP needs a reachable load balancer or other forwarding. |
| ACME account email | Enables the built-in automatic certificate flow for routes that choose it. |
| Use Let's Encrypt production | Uses the production certificate service. Test certificates are not trusted by browsers. |
| Load balancer / floating public IPs | Additional public addresses expected to serve cluster routes. Selected nodes' public addresses are already included. This records the addresses; it does not create the load balancer. |
| Trusted HTTP proxies | IPs or CIDRs of proxies allowed to supply the visitor's real address, such as your load balancer or CDN. Leave blank for direct traffic. |
| Custom entrypoints → Name | A unique name for an additional TCP listener that routes can select. |
| Custom entrypoints → Port | The port exposed for that listener. Open it in your provider firewall when needed. |
Only trust the actual proxies in front of your ingress. Trusting arbitrary clients lets them spoof visitor addresses used by IP rules and rate limits. When trusted-proxy routing expects a client address but it is missing, IP protection rejects the request.
The page shows ingress health, certificate mode, and any reported error. Redeploy ingress restarts Traefik while application containers continue running. Static configuration changes require that restart; do it during a suitable window because incoming requests can be interrupted.
Add your first route
- Open the application and its Application tab.
- In Routes, select Add route.
- Enter Hostname, such as
app.example.com, withouthttps://or a URL path. - Keep Public path at
/for the whole site. - Enter Target port, the port the application listens on inside the container, such as
3000. - Choose Automatic certificate and Let's Encrypt if cluster automatic HTTPS is configured.
- Save the application, then deploy the saved revision.
- At your DNS provider, point the hostname to the ingress node or load-balancer address.
- Check the saved route's DNS and certificate badges, then use Open route.
The application's process must listen on a container-reachable interface, usually 0.0.0.0, not only on 127.0.0.1.
sslip.io can generate a hostname for a known ingress address when you want to test before configuring your own domain. If there are several addresses, choose the one that should receive traffic.
Route fields
Simple view shows the common fields. Full view reveals path rewriting, middleware, and redirect controls. Switching views hides controls; it does not discard their values.
| Field | What it does |
|---|---|
| Hostname | Domain matched by the incoming request. |
| Public path | URL prefix matched on that hostname. / matches the whole host. /api matches requests beginning with /api. |
| Target port | Internal container port receiving the request. This is not the public listener port. |
| TLS mode → HTTP only | Serves plain HTTP and does not request a certificate. |
| TLS mode → Automatic certificate | Uses the built-in certificate service or a named custom resolver. |
| TLS mode → Existing uploaded certificate | Uses a certificate from Traefik files matching the requested hostname. |
| Certificate provider → Let's Encrypt | Uses the cluster's built-in automatic certificate configuration. |
| Certificate provider → Custom resolver | Uses a certificate resolver you configured in traefik.yml. Enter its exact name. |
| Custom entrypoint | Chooses one of the cluster's additional listeners. Blank uses the normal HTTP/HTTPS listeners on ports 80/443. |
| Internal path | Replaces the matched public prefix before forwarding, preserving the remaining suffix. Unavailable while stripping is enabled. |
| Middlewares | Comma-separated middleware names, in execution order. They must already exist, for example compress@file. |
| Strip public path before forwarding | Removes the matched public prefix. Clears the internal-path setting. |
| Redirect HTTP after the certificate is verified | Turns HTTP requests into HTTPS redirects after the certificate becomes usable. Only applies to a TLS route. |
A public path is a prefix match, not an exact-match route. If you need more complex matching rules, use a manual Traefik configuration.
Path examples
Assume the incoming URL is https://example.com/api/users:
| Public path | Advanced setting | Path sent to the app |
|---|---|---|
/api | No path change | /api/users |
/api | Strip public path | /users |
/api | Internal path /backend | /backend/users |
Use stripping when the app serves / but visitors should use a prefix. Use an internal path when the app expects a different prefix. The app may also need its own base-URL setting so that links, redirects, and static assets use the public path.
DNS and certificates
Built-in automatic HTTPS uses HTTP-01 validation. The domain must resolve to a configured ingress address and its port 80 must reach the cluster's ingress. Certificates are synchronized across the selected ingress nodes.
After saving a route, its status row shows DNS and certificate progress. Recheck DNS checks updated DNS records. Retry certificate retries issuance or verification after you fix a reported problem.
In Full view → DNS & certificate details, inspect resolved addresses, last DNS check, certificate issuer and expiry, last certificate check, last synchronization, and the next scheduled check.
A certificate marked active is different from merely having automatic TLS selected. The redirect option waits for verification so HTTP does not immediately send visitors to an unready HTTPS endpoint.
Use an existing certificate
- Open Cluster → Traefik.
- Upload the certificate chain and matching private key, for example under
certs/. - Create a file directly inside
dynamic/, such asdynamic/custom-tls.yml, referring to their mounted paths:
tls:
certificates:
- certFile: /etc/traefik/certs/example-fullchain.pem
keyFile: /etc/traefik/certs/example-key.pem
- Save the file and wait for synchronization.
- In the application's route, choose Existing uploaded certificate, save, and deploy.
- Check that the certificate becomes active and matches the hostname.
The certificate must cover the hostname, be valid, and have a matching key. Selecting an existing certificate does not enroll it in automatic renewal; replace it before it expires.
Use a custom resolver
Configure the resolver under certificatesResolvers in traefik.yml, supply the credentials and files required by that resolver, and redeploy ingress. Then select Custom resolver on the route and enter that resolver's name. Merely typing a name in the route does not create it.
Use a custom resolver only when you need certificate behavior outside the built-in flow. A typical public application can use the built-in Let's Encrypt setting.
Protect an application
The application's Security tab provides traffic controls without editing YAML. Save your changes, then deploy the new revision to apply them.
These controls require Upvale's default generated routing. If you manually edited the application's Traefik file, restore defaults before relying on the Security tab to change its routing.
Rate limiting
Enable Limit requests per visitor IP to reject excess requests with HTTP 429.
| Field | Meaning |
|---|---|
| Average requests | Requests allowed per period. |
| Period (seconds) | The interval used for that average. For example, 100 requests over 60 seconds. |
| Burst capacity | Extra capacity for short spikes rather than a perfectly even request rate. |
Limits are enforced by Traefik instances; this is not an organization-wide request quota shared across all ingress nodes. Configure trusted proxies correctly if traffic arrives through a CDN or load balancer.
Request size
Enable Limit request body size and set Maximum request body in KiB, MiB, or GiB. Requests over the limit receive HTTP 413. Disable this control for streaming uploads that should not be buffered by the proxy.
IP access policy
Enable Apply IP access rules, then select:
- Open with blocklist to accept traffic except from blocked addresses.
- Allowlist only to accept only listed addresses or ranges.
Enter individual IPs or CIDRs under Allowed IPs and ranges and Blocked IPs and ranges. Blocked ranges take priority. Keep your own client address in an allowlist if you still need to reach the site.
Security headers
Enable Security headers to add the selected response headers. They override matching headers returned by the application.
| Option | Effect |
|---|---|
| Referrer policy | Uses strict-origin-when-cross-origin: full referrer information for same-origin requests and only the origin for cross-origin requests where permitted. |
| Prevent content-type sniffing | Adds X-Content-Type-Options: nosniff, telling browsers to use the declared content type. |
| Frame embedding → Application managed | Leaves frame-embedding behavior to the application. |
| Allow same origin only | Allows the site to be framed only by pages on the same origin. |
| Deny all frame embedding | Prevents the site from appearing in an iframe. |
| Require future HTTPS connections (HSTS) | Tells browsers to use HTTPS for later visits. Enable only after HTTPS works. Does not include subdomains or request preload. |
| HSTS max age (seconds) | How long the browser remembers that requirement. 0 clears the cached policy when received. |
Add a custom middleware
A middleware changes or checks a request before it reaches the application, or modifies the response on the way back. Examples include compression, authentication, headers, and redirects.
To add compression:
- Open Cluster → Traefik.
- Create
dynamic/custom-middlewares.yml. - Add and save:
http:
middlewares:
compress:
compress: {}
- Open the application's Routes, switch to Full view, and set Middlewares to
compress@file. - Save and deploy the application.
The @file suffix refers to Traefik's file provider. Multiple names are comma-separated and run in the order entered. A reference to a nonexistent middleware does not create it.
Use the built-in Security tab for the common protections above. Custom middleware is useful for behavior those fields do not expose.
Edit Traefik files
The cluster Traefik tab manages files synchronized to the ingress nodes under /etc/traefik.
| Control | What it does |
|---|---|
| New file | Creates a text file in the selected folder. |
| New folder | Creates a folder for configuration or supporting assets. |
| Upload | Adds a file; replacing a file saves the previous content as a revision. |
| Rename or move | Changes a file or folder path. Update any configuration references that use the old path. |
| Delete | Removes the selected file or folder. Removing a routing file can stop its routes. |
| Download | Saves a copy of the selected file. |
| Validate & save | Checks the supported format and YAML syntax, saves a revision, and queues synchronization. |
| Revision history → Roll back | Restores a previous nondeleted revision and synchronizes it. |
| Refresh | Reloads the current file list and state. |
Files directly in dynamic/ reload automatically after synchronization. Supporting files such as certificates can live elsewhere. Edit traefik.yml for static configuration, then use Ingress & TLS → Redeploy ingress to restart with it.
Validation checks the accepted format and syntax. It is not a complete test that your upstream exists, a hostname resolves, or every Traefik option will produce the intended behavior. Check ingress health and your route after changes.
Generated and manually managed application files
The application's Traefik tab opens its routing file. Upvale creates it on the first deployment.
While it is generated, application route and Security settings update it. Saving a manual edit makes it manually managed, so later route settings do not overwrite your custom file.
Select Restore defaults to regenerate routing from the application's managed settings. This replaces custom content and queues a normal deployment. Use file revision history when you want to restore a previous manual revision instead.
Choose one editing approach for an application at a time. If a saved route or security option seems to have no effect, check whether its Traefik file is manually managed.
Compose routes
Compose services can have managed public routes while keeping their declared service networks. During Compose setup, map the HTTP service and choose the network Traefik should use to reach it. The application route still has a hostname, target port, and TLS settings.
Make changes owned by Compose through the project's Compose workflow so the preview and applied configuration remain consistent. See Managed Compose.
Common problems
| Symptom | Check |
|---|---|
| DNS failed | Domain records point at the selected ingress node or declared load-balancer/floating IP. Recheck after DNS changes. |
| HTTP 502/504 | Container is running, target port is correct, process listens beyond localhost, and Traefik can reach its network. |
| HTTPS is not browser-trusted | Production certificate mode, hostname coverage, certificate expiry, and whether you used a test certificate. |
| HTTP does not redirect yet | Certificate status must be active and the redirect option enabled. |
| A rewritten page has broken assets | App base URL and path settings agree with the public route and path rewrite. |
| IP rules see a proxy address | Trusted HTTP proxy settings match the actual proxy source addresses. |
| Security changes do not take effect | Deploy the saved revision and check whether the application routing file is manually managed. |
| New static Traefik settings do not apply | Redeploy ingress after saving traefik.yml. |