Changelog
[Unreleased]
Section titled “[Unreleased]”- Automatic certificates (ADR-0020): routes with
tls: autowhose hosts no configured certificate covers get a certificate from Let’s Encrypt (oracme.ca) through HTTP-01, answered on every plain-HTTP listener before routing. One certificate per name, or one per route withtls.domains; each with a new ECDSA P-256 key; stored in$RDOCK_DATA_DIR/acme(mode 0600, atomic writes, a lock against a second process) and served without a reload; renewed when a third of the lifetime is left; failures retried with backoff from 1 minute to 24 hours.tlsserveris ordered when the CA offers it.acme.ca_roottrusts an internal CA’s endpoint. Names public CAs do not certify (localhost,.internal, private addresses …) are reported instead of ordered. Tested end to end against Pebble. - TLS-ALPN-01 (RFC 8737): certificates can also be validated on a TLS listener, without a plain-HTTP port. A handshake offering only
acme-tls/1gets the validation certificate for its name and is closed without HTTP; no validation certificate is ever served otherwise.acme.challengessets the order of preference, and after a failure the next attempt starts with the next challenge type. - Configuration for automatic HTTPS (ADR-0020):
acme: falseturns automatic certificates off;acme.dns_providernames a default DNS provider for every route; DNS providersexec(a program run without a shell) andwebhook(JSON to anhttps://endpoint) next tocloudflare, which gainszone_id;observability.alerts.webhookfor certificate alerts. Webhooks must usehttps://(plainhttp://only for localhost), exec commands must be absolute paths, and tokens should be${file:…}references. Public IP-address hosts are flagged unlessacme.profile: shortlived, and DNS-01 for an IP address is refused. Issuance itself arrives with the following v0.3 changes; until thenrdock runstill refusesacmesettings and webhooks with “planned for v0.3”.
Changed
Section titled “Changed”tls: autoroutes now get certificates. In v0.2 a route asking for automatic HTTPS without a matching certificate was refused (“planned for v0.3”); now ReverseDock orders one from Let’s Encrypt production, which accepts its terms of service. Setacme: falseto keep v0.2’s behaviour, oracme: { staging: true }to try it first.ca: buypassis refused: Buypass stopped issuing certificates on 2025-10-16.
[0.2.0-alpha.1] — v0.2 “Docker-native”
Section titled “[0.2.0-alpha.1] — v0.2 “Docker-native””- Extra configuration files (
providers.file.paths): files or patterns such asconf.d/*.yaml(relative to the main file) add routes, services, middlewares, TCP objects and certificates to the main file. A name defined twice is an error naming both files; other sections belong in the main file. They are watched like the main file, and a file added next to a pattern is loaded without a restart.rdock validatereads them too. rdock migrate traefik(F-MGMT-03): turns the Traefik labels of a Compose file, or a Traefik dynamic configuration, into routes, services and middlewares forrdock.yaml, through the same translator as the Docker provider. What cannot be migrated is listed at the top of the output.--expose-by-defaultfollows Traefik’s default for services withouttraefik.enable.- Zero-config mode (B-CFG-11):
rdock runwith no configuration file (none given and none at/etc/rdock/rdock.yaml) and a Docker socket at/var/run/docker.sockserves labelled containers over HTTP on:80; the admin listener keeps its default. Without the socket it exits with a hint. HTTPS joins it in v0.3. - The Docker provider (
providers.docker, ADR-0018): routes, services and middlewares from container labels, nativerdock.*and a Traefik v3 subset (64 conformance fixtures intests/conformance/traefik-labels). Containers are opt-in; replicas share a service; unhealthy containers leave the pool. A container Docker is stopping leaves its pool as soon as Docker signals it (thekillevent), so new requests go to the other replicas while its open requests finish. Changes apply within about a second of the Docker event; if the Docker socket is lost, the last routes stay in service and the provider reconnects. Unix sockets andtcp://socket proxies;rdock statusshows the provider’s state. Thedockercargo feature (on by default) builds it. - The public website and documentation in
apps/website(Astro + Starlight, ADR-0017): a landing page and 69 pages of guides, install and migration guides (from Traefik and NGINX), concepts, operations and reference. The configuration and CLI reference are generated from the schema and the binary; every complete configuration in the docs passesrdock validate --strictin CI, and “planned for vX.Y” badges are checked against whatrdockrefuses.
Changed
Section titled “Changed”- A file route that refers to another provider’s object (
name@docker) that does not exist is left out with a warning; the rest of the configuration applies (ADR-0018). The error for a missing service or middleware now reads “xdoes not exist”. - New logo, “Berth”: a container moored in an amber dock bay. It replaces the two-arrow mark in the README banner, the website and docs header (with a dark-theme version), and the favicon; the website gains the full web icon set and a manifest. Master files and usage rules are in
docs/assets/logo/.
rdock validateno longer warns that a route withoutHostneeds a host name for automatic HTTPS whendefaults.certificateserves it.- The Compose example mounts the config directory instead of the single file (editors replace files on save, which broke reloads), and starts after the backend so its name resolves on the first request.
[0.1.0-alpha.3] — v0.1 “hello proxy”
Section titled “[0.1.0-alpha.3] — v0.1 “hello proxy””Breaking
Section titled “Breaking”Configurations that worked with 0.1.0-alpha.2 may need changes:
- Unknown configuration keys are errors (they were ignored); the error suggests the nearest valid key. Keys starting with
x-are still ignored, for YAML anchors. redirect.permanentdefaults tofalse(302/307), as in Traefik. Setpermanent: truefor 301/308.security.limitsdefaults are 64 KiB of request headers, 100 headers and no body limit; setmax_body_bytesto limit bodies.rdock validate --strictturns warnings into errors.
- The proxy (
rdock run): Pingora 0.9 HTTP engine behind our own listeners (ADR-0012). HTTP/1.1, HTTP/2 over TLS (ALPN), h2c on plain listeners and to backends, WebSocket, server-sent events and gRPC with trailers; backends by IP, DNS name (re-resolved every 10 s) or Unix socket, over HTTP, HTTPS (verified, custom CA, orverify: false) or h2c; smooth weighted round-robin and weighted random. - Routing with the Traefik v3 grammar: priorities, normalised paths (forwarded as normalised), host/path/method/header/query/client-IP matchers; automatic HTTP→HTTPS redirect for HTTPS hosts; branded 404/5xx pages with the request ID (HTML or JSON).
- TLS: manual certificates with SNI (exact, one-label wildcard,
defaults.certificate), encrypted PKCS#8 keys (key_password),modern(TLS 1.3) andintermediatepolicies, session tickets, reload when the files change. - Middlewares:
headers(with HSTS on HTTPS only),redirect,rewrite,strip_prefix,add_prefix,replace_path,basic_auth(argon2id, bcrypt; Apache MD5 and SHA-1 with a warning),forward_auth,ip_allow,ip_deny,rate_limit,cors,compress(streaming gzip),errors,maintenance. - Security: forwarding headers trusted only from
security.trusted_proxies; header, header-count, target and body limits (431/414/413, chunked bodies counted); HTTP/1.1 withoutHost, bare-LF line endings and unknownExpectrefused; 10 s request-header deadline; request IDs. - Operations: reload on file change,
SIGHUP,rdock reloador the admin API, without dropping requests; listener changes without a restart; configuration history and last-known-good copy in$RDOCK_DATA_DIR/state, used at start when the file is broken; drain on shutdown (lifecycle.drain_timeout); systemd readiness (Type=notify). - Admin listener (
127.0.0.1:2080):/healthz,/readyz,/metrics(Prometheus), and with a token/api/v1/statusand/api/v1/config/reload;rdock status,rdock reload,rdock healthcheck. ${NAME},${env:NAME}and${file:/path}references in the configuration; secret fields stay references (ADR-0016).- JSON (or text) access log and JSON application logs; Prometheus metrics for requests, latency, upstream errors, connections, TLS handshakes, reloads and certificate expiry.
- Packaging:
Dockerfile(CMake added),Dockerfile.releaseand multi-arch GHCR images on tags (signed, attested),deploy/dockerCompose example,deploy/systemd/rdock.service. - Tests: end-to-end suites against the real binary (protocols, middlewares, smuggling vectors, limits, slow clients, reload under load, listener changes, drain, last-known-good, certificate swap); fuzz targets in
tests/fuzz(differential HTTP/1 framing, rule parser, configuration loader) and a weeklyfuzzworkflow. rdock hash [--user NAME]: creates an argon2id hash (or auser:hashentry) forbasic_auth, reading the password from stdin.- Weekly
weeklyworkflow: RustSec advisories for both lockfiles, and a tokio canary that tests past the tokio cap. - ADRs 0012–0016; the v0.1 research notes in
docs/research/.
Changed
Section titled “Changed”rdock validatealso compiles the configuration and lists settings this version cannot honour yet (“planned for vX.Y”);rdock runrefuses them.- Rules: matcher names are case-insensitive, one-argument
Query(k)matches an empty value,Hostaccepts a trailing dot and unbracketed IPv6,Methodcompares in upper case (Traefik parity). - Model: new
listeners.*.timeouts,routes.*.timeouts,defaults.certificate,certificates.*.key_password,headers.hsts,lifecycle.drain_timeout. - TLS uses rustls with the ring provider (ADR-0013); tokio is capped below 1.54 until Pingora supports it.
[0.1.0-alpha.2] — first published pre-release
Section titled “[0.1.0-alpha.2] — first published pre-release”- Release workflow: in the checksum step,
#inside a plain YAML scalar started a comment and cut the shell command short, sov0.1.0-alpha.1was tagged but never published. Checksums and the SBOM are now produced on every pull request that touches the build, and only the publish job (tags) holds write permissions.
actionlintwith shellcheck in the requireddocscheck and injust ci.
[0.1.0-alpha.1] — M0 foundations (tagged, not published)
Section titled “[0.1.0-alpha.1] — M0 foundations (tagged, not published)”- Cargo workspace with all crates of the architecture; skeleton crates document their milestone.
rdock-rules: Traefik v3 compatible rule parser (HTTP and TCP matchers,!,&&,||, parentheses, backtick and double-quoted strings), validation, canonical printing and property tests.rdock-model: configuration types for listeners, routes, services, middlewares, TCP, certificates, ACME, providers, security, admin and observability; typed values (durations, sizes, addresses, networks); semantic validation with paths and hints; JSON Schema (schema/rdock.v1.json).rdock-config: YAML (serde-saphyr, YAML 1.2 booleans) and JSON loading, unknown-key warnings with suggestions,--strictmode.rdock validate,rdock schema,rdock version.- CI: rust (fmt, clippy pedantic, nextest, doc), msrv (1.89), cargo-deny, Docker build, Semgrep; release workflow with signed checksums, SBOM and provenance; static non-root Dockerfile.
- ADR-0011 (YAML parser and MSRV).
Earlier
Section titled “Earlier”- Design plan: vision, verified research, feature-parity matrix, requirements, architecture, roadmap, Harbor UI design system, ADR-0001…0010.
- Repository governance: contributing guide, code of conduct, security policy, support and governance docs, issue forms, PR template, CODEOWNERS, docs/DCO/PR-title CI checks, protected
mainand release tags.