From 49a5643e769af97de308202ccbb52406dd1ff330 Mon Sep 17 00:00:00 2001 From: houseme Date: Fri, 11 Jul 2025 14:20:22 +0800 Subject: [PATCH] refactor(config): Unify S3 API and Console ports (#173) This commit streamlines the server configuration by unifying the S3 API and the WebUI (Console) to serve on a single port. Previously, the console was managed by separate configuration options (`RUSTFS_CONSOLE_ENABLE` and `RUSTFS_CONSOLE_ADDRESS`), requiring a distinct port. This added complexity to deployment and configuration. With this change: - The `RUSTFS_CONSOLE_ADDRESS` and `RUSTFS_CONSOLE_FS_ENDPOINT` environment variables are removed. - The WebUI is now always available and served directly from the main application port defined by `RUSTFS_ADDRESS`. - This simplifies setup, reduces the number of exposed ports, and makes the application easier to manage and deploy, especially in containerized environments. Users should update their startup scripts and remove the deprecated `RUSTFS_CONSOLE_*` variables. --- Cargo.lock | 46 +++++++++++++++++++++++++++----------- Cargo.toml | 8 +++---- Dockerfile.obs | 3 +-- crates/utils/src/net.rs | 6 ++--- docker-compose-obs.yaml | 18 +++++---------- docker-compose.yaml | 27 ++++++++-------------- docker-compose.yml | 4 ---- rustfs/src/config/mod.rs | 10 +-------- rustfs/src/logging/mod.rs | 13 ----------- rustfs/src/main.rs | 5 ++--- rustfs/src/server/http.rs | 22 ++++++++++++++---- rustfs/src/server/layer.rs | 14 ++++++++++++ scripts/dev_rustfs.env | 1 - scripts/run.sh | 2 +- 14 files changed, 91 insertions(+), 88 deletions(-) delete mode 100644 rustfs/src/logging/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 4b9b5989..47e9fedb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4618,7 +4618,7 @@ dependencies = [ "httpdate", "itoa 1.0.15", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -4712,7 +4712,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.5.10", "system-configuration", "tokio", "tower-service", @@ -7180,6 +7180,16 @@ name = "quick-xml" version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" dependencies = [ "memchr", "serde", @@ -7199,7 +7209,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls 0.23.29", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -7236,7 +7246,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -7400,9 +7410,9 @@ dependencies = [ [[package]] name = "rdkafka" -version = "0.37.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b52c81ac3cac39c9639b95c20452076e74b8d9a71bc6fc4d83407af2ea6fff" +checksum = "5f1856d72dbbbea0d2a5b2eaf6af7fb3847ef2746e883b11781446a51dbc85c0" dependencies = [ "futures-channel", "futures-util", @@ -7888,7 +7898,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "shadow-rs", - "socket2", + "socket2 0.6.0", "thiserror 2.0.12", "tikv-jemallocator", "time", @@ -8156,7 +8166,7 @@ dependencies = [ "dashmap 6.1.0", "form_urlencoded", "once_cell", - "quick-xml", + "quick-xml 0.38.0", "reqwest", "rumqttc", "rustfs-config", @@ -8616,7 +8626,7 @@ dependencies = [ "nugine-rust-utils", "numeric_cast", "pin-project-lite", - "quick-xml", + "quick-xml 0.37.5", "serde", "serde_urlencoded", "sha1 0.11.0-pre.5", @@ -9237,6 +9247,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "soup3" version = "0.5.0" @@ -9530,9 +9550,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.35.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3ffa3e4ff2b324a57f7aeb3c349656c7b127c3c189520251a648102a92496e" +checksum = "aab138f5c1bb35231de19049060a87977ad23e04f2303e953bc5c2947ac7dec4" dependencies = [ "libc", "memchr", @@ -9877,7 +9897,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.5.10", "tokio-macros", "tracing", "windows-sys 0.52.0", @@ -10062,7 +10082,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost", - "socket2", + "socket2 0.5.10", "tokio", "tokio-stream", "tower", diff --git a/Cargo.toml b/Cargo.toml index a2c50f55..64dbb6d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -182,9 +182,9 @@ pbkdf2 = "0.12.2" percent-encoding = "2.3.1" pin-project-lite = "0.2.16" prost = "0.13.5" -quick-xml = "0.37.5" +quick-xml = "0.38.0" rand = "0.9.1" -rdkafka = { version = "0.37.0", features = ["tokio"] } +rdkafka = { version = "0.38.0", features = ["tokio"] } reed-solomon-simd = { version = "3.0.1" } regex = { version = "1.11.1" } reqwest = { version = "0.12.22", default-features = false, features = [ @@ -222,9 +222,9 @@ siphasher = "1.0.1" smallvec = { version = "1.15.1", features = ["serde"] } snafu = "0.8.6" snap = "1.1.1" -socket2 = "0.5.10" +socket2 = "0.6.0" strum = { version = "0.27.1", features = ["derive"] } -sysinfo = "0.35.2" +sysinfo = "0.36.0" tempfile = "3.20.0" temp-env = "0.3.6" test-case = "3.3.1" diff --git a/Dockerfile.obs b/Dockerfile.obs index f16ea3dc..f7c02645 100644 --- a/Dockerfile.obs +++ b/Dockerfile.obs @@ -7,7 +7,7 @@ FROM ubuntu:latest WORKDIR /app -# 创建与 RUSTFS_VOLUMES 一致的目录 +# Create a directory that is consistent with RUSTFS_VOLUMES RUN mkdir -p /root/data/target/volume/test1 /root/data/target/volume/test2 /root/data/target/volume/test3 /root/data/target/volume/test4 # COPY ./target/x86_64-unknown-linux-musl/release/rustfs /app/rustfs @@ -16,6 +16,5 @@ COPY ./target/x86_64-unknown-linux-gnu/release/rustfs /app/rustfs RUN chmod +x /app/rustfs EXPOSE 9000 -EXPOSE 9002 CMD ["/app/rustfs"] \ No newline at end of file diff --git a/crates/utils/src/net.rs b/crates/utils/src/net.rs index 0d5440c9..1bc0adcc 100644 --- a/crates/utils/src/net.rs +++ b/crates/utils/src/net.rs @@ -176,7 +176,7 @@ impl Display for XHost { impl TryFrom for XHost { type Error = std::io::Error; - fn try_from(value: String) -> std::result::Result { + fn try_from(value: String) -> Result { if let Some(addr) = value.to_socket_addrs()?.next() { Ok(Self { name: addr.ip().to_string(), @@ -212,9 +212,9 @@ pub fn parse_and_resolve_address(addr_str: &str) -> std::io::Result } #[allow(dead_code)] -pub fn bytes_stream(stream: S, content_length: usize) -> impl Stream> + Send + 'static +pub fn bytes_stream(stream: S, content_length: usize) -> impl Stream> + Send + 'static where - S: Stream> + Send + 'static, + S: Stream> + Send + 'static, E: Send + 'static, { AsyncTryStream::::new(|mut y| async move { diff --git a/docker-compose-obs.yaml b/docker-compose-obs.yaml index 8878574d..e546a004 100644 --- a/docker-compose-obs.yaml +++ b/docker-compose-obs.yaml @@ -79,14 +79,12 @@ services: - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4} - RUSTFS_ADDRESS=:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=:9002 - RUSTFS_OBS_CONFIG=/etc/observability/config/obs-multi.toml platform: linux/amd64 ports: - - "9001:9000" # 映射宿主机的 9001 端口到容器的 9000 端口 - - "9101:9002" + - "9001:9000" # Map port 9001 of the host to port 9000 of the container volumes: - # - ./data:/root/data # 将当前路径挂载到容器内的 /root/data + # - ./data:/root/data # Mount the current path to /root/data in the container - ./.docker/observability/config:/etc/observability/config networks: - rustfs-network @@ -100,12 +98,10 @@ services: - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4} - RUSTFS_ADDRESS=:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=:9002 - RUSTFS_OBS_CONFIG=/etc/observability/config/obs-multi.toml platform: linux/amd64 ports: - - "9002:9000" # 映射宿主机的 9002 端口到容器的 9000 端口 - - "9102:9002" + - "9002:9000" # Map port 9002 of the host to port 9000 of the container volumes: # - ./data:/root/data - ./.docker/observability/config:/etc/observability/config @@ -121,12 +117,10 @@ services: - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4} - RUSTFS_ADDRESS=:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=:9002 - RUSTFS_OBS_CONFIG=/etc/observability/config/obs-multi.toml platform: linux/amd64 ports: - - "9003:9000" # 映射宿主机的 9003 端口到容器的 9000 端口 - - "9103:9002" + - "9003:9000" # Map port 9003 of the host to port 9000 of the container volumes: # - ./data:/root/data - ./.docker/observability/config:/etc/observability/config @@ -142,12 +136,10 @@ services: - RUSTFS_VOLUMES=http://node{1...4}:9000/root/data/target/volume/test{1...4} - RUSTFS_ADDRESS=:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=:9002 - RUSTFS_OBS_CONFIG=/etc/observability/config/obs-multi.toml platform: linux/amd64 ports: - - "9004:9000" # 映射宿主机的 9004 端口到容器的 9000 端口 - - "9104:9002" + - "9004:9000" # Map port 9004 of the host to port 9000 of the container volumes: # - ./data:/root/data - ./.docker/observability/config:/etc/observability/config diff --git a/docker-compose.yaml b/docker-compose.yaml index d34b0df2..8de2ec71 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -14,70 +14,61 @@ services: node0: - image: rustfs:v1 # 替换为你的镜像名称和标签 + image: rustfs/rustfs:latest # Replace with your image name and label container_name: node0 hostname: node0 environment: - RUSTFS_VOLUMES=http://node{0...3}:9000/data/rustfs{0...3} - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9002 platform: linux/amd64 ports: - - "9000:9000" # 映射宿主机的 9001 端口到容器的 9000 端口 - - "8000:9001" # 映射宿主机的 9001 端口到容器的 9000 端口 + - "9000:9000" # Map port 9001 of the host to port 9000 of the container volumes: - ./target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs - # - ./data/node0:/data # 将当前路径挂载到容器内的 /root/data command: "/app/rustfs" node1: - image: rustfs:v1 + image: rustfs/rustfs:latest container_name: node1 hostname: node1 environment: - RUSTFS_VOLUMES=http://node{0...3}:9000/data/rustfs{0...3} - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9002 platform: linux/amd64 ports: - - "9001:9000" # 映射宿主机的 9002 端口到容器的 9000 端口 + - "9001:9000" # Map port 9002 of the host to port 9000 of the container volumes: - - ./target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs - # - ./data/node1:/data + - ./target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs command: "/app/rustfs" node2: - image: rustfs:v1 + image: rustfs/rustfs:latest container_name: node2 hostname: node2 environment: - RUSTFS_VOLUMES=http://node{0...3}:9000/data/rustfs{0...3} - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9002 platform: linux/amd64 ports: - - "9002:9000" # 映射宿主机的 9003 端口到容器的 9000 端口 + - "9002:9000" # Map port 9003 of the host to port 9000 of the container volumes: - ./target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs - # - ./data/node2:/data command: "/app/rustfs" node3: - image: rustfs:v1 + image: rustfs/rustfs:latest container_name: node3 hostname: node3 environment: - RUSTFS_VOLUMES=http://node{0...3}:9000/data/rustfs{0...3} - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9002 platform: linux/amd64 ports: - - "9003:9000" # 映射宿主机的 9004 端口到容器的 9000 端口 + - "9003:9000" # Map port 9004 of the host to port 9000 of the container volumes: - ./target/x86_64-unknown-linux-musl/release/rustfs:/app/rustfs - # - ./data/node3:/data command: "/app/rustfs" diff --git a/docker-compose.yml b/docker-compose.yml index 6ffe4f7e..ffba7c83 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,12 +28,10 @@ services: TARGETPLATFORM: linux/amd64 ports: - "9000:9000" # S3 API port - - "9001:9001" # Console port environment: - RUSTFS_VOLUMES=/data/rustfs0,/data/rustfs1,/data/rustfs2,/data/rustfs3 - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - RUSTFS_ACCESS_KEY=rustfsadmin - RUSTFS_SECRET_KEY=rustfsadmin - RUSTFS_LOG_LEVEL=info @@ -65,12 +63,10 @@ services: dockerfile: .docker/Dockerfile.devenv ports: - "9010:9000" - - "9011:9001" environment: - RUSTFS_VOLUMES=/data/rustfs0,/data/rustfs1 - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_CONSOLE_ENABLE=true - - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001 - RUSTFS_ACCESS_KEY=devadmin - RUSTFS_SECRET_KEY=devadmin - RUSTFS_LOG_LEVEL=debug diff --git a/rustfs/src/config/mod.rs b/rustfs/src/config/mod.rs index 8b93801b..fc127762 100644 --- a/rustfs/src/config/mod.rs +++ b/rustfs/src/config/mod.rs @@ -68,15 +68,7 @@ pub struct Opt { #[arg(long, default_value_t = true, env = "RUSTFS_CONSOLE_ENABLE")] pub console_enable: bool, - /// Console server bind address - #[arg(long, default_value_t = rustfs_config::DEFAULT_CONSOLE_ADDRESS.to_string(), env = "RUSTFS_CONSOLE_ADDRESS")] - pub console_address: String, - - /// rustfs endpoint for console - #[arg(long, env = "RUSTFS_CONSOLE_FS_ENDPOINT")] - pub console_fs_endpoint: Option, - - /// Observability configuration file + /// Observability endpoint for trace, metrics and logs,only support grpc mode. #[arg(long, default_value_t = rustfs_config::DEFAULT_OBS_ENDPOINT.to_string(), env = "RUSTFS_OBS_ENDPOINT")] pub obs_endpoint: String, diff --git a/rustfs/src/logging/mod.rs b/rustfs/src/logging/mod.rs deleted file mode 100644 index 6238cfff..00000000 --- a/rustfs/src/logging/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2024 RustFS Team -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 1a0a9c39..469624c1 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -18,14 +18,11 @@ mod config; mod error; // mod grpc; pub mod license; -mod logging; mod server; mod storage; mod update; mod version; -use rustfs_config::DEFAULT_DELIMITER; -use rustfs_ecstore::config::GLOBAL_ServerConfig; // Ensure the correct path for parse_license is imported use crate::server::{SHUTDOWN_TIMEOUT, ServiceState, ServiceStateManager, ShutdownSignal, start_http_server, wait_for_shutdown}; use chrono::Datelike; @@ -34,10 +31,12 @@ use license::init_license; use rustfs_ahm::scanner::data_scanner::ScannerConfig; use rustfs_ahm::{Scanner, create_ahm_services_cancel_token, shutdown_ahm_services}; use rustfs_common::globals::set_global_addr; +use rustfs_config::DEFAULT_DELIMITER; use rustfs_ecstore::bucket::metadata_sys::init_bucket_metadata_sys; use rustfs_ecstore::cmd::bucket_replication::init_bucket_replication_pool; use rustfs_ecstore::config as ecconfig; use rustfs_ecstore::config::GLOBAL_ConfigSys; +use rustfs_ecstore::config::GLOBAL_ServerConfig; use rustfs_ecstore::store_api::BucketOptions; use rustfs_ecstore::{ StorageAPI, diff --git a/rustfs/src/server/http.rs b/rustfs/src/server/http.rs index 7ffb2c47..34a20813 100644 --- a/rustfs/src/server/http.rs +++ b/rustfs/src/server/http.rs @@ -1,7 +1,21 @@ -// use crate::admin::console::{CONSOLE_CONFIG, init_console_cfg}; -use crate::auth::IAMAuth; +// Copyright 2024 RustFS Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Ensure the correct path for parse_license is imported use crate::admin; +// use crate::admin::console::{CONSOLE_CONFIG, init_console_cfg}; +use crate::auth::IAMAuth; use crate::config; use crate::server::hybrid::hybrid; use crate::server::layer::RedirectLayer; @@ -44,7 +58,7 @@ const MI_B: usize = 1024 * 1024; pub async fn start_http_server( opt: &config::Opt, worker_state_manager: ServiceStateManager, -) -> std::io::Result> { +) -> Result> { let server_addr = parse_and_resolve_address(opt.address.as_str()).map_err(Error::other)?; let server_port = server_addr.port(); let server_address = server_addr.to_string(); @@ -201,7 +215,7 @@ pub async fn start_http_server( }; let socket_ref = SockRef::from(&socket); - if let Err(err) = socket_ref.set_nodelay(true) { + if let Err(err) = socket_ref.set_tcp_nodelay(true) { warn!(?err, "Failed to set TCP_NODELAY"); } if let Err(err) = socket_ref.set_recv_buffer_size(4 * MI_B) { diff --git a/rustfs/src/server/layer.rs b/rustfs/src/server/layer.rs index d00af717..f77f1252 100644 --- a/rustfs/src/server/layer.rs +++ b/rustfs/src/server/layer.rs @@ -1,3 +1,17 @@ +// Copyright 2024 RustFS Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + use crate::server::hybrid::HybridBody; use http::{Request as HttpRequest, Response, StatusCode}; use hyper::body::Incoming; diff --git a/scripts/dev_rustfs.env b/scripts/dev_rustfs.env index d45fa38c..59ee523d 100644 --- a/scripts/dev_rustfs.env +++ b/scripts/dev_rustfs.env @@ -4,7 +4,6 @@ RUSTFS_ROOT_PASSWORD=rustfsadmin RUSTFS_VOLUMES="http://node{1...4}:7000/data/rustfs{0...3} http://node{5...8}:7000/data/rustfs{0...3}" RUSTFS_ADDRESS=":7000" RUSTFS_CONSOLE_ENABLE=true -RUSTFS_CONSOLE_ADDRESS=":7001" RUST_LOG=warn RUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/" RUSTFS_NS_SCANNER_INTERVAL=60 diff --git a/scripts/run.sh b/scripts/run.sh index fa53566a..1f77a067 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -57,7 +57,7 @@ export RUSTFS_OBS_ENDPOINT=http://localhost:4317 # OpenTelemetry Collector 的 #export RUSTFS_OBS_METER_INTERVAL=1 # 采样间隔,单位为秒 #export RUSTFS_OBS_SERVICE_NAME=rustfs # 服务名称 #export RUSTFS_OBS_SERVICE_VERSION=0.1.0 # 服务版本 -#export RUSTFS_OBS_ENVIRONMENT=develop # 环境名称 +export RUSTFS_OBS_ENVIRONMENT=develop # 环境名称 export RUSTFS_OBS_LOGGER_LEVEL=debug # 日志级别,支持 trace, debug, info, warn, error export RUSTFS_OBS_LOCAL_LOGGING_ENABLED=true # 是否启用本地日志记录 export RUSTFS_OBS_LOG_DIRECTORY="$current_dir/deploy/logs" # Log directory