From 20cd117aa683e50b9d0dea1e4af3c649b36664ef Mon Sep 17 00:00:00 2001 From: houseme Date: Fri, 18 Jul 2025 15:53:00 +0800 Subject: [PATCH] improve code for dockerfile (#256) * improve code for dockerfile * Update Dockerfile Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * improve code for file name * improve code for dockerfile * fix --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Cargo.lock | 247 ++++++++++++++++++----------- Cargo.toml | 6 +- Dockerfile | 139 +++++++--------- crates/config/src/constants/app.rs | 16 +- crates/obs/src/config.rs | 14 +- crates/obs/src/logger.rs | 3 +- crates/obs/src/sinks/mod.rs | 3 +- entrypoint.sh | 51 ++++++ scripts/run.sh | 2 +- 9 files changed, 285 insertions(+), 196 deletions(-) create mode 100644 entrypoint.sh diff --git a/Cargo.lock b/Cargo.lock index 349b1d54..b3e32984 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,7 +455,10 @@ dependencies = [ "serde_repr", "tokio", "url", - "zbus 5.8.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus 5.9.0", ] [[package]] @@ -512,7 +515,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 1.0.7", + "rustix 1.0.8", "slab", "tracing", "windows-sys 0.59.0", @@ -544,7 +547,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 1.0.7", + "rustix 1.0.8", "tracing", ] @@ -571,7 +574,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.0.7", + "rustix 1.0.8", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -673,9 +676,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-credential-types" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" +checksum = "b68c2194a190e1efc999612792e25b1ab3abfefe4306494efaaabc25933c0cbe" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -708,9 +711,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.8" +version = "1.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6c68419d8ba16d9a7463671593c54f81ba58cab466e9b759418da606dcc2e2" +checksum = "b2090e664216c78e766b6bac10fe74d2f451c02441d43484cd76ac9a295075f7" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -733,9 +736,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.96.0" +version = "1.98.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e25d24de44b34dcdd5182ac4e4c6f07bcec2661c505acef94c0d293b65505fe" +checksum = "029e89cae7e628553643aecb3a3f054a0a0912ff0fd1f5d6a0b4fda421dce64b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -806,9 +809,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.4" +version = "0.63.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244f00666380d35c1c76b90f7b88a11935d11b84076ac22a4c014ea0939627af" +checksum = "5ab9472f7a8ec259ddb5681d2ef1cb1cf16c0411890063e67cdc7b62562cc496" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -826,9 +829,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.9" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338a3642c399c0a5d157648426110e199ca7fd1c689cc395676b81aa563700c4" +checksum = "604c7aec361252b8f1c871a7641d5e0ba3a7f5a586e51b66bc9510a5519594d9" dependencies = [ "aws-smithy-types", "bytes", @@ -837,9 +840,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" +checksum = "43c82ba4cab184ea61f6edaafc1072aad3c2a17dcf4c0fce19ac5694b90d8b5f" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -865,7 +868,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.3.26", + "h2 0.3.27", "h2 0.4.11", "http 0.2.12", "http 1.3.1", @@ -1574,23 +1577,12 @@ dependencies = [ [[package]] name = "chrono-tz" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efdce149c370f133a071ca8ef6ea340b7b88748ab0810097a9e2976eaa34b4f3" +checksum = "a6139a8597ed92cf816dfb33f5dd6cf0bb93a6adc938f11039f371bc5bcd26c3" dependencies = [ "chrono", - "chrono-tz-build", - "phf 0.11.3", -] - -[[package]] -name = "chrono-tz-build" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f10f8c9340e31fc120ff885fcdb54a0b48e474bbd77cab557f0c30a3e569402" -dependencies = [ - "parse-zoneinfo", - "phf_codegen 0.11.3", + "phf 0.12.1", ] [[package]] @@ -1850,18 +1842,18 @@ dependencies = [ [[package]] name = "const-str" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e991226a70654b49d34de5ed064885f0bef0348a8e70018b8ff1ac80aa984a2" +checksum = "041fbfcf8e7054df725fb9985297e92422cdc80fcf313665f5ca3d761bb63f4c" dependencies = [ "const-str-proc-macro", ] [[package]] name = "const-str-proc-macro" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d1c4c3cb85e5856b34e829af0035d7154f8c2889b15bbf43c8a6c6786dcab5" +checksum = "f801882b7ecd4188f4bca0317f34e022d623590d85893d7024b18d14f2a3b40b" dependencies = [ "proc-macro2", "quote", @@ -2031,9 +2023,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -3384,18 +3376,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dispatch2" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" -dependencies = [ - "bitflags 2.9.1", - "block2 0.6.1", - "libc", - "objc2 0.6.1", -] - [[package]] name = "dispatch2" version = "0.3.0" @@ -3403,6 +3383,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.1", + "block2 0.6.1", + "libc", "objc2 0.6.1", ] @@ -3417,6 +3399,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.8", +] + [[package]] name = "dlopen2" version = "0.7.0" @@ -3440,6 +3431,12 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dpi" version = "0.1.2" @@ -4375,9 +4372,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -4623,7 +4620,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", @@ -6212,7 +6209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", ] @@ -6611,15 +6608,6 @@ dependencies = [ "zstd", ] -[[package]] -name = "parse-zoneinfo" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" -dependencies = [ - "regex", -] - [[package]] name = "password-hash" version = "0.5.0" @@ -6728,11 +6716,11 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.3" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" dependencies = [ - "phf_shared 0.11.3", + "phf_shared 0.12.1", ] [[package]] @@ -6755,16 +6743,6 @@ dependencies = [ "phf_shared 0.10.0", ] -[[package]] -name = "phf_codegen" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" -dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", -] - [[package]] name = "phf_generator" version = "0.8.0" @@ -6836,6 +6814,15 @@ dependencies = [ "siphasher 1.0.1", ] +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher 1.0.1", +] + [[package]] name = "pin-project" version = "1.1.10" @@ -6967,7 +6954,7 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.7", + "rustix 1.0.8", "tracing", "windows-sys 0.59.0", ] @@ -7647,13 +7634,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd 0.11.0", "block2 0.6.1", - "dispatch2 0.2.0", + "dispatch2", "js-sys", "log", "objc2 0.6.1", @@ -8107,7 +8094,7 @@ dependencies = [ "dirs", "hex", "keyring", - "rfd 0.15.3", + "rfd 0.15.4", "rust-embed", "rust-i18n", "serde", @@ -8443,15 +8430,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -8675,6 +8662,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -9698,7 +9691,7 @@ dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -10079,7 +10072,7 @@ dependencies = [ "serde_spanned", "toml_datetime", "toml_write", - "winnow 0.7.11", + "winnow 0.7.12", ] [[package]] @@ -10769,6 +10762,66 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.44", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +dependencies = [ + "bitflags 2.9.1", + "rustix 0.38.44", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +dependencies = [ + "bitflags 2.9.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -11440,9 +11493,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -11542,7 +11595,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.7", + "rustix 1.0.8", ] [[package]] @@ -11641,9 +11694,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" +checksum = "4bb4f9a464286d42851d18a605f7193b8febaf5b0919d71c6399b7b26e5b0aad" dependencies = [ "async-broadcast", "async-recursion", @@ -11661,8 +11714,8 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.11", - "zbus_macros 5.8.0", + "winnow 0.7.12", + "zbus_macros 5.9.0", "zbus_names 4.2.0", "zvariant 5.6.0", ] @@ -11682,9 +11735,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.8.0" +version = "5.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" +checksum = "ef9859f68ee0c4ee2e8cde84737c78e3f4c54f946f2a38645d0d4c7a95327659" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", @@ -11714,7 +11767,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.11", + "winnow 0.7.12", "zvariant 5.6.0", ] @@ -11906,7 +11959,7 @@ dependencies = [ "enumflags2", "serde", "url", - "winnow 0.7.11", + "winnow 0.7.12", "zvariant_derive 5.6.0", "zvariant_utils 3.2.0", ] @@ -11959,5 +12012,5 @@ dependencies = [ "serde", "static_assertions", "syn 2.0.104", - "winnow 0.7.11", + "winnow 0.7.12", ] diff --git a/Cargo.toml b/Cargo.toml index 64ef4ed0..64358c4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -108,8 +108,8 @@ cfg-if = "1.0.1" chacha20poly1305 = { version = "0.10.1" } chrono = { version = "0.4.41", features = ["serde"] } clap = { version = "4.5.41", features = ["derive", "env"] } -const-str = { version = "0.6.2", features = ["std", "proc"] } -crc32fast = "1.4.2" +const-str = { version = "0.6.3", features = ["std", "proc"] } +crc32fast = "1.5.0" criterion = { version = "0.5", features = ["html_reports"] } dashmap = "6.1.0" datafusion = "46.0.1" @@ -196,7 +196,7 @@ reqwest = { version = "0.12.22", default-features = false, features = [ "json", "blocking", ] } -rfd = { version = "0.15.3", default-features = false, features = [ +rfd = { version = "0.15.4", default-features = false, features = [ "xdg-portal", "tokio", ] } diff --git a/Dockerfile b/Dockerfile index 18c72c81..e932ebe9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,121 +1,94 @@ # Multi-stage build for RustFS production image -FROM alpine:latest AS build -# Build arguments - use TARGETPLATFORM for consistency with Dockerfile.source +# Build stage: Download and extract RustFS binary +FROM alpine:3.22 AS build + +# Build arguments for platform and release ARG TARGETPLATFORM ARG BUILDPLATFORM ARG RELEASE=latest -# Install dependencies for downloading and verifying binaries -RUN apk add --no-cache \ - ca-certificates \ - curl \ - bash \ - wget \ - unzip \ - jq +# Install minimal dependencies for downloading and extracting +RUN apk add --no-cache ca-certificates curl unzip # Create build directory WORKDIR /build -# Map TARGETPLATFORM to architecture format used in builds +# Map TARGETPLATFORM to architecture RUN case "${TARGETPLATFORM}" in \ "linux/amd64") ARCH="x86_64" ;; \ "linux/arm64") ARCH="aarch64" ;; \ - *) echo "Unsupported platform: ${TARGETPLATFORM}" && exit 1 ;; \ + *) echo "Unsupported platform: ${TARGETPLATFORM}" >&2 && exit 1 ;; \ esac && \ echo "ARCH=${ARCH}" > /build/arch.env -# Download rustfs binary from dl.rustfs.com (release channel only) +# Download and extract RustFS binary RUN . /build/arch.env && \ BASE_URL="https://dl.rustfs.com/artifacts/rustfs/release" && \ - PLATFORM="linux" && \ - if [ "${RELEASE}" = "latest" ]; then \ - # Download latest release version \ - PACKAGE_NAME="rustfs-${PLATFORM}-${ARCH}-latest.zip"; \ - DOWNLOAD_URL="${BASE_URL}/${PACKAGE_NAME}"; \ - echo "📥 Downloading latest release build: ${PACKAGE_NAME}"; \ - else \ - # Download specific release version \ - PACKAGE_NAME="rustfs-${PLATFORM}-${ARCH}-v${RELEASE}.zip"; \ - DOWNLOAD_URL="${BASE_URL}/${PACKAGE_NAME}"; \ - echo "📥 Downloading specific release version: ${PACKAGE_NAME}"; \ - fi && \ - echo "🔗 Download URL: ${DOWNLOAD_URL}" && \ - curl -f -L "${DOWNLOAD_URL}" -o /build/rustfs.zip && \ - if [ ! -f /build/rustfs.zip ] || [ ! -s /build/rustfs.zip ]; then \ - echo "❌ Failed to download binary package"; \ - echo "💡 Make sure the package ${PACKAGE_NAME} exists"; \ - echo "🔗 Check: ${DOWNLOAD_URL}"; \ - exit 1; \ - fi && \ - unzip /build/rustfs.zip -d /build && \ + PACKAGE_NAME="rustfs-linux-${ARCH}-${RELEASE}.zip" && \ + DOWNLOAD_URL="${BASE_URL}/${PACKAGE_NAME}" && \ + echo "Downloading ${PACKAGE_NAME} from ${DOWNLOAD_URL}" >&2 && \ + curl -f -L "${DOWNLOAD_URL}" -o rustfs.zip && \ + unzip rustfs.zip -d /build && \ chmod +x /build/rustfs && \ - rm /build/rustfs.zip && \ - echo "✅ Successfully downloaded and extracted rustfs binary" + rm rustfs.zip || { echo "Failed to download or extract ${PACKAGE_NAME}" >&2; exit 1; } -# Runtime stage -FROM alpine:latest +# Runtime stage: Configure runtime environment +FROM alpine:3.22.1 -# Set build arguments and labels +# Build arguments and labels ARG RELEASE=latest ARG BUILD_DATE ARG VCS_REF LABEL name="RustFS" \ - vendor="RustFS Team" \ - maintainer="RustFS Team " \ - version="${RELEASE}" \ - release="${RELEASE}" \ - build-date="${BUILD_DATE}" \ - vcs-ref="${VCS_REF}" \ - summary="RustFS is a high-performance distributed object storage system written in Rust, compatible with S3 API." \ - description="RustFS is a high-performance distributed object storage software built using Rust. It supports erasure coding storage, multi-tenant management, observability, and other enterprise-level features." \ - url="https://rustfs.com" \ - license="Apache-2.0" + vendor="RustFS Team" \ + maintainer="RustFS Team " \ + version="${RELEASE}" \ + release="${RELEASE}" \ + build-date="${BUILD_DATE}" \ + vcs-ref="${VCS_REF}" \ + summary="High-performance distributed object storage system compatible with S3 API" \ + description="RustFS is a distributed object storage system written in Rust, supporting erasure coding, multi-tenant management, and observability." \ + url="https://rustfs.com" \ + license="Apache-2.0" # Install runtime dependencies -RUN apk add --no-cache \ - ca-certificates \ - bash \ - && addgroup -g 1000 rustfs \ - && adduser -u 1000 -G rustfs -s /bin/sh -D rustfs +RUN echo "https://dl-cdn.alpinelinux.org/alpine/v3.20/community" >> /etc/apk/repositories && \ + apk update && \ + apk add --no-cache ca-certificates bash gosu && \ + addgroup -g 1000 rustfs && \ + adduser -u 1000 -G rustfs -s /bin/bash -D rustfs -# Environment variables -ENV RUSTFS_ACCESS_KEY=rustfsadmin \ +# Copy CA certificates and RustFS binary from build stage +COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=build /build/rustfs /usr/bin/rustfs + +# Copy entry point script +COPY entrypoint.sh /entrypoint.sh + +# Set permissions +RUN chmod +x /usr/bin/rustfs /entrypoint.sh && \ + mkdir -p /data /logs && \ + chown rustfs:rustfs /data /logs && \ + chmod 700 /data /logs + +# Environment variables (credentials should be set via environment or secrets) +ENV RUSTFS_ADDRESS=":9000" \ + RUSTFS_ACCESS_KEY=rustfsadmin \ RUSTFS_SECRET_KEY=rustfsadmin \ - RUSTFS_ADDRESS=":9000" \ RUSTFS_CONSOLE_ENABLE=true \ RUSTFS_VOLUMES=/data \ RUST_LOG=warn \ -# Directory where RustFS stores observability logs. Ensure this path exists and has appropriate permissions. - RUSTFS_OBS_LOG_DIRECTORY=/logs - -# Set permissions for /usr/bin (similar to MinIO's approach) -RUN chmod -R 755 /usr/bin - -# Copy CA certificates and binaries from build stage -COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ -COPY --from=build /build/rustfs /usr/bin/ - -# Set executable permissions -RUN chmod +x /usr/bin/rustfs - -# Create data directory -RUN mkdir -p /data /logs && chown -R rustfs:rustfs /data /logs - -# Switch to non-root user -USER rustfs - -# Set working directory -WORKDIR /data + RUSTFS_OBS_LOG_DIRECTORY=/logs \ + RUSTFS_SINKS_FILE_PATH=/logs # Expose port EXPOSE 9000 +# Volumes for data and logs +VOLUME ["/data", "/logs"] -# Volume for data -VOLUME ["/data"] - -# Set entrypoint -ENTRYPOINT ["/usr/bin/rustfs"] +# Set entry point +ENTRYPOINT ["/entrypoint.sh"] +CMD ["/usr/bin/rustfs"] \ No newline at end of file diff --git a/crates/config/src/constants/app.rs b/crates/config/src/constants/app.rs index f397203b..b2a74e91 100644 --- a/crates/config/src/constants/app.rs +++ b/crates/config/src/constants/app.rs @@ -108,14 +108,26 @@ pub const DEFAULT_CONSOLE_ADDRESS: &str = concat!(":", DEFAULT_CONSOLE_PORT); /// It is used to store the logs of the application. /// Default value: rustfs.log /// Environment variable: RUSTFS_OBSERVABILITY_LOG_FILENAME -pub const DEFAULT_LOG_FILENAME: &str = "rustfs.log"; +pub const DEFAULT_LOG_FILENAME: &str = "rustfs"; + +/// Default OBS log filename for rustfs +/// This is the default log filename for OBS. +/// It is used to store the logs of the application. +/// Default value: rustfs.log +pub const DEFAULT_OBS_LOG_FILENAME: &str = concat!(DEFAULT_LOG_FILENAME, ".log"); + +/// Default sink file log file for rustfs +/// This is the default sink file log file for rustfs. +/// It is used to store the logs of the application. +/// Default value: rustfs-sink.log +pub const DEFAULT_SINK_FILE_LOG_FILE: &str = concat!(DEFAULT_LOG_FILENAME, "-sink.log"); /// Default log directory for rustfs /// This is the default log directory for rustfs. /// It is used to store the logs of the application. /// Default value: logs /// Environment variable: RUSTFS_OBSERVABILITY_LOG_DIRECTORY -pub const DEFAULT_LOG_DIR: &str = "deploy/logs"; +pub const DEFAULT_LOG_DIR: &str = "/logs"; /// Default log rotation size mb for rustfs /// This is the default log rotation size for rustfs. diff --git a/crates/obs/src/config.rs b/crates/obs/src/config.rs index 0ddeab57..854273a3 100644 --- a/crates/obs/src/config.rs +++ b/crates/obs/src/config.rs @@ -14,7 +14,8 @@ use rustfs_config::{ APP_NAME, DEFAULT_LOG_DIR, DEFAULT_LOG_FILENAME, DEFAULT_LOG_KEEP_FILES, DEFAULT_LOG_LEVEL, DEFAULT_LOG_ROTATION_SIZE_MB, - DEFAULT_LOG_ROTATION_TIME, ENVIRONMENT, METER_INTERVAL, SAMPLE_RATIO, SERVICE_VERSION, USE_STDOUT, + DEFAULT_LOG_ROTATION_TIME, DEFAULT_OBS_LOG_FILENAME, DEFAULT_SINK_FILE_LOG_FILE, ENVIRONMENT, METER_INTERVAL, SAMPLE_RATIO, + SERVICE_VERSION, USE_STDOUT, }; use serde::{Deserialize, Serialize}; use std::env; @@ -104,7 +105,7 @@ impl OtelConfig { log_filename: env::var("RUSTFS_OBS_LOG_FILENAME") .ok() .and_then(|v| v.parse().ok()) - .or(Some(DEFAULT_LOG_FILENAME.to_string())), + .or(Some(DEFAULT_OBS_LOG_FILENAME.to_string())), log_rotation_size_mb: env::var("RUSTFS_OBS_LOG_ROTATION_SIZE_MB") .ok() .and_then(|v| v.parse().ok()) @@ -210,16 +211,15 @@ pub struct FileSinkConfig { impl FileSinkConfig { pub fn get_default_log_path() -> String { - let temp_dir = env::temp_dir().join("rustfs"); - + let temp_dir = env::temp_dir().join(DEFAULT_LOG_FILENAME); if let Err(e) = std::fs::create_dir_all(&temp_dir) { eprintln!("Failed to create log directory: {e}"); - return "rustfs/rustfs.log".to_string(); + return DEFAULT_LOG_DIR.to_string(); } temp_dir - .join("rustfs.log") + .join(DEFAULT_SINK_FILE_LOG_FILE) .to_str() - .unwrap_or("rustfs/rustfs.log") + .unwrap_or(DEFAULT_LOG_DIR) .to_string() } pub fn new() -> Self { diff --git a/crates/obs/src/logger.rs b/crates/obs/src/logger.rs index 0cd4e885..1f109e40 100644 --- a/crates/obs/src/logger.rs +++ b/crates/obs/src/logger.rs @@ -77,8 +77,7 @@ impl Logger { } /// Asynchronous logging of unified log entries - #[tracing::instrument(skip(self), fields(log_source = "logger"))] - #[tracing::instrument(level = "error", skip_all)] + #[tracing::instrument(skip_all, fields(log_source = "logger"))] pub async fn log_entry(&self, entry: UnifiedLogEntry) -> Result<(), GlobalError> { // Extract information for tracing based on entry type match &entry { diff --git a/crates/obs/src/sinks/mod.rs b/crates/obs/src/sinks/mod.rs index 5ff5a7fa..dc2752be 100644 --- a/crates/obs/src/sinks/mod.rs +++ b/crates/obs/src/sinks/mod.rs @@ -14,6 +14,7 @@ use crate::{AppConfig, SinkConfig, UnifiedLogEntry}; use async_trait::async_trait; +use rustfs_config::DEFAULT_SINK_FILE_LOG_FILE; use std::sync::Arc; #[cfg(feature = "file")] @@ -71,7 +72,7 @@ pub async fn create_sinks(config: &AppConfig) -> Vec> { SinkConfig::File(file_config) => { tracing::debug!("FileSink: Using path: {}", file_config.path); match file::FileSink::new( - file_config.path.clone(), + format!("{}/{}", file_config.path.clone(), DEFAULT_SINK_FILE_LOG_FILE), file_config.buffer_size.unwrap_or(8192), file_config.flush_interval_ms.unwrap_or(1000), file_config.flush_threshold.unwrap_or(100), diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 00000000..6ea3c5bb --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,51 @@ +#!/bin/bash +set -e + +# Function to adjust rustfs user/group to match mounted directory ownership +fix_permissions() { + local dir="$1" + local user="rustfs" + local group="rustfs" + + # Skip if directory doesn't exist or isn't mounted + if [ ! -d "$dir" ]; then + echo "Directory $dir does not exist, creating it" + mkdir -p "$dir" + chown "$user:$group" "$dir" + chmod 700 "$dir" + return + fi + + # Get directory ownership + local dir_uid=$(stat -c %u "$dir") + local dir_gid=$(stat -c %g "$dir") + + # If directory is owned by root or inaccessible, skip adjustment + if [ "$dir_uid" = "0" ] || [ "$dir_gid" = "0" ]; then + echo "Warning: Directory $dir is owned by root, skipping UID/GID adjustment" + chown "$user:$group" "$dir" + chmod 700 "$dir" + return + fi + + # Adjust rustfs user/group to match directory ownership + if [ "$dir_uid" != "$(id -u $user)" ]; then + echo "Adjusting UID of $user to $dir_uid for $dir" + usermod -u "$dir_uid" "$user" + fi + if [ "$dir_gid" != "$(id -g $group)" ]; then + echo "Adjusting GID of $group to $dir_gid for $dir" + groupmod -g "$dir_gid" "$group" + fi + + # Ensure permissions are correct + chown "$user:$group" "$dir" + chmod 700 "$dir" +} + +# Fix permissions for /data and /logs +fix_permissions "/data" +fix_permissions "/logs" + +# Run RustFS as the rustfs user +exec gosu rustfs:rustfs "$@" \ No newline at end of file diff --git a/scripts/run.sh b/scripts/run.sh index 60314fad..44987d78 100755 --- a/scripts/run.sh +++ b/scripts/run.sh @@ -51,7 +51,7 @@ export RUSTFS_CONSOLE_ADDRESS=":9001" # export RUSTFS_TLS_PATH="./deploy/certs" # 可观测性 相关配置信息 -export RUSTFS_OBS_ENDPOINT=http://localhost:4317 # OpenTelemetry Collector 的地址 +#export RUSTFS_OBS_ENDPOINT=http://localhost:4317 # OpenTelemetry Collector 的地址 #export RUSTFS_OBS_USE_STDOUT=false # 是否使用标准输出 #export RUSTFS_OBS_SAMPLE_RATIO=2.0 # 采样率,0.0-1.0之间,0.0表示不采样,1.0表示全部采样 #export RUSTFS_OBS_METER_INTERVAL=1 # 采样间隔,单位为秒