Proxy
Kamal uses kamal-proxy to provide gapless deployments. It runs on ports 80 and 443 and forwards requests to the application container.
The proxy is configured in the root configuration under proxy
. These are
options that are set when deploying the application, not when booting the proxy.
They are application-specific, so they are not shared when multiple applications run on the same proxy.
The proxy is enabled by default on the primary role but can be disabled by
setting proxy: false
.
It is disabled by default on all other roles but can be enabled by setting
proxy: true
or providing a proxy configuration.
proxy:
Hosts
The hosts that will be used to serve the app. The proxy will only route requests to this host to your app.
If no hosts are set, then all requests will be forwarded, except for matching requests for other apps deployed on that server that do have a host set.
Specify one of host
or hosts
.
host: foo.example.com
hosts:
- foo.example.com
- bar.example.com
App port
The port the application container is exposed on.
Defaults to 80:
app_port: 3000
SSL
kamal-proxy can provide automatic HTTPS for your application via Let’s Encrypt.
This requires that we are deploying to one server and the host option is set. The host value must point to the server we are deploying to, and port 443 must be open for the Let’s Encrypt challenge to succeed.
If you set ssl
to true
, kamal-proxy
will stop forwarding headers to your app,
unless you explicitly set forward_headers: true
Defaults to false
:
ssl: true
Forward headers
Whether to forward the X-Forwarded-For
and X-Forwarded-Proto
headers.
If you are behind a trusted proxy, you can set this to true
to forward the headers.
By default, kamal-proxy will not forward the headers if the ssl
option is set to true
, and
will forward them if it is set to false
.
forward_headers: true
Response timeout
How long to wait for requests to complete before timing out, defaults to 30 seconds:
response_timeout: 10
Healthcheck
When deploying, the proxy will by default hit /up
once every second until we hit
the deploy timeout, with a 5-second timeout for each request.
Once the app is up, the proxy will stop hitting the healthcheck endpoint.
healthcheck:
interval: 3
path: /health
timeout: 3
Buffering
Whether to buffer request and response bodies in the proxy.
By default, buffering is enabled with a max request body size of 1GB and no limit for response size.
You can also set the memory limit for buffering, which defaults to 1MB; anything larger than that is written to disk.
buffering:
requests: true
responses: true
max_request_body: 40_000_000
max_response_body: 0
memory: 2_000_000
Logging
Configure request logging for the proxy.
You can specify request and response headers to log.
By default, Cache-Control
, Last-Modified
, and User-Agent
request headers are logged:
logging:
request_headers:
- Cache-Control
- X-Forwarded-Proto
response_headers:
- X-Request-ID
- X-Request-Start