Routing and Domains
Configure same-origin API routing, root-domain admin tools, and optional API subdomains across Traefik, Caddy, and Nginx.
Last updated
remoteEaze works best when the browser-facing app and the normal browser API traffic stay on the same root domain.
Recommended topology
| URL | Target |
|---|---|
https://remote-eaze.example.com/ | Web app |
https://remote-eaze.example.com/api/* | API |
https://remote-eaze.example.com/admin/redis | API |
https://remote-eaze.example.com/admin/queues | API |
https://api.remote-eaze.example.com/health | API |
https://api.remote-eaze.example.com/health/live | API |
https://api.remote-eaze.example.com/documentation | API |
Why the admin dashboards are better on the root domain
The browser app uses same-origin auth and /api routing by default. In practice, that means:
- root-domain
/apiis the normal browser API path - root-domain
/admin/redisand/admin/queuesreuse the same browser host and login context more smoothly api.<host>is ideal for direct health checks and Swagger docs
Important rule: do not strip these paths
The backend already expects these exact paths:
/api/admin/redis/admin/queues/documentation/health/health/live
If your proxy strips or rewrites those prefixes unexpectedly, the API will receive the wrong path and routing will fail.
Traefik example
Traefik is the currently tested reverse-proxy reference.
The important routing idea is:
| Match | Target |
|---|---|
Host(remote-eaze.example.com) && PathPrefix(/api) | API |
Host(remote-eaze.example.com) && PathPrefix(/admin/redis) | API |
Host(remote-eaze.example.com) && PathPrefix(/admin/queues) | API |
Host(remote-eaze.example.com) | Web |
Host(api.remote-eaze.example.com) | API |
Dokploy domain/path values
If you configure domains through Dokploy’s UI, use:
| Service | Host | Path | Internal Path | Strip Path | Port |
|---|---|---|---|---|---|
web | remote-eaze.example.com | / | / | Off | 8080 |
api | remote-eaze.example.com | /api | / | Off | 3000 |
api | remote-eaze.example.com | /admin/redis | / | Off | 3000 |
api | remote-eaze.example.com | /admin/queues | / | Off | 3000 |
api | api.remote-eaze.example.com | / | / | Off | 3000 |
Caddy example
This example shows the important path rules without extra deployment boilerplate:
remote-eaze.example.com {
handle /api/* {
reverse_proxy api:3000
}
handle /admin/redis* {
reverse_proxy api:3000
}
handle /admin/queues* {
reverse_proxy api:3000
}
handle {
root * /srv/remote-eaze-web
try_files {path} /index.html
file_server
}
}
api.remote-eaze.example.com {
reverse_proxy api:3000
}Reference:
Nginx example
This example focuses on preserving the incoming path:
server {
server_name remote-eaze.example.com;
root /srv/remote-eaze-web;
index index.html;
location /api/ {
proxy_pass http://api:3000;
}
location /admin/redis {
proxy_pass http://api:3000;
}
location /admin/queues {
proxy_pass http://api:3000;
}
location / {
try_files $uri $uri/ /index.html;
}
}
server {
server_name api.remote-eaze.example.com;
location / {
proxy_pass http://api:3000;
}
}Key idea:
proxy_pass http://api:3000;preserves the original request URI when used this way
Health and Swagger access
If you expose the optional API hostname, you get clean operational URLs:
https://api.remote-eaze.example.com/healthhttps://api.remote-eaze.example.com/health/livehttps://api.remote-eaze.example.com/documentation
Redis dashboard and Bull Board access
These routes are protected for logged-in system administrators:
/admin/redis/admin/queues
If those routes send you to a browser-facing 404 page instead of the dashboard, the root cause is usually that the request is hitting the web app instead of the API service.
Next step
Continue with Post-Deploy Bootstrap.
PM2 and Manual Runtime
Run the API and worker without compose-managed infrastructure, using your own Postgres, Redis, reverse proxy, and process manager.
Post-Deploy Bootstrap
Run the required seeds after deployment, and use the reset workflow only when you intentionally want to wipe and reseed an environment.