Reverse Proxy Configuration
When hosting Trailarr behind a reverse proxy (like Nginx, Apache, Caddy, Traefik, etc.), certain configurations are necessary to ensure that the application functions correctly. This includes proper routing of requests and handling of headers.
There are two common scenarios for reverse proxy setups:
https://trailarr.mydomain.com/(Sub-domain)https://mydomain.com/trailarr/(Sub-directory)
Sub-domain Reverse Proxy Configuration
When hosting the application behind a reverse proxy in a sub-domain (e.g., https://trailarr.mydomain.com/), the following configurations can be used as examples.
These are example configurations for common reverse proxies, adjust them as needed for your specific setup.
No special configuration is needed in Trailarr for sub-domain setups, but ensure that your reverse proxy forwards the necessary headers.
Sub-directory Reverse Proxy Configuration
When hosting the application behind a reverse proxy in a sub-directory (e.g., https://mydomain.com/trailarr/), additional configuration is required to ensure proper routing and resource loading.
URL Base Setting
- Make sure to set the
URL Basein the General Settings of the application to match the sub-directory path used in the reverse proxy. For example, if your application is accessible athttps://mydomain.com/trailarr/, set theURL Baseto/trailarr.
Example Configurations
Warning
Remember to replace these with actual values:
http://192.168.1.231:7889-> Trailarr internal IP and porttrailarr.mydomain.com-> Your Sub-Domain/trailarr/-> Your Sub-Directory path -> set the same forURL Basesetting in Trailarr
Recommended headers
The following headers preserve information about the original request that would otherwise be lost when the proxy forwards it:
| Header | Purpose |
|---|---|
X-Forwarded-For |
Original client IP address — added automatically by most proxies |
X-Forwarded-Proto |
Original protocol (http or https) |
X-Forwarded-Host |
Original host name (mysuperapp.com) |
X-Forwarded-Prefix |
Sub-directory prefix (/trailarr) — required for correct frontend routing in sub-directory setups |
Nginx
server {
server_name trailarr.mydomain.com;
location / {
proxy_pass http://192.168.1.231:7889;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
}
}
server {
server_name mydomain.com;
location /trailarr/ {
proxy_pass http://192.168.1.231:7889;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Prefix /trailarr;
}
}
Apache
<VirtualHost *:80>
ServerName mydomain.com
ProxyPreserveHost On
ProxyPass "/trailarr/" "http://192.168.1.231:7889/"
ProxyPassReverse "/trailarr/" "http://192.168.1.231:7889/"
RequestHeader set X-Forwarded-Proto "%{REQUEST_SCHEME}s"
RequestHeader set X-Forwarded-Host "%{HTTP_HOST}s"
RequestHeader set X-Forwarded-Prefix "/trailarr"
</VirtualHost>
Caddy
Traefik
http:
routers:
trailarr:
rule: "PathPrefix(`/trailarr`)"
service: trailarr-service
middlewares:
- strip-trailarr
- trailarr-headers
services:
trailarr-service:
loadBalancer:
servers:
- url: "http://192.168.1.231:7889"
middlewares:
strip-trailarr:
stripPrefix:
prefixes:
- "/trailarr"
trailarr-headers:
headers:
customRequestHeaders:
X-Forwarded-Prefix: "/trailarr"
Additional Notes
- Forward the
X-Forwarded-Prefixheader from reverse proxy to Trailarr. Recommended — ensures the correct frontend is served when accessed through the proxy. - Restart Trailarr and reverse proxy to apply the new configuration.
- After setting
URL Baseand restarting, Trailarr is accessible at both the local URL (http://your-ip:7889/) and the sub-directory URL (https://mydomain.com/trailarr/). -
You may need to clear your browser cache or perform a hard refresh to load the resources correctly.
Tip
Ctrl + Shift + Ito open Developer Tools -> right-click theRefreshbutton -> selectEmpty Cache and Hard Reload -
If you encounter any issues, and want to revert back to root-only access, find the
.envfile inconfig/folder and remove the value set forURL_BASE, then restart the application.
Success
If you are using a different reverse proxy, and successfully configured it to work with Trailarr in a sub-directory, please consider sharing your configuration by opening a new issue or a pull request on our GitHub repository and we will update the documentation accordingly.
How It Works
When URL Base is set and Trailarr restarts, it does the following:
- Keeps the root
index.htmlwith<base href="/">so the app remains accessible at the local IP and port (http://your-ip:7889/). - Creates a
/{url_base}/subfolder inside the frontend build directory containing a separateindex.htmlpatched with<base href="/{url_base}/">. This makes the app also accessible athttp://your-ip:7889/{url_base}/and via the reverse proxy sub-directory URL. - Registers a middleware that strips the
/{url_base}prefix from API, WebSocket, and other server-side requests arriving without a reverse proxy (i.e., direct local access athttp://your-ip:7889/{url_base}/api/...), so they are routed correctly without any proxy stripping needed. - Reads the
X-Forwarded-Prefixheader (sent by the reverse proxy) to decide whichindex.htmlto serve when the proxy strips the prefix before forwarding — ensuring Angular loads with the correct base path.
Both access methods work simultaneously after a single restart — no trade-off between local and proxied access.