Snakeway v0.11.1
Maintenance release to fix incorrect bind address in the systemd unit and add better config values.
Maintenance release to fix incorrect bind address in the systemd unit and add better config values.
Maintenance release to iron-out various issues with packaging targets (Docker image, rpm, deb).
Arc<str>modeThe tls block inside bind and bind_admin now requires an explicit mode field.
Before (v0.8.0):
bind = {
tls = {
cert = "/path/to/certs/server.pem"
key = "/path/to/certs/server.key"
}
}
After (v0.9.0):
bind = {
tls = {
mode = "manual"
cert = "/path/to/certs/server.pem"
key = "/path/to/certs/server.key"
}
}
Set mode = "manual" to preserve the existing behavior. The new "acme" mode enables automatic certificate issuance
and renewal.
hosts fieldService routes and static file routes now require a hosts list. This enables virtual hosting — multiple domains can
be served from a single Snakeway instance.
Before (v0.8.0):
routes = [
{ path = "/api" }
]
After (v0.9.0):
routes = [
{
hosts = ["example.com"]
path = "/api"
}
]
Use ["*"] to match all hostnames and preserve previous behavior when upgrading:
routes = [
{
hosts = ["*"]
path = "/api"
}
]
Snakeway now supports automatic TLS certificate issuance and renewal via the ACME protocol (Let's Encrypt).
Configure tls_automation in snakeway.hcl:
server {
tls_automation = {
renew_within_days = 30
acme = {
directory_url = "https://acme-v02.api.letsencrypt.org/directory"
data_dir = "/var/lib/snakeway/acme"
contact_email = ["[email protected]"]
}
cert_store = {
type = "filesystem"
cert_dir = "/var/lib/snakeway/acme/certs"
}
}
}
Then set mode = "acme" on any bind block you want managed automatically:
bind = {
tls = {
mode = "acme"
domains = ["example.com", "api.example.com"]
challenge = "http01"
}
}
Certificates are renewed automatically in the background. No restart or reload is required.
See the TLS Cert Management guide for full details.
Routes now accept a hosts list, allowing a single Snakeway instance to serve multiple domains. Incoming requests are
matched against the Host header before path matching is applied.
See the Routes reference for full details.
Upstream connections can now be made over TLS. Configure this per endpoint:
endpoint = {
host = "backend.internal"
port = 8443
tls = {
sni = "backend.internal"
verify = true
// ca_file = "/path/to/ca.pem" // optional; falls back to server.ca_file
}
}
See the Upstream TLS reference for the full field reference.
route solve CLI CommandDebug routing decisions without starting the proxy. The command runs the same config loading, lowering, and routing logic used by the live proxy:
snakeway route solve http://example.com/api/v1/users --config /etc/snakeway
Supports --trace, --verbose, --format=json, and deterministic upstream selection via --lb-index / --lb-key.
See route solve for full documentation.
See the Server Block reference for more details.
config init TemplatesYou can now generate a fully structured configuration directory using built-in templates:
snakeway config init ./my-proxy --template=httpbin
Available templates:
minimal -- Barebones starting pointhttpbin -- Working reverse proxy exampledev -- Full-featured development setupGenerated structure:
my-proxy/ ├── device.d/ ├── ingress.d/ └── snakeway.hcl
This makes onboarding easier and removes guesswork when starting a new deployment.
config dump and config checkBoth commands now support consistent output formats using --format:
snakeway config check /etc/snakeway --format=json
snakeway config dump /etc/snakeway --format=hcl --repr=runtime
Supported formats:
hcljsonyamlYou can inspect either:
--repr=spec (your configuration files)--repr=runtime (internal resolved state)This improves automation, CI validation, and debugging workflows.
The include section has been standardized.
Old:
include {
devices = "devices.d/*.hcl"
ingress = "ingress.d/*.hcl"
}
New:
include {
devices = "device.d/*.hcl"
ingresses = "ingress.d/*.hcl"
}
Changes:
devices.d/ → device.d/ingress → ingressesIf upgrading, update both your snakeway.hcl and directory names.
The Identity device now exposes two configurable limits:
identity_device = {
max_x_forwarded_for_length = 1024
max_user_agent_length = 2048
}
These were previously hard-coded. Both are range validated and applied during parsing, improving safety against oversized or malicious headers.
Runtime logging is now controlled via environment variables:
RUST_LOGSNAKEWAY_LOG_DIRTOKIO_CONSOLEStructured observability remains available via the
structured_logging_device.
Spec and
Config typesInternal CLI modules moved from cli::conf to cli::config.
User-facing commands remain unchanged.
Snakeway now uses an internal HCL serializer that:
Many configuration fields now use:
#[serde(skip_serializing_if = "Option::is_none")]
This keeps generated configurations clean and avoids emitting default values unnecessarily.
Header mutation APIs are now gated behind the wasm feature.
They are only available when WASM support is enabled.
rust-embedEmbedded config templates have been removed.
Templates are now generated programmatically at runtime, reducing binary
size and improving clarity.
If upgrading:
In snakeway.hcl:
devices.d/ → device.d/include block to use ingressesIn your Identity device config file:
max_x_forwarded_for_lengthmax_user_agent_lengthNew built-in Network Policy device (L7 allow/deny by client identity)
network_policy_device to enforce CIDR-based allow/deny decisions at the HTTP layer.New built-in Request Rate Limiting device (L7)
request_rate_limiting_device to cap request volume per client over a rolling time window.Listener-level connection controls
bind block, so you can enforce them before requests even reach
routing/devices.WASM tooling renamed and clarified
Docs overhaul focused on “how to operate Snakeway”
/configuration/devices/*.Config scaffolding and templates
snakeway config init uses embedded templates to generate a starter config directory (useful for first-run setup
and repeatable environments).Config dump improvements
snakeway config dump supports emitting both “spec” (as-written config) and “runtime” (lowered internal
representation) to help debug what Snakeway actually loaded.Routing and service spec ergonomics
Dependency upgrades that matter to operators
Tests and fixtures refreshed
If you are upgrading from v0.5.4:
bind configuration (connection
filter / connection rate limiting).devices.d/.