From c58dfaf64783f18f45c1feb9056debc51e1a4367 Mon Sep 17 00:00:00 2001 From: Alphonse Paix Date: Sun, 28 Sep 2025 14:58:15 +0200 Subject: [PATCH] Remove unnecessary axum_server dependency --- .dockerignore | 3 + Cargo.lock | 157 --------------------------------------- Cargo.toml | 14 +++- Dockerfile | 14 ++-- configuration/local.yaml | 1 - package.json | 3 +- src/configuration.rs | 1 - src/startup.rs | 40 ++-------- 8 files changed, 30 insertions(+), 203 deletions(-) diff --git a/.dockerignore b/.dockerignore index b8c4919..8b2ecb7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,3 +8,6 @@ Dockerfile /assets/css/main.css /.cargo /.github +README.md +/tests +/configuration/local.yaml diff --git a/Cargo.lock b/Cargo.lock index f6c4da9..d4e4ab2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -227,28 +227,6 @@ dependencies = [ "syn", ] -[[package]] -name = "axum-server" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "495c05f60d6df0093e8fb6e74aa5846a0ad06abaf96d76166283720bf740f8ab" -dependencies = [ - "arc-swap", - "bytes", - "fs-err", - "http", - "http-body", - "hyper", - "hyper-util", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - [[package]] name = "backtrace" version = "0.3.75" @@ -361,12 +339,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - [[package]] name = "chrono" version = "0.4.41" @@ -833,16 +805,6 @@ dependencies = [ "syn", ] -[[package]] -name = "fs-err" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d7be93788013f265201256d58f04936a8079ad5dc898743aa20525f503b683" -dependencies = [ - "autocfg", - "tokio", -] - [[package]] name = "futures" version = "0.3.31" @@ -960,10 +922,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -973,11 +933,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", - "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", - "wasm-bindgen", ] [[package]] @@ -1151,23 +1109,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots 1.0.2", -] - [[package]] name = "hyper-util" version = "0.1.16" @@ -1473,12 +1414,6 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - [[package]] name = "markdown" version = "1.0.0" @@ -1927,61 +1862,6 @@ dependencies = [ "syn", ] -[[package]] -name = "quinn" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2 0.5.10", - "thiserror", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" -dependencies = [ - "bytes", - "getrandom 0.3.3", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.5.10", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "quote" version = "1.0.40" @@ -2138,21 +2018,16 @@ dependencies = [ "http-body", "http-body-util", "hyper", - "hyper-rustls", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls", "tower", "tower-http", "tower-service", @@ -2160,7 +2035,6 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.2", ] [[package]] @@ -2268,22 +2142,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "web-time", "zeroize", ] @@ -2910,16 +2774,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - [[package]] name = "tokio-stream" version = "0.1.17" @@ -3449,16 +3303,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-roots" version = "0.26.11" @@ -3807,7 +3651,6 @@ dependencies = [ "argon2", "askama", "axum", - "axum-server", "base64 0.22.1", "chrono", "claims", diff --git a/Cargo.toml b/Cargo.toml index bb95bce..67dafcf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,19 +11,29 @@ path = "src/lib.rs" path = "src/main.rs" name = "zero2prod" +[profile.release] +opt-level = 'z' +lto = true +codegen-units = 1 +panic = 'abort' +strip = true +rpath = false +debug = false +debug-assertions = false +overflow-checks = false +incremental = false + [dependencies] anyhow = "1.0.99" argon2 = { version = "0.5.3", features = ["std"] } askama = "0.14.0" axum = { version = "0.8.4", features = ["macros"] } -axum-server = { version = "0.7.2", features = ["tls-rustls-no-provider"] } base64 = "0.22.1" chrono = { version = "0.4.41", default-features = false, features = ["clock"] } config = "0.15.14" markdown = "1.0.0" rand = { version = "0.9.2", features = ["std_rng"] } reqwest = { version = "0.12.23", default-features = false, features = [ - "rustls-tls", "json", "cookies", ] } diff --git a/Dockerfile b/Dockerfile index 53d04f8..7f28108 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM lukemathwalker/cargo-chef:latest-rust-1.89.0 AS chef +FROM lukemathwalker/cargo-chef:latest-rust-1.90.0 AS chef WORKDIR /app RUN apt update && apt install -y nodejs npm && rm -rf /var/lib/apt/lists/* @@ -11,18 +11,14 @@ COPY --from=planner /app/recipe.json recipe.json RUN cargo chef cook --release --recipe-path recipe.json COPY . . ENV SQLX_OFFLINE=true +ENV RUSTFLAGS="-C strip=symbols -C target-cpu=native" RUN cargo build --release --bin zero2prod RUN npm install && npm run build-css -FROM debian:bookworm-slim AS runtime +FROM gcr.io/distroless/cc-debian12 AS runtime WORKDIR /app -RUN apt update -y \ - && apt install -y --no-install-recommends openssl ca-certificates \ - && apt autoremove -y \ - && apt clean -y \ - && rm -rf /var/lib/apt/lists/* COPY --from=builder /app/target/release/zero2prod zero2prod -COPY assets assets -COPY configuration configuration +COPY --from=builder /app/assets assets +COPY --from=builder /app/configuration configuration ENV APP_ENVIRONMENT=production ENTRYPOINT [ "./zero2prod" ] diff --git a/configuration/local.yaml b/configuration/local.yaml index 8a2c03e..81c9322 100644 --- a/configuration/local.yaml +++ b/configuration/local.yaml @@ -13,4 +13,3 @@ database: email_client: authorization_token: "secret-token" redis_uri: "redis://127.0.0.1:6379" -require_tls: false diff --git a/package.json b/package.json index 8a23ace..c12b621 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "scripts": { - "build-css": "tailwindcss -i ./templates/input.css -o ./assets/css/main.css --minify --watch" + "build-css": "tailwindcss -i ./templates/input.css -o ./assets/css/main.css --minify", + "watch-css": "tailwindcss -i ./templates/input.css -o ./assets/css/main.css --watch" }, "dependencies": { "@tailwindcss/cli": "^4.1.13", diff --git a/src/configuration.rs b/src/configuration.rs index 4bd9673..9316ba0 100644 --- a/src/configuration.rs +++ b/src/configuration.rs @@ -61,7 +61,6 @@ pub struct Settings { pub database: DatabaseSettings, pub email_client: EmailClientSettings, pub redis_uri: SecretString, - pub require_tls: bool, } #[derive(Clone, Deserialize)] diff --git a/src/startup.rs b/src/startup.rs index 3ab257d..79aeaa7 100644 --- a/src/startup.rs +++ b/src/startup.rs @@ -1,4 +1,5 @@ use crate::{configuration::Settings, email_client::EmailClient, routes::require_auth, routes::*}; +use anyhow::Context; use axum::{ Router, body::Bytes, @@ -8,11 +9,11 @@ use axum::{ response::{IntoResponse, Response}, routing::{delete, get, post}, }; -use axum_server::tls_rustls::RustlsConfig; use reqwest::{StatusCode, header}; use secrecy::ExposeSecret; use sqlx::{PgPool, postgres::PgPoolOptions}; -use std::{net::TcpListener, sync::Arc, time::Duration}; +use std::{sync::Arc, time::Duration}; +use tokio::net::TcpListener; use tower_http::{services::ServeDir, trace::TraceLayer}; use tower_sessions::SessionManagerLayer; use tower_sessions_redis_store::{ @@ -31,7 +32,6 @@ pub struct AppState { pub struct Application { listener: TcpListener, router: Router, - tls_config: Option, } impl Application { @@ -64,39 +64,15 @@ impl Application { configuration.application.base_url, redis_store, ); - let tls_config = if configuration.require_tls { - Some( - RustlsConfig::from_pem_file( - std::env::var("APP_TLS_CERT") - .expect("Failed to read TLS certificate environment variable"), - std::env::var("APP_TLS_KEY") - .expect("Feiled to read TLS private key environment variable"), - ) - .await - .expect("Could not create TLS configuration"), - ) - } else { - None - }; - let listener = TcpListener::bind(address).unwrap(); - Ok(Self { - listener, - router, - tls_config, - }) + let listener = TcpListener::bind(address) + .await + .context("Could not bind application address.")?; + Ok(Self { listener, router }) } pub async fn run_until_stopped(self) -> Result<(), std::io::Error> { tracing::debug!("listening on {}", self.local_addr()); - if let Some(tls_config) = self.tls_config { - axum_server::from_tcp_rustls(self.listener, tls_config) - .serve(self.router.into_make_service()) - .await - } else { - axum_server::from_tcp(self.listener) - .serve(self.router.into_make_service()) - .await - } + axum::serve(self.listener, self.router).await } pub fn local_addr(&self) -> String {