Skip to main content
This example uses Nginx installed on the same host as the Docker Compose deployment. The Kaneo container is available only at 127.0.0.1:5173. You need a domain pointing at the server and a valid TLS certificate. The paths below assume a certificate for kaneo.example.com already exists. Obtain one with your certificate manager before enabling the HTTPS server block.

Configure one public origin

Set this in Kaneo’s .env:
Leave KANEO_API_URL unset for the bundled image. It serves the web app and /api through the same public origin.

Trust the proxy chain

Configure TRUSTED_PROXIES for this host-Nginx setup before serving traffic. Requests pass through host Nginx, Docker’s published port, and the bundled Nginx before reaching the API. The API trusts loopback by default, but the bundled Nginx also appends its Docker-side peer address. Without trusting that hop, visitors can share the gateway address in session records and IP-based rate limits. Find the gateway for the Kaneo container’s network:
On a standard Linux Docker bridge, the host proxy reaches the container through that gateway. If the output shows 172.19.0.1, add this to .env, replacing the example address with your actual gateway:
Keep loopback in the list because the bundled Nginx connects to the API locally. Trust only the gateway or proxy addresses you control, not every private network. If Docker uses a different network mode or forwarding layer, confirm the peer address in the bundled Nginx access logs and trust that specific hop instead. Recheck this setting if you recreate the Docker network. Apply the setting:

Configure Nginx

Save this in your Nginx site’s configuration. The map belongs in the http context, outside the server blocks; on a standard Debian or Ubuntu installation, sites-enabled is included there.
The upgrade headers follow Nginx’s WebSocket guidance. They allow live task updates through the proxy. Disabling response buffering also lets streaming MCP responses arrive promptly. Enable the site using your distribution’s normal procedure, then validate and reload:

Check the public URL

Sign in and open a project in two browser sessions. Change a task in one and confirm the other receives the update without a refresh.

Other network layouts

If Nginx runs in another container, 127.0.0.1 refers to that proxy container. Put it on the same Docker network as Kaneo and use http://kaneo:5173 as the upstream. Configure TRUSTED_PROXIES for this different proxy chain so client addresses remain correct. Trust only the proxy addresses or a dedicated proxy subnet. If you deliberately host the API and web app separately, set their public URLs explicitly and configure allowed origins. The one-domain setup above does not require exposing port 1337. For uploads, give Silo its own HTTPS hostname pointing to its S3 API.