Task graph covers all Phase 1 concerns: config system, TLS termination, proxy handler, operations (rate limiting, logging, health check, admin socket, signals, shutdown, body size limit), deployment artifacts, and two review checkpoints. No circular dependencies. Critical path length of 7. Risk distribution: 3 high-risk (ACME, TLS listener setup, startup orchestration), 7 medium, 11 low, 2 trivial.
3.7 KiB
3.7 KiB
id, name, status, depends_on, scope, risk, impact, level
| id | name | status | depends_on | scope | risk | impact | level |
|---|---|---|---|---|---|---|---|
| setup/project-init | Initialize Rust project with Cargo, dependencies, and module skeleton | pending | moderate | low | project | implementation |
Description
Initialize the Rust project from scratch. The repo currently has only docs/ and .git/. Set up a single-binary Rust project with all core dependencies per the architecture spec (overview.md), and create the module skeleton that subsequent tasks will fill in.
This is a single-binary project — there are no library exports. The product is the reverse-proxy binary.
Core Dependencies
| Crate | Purpose |
|---|---|
axum 0.8 |
HTTP framework, routing, middleware, extractors |
tokio 1 (full) |
Async runtime |
hyper 1 |
HTTP protocol, proxy Client |
tower 0.5 |
Middleware ecosystem, Service trait |
rustls 0.23 |
TLS implementation, aws_lc_rs crypto provider |
tokio-rustls 0.26 |
Async TLS I/O |
rustls-acme 0.12 |
ACME client for Let's Encrypt |
serde 1 |
Serialization |
toml 0.8 |
Config format |
arc-swap 1 |
Atomic config swap for DynamicConfig |
tracing 0.1 |
Structured logging |
tracing-subscriber 0.3 |
Log output (file + stdout) |
rustls-pemfile 2 |
PEM parsing for manual cert loading |
rustls-pki-types 1 |
TLS types (CertificateDer, PrivateKeyDer) |
clap 4 |
CLI arguments |
signal-hook 0.3 |
SIGTERM/SIGINT/SIGHUP handling |
Pin exact versions in Cargo.toml per standard Rust practice.
Module Skeleton
src/
├── main.rs — entry point, CLI parsing, startup orchestration
├── config/
│ ├── mod.rs — config module, re-exports
│ ├── static_config.rs — StaticConfig, ListenerConfig, TlsConfig, LoggingConfig
│ ├── dynamic_config.rs — DynamicConfig, SiteConfig, RateLimitConfig
│ └── validation.rs — config validation logic
├── proxy/
│ ├── mod.rs — proxy module, re-exports
│ ├── handler.rs — reverse proxy handler
│ ├── headers.rs — proxy header injection
│ └── error.rs — error response types
├── tls/
│ ├── mod.rs — TLS module, re-exports
│ ├── acceptor.rs — TLS acceptor construction (manual + ACME)
│ └── redirect.rs — HTTP → HTTPS redirect handler
├── rate_limit/
│ ├── mod.rs — rate limit module
│ └── bucket.rs — token bucket implementation
├── logging/
│ ├── mod.rs — logging module
│ └── format.rs — custom structured log format
├── admin/
│ ├── mod.rs — admin socket module
│ └── socket.rs — Unix domain socket handler
├── health.rs — health check endpoint
└── shutdown.rs — graceful shutdown logic
Acceptance Criteria
Cargo.tomlwith all dependencies listed in overview.md, exact versions pinnedsrc/main.rswith minimalfn main()that compiles- All module files exist with
mod.rsre-exports and skeleton content cargo checksucceeds with no errorscargo clippysucceeds with no warnings- Binary name is
reverse-proxyinCargo.toml .gitignorecoverstarget/- Dual licensing:
MIT OR Apache-2.0inCargo.toml
References
- docs/architecture/overview.md — crate dependencies, exports
- docs/architecture/config.md — config structure
- docs/architecture/proxy.md — proxy handler architecture
- docs/architecture/tls.md — TLS architecture
- docs/architecture/operations.md — rate limiting, logging, health check, shutdown
Notes
To be filled by implementation agent
Summary
To be filled on completion