diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ef918a9 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +ADDRESS=0.0.0.0 +PORT=3000 +ENABLE_CORS=true \ No newline at end of file diff --git a/.gitignore b/.gitignore index ea8c4bf..0b745e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +.env \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c97f78e..00de12a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -228,6 +228,12 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "engineioxide" version = "0.13.1" @@ -610,6 +616,7 @@ version = "0.1.0" dependencies = [ "axum", "chrono", + "dotenv", "serde", "serde_json", "socketioxide", diff --git a/Cargo.toml b/Cargo.toml index f359420..1c64523 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ edition = "2021" [dependencies] axum = "0.7.5" chrono = "0.4.38" +dotenv = "0.15.0" serde = { version = "1.0.201", features = ["derive"] } serde_json = "1.0.117" socketioxide = "0.13.1" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..779af35 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM rust:1.76 as builder +WORKDIR /app + +COPY Cargo.toml Cargo.lock ./ + +COPY src ./src + +RUN cargo build --release + +FROM rust:1.76 +WORKDIR /app + +COPY --from=builder /app/target/release/painter . +COPY painter-js/dist ./dist +COPY .env .env + +EXPOSE 3000 + +CMD ["./painter"] \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 8ef1975..0811786 100644 --- a/src/main.rs +++ b/src/main.rs @@ -71,6 +71,7 @@ async fn on_connect(socket: SocketRef, state: Arc) { #[tokio::main] async fn main() -> Result<(), Box> { + dotenv::dotenv().ok(); tracing::subscriber::set_global_default(FmtSubscriber::new())?; let (layer, io) = SocketIo::new_layer(); @@ -85,24 +86,38 @@ async fn main() -> Result<(), Box> { tokio::spawn(on_connect(socket, app_state_for_ns.clone())); }); - let cors = CorsLayer::new() - .allow_origin(Any) - .allow_methods(Any) - .allow_headers(Any); + let address = std::env::var("ADDRESS").unwrap_or_else(|_| "0.0.0.0".to_string()); + let port: u16 = std::env::var("PORT") + .unwrap_or_else(|_| "3000".to_string()) + .parse() + .expect("Invalid port"); + let enable_cors = std::env::var("ENABLE_CORS").unwrap_or_else(|_| "true".to_string()) == "true"; + + let cors = if enable_cors { + Some( + CorsLayer::new() + .allow_origin(Any) + .allow_methods(Any) + .allow_headers(Any), + ) + } else { + None + }; let app = Router::new() - .fallback_service(ServeDir::new("painter-js/dist")) - .layer(layer) - .layer(cors); + .fallback_service(ServeDir::new("dist")) + .layer(layer); - info!("Starting server"); + let app = if let Some(cors) = cors { + app.layer(cors) + } else { + app + }; - let listener = tokio::net::TcpListener::bind("127.0.0.1:3000").await?; - axum::serve( - listener, - app.into_make_service_with_connect_info::(), - ) - .await?; + let server_address = format!("{}:{}", address, port); + info!("Starting server on {}", server_address); + let listener = tokio::net::TcpListener::bind(server_address).await?; + axum::serve(listener, app.into_make_service()).await?; Ok(()) }