Dockerize
This commit is contained in:
3
.env.example
Normal file
3
.env.example
Normal file
@@ -0,0 +1,3 @@
|
||||
ADDRESS=0.0.0.0
|
||||
PORT=3000
|
||||
ENABLE_CORS=true
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
/target
|
||||
.env
|
||||
7
Cargo.lock
generated
7
Cargo.lock
generated
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@@ -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"]
|
||||
39
src/main.rs
39
src/main.rs
@@ -71,6 +71,7 @@ async fn on_connect(socket: SocketRef, state: Arc<AppState>) {
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
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<dyn std::error::Error>> {
|
||||
tokio::spawn(on_connect(socket, app_state_for_ns.clone()));
|
||||
});
|
||||
|
||||
let cors = CorsLayer::new()
|
||||
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);
|
||||
.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::<SocketAddr>(),
|
||||
)
|
||||
.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(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user