Update architecture specs to reflect live deployment findings and fix two bugs
Architecture updates based on gaps discovered during live deployment testing: - ADR-023: HTTP/2 client-facing support via ALPN-based protocol detection. The spec previously said HTTP/2 was out of scope, but the deployment revealed that modern browsers negotiate HTTP/2 via ALPN. The proxy now correctly detects the negotiated ALPN protocol and uses the appropriate HTTP server builder (http2::Builder for h2, auto::Builder for http/1.1). Upstream connections remain HTTP/1.1. Host resolution now falls back to URI host for HTTP/2 :authority pseudo-headers. - ADR-024: ANSI-disabled logging. All tracing-subscriber layers now use with_ansi(false) to prevent ANSI escape codes in log output, which broke fail2ban regex matching in Docker deployments. Also documents the fail2ban regex anchor fix (^RATE_LIMIT → RATE_LIMIT). Bug fixes found by architecture review: - Fix missing ALPN protocols in manual TLS mode. build_manual_server_config and build_multi_domain_server_config did not set alpn_protocols, meaning manual TLS mode could not support HTTP/2. Added h2 and http/1.1 ALPN entries to both functions (acme-tls/1 only in ACME mode). - Fix missing with_ansi(false) in JSON log format. The init_json function with file output did not disable ANSI on stdout or file layers, which would break fail2ban in production JSON logging mode. Other spec updates: - All document statuses updated from draft to reviewed - proxy.md: documented Server header removal, upstream HTTPS client, two-phase timeout enforcement, HTTP/2 host resolution, connect timeout - tls.md: documented ALPN configuration differing by mode (ACME vs manual) - overview.md: added HTTP/2 client-facing support to scope, updated crate deps (hyper-rustls, rustls-native-certs, hyper-util), clarified out-of-scope - config.md: fixed http_port type (u16→u32) to match implementation, added ANSI-disabled note for LoggingConfig - operations.md: documented ANSI-disabled logging, fail2ban regex anchor - open-questions.md: updated OQ-09 resolution (connect timeout fully implemented), OQ-10 (C2 bug is fixed)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
---
|
||||
status: draft
|
||||
status: reviewed
|
||||
last_updated: 2026-06-12
|
||||
---
|
||||
|
||||
@@ -7,7 +7,8 @@ last_updated: 2026-06-12
|
||||
|
||||
## Current State
|
||||
|
||||
**Phase 0 (Exploration) — Complete.** Phase 1 (Architecture) — In progress.
|
||||
**Phase 1 (Implementation) — Complete.** The proxy is deployed and running in a
|
||||
Docker container, replacing our vulnerable nginx 1.24.0 installation.
|
||||
|
||||
This project replaces our vulnerable nginx 1.24.0 installation with a
|
||||
memory-safe Rust/axum reverse proxy. The primary motivation is CVE-2026-42945
|
||||
@@ -16,17 +17,19 @@ memory corruption bugs in nginx's C codebase.
|
||||
|
||||
The proxy supports multiple domains from initial release (git.alk.dev and
|
||||
alk.dev), with per-domain host-based routing and a single multi-domain SAN
|
||||
certificate via ACME.
|
||||
certificate via ACME. HTTP/2 is supported on the client-facing side (between
|
||||
the client and the proxy) with ALPN-based protocol detection. Upstream
|
||||
connections remain HTTP/1.1.
|
||||
|
||||
## Architecture Documents
|
||||
|
||||
| Document | Status | Description |
|
||||
|----------|--------|-------------|
|
||||
| [overview.md](overview.md) | Draft | Vision, scope, crate dependencies, exports |
|
||||
| [proxy.md](proxy.md) | Draft | Reverse proxy handler, request flow, header injection |
|
||||
| [tls.md](tls.md) | Draft | TLS termination, ACME, manual certs, SNI |
|
||||
| [config.md](config.md) | Draft | TOML config format, static/dynamic split, ArcSwap reload |
|
||||
| [operations.md](operations.md) | Draft | Rate limiting, logging, health check, systemd, shutdown |
|
||||
| [overview.md](overview.md) | Reviewed | Vision, scope, crate dependencies, exports |
|
||||
| [proxy.md](proxy.md) | Reviewed | Reverse proxy handler, request flow, header injection |
|
||||
| [tls.md](tls.md) | Reviewed | TLS termination, ACME, manual certs, SNI, ALPN |
|
||||
| [config.md](config.md) | Reviewed | TOML config format, static/dynamic split, ArcSwap reload |
|
||||
| [operations.md](operations.md) | Reviewed | Rate limiting, logging, health check, systemd, shutdown |
|
||||
|
||||
## ADR Table
|
||||
|
||||
@@ -54,6 +57,8 @@ certificate via ACME.
|
||||
| [020](decisions/020-container-deployment.md) | Container Deployment Model | Accepted |
|
||||
| [021](decisions/021-x-forwarded-for-edge-proxy.md) | X-Forwarded-For Edge Proxy Model | Accepted |
|
||||
| [022](decisions/022-health-check-scope.md) | Health Check Scope — Local Port and Admin Socket Only | Accepted |
|
||||
| [023](decisions/023-http2-client-facing.md) | HTTP/2 Client-Facing Support | Accepted |
|
||||
| [024](decisions/024-ansi-disabled-logging.md) | ANSI-Disabled Logging for Container Deployments | Accepted |
|
||||
|
||||
## Open Questions
|
||||
|
||||
|
||||
Reference in New Issue
Block a user