From 24dd9e5b94e1d504ff4c6cbdc7879c60957e6068 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 19 Oct 2026 12:25:36 +0000 Subject: [PATCH] docs: revise remaining US English in the English docs Apply the leftover editorial fixes from the US English audit: correct the HTTP-only and max_object_size claims, rewrite the scanner and drive-replacement pages against documented behavior, and sentence-case the older install, SDK, and checklist pages. Sync changed code fences in de, fr, ja, and zh so locale parity still holds. Co-authored-by: hector --- content/de/developer/mcp.md | 6 +- content/de/developer/sdk/java.md | 2 +- content/de/developer/sdk/other.md | 2 +- content/de/developer/sdk/python.md | 2 +- .../linux/multiple-node-multiple-disk.md | 3 +- .../checklists/hardware-checklists.md | 6 +- content/de/integration/virtual.md | 10 +- content/de/troubleshooting/driver.md | 30 ++--- content/en/administration/console/index.md | 2 +- .../en/administration/data/bucket/creation.md | 8 +- .../en/administration/data/bucket/deletion.md | 10 +- .../en/administration/data/bucket/quota.md | 2 +- .../administration/data/bucket/replication.md | 2 +- .../en/administration/data/object/creation.md | 18 +-- .../en/administration/data/object/deletion.md | 8 +- .../data/object/multipart-upload.md | 2 +- .../administration/data/object/object-lock.md | 6 +- .../en/administration/data/object/scanner.md | 48 ++++--- .../administration/data/object/versioning.md | 2 +- .../en/administration/data/tiered-storage.md | 4 +- content/en/developer/license.md | 2 +- content/en/developer/mcp.md | 34 ++--- content/en/developer/sdk/index.md | 2 +- content/en/developer/sdk/java.md | 54 +++----- content/en/developer/sdk/javascript.md | 18 +-- content/en/developer/sdk/other.md | 16 +-- content/en/developer/sdk/python.md | 36 +++--- content/en/developer/sdk/rust.md | 16 +-- content/en/developer/sdk/typescript.md | 16 +-- content/en/installation/cloud-native/index.md | 2 +- content/en/installation/container/docker.md | 2 +- content/en/installation/index.md | 2 +- content/en/installation/linux/index.md | 8 +- .../linux/multiple-node-multiple-disk.md | 17 ++- .../linux/prerequisites-and-service.md | 33 +++-- content/en/installation/linux/quick-start.md | 6 +- .../linux/single-node-multiple-disk.md | 14 +- .../linux/single-node-single-disk.md | 12 +- content/en/installation/macos/index.md | 20 +-- .../checklists/hardware-checklists.md | 40 +++--- .../checklists/hardware-selection.md | 8 +- .../requirement/checklists/index.md | 4 +- .../requirement/checklists/meta.json | 2 +- .../checklists/network-checklists.md | 24 ++-- .../checklists/security-checklists.md | 18 +-- .../checklists/software-checklists.md | 25 ++-- content/en/integration/virtual.md | 57 ++++---- content/en/operations/cluster-lifecycle.md | 2 +- .../en/operations/scaling/data-rebalancing.md | 4 +- .../scaling/storage-pool-decommission.md | 4 +- .../scaling/storage-pool-expansion.md | 4 +- content/en/operations/status-check.md | 8 +- .../security-compliance/iam/access-token.md | 8 +- content/en/security-compliance/iam/sts.md | 2 +- content/en/troubleshooting/driver.md | 122 ++++++------------ content/en/troubleshooting/index.md | 8 +- content/en/troubleshooting/node.md | 28 ++-- content/fr/developer/mcp.md | 6 +- content/fr/developer/sdk/java.md | 2 +- content/fr/developer/sdk/other.md | 2 +- content/fr/developer/sdk/python.md | 2 +- .../linux/multiple-node-multiple-disk.md | 3 +- .../checklists/hardware-checklists.md | 6 +- content/fr/integration/virtual.md | 10 +- content/fr/troubleshooting/driver.md | 30 ++--- content/ja/developer/mcp.md | 6 +- content/ja/developer/sdk/java.md | 2 +- content/ja/developer/sdk/other.md | 2 +- content/ja/developer/sdk/python.md | 2 +- .../linux/multiple-node-multiple-disk.md | 3 +- .../checklists/hardware-checklists.md | 6 +- content/ja/integration/virtual.md | 10 +- content/ja/troubleshooting/driver.md | 30 ++--- content/zh/developer/mcp.md | 6 +- content/zh/developer/sdk/java.md | 2 +- content/zh/developer/sdk/other.md | 2 +- content/zh/developer/sdk/python.md | 2 +- .../linux/multiple-node-multiple-disk.md | 3 +- .../checklists/hardware-checklists.md | 6 +- content/zh/integration/virtual.md | 10 +- content/zh/troubleshooting/driver.md | 30 ++--- 81 files changed, 465 insertions(+), 569 deletions(-) diff --git a/content/de/developer/mcp.md b/content/de/developer/mcp.md index 85b5bd0ec..9082f7bb3 100644 --- a/content/de/developer/mcp.md +++ b/content/de/developer/mcp.md @@ -86,7 +86,7 @@ Der Server unterstützt mehrere Befehlszeilenoptionen, mit denen Sie das Verhalt rustfs-mcp # Or with custom options -rustfs-mcp --log-level debug --region us-west-2 +rustfs-mcp --log-level debug --region us-east-1 ``` ### Integration mit Chat-Clients @@ -101,7 +101,7 @@ rustfs-mcp --log-level debug --region us-west-2 "args": [ "--access-key-id", "your_access_key", "--secret-access-key", "your_secret_key", - "--region", "us-west-2", + "--region", "us-east-1", "--log-level", "info" ] } @@ -183,7 +183,7 @@ Wenn der Server erfolgreich hinzugefügt wurde, listet die MCP-Konfigurationssei Um in Trae ein MCP-Tool aufzurufen, geben Sie im Chat eine Eingabeaufforderung ein. Zum Beispiel: ```text -Please help me list the buckets in the current rustfs instance, thank you! +List the buckets in this RustFS instance. ``` Trae gibt die folgende Antwort zurück: diff --git a/content/de/developer/sdk/java.md b/content/de/developer/sdk/java.md index 878955bab..d1212312a 100644 --- a/content/de/developer/sdk/java.md +++ b/content/de/developer/sdk/java.md @@ -217,7 +217,7 @@ GetObjectRequest getObjectRequest = GetObjectRequest.builder() GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .getObjectRequest(getObjectRequest) - .signatureDuration(Duration.ofMinutes(15)) // 15 minutes validity + .signatureDuration(Duration.ofMinutes(15)) // expires in 15 minutes .build(); PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest); diff --git a/content/de/developer/sdk/other.md b/content/de/developer/sdk/other.md index 8f31b457c..226ca12e3 100644 --- a/content/de/developer/sdk/other.md +++ b/content/de/developer/sdk/other.md @@ -30,7 +30,7 @@ Wenn Sie Signaturen nicht selbst implementieren möchten, können Sie: Führen Sie zum Beispiel den folgenden Befehl aus Ihrer Anwendung über eine Shell aus: ```bash -aws s3 cp local.txt s3://mybucket/myfile.txt --endpoint-url http://rustfs.local:9000 +aws s3 cp /path/to/hello.txt s3://my-bucket/hello.txt --endpoint-url http://localhost:9000 ``` Alternativ bauen Sie einen kleinen Relay-Dienst mit einem SDK für Node.js oder Python und rufen ihn aus Ihrer Anwendung auf, um Objekte hoch- oder herunterzuladen. diff --git a/content/de/developer/sdk/python.md b/content/de/developer/sdk/python.md index 217b6ebda..304845251 100644 --- a/content/de/developer/sdk/python.md +++ b/content/de/developer/sdk/python.md @@ -172,7 +172,7 @@ Bucket deleted. url = s3.generate_presigned_url( ClientMethod='get_object', Params={'Bucket': bucket_name, 'Key': 'hello.txt'}, - ExpiresIn=600, # 10 minutes validity + ExpiresIn=600, # expires in 10 minutes ) print('Presigned GET URL:', url) diff --git a/content/de/installation/linux/multiple-node-multiple-disk.md b/content/de/installation/linux/multiple-node-multiple-disk.md index fd382d008..78c591ead 100644 --- a/content/de/installation/linux/multiple-node-multiple-disk.md +++ b/content/de/installation/linux/multiple-node-multiple-disk.md @@ -43,8 +43,7 @@ Legen Sie DNS-Einträge an, sodass jeder fortlaufende Hostname auf den richtigen Tragen Sie auf jedem Knoten die folgenden Einträge in `/etc/hosts` ein: -```bash title="/etc/hosts" -vim /etc/hosts +```text title="/etc/hosts" 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 diff --git a/content/de/installation/requirement/checklists/hardware-checklists.md b/content/de/installation/requirement/checklists/hardware-checklists.md index 56245681d..06908dc00 100644 --- a/content/de/installation/requirement/checklists/hardware-checklists.md +++ b/content/de/installation/requirement/checklists/hardware-checklists.md @@ -123,11 +123,7 @@ def calc_memory(data_tb, access_pattern): ### Dateisystemkonfiguration ```bash -# XFS formatting example -mkfs.xfs -f -L rustfs_disk1 -d su=256k,sw=10 /dev/sdb - -# Recommended mount parameters -UUID=xxxx /mnt/disk1 xfs defaults,noatime,nodiratime,logbsize=256k 0 0 +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` ## Hochverfügbarkeit diff --git a/content/de/integration/virtual.md b/content/de/integration/virtual.md index 65344c16d..09a06da99 100644 --- a/content/de/integration/virtual.md +++ b/content/de/integration/virtual.md @@ -17,7 +17,7 @@ Die pfadbasierte Adressierung ist der Standard. In einer pfadbasierten URL folgt Beispiel (Bucket: `test`, Host: `rustfs.yourdomain.com`): ```text -http://rustfs.yourdomain.com/test +http://rustfs.example.com/my-bucket ``` **Hinweis**: Für die pfadbasierte Adressierung ist keine Konfiguration erforderlich. @@ -29,7 +29,7 @@ Bei der Adressierung im Virtual-Hosted-Stil ist der Bucket-Name Teil der Domain. Beispiel (Bucket: `test`, Host: `rustfs.yourdomain.com`): ```text -http://test.rustfs.yourdomain.com/ +http://my-bucket.rustfs.example.com/ ``` ### Konfiguration @@ -45,14 +45,14 @@ Das Routing im Virtual-Hosted-Stil gilt für den Listener der S3-API (standardm Beispiel (`rustfs.yourdomain.com:8000`): -```ini -RUSTFS_SERVER_DOMAINS = "rustfs.yourdomain.com:8000" +```ini title="/etc/default/rustfs" +RUSTFS_SERVER_DOMAINS=rustfs.example.com:8000 ``` Damit werden Anfragen wie diese korrekt weitergeleitet: ```text -http://my-bucket.rustfs.yourdomain.com:8000/ +http://my-bucket.rustfs.example.com:8000/ ``` Die Weiterleitung verwendet die Adressierung im Virtual-Hosted-Stil. diff --git a/content/de/troubleshooting/driver.md b/content/de/troubleshooting/driver.md index e6e16b42b..49a76f036 100644 --- a/content/de/troubleshooting/driver.md +++ b/content/de/troubleshooting/driver.md @@ -12,8 +12,7 @@ RustFS verwendet Erasure Coding, damit Daten lesbar und schreibbar bleiben, wenn Hängen Sie das ausgefallene Laufwerk auf Betriebssystemebene aus, bevor Sie die physische Festplatte ersetzen. So vermeiden Sie I/O-Fehler im Dateisystem oder in RustFS während des Austauschs. ```bash -# Assume the failed disk is /dev/sdb -umount /dev/sdb +sudo umount /data/rustfs0 ``` :::note[Hinweise] @@ -22,7 +21,7 @@ umount /dev/sdb * Wenn Sie den Fehler „device is busy“ sehen, stoppen Sie zuerst den RustFS-Dienst: ```bash -systemctl stop rustfs +sudo systemctl stop rustfs ``` ::: @@ -34,8 +33,7 @@ systemctl stop rustfs Nachdem Sie das ausgefallene Laufwerk physisch ersetzt haben, partitionieren und formatieren Sie das neue Laufwerk und vergeben Sie dieselbe Bezeichnung wie beim ursprünglichen Laufwerk. ```bash -# Format as XFS and apply the same label as the original disk (RustFS requires XFS, like the other disks in the deployment) -mkfs.xfs -L DISK1 /dev/sdb +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` :::note[Anforderungen] @@ -52,12 +50,8 @@ mkfs.xfs -L DISK1 /dev/sdb Prüfen Sie, dass Bezeichnungen oder UUIDs in den Einträgen von `/etc/fstab` auf das neue Laufwerk zeigen. Der Einhängepunkt muss mit dem in `RUSTFS_VOLUMES` (in `/etc/default/rustfs`) genannten identisch bleiben, damit das wiederhergestellte Laufwerk dem Cluster unter demselben Pfad beitritt. -```bash -# View current fstab -cat /etc/fstab - -# Example fstab entry (no modification needed if labels are the same) -LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 +```ini title="/etc/fstab" +UUID= /data/rustfs0 xfs defaults,noatime,nodiratime 0 0 ``` :::tip[Tipps] @@ -65,14 +59,14 @@ LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 * Bei Verwendung einer UUID: ```bash -blkid /dev/sdb -# Get the new partition's UUID, then replace the corresponding field in fstab +sudo blkid -s UUID -o value /dev/sdb ``` * Nachdem Sie `/etc/fstab` bearbeitet haben, prüfen Sie die Syntax: ```bash -mount -a # If no errors, configuration is correct +sudo mount -a +findmnt /data/rustfs0 ``` ::: @@ -84,14 +78,13 @@ mount -a # If no errors, configuration is correct Führen Sie die folgenden Befehle aus, um alle konfigurierten Dateisysteme einzuhängen und RustFS zu starten: ```bash -mount -a -systemctl start rustfs +sudo systemctl start rustfs ``` Prüfen Sie, dass alle erwarteten Dateisysteme eingehängt sind: ```bash -df -h | grep /data/rustfs +df -hT /data/rustfs0 ``` :::note[Fehler beim Einhängen] @@ -107,10 +100,7 @@ Wenn ein Einhängen fehlschlägt, prüfen Sie, dass Bezeichnungen oder UUIDs in Sobald RustFS an einem bekannten Einhängepunkt ein frisch formatiertes Laufwerk erkennt, stellt der Hintergrund-Scanner die fehlenden Daten automatisch darauf wieder her. Ein manueller Befehl ist nicht erforderlich. Bestätigen Sie, dass die Wiederherstellung begonnen hat, und verfolgen Sie den Fortschritt in den Dienstprotokollen: ```bash -# For systemd-managed installations journalctl -u rustfs -f - -# Or view the log files under the directory set by RUSTFS_OBS_LOG_DIRECTORY tail -f /var/log/rustfs/rustfs.log ``` diff --git a/content/en/administration/console/index.md b/content/en/administration/console/index.md index 0877c14cf..80f690097 100644 --- a/content/en/administration/console/index.md +++ b/content/en/administration/console/index.md @@ -35,7 +35,7 @@ For a local deployment, including the Windows and macOS desktop launchers, open If the login page cannot reach the target RustFS service, select **Server Configuration** or open `/config`. Enter the externally reachable RustFS service address and save it after the health check succeeds. **Reset** clears the saved address; **Skip** returns to login without changing it. -## Log in +## Sign in The login methods shown depend on the deployment configuration: diff --git a/content/en/administration/data/bucket/creation.md b/content/en/administration/data/bucket/creation.md index 97caf8b40..b90040a58 100644 --- a/content/en/administration/data/bucket/creation.md +++ b/content/en/administration/data/bucket/creation.md @@ -1,9 +1,9 @@ --- -title: "Create a Bucket" -description: "Create buckets using the RustFS UI, rc, or the S3 API." +title: "Create a bucket" +description: "Create a bucket on the Console, with rc, or with the S3 API." --- -This guide explains how to create buckets using the RustFS UI, `rc`, or the S3 API. +This guide explains how to create a bucket on the Console, with `rc`, or with the S3 API. ## Requirements @@ -12,7 +12,7 @@ This guide explains how to create buckets using the RustFS UI, `rc`, or the S3 A ## Use the RustFS Console -1. Log in to the RustFS Console. +1. Sign in to the RustFS Console. 2. On the Buckets page, in the top right corner, select **Create Bucket**. 3. Enter a bucket name and select **Create**. diff --git a/content/en/administration/data/bucket/deletion.md b/content/en/administration/data/bucket/deletion.md index 2bb4fdaf9..8aaa25798 100644 --- a/content/en/administration/data/bucket/deletion.md +++ b/content/en/administration/data/bucket/deletion.md @@ -1,9 +1,9 @@ --- -title: "RustFS Bucket Deletion" -description: "Delete buckets using the RustFS UI, rc, or the S3 API." +title: "Delete a bucket" +description: "Delete a bucket on the Console, with rc, or with the S3 API." --- -This guide explains how to delete buckets using the RustFS UI, `rc`, or the S3 API. +This guide explains how to delete a bucket on the Console, with `rc`, or with the S3 API. ## Requirements @@ -16,9 +16,9 @@ Deleting a bucket is irreversible and can break applications that depend on it. ::: -## Using the RustFS UI +## Use the RustFS Console -1. Log in to the RustFS Console. +1. Sign in to the RustFS Console. 2. On the homepage, select the bucket you want to delete. 3. On the far right, select the **Delete** button. 4. In the confirmation dialog, select **Confirm**. diff --git a/content/en/administration/data/bucket/quota.md b/content/en/administration/data/bucket/quota.md index ef975aac0..fd0d95e7f 100644 --- a/content/en/administration/data/bucket/quota.md +++ b/content/en/administration/data/bucket/quota.md @@ -26,7 +26,7 @@ The quota check reserves the full incoming object size against the bucket's curr ::: -## Configure in the Console +## Configure on the Console 1. Sign in to the RustFS Console and open **Browser**. 2. Find the bucket and select **Settings**. diff --git a/content/en/administration/data/bucket/replication.md b/content/en/administration/data/bucket/replication.md index 37642ae90..0e839adb9 100644 --- a/content/en/administration/data/bucket/replication.md +++ b/content/en/administration/data/bucket/replication.md @@ -104,7 +104,7 @@ Do not suspend source-bucket versioning while replication is configured. ## Usage -### Configure replication in the Console +### Configure replication on the Console The RustFS Console combines remote-target registration and replication-rule configuration in one form. diff --git a/content/en/administration/data/object/creation.md b/content/en/administration/data/object/creation.md index 546a1aacf..474f8353e 100644 --- a/content/en/administration/data/object/creation.md +++ b/content/en/administration/data/object/creation.md @@ -1,21 +1,21 @@ --- -title: "Object Creation" -description: "Create objects using the RustFS UI, rc, or the S3 API." +title: "Create an object" +description: "Upload an object on the Console, with rc, or with the S3 API." --- -Objects are the fundamental storage units in RustFS, containing data, metadata, and a unique key. This guide covers object creation (upload). +An object is the data RustFS stores under a key, along with its metadata. This guide shows how to upload one. ## Requirements - A running RustFS instance (see [Installation Guide](../../../installation/index.md)). - [`rc`](/operations/rc) installed and configured with an alias for the command-line workflow. -- A target bucket. Create one by following [Bucket Creation](../bucket/creation.md). +- A target bucket. Create one by following [Create a bucket](../bucket/creation.md). -## Creating Objects +## Create an object -### Using the RustFS UI +### Use the RustFS Console -1. Log in to the RustFS Console. +1. Sign in to the RustFS Console. 2. Select the target bucket. 3. On the bucket page, in the top right corner, select **New Directory**, **New File**, or **Upload File/Folder**. 4. To upload from your local machine, click **Upload File/Folder**, select the files, and click **Start Upload**. @@ -59,9 +59,9 @@ aws s3api put-object \ Verify the upload in the RustFS Console. -## Deleting Objects +## Delete an object -See [Object Deletion](./deletion.md). +See [Delete an object](./deletion.md). To delete an object with the S3 API, use: diff --git a/content/en/administration/data/object/deletion.md b/content/en/administration/data/object/deletion.md index fa53e3672..617b285fb 100644 --- a/content/en/administration/data/object/deletion.md +++ b/content/en/administration/data/object/deletion.md @@ -1,6 +1,6 @@ --- -title: "Object Deletion" -description: "Delete objects using the RustFS UI, rc, or the S3 API." +title: "Delete an object" +description: "Delete an object on the Console, with rc, or with the S3 API." --- This guide covers object deletion. @@ -10,9 +10,9 @@ This guide covers object deletion. - Install and configure [`rc`](/operations/rc) before using the command-line workflow. - Confirm the alias, bucket, and object key before deleting an object. -## Using the RustFS UI +## Use the RustFS Console -1. Log in to the RustFS Console. +1. Sign in to the RustFS Console. 2. Select the bucket that contains the object you want to delete. 3. On the bucket page, select the file to be deleted. 4. Select **Delete Selected Items** in the upper-right corner, and then select **Confirm**. diff --git a/content/en/administration/data/object/multipart-upload.md b/content/en/administration/data/object/multipart-upload.md index 93877a8bd..c78f5c857 100644 --- a/content/en/administration/data/object/multipart-upload.md +++ b/content/en/administration/data/object/multipart-upload.md @@ -17,7 +17,7 @@ Abort an unfinished upload with **AbortMultipartUpload** so temporary parts do n RustFS accepts part numbers from `1` through `10000`. `ListParts` and `ListMultipartUploads` return at most 1,000 entries per response and use markers for pagination. The completed object appears only after the completion request succeeds. -## Upload in the Console +## Upload on the Console 1. Sign in to the RustFS Console and open the destination bucket. 2. Select **Upload File/Folder**. diff --git a/content/en/administration/data/object/object-lock.md b/content/en/administration/data/object/object-lock.md index c769ae64f..2786ea1ba 100644 --- a/content/en/administration/data/object/object-lock.md +++ b/content/en/administration/data/object/object-lock.md @@ -23,7 +23,7 @@ COMPLIANCE retention cannot be bypassed or shortened before its retain-until dat ::: -## Configure in the Console +## Configure on the Console 1. Sign in to the RustFS Console and open **Buckets**. 2. Select **Create Bucket** and enter the bucket name. @@ -50,7 +50,7 @@ rc alias set rustfs http://localhost:9000 \ :::note[Bucket creation limitation in rc 0.1.29] -`rc bucket create --with-lock` and `--with-versioning` appear in the `rc 0.1.29` help output but return `not implemented` when executed. Create the Object Lock bucket in the Console. The upload headers shown below are supported and were validated against RustFS. +`rc bucket create --with-lock` and `--with-versioning` appear in the `rc 0.1.29` help output but return `not implemented` when executed. Create the Object Lock bucket on the Console. The upload headers shown below are supported and were validated against RustFS. ::: @@ -84,7 +84,7 @@ rc object stat rustfs/my-bucket/hello.txt \ 1. Upload a test object with GOVERNANCE retention or Legal Hold. 2. Record its version ID with `rc bucket version list`. 3. Attempt to delete that exact version through an S3 client without bypass. RustFS must return `AccessDenied` while protection is active. -4. Confirm the version remains visible in the Console and through `rc object stat --version-id`. +4. Confirm the version remains visible on the Console and through `rc object stat --version-id`. For GOVERNANCE retention, test bypass only with a dedicated administrative identity that has `s3:BypassGovernanceRetention`. COMPLIANCE retention and Legal Hold remain protected from governance bypass. diff --git a/content/en/administration/data/object/scanner.md b/content/en/administration/data/object/scanner.md index 9c6616a65..579a26993 100644 --- a/content/en/administration/data/object/scanner.md +++ b/content/en/administration/data/object/scanner.md @@ -1,32 +1,44 @@ --- -title: "Object Scanning" -description: "Guide to the RustFS object scanner, including design, implementation, and monitoring." +title: "Object scanning" +description: "Control the RustFS background scanner, its bit-rot cycle, and the metrics that show scans are still running." --- -This guide covers the design and implementation of the RustFS object scanner, including how it works with erasure coding, scrubbing and repair, scheduling, metrics, and troubleshooting. +The background scanner walks buckets and drives, records usage, and can queue objects for healing. A separate cycle runs deeper bit-rot checks. Use this page to see what the scanner does, how to slow it down, and which metrics show that it is still running. -## Overview +## What the scanner does -The RustFS object scanner is built into the storage engine and is responsible for periodically checking object integrity and executing scheduled operations. -The scanner collects disk usage statistics, evaluates lifecycle rules, performs object replication, and triggers healing for corrupted objects. +On each cycle the scanner visits objects and directories and updates usage data. When it finds storage that needs repair, it can queue that object for healing. Healing runs on its own schedule. See [Node healing](/operations/high-availability/node-healing) for how reconstructed data is written back. -## Architecture and Design Principles +Deep bit-rot scans use a separate interval. `RUSTFS_SCANNER_BITROT_CYCLE_SECS` defaults to `2592000` (30 days). Set it to `0`, `true`, or `on` to make every cycle a deep scan, or to `false` or `off` to turn deep scans off. -### Scanner Architecture +Reads can also discover damage and submit repair work. That path is separate from the background cycle. -The RustFS scanner uses a hash sampling mechanism, selecting one out of every 1024 objects for inspection based on object name hashing to minimize performance impact. -The scanner works with the erasure coding layer: when it detects a missing or corrupted shard, it rebuilds the shard online from the remaining redundant shards. +## Control the scan rate -## Data Verification and Recovery +`RUSTFS_SCANNER_SPEED` selects a preset: `fastest`, `fast`, `default`, `slow`, or `slowest`. The preset sets how long the scanner sleeps between objects, the maximum sleep, and the cycle interval. Override one value at a time: -The RustFS data verification mechanism checks metadata consistency and reads and verifies data to detect latent bad sectors. The object scanner detects issues like bit rot and triggers repair processes when necessary. +| Variable | Default | Purpose | +| --- | --- | --- | +| `RUSTFS_SCANNER_DELAY` | preset | Sleep multiplier, for example `30.0` | +| `RUSTFS_SCANNER_MAX_WAIT_SECS` | preset | Maximum sleep, in seconds | +| `RUSTFS_SCANNER_CYCLE` | preset | Cycle interval, in seconds. An example override is `3600` | +| `RUSTFS_SCANNER_IDLE_MODE` | `true` | When `true`, the scanner throttles itself | -## Scanning Modes and Scheduling +Cycle budgets, startup delay, and concurrency caps are listed in the [environment variable reference](/reference/environment-variables). -RustFS supports three scanning modes that balance performance and reliability: inline checks during reads, periodic background scans, and manual full scans. -Similar to the `osd_scrub_begin_hour` configuration in Ceph, administrators can set scanning start times and frequency. For example, a lightweight check runs once a day by default. +## Monitor scans -## Monitoring and Metrics +With OpenTelemetry export enabled, use the scanner series documented in [Observability](/operations/observability): -The scanner reports the total number of tasks, the number of failures, and duration distribution as Prometheus metrics, such as `rustfs_scanner_jobs_total`, `rustfs_scanner_failures_total`, and `rustfs_scanner_duration_seconds`. -Configure alerts on scan failure rate and duration so you can detect and diagnose storage or network problems early. +- `rustfs_scanner_cycles_total` counts finished cycles and is labeled by result. +- `rustfs_scanner_objects_scanned_total` counts objects visited. +- `rustfs_scanner_inline_heal_total` counts objects the scanner queued for healing. +- `rustfs_scanner_cycle_duration_seconds` is the duration of the last completed cycle. + +If `rustfs_scanner_cycles_total` does not increase, treat the scanner as stalled and follow the alert hint on that page. Per-drive online state is shown on the Console and through the admin API, not as a dedicated scanner metric. + +## Next steps + +- [Replace a failed drive](/troubleshooting/driver) +- [Recover a failed node](/troubleshooting/node) +- [Monitor healing](/operations/high-availability/node-healing) diff --git a/content/en/administration/data/object/versioning.md b/content/en/administration/data/object/versioning.md index b6a5130ba..6b0a04301 100644 --- a/content/en/administration/data/object/versioning.md +++ b/content/en/administration/data/object/versioning.md @@ -16,7 +16,7 @@ When versioning is enabled: Suspending versioning stops normal creation of new version IDs but preserves existing versions and delete markers. Suspension is not the same as disabling or removing version history. -## Configure in the Console +## Configure on the Console ### Enable at bucket creation diff --git a/content/en/administration/data/tiered-storage.md b/content/en/administration/data/tiered-storage.md index d36257683..ece7de213 100644 --- a/content/en/administration/data/tiered-storage.md +++ b/content/en/administration/data/tiered-storage.md @@ -3,7 +3,7 @@ title: "Tiered Storage" description: "Configure lifecycle-driven object transitions from RustFS to a remote storage tier." --- -RustFS tiered storage moves objects from local storage to a configured remote backend. This page explains the supported targets and shows how to add and maintain a RustFS tier in the Console. +RustFS tiered storage moves objects from local storage to a configured remote backend. This page explains the supported targets and shows how to add and maintain a RustFS tier on the Console. Tiering is asynchronous. RustFS keeps the object metadata locally, transfers the object data to the remote tier, and continues to serve S3 reads through the original bucket and object key. @@ -94,7 +94,7 @@ Install and configure [`rc`](/operations/rc), then list the tiers registered on rc bucket lifecycle tier list local ``` -Add a RustFS tier with the same settings described in the Console workflow: +Add a RustFS tier with the same settings as the Console steps above: ```bash rc bucket lifecycle tier add rustfs COLDTIER local \ diff --git a/content/en/developer/license.md b/content/en/developer/license.md index f2910342b..15b70ee0f 100644 --- a/content/en/developer/license.md +++ b/content/en/developer/license.md @@ -13,7 +13,7 @@ description: RustFS is released under the Apache 2.0 license. _Version 2.0, January 2004_ http://www.apache.org/licenses/ -### Terms and Conditions for use, reproduction, and distribution +### Terms and Conditions for Use, Reproduction, and Distribution #### Definitions diff --git a/content/en/developer/mcp.md b/content/en/developer/mcp.md index 553e2e186..c26077590 100644 --- a/content/en/developer/mcp.md +++ b/content/en/developer/mcp.md @@ -11,7 +11,7 @@ The Model Context Protocol is an open standard that enables AI applications to e ## Features -### Supported S3 Operations +### Supported S3 operations - **List Buckets**: Lists all accessible S3 buckets. - **List Objects**: Browses bucket contents with optional prefix filtering. @@ -32,7 +32,7 @@ The `rustfs-mcp` crate is no longer part of the current `rustfs/rustfs` main bra - Configured AWS credentials (via environment variables, AWS CLI, or IAM roles) - Access to S3-compatible storage services -### Building from Source +### Build from source ```bash # Clone the repository @@ -48,7 +48,7 @@ cargo build --release -p rustfs-mcp ## Configuration -### Environment Variables +### Environment variables ```bash # AWS credentials (required) @@ -63,7 +63,7 @@ export AWS_ENDPOINT_URL=http://localhost:9000 export RUST_LOG=info ``` -### Command Line Options +### Command-line options ```bash rustfs-mcp --help @@ -79,19 +79,19 @@ The server supports various command line options to customize behavior: ## Usage -### Starting the Server +### Start the server ```bash # Start the MCP server rustfs-mcp # Or with custom options -rustfs-mcp --log-level debug --region us-west-2 +rustfs-mcp --log-level debug --region us-east-1 ``` -### Integration with Chat Clients +### Connect a chat client -#### Option 1: Using Command Line Arguments +#### Pass command-line arguments ```json { @@ -101,7 +101,7 @@ rustfs-mcp --log-level debug --region us-west-2 "args": [ "--access-key-id", "your_access_key", "--secret-access-key", "your_secret_key", - "--region", "us-west-2", + "--region", "us-east-1", "--log-level", "info" ] } @@ -109,7 +109,7 @@ rustfs-mcp --log-level debug --region us-west-2 } ``` -#### Option 2: Using Environment Variables +#### Pass environment variables ```json { @@ -126,7 +126,7 @@ rustfs-mcp --log-level debug --region us-west-2 } ``` -### Using with Docker +### Run with Docker RustFS MCP provides an [official Dockerfile](https://github.com/rustfs/rustfs/tree/main/crates/mcp) that you can use to build a container image. @@ -140,7 +140,7 @@ docker build -f crates/mcp/Dockerfile -t rustfs/rustfs-mcp . After the build succeeds, add the server to your IDE's MCP configuration. -#### Configuring MCP in AI IDEs +#### Configure MCP in an AI IDE Many AI IDEs, such as Cursor, Windsurf, and Trae, support MCP. For example, in Trae, add the following content to the MCP configuration (**MCP --> Add**): @@ -174,7 +174,11 @@ Many AI IDEs, such as Cursor, Windsurf, and Trae, support MCP. For example, in T } ``` -> `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are RustFS access keys. To create them, see [Access Key Management](../security-compliance/iam/access-token.md). +:::note[Access keys] + +`AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are RustFS access keys. To create them, see [Access keys](../security-compliance/iam/access-token.md). + +::: If the server is added successfully, the MCP configuration page lists its [available tools](#available-tools). @@ -183,12 +187,12 @@ If the server is added successfully, the MCP configuration page lists its [avail To invoke an MCP tool in Trae, enter a prompt in the chat. For example: ```text -Please help me list the buckets in the current rustfs instance, thank you! +List the buckets in this RustFS instance. ``` Trae returns the following response: -![list rustfs bucket with rustfs mcp](images/list-rustfs-bucket-with-mcp.png) +![Trae listing RustFS buckets with the RustFS MCP server](images/list-rustfs-bucket-with-mcp.png) Trae uses **Builder with MCP** mode, calling the `list_buckets` tool to list all buckets in the configured RustFS instance. Other tools work the same way. diff --git a/content/en/developer/sdk/index.md b/content/en/developer/sdk/index.md index f5550eb33..0f126aadd 100644 --- a/content/en/developer/sdk/index.md +++ b/content/en/developer/sdk/index.md @@ -24,7 +24,7 @@ Amazon Simple Storage Service (Amazon S3) was the first widely adopted object st ## SDK Recommendations -We recommend using the official AWS S3 SDKs. These SDKs are mature, well-maintained, and highly optimized. +We recommend using the official AWS S3 SDKs. These SDKs are mature and well maintained. You can also use a vendor SDK you know and trust, provided it supports the S3 operations you need. diff --git a/content/en/developer/sdk/java.md b/content/en/developer/sdk/java.md index bd70da59f..2061c9eaf 100644 --- a/content/en/developer/sdk/java.md +++ b/content/en/developer/sdk/java.md @@ -5,7 +5,7 @@ description: "Use the official AWS SDK for Java v2 with RustFS." RustFS ships no first-party Java SDK — it is S3-compatible, so you use the official AWS SDK for Java v2 configured to point at your RustFS server. -## 1. Prerequisites +## Prerequisites * Java 8 or later and Maven (or Gradle) * A running RustFS instance (see the [Installation Guide](../../installation/index.md)) — the S3 API listens on port `9000`, the Console on port `9001` @@ -17,7 +17,7 @@ If you did not set credentials at install time, the server defaults to `rustfsad ::: -### 1.1 Maven Project Setup +### Set up the Maven project Create a new Maven project: @@ -32,7 +32,7 @@ rustfs-java-s3-demo/ └── RustfsS3Example.java ``` -### 1.2 Add Dependencies +### Add dependencies Add AWS SDK dependencies in `pom.xml`: @@ -50,9 +50,9 @@ We recommend AWS SDK for Java v2, which is more complete and supports asynchrono --- -## 2. Connecting to RustFS +## Connect to RustFS -### 2.1 Complete Example +### Complete example The following class compiles and runs as-is. Replace `localhost` with your server's IP address if RustFS runs on another machine, and fill in your own access keys: @@ -133,20 +133,18 @@ Deleted hello.txt --- -## 3. Troubleshooting +## Troubleshoot common errors | Issue | Cause | Solution | | -------------------------------------- | ------------------------------------ | ----------------------------------------- | | `S3Exception: 301 Moved Permanently` | Path-style not enabled or region error | Set `.forcePathStyle(true)` and use region `us-east-1` | | `ConnectException: Connection refused` | RustFS not started or incorrect port | Check RustFS status and port | | `403 Forbidden` | Incorrect access key or secret key | Check your credentials | -| Upload fails with no response | The SDK defaults to HTTPS, and RustFS only supports HTTP (or needs certificates) | Use an `http://` address and set `endpointOverride` | +| Upload hangs with no response | The SDK uses HTTPS by default, but RustFS is serving HTTP (or TLS is not configured) | Set `endpointOverride` to an `http://` URL | --- -## 4. Appendix - -### 4.1 Maven Package and Run +## Package and run Package the project: @@ -160,28 +158,18 @@ Run it: java -cp target/rustfs-java-s3-demo-1.0-SNAPSHOT.jar com.example.RustfsS3Example ``` -### 4.2 Recommended RustFS settings - -* If RustFS is serving plain HTTP, disable TLS certificate validation in the SDK. -* Enable CORS support (if used for web frontend). -* We recommend setting limits such as `max_object_size` and `max_part_size` to prevent large-file transfer failures. - ---- +### Recommended settings -The following advanced examples cover: - -* Presigned URL generation and usage -* The complete multipart upload workflow - ---- +* If RustFS serves plain HTTP, you do not need TLS certificate validation. Point the client at an `http://` endpoint. +* Enable CORS when a browser calls RustFS directly. See [CORS](/administration/cors). -## 5. Advanced examples +## Advanced examples -### 5.1 Generate and Use Presigned URLs +### Generate presigned URLs Presigned URLs give clients temporary access to private objects without exposing credentials. They are commonly used for direct uploads and downloads from a browser. -#### 5.1.1 Generate Download Link (GET) +#### Download (GET) ```java import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; @@ -217,7 +205,7 @@ GetObjectRequest getObjectRequest = GetObjectRequest.builder() GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .getObjectRequest(getObjectRequest) - .signatureDuration(Duration.ofMinutes(15)) // 15 minutes validity + .signatureDuration(Duration.ofMinutes(15)) // expires in 15 minutes .build(); PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest); @@ -231,7 +219,7 @@ Presigned URL: http://localhost:9000/my-bucket/hello.txt?X-Amz-Algorithm=AWS4-HM Open the URL in a browser to access the object. -#### 5.1.2 Upload Presigned URL (PUT) +#### Upload (PUT) You can also generate upload URLs: @@ -257,7 +245,7 @@ System.out.println("Upload URL: " + presignedPut.url()); --- -### 5.2 Implement Multipart Upload +### Upload an object in parts Multipart upload is the recommended way to upload large files. If the network is interrupted, you can retry failed parts instead of restarting the whole upload. @@ -271,7 +259,7 @@ import java.util.ArrayList; import java.util.List; ``` -#### 5.2.1 Start Multipart Upload +#### Start the multipart upload ```java CreateMultipartUploadRequest createRequest = CreateMultipartUploadRequest.builder() @@ -283,7 +271,7 @@ CreateMultipartUploadResponse createResponse = s3.createMultipartUpload(createRe String uploadId = createResponse.uploadId(); ``` -#### 5.2.2 Upload Each Part +#### Upload each part ```java List completedParts = new ArrayList<>(); @@ -306,7 +294,7 @@ for (int i = 1; i <= 3; i++) { } ``` -#### 5.2.3 Complete Multipart Upload +#### Complete the multipart upload ```java CompletedMultipartUpload completedUpload = CompletedMultipartUpload.builder() @@ -328,7 +316,7 @@ System.out.println("Multipart upload completed."); Multipart upload completed. ``` -#### 5.2.4 Abort Upload on Exception (Optional) +#### Abort the upload on failure ```java AbortMultipartUploadRequest abortRequest = AbortMultipartUploadRequest.builder() diff --git a/content/en/developer/sdk/javascript.md b/content/en/developer/sdk/javascript.md index 3cd34ac18..c5c80f03c 100644 --- a/content/en/developer/sdk/javascript.md +++ b/content/en/developer/sdk/javascript.md @@ -69,7 +69,7 @@ All snippets below reuse this `s3` client. ## Basic operations -### 4.1 Create a bucket +### Create a bucket ```js import { CreateBucketCommand } from "@aws-sdk/client-s3"; @@ -84,7 +84,7 @@ Bucket created --- -### 4.2 Upload an object +### Upload an object ```js import { PutObjectCommand } from "@aws-sdk/client-s3"; @@ -109,7 +109,7 @@ File uploaded --- -### 4.3 Download an object +### Download an object ```js import { GetObjectCommand } from "@aws-sdk/client-s3"; @@ -137,7 +137,7 @@ File downloaded --- -### 4.4 List objects +### List objects ```js import { ListObjectsV2Command } from "@aws-sdk/client-s3"; @@ -152,7 +152,7 @@ hello.txt (12 bytes) --- -### 4.5 Delete an object +### Delete an object ```js import { DeleteObjectCommand } from "@aws-sdk/client-s3"; @@ -169,7 +169,7 @@ File deleted ## Advanced features -### 5.1 Generate presigned URLs +### Generate presigned URLs Presigned URLs let browser clients or third parties upload or download objects through temporary links. @@ -209,7 +209,7 @@ console.log("Presigned PUT URL:", url); --- -### 5.2 Multipart upload +### Upload an object in parts ```js import { @@ -280,8 +280,8 @@ Multipart upload completed | Problem | Cause | Solution | | --------------------------- | -------------------- | --------------------------------------- | | SignatureDoesNotMatch | Signature mismatch | SDK v3 signs with SigV4 by default; check credentials, region, and endpoint | -| EndpointConnectionError | Endpoint address misconfigured or not started | Check if RustFS address is accessible | -| NoSuchKey | File does not exist | Check if `Key` is spelled correctly | +| EndpointConnectionError | Endpoint address misconfigured or not started | Check that the RustFS address is reachable | +| NoSuchKey | Object does not exist | Check the object key | | InvalidAccessKeyId / Secret | Credentials misconfigured | Check `accessKeyId` / `secretAccessKey` configuration | | Upload failure (path issue) | Path-style not enabled | Set `forcePathStyle: true` | diff --git a/content/en/developer/sdk/other.md b/content/en/developer/sdk/other.md index 9d1152761..49eb4edc7 100644 --- a/content/en/developer/sdk/other.md +++ b/content/en/developer/sdk/other.md @@ -5,7 +5,7 @@ description: "Learn how to connect to RustFS from languages without an official If AWS does not provide an official SDK for your language, you can use one of the following approaches to integrate with RustFS: -## 1. Send HTTP requests directly to the S3 API +## Call the S3 REST API directly The S3 protocol is a standard RESTful API. You can implement the client logic yourself in any language that can send HTTP requests (such as C, Rust, Lua, or Erlang). @@ -21,23 +21,23 @@ We recommend consulting existing open-source implementations of request signing, --- -## 2. Use the AWS CLI or a service built on an existing SDK +## Use the AWS CLI or a service built on an existing SDK If you don't want to implement signatures yourself, you can: -### 2.1. Call the AWS CLI +### Call the AWS CLI For example, run the following command from your application using a shell: ```bash -aws s3 cp local.txt s3://mybucket/myfile.txt --endpoint-url http://rustfs.local:9000 +aws s3 cp /path/to/hello.txt s3://my-bucket/hello.txt --endpoint-url http://localhost:9000 ``` Alternatively, build a small relay service with an SDK for Node.js or Python, then call it from your application to upload or download objects. -### 2.2. Run a proxy service (for example, Flask, FastAPI, or Express) +### Run a proxy service -Expose an HTTP API that clients without S3 support can call: +Run a small HTTP service (for example, Flask, FastAPI, or Express) and expose an API that clients without S3 support can call: ```http POST /upload -> Service internally calls SDK to upload objects to RustFS @@ -46,7 +46,7 @@ GET /presigned-url -> Generate presigned URL for frontend/client use --- -## 3. Find Third-Party Community SDKs +## Find a community SDK For languages without an official AWS SDK, look for community-maintained S3 clients. For example: @@ -59,7 +59,7 @@ Community SDKs vary greatly in stability, so you should evaluate activity, docum --- -## 4. Upload directly from clients with presigned URLs +## Upload directly with presigned URLs For example: diff --git a/content/en/developer/sdk/python.md b/content/en/developer/sdk/python.md index 5e831c261..4cce8a3aa 100644 --- a/content/en/developer/sdk/python.md +++ b/content/en/developer/sdk/python.md @@ -3,7 +3,7 @@ title: "Python SDK Guide" description: "Use the official AWS SDK for Python (Boto3) with RustFS." --- -## 1. Overview +## Overview RustFS ships no first-party SDKs — it is S3-compatible, so you use the official AWS SDK for Python, [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html), configured to point at your RustFS server. @@ -17,7 +17,7 @@ This guide covers: --- -## 2. Prerequisites +## Prerequisites * Python 3.8 or later * A running RustFS instance (see the [Installation Guide](../../installation/index.md)) — the S3 API listens on port `9000`, the Console on port `9001` @@ -29,7 +29,7 @@ If you did not set credentials at install time, the server defaults to `rustfsad ::: -### 2.1 Install Boto3 +### Install Boto3 We recommend using a virtual environment: @@ -43,7 +43,7 @@ pip install boto3 --- -## 3. Connecting to RustFS +## Connect to RustFS The following is a complete, runnable script. Replace `localhost` with your server's IP address if RustFS runs on another machine, and fill in your own access keys: @@ -85,9 +85,9 @@ python main.py --- -## 4. Basic Operations +## Basic operations -### 4.1 Create Bucket +### Create a bucket ```python bucket_name = 'my-bucket' @@ -105,7 +105,7 @@ Bucket my-bucket created. --- -### 4.2 Upload File +### Upload an object ```python s3.upload_file('/path/to/hello.txt', bucket_name, 'hello.txt') @@ -118,7 +118,7 @@ File uploaded. --- -### 4.3 Download File +### Download an object ```python s3.download_file(bucket_name, 'hello.txt', 'hello-downloaded.txt') @@ -131,7 +131,7 @@ File downloaded. --- -### 4.4 List Objects +### List objects ```python response = s3.list_objects_v2(Bucket=bucket_name) @@ -145,7 +145,7 @@ for obj in response.get('Contents', []): --- -### 4.5 Delete Object and Bucket +### Delete an object and a bucket ```python s3.delete_object(Bucket=bucket_name, Key='hello.txt') @@ -162,17 +162,17 @@ Bucket deleted. --- -## 5. Advanced Features +## Advanced operations -### 5.1 Generate Presigned URLs +### Generate presigned URLs -#### 5.1.1 Download Link (GET) +#### Download (GET) ```python url = s3.generate_presigned_url( ClientMethod='get_object', Params={'Bucket': bucket_name, 'Key': 'hello.txt'}, - ExpiresIn=600, # 10 minutes validity + ExpiresIn=600, # expires in 10 minutes ) print('Presigned GET URL:', url) @@ -182,7 +182,7 @@ print('Presigned GET URL:', url) Presigned GET URL: http://localhost:9000/my-bucket/hello.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&... ``` -#### 5.1.2 Upload Link (PUT) +#### Upload (PUT) ```python url = s3.generate_presigned_url( @@ -202,7 +202,7 @@ curl -X PUT --upload-file /path/to/hello.txt "http://localhost:9000/my-bucket/up --- -### 5.2 Multipart Upload +### Upload an object in parts Use multipart upload for files larger than 10 MB when you need control over each part. @@ -260,7 +260,7 @@ Multipart upload complete. --- -## 6. Troubleshooting +## Troubleshooting | Issue | Cause | Solution | | ------------------------- | ----------------- | -------------------------------------------------------------- | @@ -271,7 +271,7 @@ Multipart upload complete. --- -## 7. Appendix: Quick Upload/Download Script Template +## Upload and download helpers ```python def upload_file(local_path, bucket, object_key): diff --git a/content/en/developer/sdk/rust.md b/content/en/developer/sdk/rust.md index 8b6d7ebdc..7dd124fb7 100644 --- a/content/en/developer/sdk/rust.md +++ b/content/en/developer/sdk/rust.md @@ -8,7 +8,7 @@ RustFS ships no first-party Rust client crate — it is S3-compatible, so you us ## Prerequisites - Rust 1.78 or later (install via [rustup](https://rustup.rs/)) -- An available RustFS instance (refer to [Installation Guide](../../installation/index.md)) — the S3 API listens on port `9000`, the Console on port `9001` +- A running RustFS instance (see the [Installation Guide](../../installation/index.md)) — the S3 API listens on port `9000`, the Console on port `9001` - Access keys, set at install time via the `RUSTFS_ACCESS_KEY` / `RUSTFS_SECRET_KEY` environment variables (refer to [Access Key Management](../../security-compliance/iam/access-token.md)) :::tip[Local test] @@ -35,7 +35,7 @@ aws-sdk-s3 = "1" tokio = { version = "1", features = ["full"] } ``` -## Initializing the Client +## Initialize the client The following is a complete, runnable program. It loads the connection settings from environment variables, initializes the S3 client, and lists your buckets: @@ -128,7 +128,7 @@ Bucket: Some("my-bucket") You can now use the client for the operations below. Each snippet runs inside `main`, reusing `rustfs_client`. -## Create Bucket +## Create a bucket ```rust match rustfs_client @@ -151,7 +151,7 @@ match rustfs_client Bucket created successfully ``` -## Delete Bucket +## Delete a bucket ```rust match rustfs_client @@ -174,7 +174,7 @@ match rustfs_client Bucket deleted successfully ``` -## List Buckets +## List buckets ```rust match rustfs_client.list_buckets().send().await { @@ -196,7 +196,7 @@ Total buckets number is 1 Bucket: Some("my-bucket") ``` -## List Objects +## List objects ```rust match rustfs_client @@ -223,7 +223,7 @@ Total objects number is 1 Object: Some("hello.txt") ``` -## Upload File +## Upload an object Add these imports at the top of `src/main.rs`: @@ -259,7 +259,7 @@ match rustfs_client Object uploaded successfully, res: PutObjectOutput { e_tag: Some("\"...\""), ... } ``` -## Download Object +## Download an object ```rust match rustfs_client diff --git a/content/en/developer/sdk/typescript.md b/content/en/developer/sdk/typescript.md index 0ecf279f5..606de1363 100644 --- a/content/en/developer/sdk/typescript.md +++ b/content/en/developer/sdk/typescript.md @@ -1,6 +1,6 @@ --- title: "TypeScript SDK Guide" -description: "Operate RustFS from TypeScript with the AWS SDK for JavaScript v3, including creation and deletion of buckets and objects." +description: "Use the AWS SDK for JavaScript v3 from TypeScript to create, upload, download, and delete buckets and objects in RustFS." --- RustFS ships no first-party TypeScript SDK — it is S3-compatible, so you use the official AWS SDK for JavaScript v3 (which includes TypeScript type definitions) configured to point at your RustFS server. With the SDK, you can create and delete buckets and upload, download, and delete objects. @@ -24,7 +24,7 @@ npm install @aws-sdk/client-s3 npm install --save-dev typescript tsx @types/node ``` -## Initializing the Client +## Initialize the client The following is a complete, runnable example. Replace `localhost` with your server's IP address if RustFS runs on another machine, and fill in your own access keys: @@ -67,7 +67,7 @@ npx tsx main.ts Then use the constructed `rustfs_client` for the operations below. -## Create Bucket +## Create a bucket ```typescript async function createBucket() { @@ -88,7 +88,7 @@ async function createBucket() { Bucket created: /my-bucket ``` -## Delete Bucket +## Delete a bucket ```typescript async function deleteBucket() { @@ -109,7 +109,7 @@ async function deleteBucket() { Bucket deleted ``` -## List Buckets +## List buckets ```typescript async function listBuckets() { @@ -126,7 +126,7 @@ async function listBuckets() { my-bucket ``` -## List Objects +## List objects ```typescript async function listObjects() { @@ -147,7 +147,7 @@ async function listObjects() { test/hello.txt (12 bytes) ``` -## Upload File +## Upload an object ```typescript async function uploadFile() { @@ -170,7 +170,7 @@ async function uploadFile() { Object uploaded ``` -## Download Object +## Download an object ```typescript async function getObject() { diff --git a/content/en/installation/cloud-native/index.md b/content/en/installation/cloud-native/index.md index 3f428742b..964891bd7 100644 --- a/content/en/installation/cloud-native/index.md +++ b/content/en/installation/cloud-native/index.md @@ -143,7 +143,7 @@ kubectl -n rustfs port-forward svc/rustfs 9000:9000 9001:9001 - S3 API: `http://localhost:9000` - Console: `http://localhost:9001` -Log in to the Console with the access key and secret key you set at install time. With ingress enabled, use your configured host instead (check `kubectl -n rustfs get ing`). The Service defaults to `ClusterIP`; `service.type` can be switched to `NodePort` (S3 on `service.endpoint.nodePort: 32000`, Console on `service.console.nodePort: 32001`) or `LoadBalancer`. +Sign in to the Console with the access key and secret key you set at install time. With ingress enabled, use your configured host instead (check `kubectl -n rustfs get ing`). The Service defaults to `ClusterIP`; `service.type` can be switched to `NodePort` (S3 on `service.endpoint.nodePort: 32000`, Console on `service.console.nodePort: 32001`) or `LoadBalancer`. ## 7. Scaling out with server pools diff --git a/content/en/installation/container/docker.md b/content/en/installation/container/docker.md index e139b39d9..2c3a90edb 100644 --- a/content/en/installation/container/docker.md +++ b/content/en/installation/container/docker.md @@ -140,7 +140,7 @@ If you only want RustFS without Grafana, Prometheus, and the other observability docker compose -f docker-compose.yml up -d rustfs ``` -This starts only the `rustfs-server` container. Whether you start only `rustfs-server` or the full stack, the S3 API is served at `http://localhost:9000`, and the RustFS Console is at `http://localhost:9001`. Open the Console in a browser and log in with the access key and secret key you configured above. Generate a strong secret with, for example, `openssl rand -base64 24`, and never ship the placeholder values to production. +This starts only the `rustfs-server` container. Whether you start only `rustfs-server` or the full stack, the S3 API is served at `http://localhost:9000`, and the RustFS Console is at `http://localhost:9001`. Open the Console in a browser and sign in with the access key and secret key you configured above. Generate a strong secret with, for example, `openssl rand -base64 24`, and never ship the placeholder values to production. For Docker Compose, define unique `RUSTFS_ACCESS_KEY` and `RUSTFS_SECRET_KEY` values in the `rustfs` service environment or in the environment file used for variable substitution, then recreate the service with `docker compose up -d rustfs`. diff --git a/content/en/installation/index.md b/content/en/installation/index.md index 3812e4890..8f70bb4ab 100644 --- a/content/en/installation/index.md +++ b/content/en/installation/index.md @@ -30,7 +30,7 @@ After installation, set unique values for `RUSTFS_ACCESS_KEY` and `RUSTFS_SECRET | Kubernetes / cloud-native | Deploy with the Helm chart or the Operator | [Cloud Native](./cloud-native/index.md) | | Windows or macOS host | Native installation | [Windows](./windows/index.md) · [macOS](./macos/index.md) | -## Deployment Mode Comparison +## Compare deployment modes | Mode | Nodes | Disks | Fault Tolerance | Typical Use | | - | - | - | - | - | diff --git a/content/en/installation/linux/index.md b/content/en/installation/linux/index.md index 174723344..a1bdbe55f 100644 --- a/content/en/installation/linux/index.md +++ b/content/en/installation/linux/index.md @@ -11,24 +11,24 @@ After installation, set unique `RUSTFS_ACCESS_KEY` and `RUSTFS_SECRET_KEY` value ::: -## Single Node Single Disk (SNSD) +## Single-node single-disk (SNSD) One server, one data disk. The simplest mode, with no redundancy — a disk failure means data loss, so rely on backups. Suitable for development, testing, and small non-critical workloads. → [Single Node Single Disk installation](./single-node-single-disk.md) -## Single Node Multiple Disk (SNMD) +## Single-node multiple-disk (SNMD) One server, multiple data disks. Erasure coding shards data across the disks, so the node tolerates a limited number of disk failures, but a whole-server failure still means data loss. Suitable for mid-sized, non-critical workloads on a single machine. → [Single Node Multiple Disk installation](./single-node-multiple-disk.md) -## Multiple Node Multiple Disk (MNMD) +## Multiple-node multiple-disk (MNMD) Four or more servers, each with one or more disks. Erasure coding spans servers, providing disk- and node-level fault tolerance plus horizontal scalability. This is the mode for production workloads. → [Multiple Node Multiple Disk installation](./multiple-node-multiple-disk.md) -## Before Production +## Before production Work through the [Pre-Installation Checklists](../requirement/checklists/index.md) — hardware, network, software, and security — before deploying to production. You can skip them for non-production deployments. diff --git a/content/en/installation/linux/multiple-node-multiple-disk.md b/content/en/installation/linux/multiple-node-multiple-disk.md index df0e26341..710808083 100644 --- a/content/en/installation/linux/multiple-node-multiple-disk.md +++ b/content/en/installation/linux/multiple-node-multiple-disk.md @@ -5,7 +5,7 @@ description: "Install a distributed RustFS cluster across multiple servers, each Multiple Node Multiple Disk (MNMD) mode is the production deployment for clusters that span multiple servers. A minimum of **4 servers** is required, each with at least 1 disk, to safely start a distributed object storage cluster. -## Topology and Planning +## Topology and planning In the following architecture, requests are distributed to the servers through load balancing. With the default 12 + 4 erasure coding layout, each object is split into 12 data shards and 4 parity shards stored on different disks across different servers: @@ -43,8 +43,7 @@ Create DNS records so that each sequential hostname resolves to the correct node Add the following entries to `/etc/hosts` on every node: -```bash title="/etc/hosts" -vim /etc/hosts +```text title="/etc/hosts" 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 @@ -53,11 +52,11 @@ vim /etc/hosts 192.168.1.4 node4 ``` -## Prerequisites and Service Setup +## Prerequisites and service setup On **every node**, complete the [common prerequisites and service setup](./prerequisites-and-service.md) — operating system, firewall, time synchronization, disk formatting, service user, binary download, and systemd unit — then continue below. Remember that all nodes must use the same listening port and must have synchronized clocks. -## Configure Environment Variables +## Configure environment variables 1. Create the same configuration file on every node. `RUSTFS_VOLUMES` uses brace expansion to enumerate all nodes and all disk mount points (this example: 4 nodes × 4 disks): @@ -73,9 +72,9 @@ RUSTFS_OBS_LOGGER_LEVEL=error RUSTFS_OBS_LOG_DIRECTORY="/var/log/rustfs/" ``` -:::note +:::note[Keep the cluster configuration identical] -The access key, secret key, and `RUSTFS_VOLUMES` value must be identical on all nodes. The hostnames (`node1` – `node4`) must match the DNS or `/etc/hosts` configuration above. +The access key, secret key, and `RUSTFS_VOLUMES` value must be identical on all nodes. The hostnames (`node1` through `node4`) must match the DNS or `/etc/hosts` configuration above. ::: @@ -112,11 +111,11 @@ netstat -ntpl tail -f /var/log/rustfs/rustfs*.log ``` -5. Access the console: enter any node's IP address (or the load balancer address) and the console port (default 9001) in a browser. You should see: +5. Open the Console: in a browser, go to `http://:9001` (or the load balancer address). You should see: ![Console](./images/console.jpg) -## Next Steps +## Next steps - Put a load balancer in front of the cluster — see the [Nginx integration guide](/developer/integration/reverse-proxy/nginx). - Enable TLS for production traffic — see [TLS configuration](../../integration/tls-configured.md). diff --git a/content/en/installation/linux/prerequisites-and-service.md b/content/en/installation/linux/prerequisites-and-service.md index 3e27d8fed..49517181e 100644 --- a/content/en/installation/linux/prerequisites-and-service.md +++ b/content/en/installation/linux/prerequisites-and-service.md @@ -34,11 +34,11 @@ firewall-cmd --reload All RustFS servers in a deployment **must** use the same listening port. If you use port 9000, every other server must also use port 9000. -## Memory Requirements +## Memory requirements RustFS requires at least 2 GB of memory for a test environment; production environments require a minimum of 128 GB of memory. -## Time Synchronization +## Time synchronization All nodes in a RustFS distributed deployment **must** maintain synchronized clocks. RustFS relies on timestamps for request signing, object versioning, distributed locking, and replication. Significant clock drift between nodes can cause: @@ -53,7 +53,7 @@ Clock drift between any two nodes should not exceed **15 minutes**. For producti ::: -### Recommended NTP Tools +### Recommended NTP tools Use any of the following time synchronization services on **every** node. Choose one and configure it consistently across the deployment. @@ -128,7 +128,7 @@ sudo systemctl enable ntpd sudo systemctl start ntpd ``` -### Verifying Time Synchronization +### Verify time synchronization After configuring your NTP service, verify synchronization on each node. @@ -171,7 +171,7 @@ For `ntpd`, use: ntpq -p ``` -### Verifying Cross-Node Clock Consistency +### Verify clocks across nodes After all nodes are synchronized, verify that clocks are consistent across the cluster. On each node, compare timestamps: @@ -191,7 +191,7 @@ done The difference between any two nodes should be negligible (under 1 millisecond in a well-configured environment). -## Capacity Planning +## Capacity planning When planning object storage capacity, we recommend considering: @@ -202,26 +202,25 @@ When planning object storage capacity, we recommend considering: Review [EC Configuration](../requirement/ec-configuration.md) to calculate usable capacity, understand the automatic parity defaults, and validate any explicit parity or erasure-set width before deployment. -## Disk Planning +## Drive planning **Do not use NFS** as the underlying storage for RustFS: under heavy I/O, NFS can cause phantom writes and locking problems. We strongly recommend **JBOD (Just a Bunch of Disks)** mode: expose physical disks directly and independently to the operating system, and let the RustFS software layer handle data redundancy and protection. This approach has several advantages: -- **Better Performance:** The RustFS erasure coding engine is highly optimized and reads/writes multiple disks concurrently, achieving higher throughput than hardware RAID controllers. Hardware RAID becomes a performance bottleneck. -- **Lower Cost:** No expensive RAID cards needed, reducing hardware procurement costs. -- **Simpler Management:** RustFS manages disks uniformly, simplifying storage operations. -- **Faster Fault Recovery:** The RustFS healing process is faster than a traditional RAID rebuild and has less impact on cluster performance. +- **Per-drive access:** RustFS reads and writes multiple drives in an erasure set. A hardware RAID volume hides those drives, so RustFS cannot heal a single failed drive. +- **Healing:** RustFS reconstructs missing shards onto a replacement drive. A hardware RAID rebuild is a different operation and is not required. +- **Operations:** RustFS manages the drives directly, using the mount paths in `RUSTFS_VOLUMES`. -We recommend NVMe SSDs as the storage medium for higher performance and throughput. +We recommend NVMe SSDs when the workload needs lower latency than hard drives provide. -## File System Selection +## File system selection We strongly recommend formatting all data disks with XFS. RustFS is developed and tested on XFS. Avoid other file systems such as ext4, Btrfs, or ZFS, as they may cause performance degradation or unpredictable issues. XFS suits RustFS's workload for three reasons: -- **High-concurrency I/O:** XFS was designed for high performance and scalability. Its internal journaling and data structures (such as B+ trees) efficiently handle large numbers of parallel read/write requests, matching how RustFS shards large objects and reads/writes multiple disks in an erasure set in parallel. +- **Concurrent I/O:** XFS journaling and its B+ tree indexes handle large numbers of parallel reads and writes. That matches how RustFS shards a large object and reads or writes several drives in an erasure set at once. - **Many files and very large files:** XFS is a 64-bit file system supporting extremely large files (up to 8 EB). Its metadata management stays efficient even with millions of files in a single directory — important because RustFS stores each object (or object version) as an independent file. - **Space reservation:** XFS provides an efficient `fallocate` API. RustFS uses it to reserve contiguous disk space before writing objects, avoiding the overhead of dynamic expansion and metadata updates during writes and minimizing file fragmentation. @@ -288,7 +287,7 @@ chown rustfs-user:rustfs-user /data/rustfs* ::: -## Download the Installation Package +## Download the installation package Install wget or curl first, then download and install the RustFS binary: @@ -300,7 +299,7 @@ chmod +x rustfs mv rustfs /usr/local/bin/ ``` -## Configure the systemd Service +## Configure the systemd service 1. Create the systemd service file @@ -363,7 +362,7 @@ The service reads `RUSTFS_VOLUMES` and the other settings from `/etc/default/rus sudo systemctl daemon-reload ``` -## Next Steps +## Next steps Return to your deployment mode page to configure the environment file and start the service: diff --git a/content/en/installation/linux/quick-start.md b/content/en/installation/linux/quick-start.md index f4b8462da..bd665909b 100644 --- a/content/en/installation/linux/quick-start.md +++ b/content/en/installation/linux/quick-start.md @@ -1,9 +1,9 @@ --- title: "Quick Start" -description: "Install RustFS with the installation script, log in to the Console, and store your first object — in about ten minutes." +description: "Install RustFS with the installation script, sign in to the Console, and store your first object." --- -This guide takes you from an empty Linux server to a working RustFS instance: install, log in to the Console, create a bucket, and upload your first object. Production planning (multi-node layout, hardware sizing) is deliberately left for [the next step](#next-steps). +This guide takes you from an empty Linux server to a working RustFS instance: install, sign in to the Console, create a bucket, and upload your first object. Production planning (multi-node layout, hardware sizing) is covered in [Next steps](#next-steps). **Prerequisites** @@ -52,7 +52,7 @@ If `RUSTFS_ACCESS_KEY` / `RUSTFS_SECRET_KEY` are not set, the server falls back ::: -## 3. Log in to the Console +## 3. Sign in to the Console Open `http://:9001` in your browser and sign in with the access key and secret key from step 2. diff --git a/content/en/installation/linux/single-node-multiple-disk.md b/content/en/installation/linux/single-node-multiple-disk.md index 500a4b852..f408b10f8 100644 --- a/content/en/installation/linux/single-node-multiple-disk.md +++ b/content/en/installation/linux/single-node-multiple-disk.md @@ -5,13 +5,13 @@ description: "Install RustFS on a single server and distribute data across multi In Single Node Multiple Disk (SNMD) mode, one server shards data across multiple data disks. Each object is split into K data shards and M parity shards (erasure coding), so the loss of up to M disks does not cause data loss. -:::warning +:::warning[Single server] -SNMD is suitable for mid-sized, non-critical workloads. The deployment can lose up to M disks without losing data, but if the entire server fails or more than M disks are damaged, data will be lost. Keep backups of important data. For node-level fault tolerance, use [MNMD](./multiple-node-multiple-disk.md). +SNMD is suitable for mid-sized, non-critical workloads. The deployment can lose up to M drives without losing data. If the entire server fails, or more than M drives fail, data is lost. Keep backups of important data. For node-level fault tolerance, use [MNMD](./multiple-node-multiple-disk.md). ::: -## Topology and Planning +## Topology and planning ```mermaid flowchart TD @@ -28,11 +28,11 @@ flowchart TD - Format each disk with XFS and mount it separately (e.g., labels `RUSTFS0` – `RUSTFS3`), as described in the prerequisites page. - For production deployments, also review the [Pre-Installation Checklists](../requirement/checklists/index.md). -## Prerequisites and Service Setup +## Prerequisites and service setup Complete the [common prerequisites and service setup](./prerequisites-and-service.md) — operating system, firewall, time synchronization, disk formatting, service user, binary download, and systemd unit — then continue below. -## Configure Environment Variables +## Configure environment variables 1. Create the configuration file. `RUSTFS_VOLUMES` uses brace expansion to enumerate the four disk mount points: @@ -81,11 +81,11 @@ netstat -ntpl tail -f /var/log/rustfs/rustfs*.log ``` -5. Access the console: enter the server's IP address and the console port (default 9001) in a browser. You should see: +5. Open the Console: in a browser, go to `http://:9001`. You should see: ![Console](./images/console.jpg) -## Next Steps +## Next steps - Need node-level fault tolerance and horizontal scalability? See [Multiple Node Multiple Disk Mode (MNMD)](./multiple-node-multiple-disk.md). - Just experimenting? [Single Node Single Disk Mode (SNSD)](./single-node-single-disk.md) is simpler to set up. diff --git a/content/en/installation/linux/single-node-single-disk.md b/content/en/installation/linux/single-node-single-disk.md index 77ca8a59b..61e33862e 100644 --- a/content/en/installation/linux/single-node-single-disk.md +++ b/content/en/installation/linux/single-node-single-disk.md @@ -5,13 +5,13 @@ description: Install RustFS on a single server that stores all data on one disk. In Single Node Single Disk (SNSD) mode, one server stores all data on a single data disk. It is the simplest deployment mode and the same topology that the [Linux Quick Start](./quick-start.md) script sets up. -:::warning +:::warning[No redundancy] -A single disk offers no redundancy: if the disk fails, data is lost. SNSD is suitable for development, testing, and small non-critical workloads. For production use, maintain regular data backups or choose [SNMD](./single-node-multiple-disk.md) / [MNMD](./multiple-node-multiple-disk.md). +A single drive offers no redundancy. If the drive fails, data is lost. SNSD is suitable for development, testing, and small non-critical workloads. For production use, keep backups or choose [SNMD](./single-node-multiple-disk.md) or [MNMD](./multiple-node-multiple-disk.md). ::: -## Topology and Planning +## Topology and planning ```mermaid flowchart TD @@ -27,11 +27,11 @@ flowchart TD - No erasure coding across disks — fault tolerance depends entirely on backups. - For production deployments, also review the [Pre-Installation Checklists](../requirement/checklists/index.md). -## Prerequisites and Service Setup +## Prerequisites and service setup Complete the [common prerequisites and service setup](./prerequisites-and-service.md) — operating system, firewall, time synchronization, disk formatting, service user, binary download, and systemd unit — then continue below. -## Configure Environment Variables +## Configure environment variables 1. Create the configuration file with the single-disk volume path: @@ -84,7 +84,7 @@ tail -f /var/log/rustfs/rustfs*.log ![Console](./images/console.jpg) -## Next Steps +## Next steps - Need disk-level redundancy on one server? See [Single Node Multiple Disk Mode (SNMD)](./single-node-multiple-disk.md). - Need a production cluster? See [Multiple Node Multiple Disk Mode (MNMD)](./multiple-node-multiple-disk.md). diff --git a/content/en/installation/macos/index.md b/content/en/installation/macos/index.md index ad87aee2e..91d875f04 100644 --- a/content/en/installation/macos/index.md +++ b/content/en/installation/macos/index.md @@ -23,12 +23,12 @@ Use the result to choose the correct package: | Result | Mac type | Current standalone binary availability | | --- | --- | --- | -| `arm64` | Apple Silicon | Download the macOS AArch64 package from current RustFS releases. | +| `arm64` | Apple silicon | Download the macOS AArch64 package from current RustFS releases. | | `x86_64` | Intel | RustFS releases after `v1.0.0-beta.9` do not provide a prebuilt Intel macOS package. Build the current version from source. | -:::warning[Intel Mac release boundary] +:::warning[Intel Mac packages] -Do not run the Apple Silicon binary on an Intel Mac. If you need a RustFS version newer than `v1.0.0-beta.9` on Intel macOS, follow the source-build procedure in this guide. An older beta.9 binary does not contain fixes and features from later releases. +Do not run the Apple silicon binary on an Intel Mac. If you need a RustFS version newer than `v1.0.0-beta.9` on Intel macOS, follow the source-build procedure in this guide. An older beta.9 binary does not contain fixes and features from later releases. ::: @@ -52,8 +52,8 @@ Use an empty directory on a disk with enough free space. Do not store unrelated | Method | Use it when | Architecture note | | --- | --- | --- | -| RustFS Launcher | You want a graphical setup and built-in log viewer. | Download a Launcher package that matches Apple Silicon or Intel. | -| Standalone binary | You want explicit Terminal commands or scripting. | Current releases provide Apple Silicon binaries; Intel users build releases after beta.9 from source. | +| RustFS Launcher | You want a graphical setup and built-in log viewer. | Download a Launcher package that matches Apple silicon or Intel. | +| Standalone binary | You want explicit Terminal commands or scripting. | Current releases provide Apple silicon binaries; Intel users build releases after beta.9 from source. | ## Install with RustFS Launcher @@ -61,7 +61,7 @@ Use an empty directory on a disk with enough free space. Do not store unrelated 1. Open the [RustFS Launcher Releases page](https://github.com/rustfs/launcher/releases). 2. Select the latest release and expand **Assets**. -3. Download the macOS installer that matches your architecture: AArch64 for Apple Silicon or x86-64 for Intel. Do not download **Source code** unless you intend to build Launcher yourself. +3. Download the macOS installer that matches your architecture: AArch64 for Apple silicon or x86-64 for Intel. Do not download **Source code** unless you intend to build Launcher yourself. 4. Open the downloaded disk image and move **RustFS Launcher** to **Applications**. 5. Open **RustFS Launcher** from **Applications**. @@ -112,7 +112,7 @@ Closing the Launcher window hides it in the menu bar; it does not stop RustFS. T ## Install the standalone binary -### 7. Download the Apple Silicon binary +### 7. Download the Apple silicon binary Use this procedure when `uname -m` returns `arm64`: @@ -158,7 +158,7 @@ The build script includes Console assets by default and verifies the resulting b :::note[Source-build dependencies] -Building from source requires the tools used by the selected RustFS release in addition to Rust and the Xcode command-line tools. If the build reports a missing dependency, follow the requirements in that release's repository README rather than substituting a binary built for Apple Silicon. +Building from source requires the tools used by the selected RustFS release in addition to Rust and the Xcode command-line tools. If the build reports a missing dependency, follow the requirements in that release's repository README rather than substituting a binary built for Apple silicon. ::: @@ -194,7 +194,7 @@ To perform an end-to-end check, create a bucket named `my-bucket`, upload `hello ## Confirm a successful installation -Whether you used Launcher, an Apple Silicon binary, or an Intel source build, a successful Console sign-in opens the **Buckets** page. +Whether you used Launcher, an Apple silicon binary, or an Intel source build, a successful Console sign-in opens the **Buckets** page. ![RustFS Console Buckets page after a successful sign-in](../windows/images/rustfs-console-login.png) @@ -213,7 +213,7 @@ uname -m file "$RUSTFS_BIN" ``` -Use an AArch64 binary on Apple Silicon. On an Intel Mac, build releases after `v1.0.0-beta.9` from source for `x86_64-apple-darwin`. +Use an AArch64 binary on Apple silicon. On an Intel Mac, build releases after `v1.0.0-beta.9` from source for `x86_64-apple-darwin`. ### The data path is rejected diff --git a/content/en/installation/requirement/checklists/hardware-checklists.md b/content/en/installation/requirement/checklists/hardware-checklists.md index f4d5de2a7..5dd7fe0b6 100644 --- a/content/en/installation/requirement/checklists/hardware-checklists.md +++ b/content/en/installation/requirement/checklists/hardware-checklists.md @@ -1,6 +1,6 @@ --- title: "Production Hardware Guide" -description: "This page provides hardware sizing and configuration guidance for production RustFS deployments." +description: "Size nodes, drives, memory, and the network for a production RustFS deployment." --- ## Planning considerations @@ -10,7 +10,7 @@ Before deploying RustFS in production, assess your workload and capacity require 1. **Data volume** - **Initial data volume**: Estimate the usable data volume at go-live (in TiB), including the ratio of hot to cold data. - - **Growth forecast**: Estimate data growth for the next 24 months based on business plans. We recommend modeling growth quarterly. + - **Growth forecast**: Estimate data growth for the next 24 months from your capacity plan. We recommend modeling growth quarterly. - **Object count**: Estimate the total number of objects from the average object size (ideally 128 KB to 1 MB). Deployments with more than 100 million objects need additional tuning. 2. **Workload characteristics** @@ -21,10 +21,10 @@ Before deploying RustFS in production, assess your workload and capacity require 3. **Storage architecture** - - **Bucket planning**: Organize buckets by business unit. We recommend no more than 500 active buckets per cluster. + - **Bucket planning**: Organize buckets by workload or team. We recommend no more than 500 active buckets per cluster. - **Disaster recovery**: Choose active-active replication (recommended) or asynchronous replication based on how critical the data is. -## Hardware Configuration Matrix +## Hardware configuration Baseline configurations based on load-test results: @@ -45,31 +45,31 @@ Baseline configurations based on load-test results: ## Performance tuning -### Network Topology Optimization (Highest Priority) +### Network topology - **Bandwidth sizing**: Provision 0.5 Gbps of bandwidth per TB of usable data (for example, 100 TB of data needs 50 Gbps of dedicated bandwidth). -- **Latency Requirements**: +- **Latency**: - Inter-node P99 latency ≤ 2ms - Cross-rack latency ≤ 5ms -### Storage Subsystem Tuning +### Storage subsystem -- **Controller Configuration**: +- **Controller**: - Enable read-ahead cache (recommended 256 MB+) - Disable all RAID features and use pass-through (HBA/JBOD) mode. - Check BBU health regularly. -- **SSD Parameters**: +- **SSD settings**: - Reserve 20% over-provisioning (OP) space to improve endurance. - Enable atomic writes (requires hardware support). ### Memory allocation -- **Allocation Ratios**: +- **Allocation**: - Metadata cache: 60% of total memory - Read/write buffers: 30% - System reserve: 10% -## Network Design Reference Model +## Network design ### Network bandwidth vs. disk count @@ -119,37 +119,35 @@ def calc_memory(data_tb, access_pattern): | Throughput Requirements | < 500 MB/s | 500 MB-3 GB/s | > 3 GB/s | | Typical use cases | Archival storage | Hot-data cache | Real-time analytics | -### File System Configuration +### File system -```bash -# XFS formatting example -mkfs.xfs -f -L rustfs_disk1 -d su=256k,sw=10 /dev/sdb +Format each data drive as its own XFS file system and mount it by UUID. Use the procedure in [Disk preparation](/installation/requirement/disk-preparation). Do not place RustFS data on NFS or on a hardware RAID volume. -# Recommended mount parameters -UUID=xxxx /mnt/disk1 xfs defaults,noatime,nodiratime,logbsize=256k 0 0 +```bash +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` ## High availability -1. **Power Supply**: +1. **Power**: - Use dual (redundant) power supplies. - Connect each PDU to a separate power feed. - Provide a UPS with at least 30 minutes of runtime. -2. **Cooling Requirements**: +2. **Cooling**: - Rack power density ≤ 15 kW per rack. - Keep the inlet-to-outlet temperature difference (ΔT) within 8 °C. -3. **Firmware Management**: +3. **Firmware**: - Maintain a hardware compatibility matrix. - Standardize on the same firmware versions across nodes. :::tip[Before go-live] -We recommend running a 72-hour stress test before production go-live that covers the following scenarios: +We recommend running a 72-hour stress test before production go-live that covers the following cases: 1. Node failover testing 2. Network partition tests diff --git a/content/en/installation/requirement/checklists/hardware-selection.md b/content/en/installation/requirement/checklists/hardware-selection.md index bc61b4dbc..7118e631a 100644 --- a/content/en/installation/requirement/checklists/hardware-selection.md +++ b/content/en/installation/requirement/checklists/hardware-selection.md @@ -1,11 +1,9 @@ --- title: Hardware Selection -description: This page lists minimum and recommended hardware for RustFS test and production environments. +description: Compare minimum and recommended hardware for RustFS test and production environments. --- -> RustFS is designed for efficiency with a low memory footprint. - -## Test Environment +## Test environment Minimum requirements for testing: @@ -21,7 +19,7 @@ Minimum requirements for testing: | Load Balancing | None | | Nodes | 1 | -## Production Environment +## Production environment The Windows version of RustFS is intended for development and debugging only and is **not recommended for production deployments**. We recommend [Linux](/en/installation/linux) for production workloads. diff --git a/content/en/installation/requirement/checklists/index.md b/content/en/installation/requirement/checklists/index.md index 1b36bb1fc..4e8ab5123 100644 --- a/content/en/installation/requirement/checklists/index.md +++ b/content/en/installation/requirement/checklists/index.md @@ -1,6 +1,6 @@ --- -title: "Pre-Installation Checklists" -description: "Pre-installation checklists." +title: "Pre-installation checklists" +description: "Review hardware, network, software, and security before a production RustFS installation." --- These checklists cover the necessary preparations for a production environment. diff --git a/content/en/installation/requirement/checklists/meta.json b/content/en/installation/requirement/checklists/meta.json index 598c9f25f..c94a52259 100644 --- a/content/en/installation/requirement/checklists/meta.json +++ b/content/en/installation/requirement/checklists/meta.json @@ -1,5 +1,5 @@ { - "title": "Checklist", + "title": "Pre-installation checklists", "pages": [ "[Hardware Checklist](/en/installation/requirement/checklists/hardware-checklists)", "[Hardware Selection](/en/installation/requirement/checklists/hardware-selection)", diff --git a/content/en/installation/requirement/checklists/network-checklists.md b/content/en/installation/requirement/checklists/network-checklists.md index 533184b62..3bc8c64b1 100644 --- a/content/en/installation/requirement/checklists/network-checklists.md +++ b/content/en/installation/requirement/checklists/network-checklists.md @@ -1,9 +1,9 @@ --- title: "Network Checklist" -description: "Network checklist for enterprise deployments." +description: "Check network layout, ports, and failover before a production RustFS deployment." --- -## Network Architecture +## Network architecture ### Planning @@ -14,7 +14,7 @@ description: "Network checklist for enterprise deployments." - **Bandwidth** Estimate traffic as: read/write bandwidth × node count × replica count, plus 20% headroom. -### IP Allocation +### IP allocation - [ ] Separate management network from data network. - [ ] Allocate a contiguous IP address range for storage nodes. We recommend a /24 subnet. @@ -22,7 +22,7 @@ description: "Network checklist for enterprise deployments." --- -## Hardware Requirements +## Switch and cabling requirements ### Switches @@ -41,9 +41,9 @@ description: "Network checklist for enterprise deployments." --- -## OS Configuration +## Operating system configuration -### Kernel Tuning +### Kernel tuning ```bash # Check the following parameter settings @@ -53,10 +53,10 @@ net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_slow_start_after_idle = 0 ``` -### NIC Configuration +### NIC configuration - [ ] Enable jumbo frames (MTU=9000, requires full path support). -- [ ] Verify bonding mode (recommend LACP mode4). +- [ ] Verify the bond mode. We recommend LACP (mode 4). - [ ] Disable IPv6 (if not needed). --- @@ -72,7 +72,7 @@ net.ipv4.tcp_slow_start_after_idle = 0 - TCP 443 (only if you terminate HTTPS on a reverse proxy / load balancer) ``` -### Access Control +### Access control - Enable port security (MAC address limits) on switches. - Encrypt traffic between storage nodes with IPsec. @@ -80,7 +80,7 @@ net.ipv4.tcp_slow_start_after_idle = 0 --- -## Performance Testing +## Performance testing ### Benchmarks @@ -98,14 +98,14 @@ net.ipv4.tcp_slow_start_after_idle = 0 --- -## Documentation Requirements +## Records to keep 1. Network topology diagram (including physical connections and logical IPs) 2. Switch configuration backup files (with timestamps) 3. Baseline test reports (including raw data) 4. Change log (including maintenance windows) -:::tip +:::tip[Before production] We recommend running a 72-hour stress test at 110% of the expected peak traffic before deploying to production. diff --git a/content/en/installation/requirement/checklists/security-checklists.md b/content/en/installation/requirement/checklists/security-checklists.md index 3fbb917b8..f8a860a13 100644 --- a/content/en/installation/requirement/checklists/security-checklists.md +++ b/content/en/installation/requirement/checklists/security-checklists.md @@ -1,11 +1,11 @@ --- title: "Security Checklist" -description: "Security checklist for enterprise deployments." +description: "Review authentication, TLS, credentials, and network exposure before a production RustFS deployment." --- -> Security best practices for RustFS. Review this checklist during deployment to ensure system security and reliability. +Review this checklist during deployment so requests are signed, traffic is encrypted, and management ports are not exposed. -## Authentication & Access Control +## Authentication and access control - **Use S3-Compatible Key Authentication** RustFS uses AWS Signature V4. Make sure that all requests are signed with a valid access key and secret key. @@ -13,7 +13,7 @@ description: "Security checklist for enterprise deployments." - **Policy-Based Access Control** Define access policies based on the principle of least privilege. Explicitly define allowed operations; deny all others by default. -## Encryption (TLS/SSL) +## Encryption (TLS) - **Enable TLS/SSL** Configure valid TLS certificates. We recommend using different certificates for external and internal access, and enforcing TLS 1.2+. @@ -24,7 +24,7 @@ description: "Security checklist for enterprise deployments." - **Multi-Domain and Cipher Suites** Use separate certificates for each domain. Use strong key algorithms (for example, RSA 2048-bit or ECDSA P-256). -## Credential Protection +## Credential protection - **Change Default Credentials** Never keep the example placeholders (`` / ``) in production. Set a unique access key and a strong, random secret — e.g. generate one with `openssl rand -base64 24` — immediately after initialization. @@ -32,7 +32,7 @@ description: "Security checklist for enterprise deployments." - **Secure Storage** Do not hardcode credentials. Use environment variables or secrets management systems (e.g., Kubernetes Secrets). -## Logging & Auditing +## Logging and auditing - **Enable Audit Logs** Export audit logs to external systems (HTTP Webhook, Kafka, ELK, Splunk). @@ -46,7 +46,7 @@ description: "Security checklist for enterprise deployments." - **Observability** Monitor request latency to identify performance issues. -## API Security +## API security - **Restrict Network Access** Restrict access to the S3 API (port 9000) and Console (port 9001) using firewalls or security groups. @@ -60,7 +60,7 @@ description: "Security checklist for enterprise deployments." ## WORM Compliance - **Versioning and Object Lock** - Enable versioning and object locking to meet regulatory requirements. + Enable versioning and Object Lock to meet regulatory requirements. ## Updates @@ -68,7 +68,7 @@ description: "Security checklist for enterprise deployments." Regularly check for and apply RustFS updates. - **Non-Disruptive Upgrades** - Use the rolling restart process for zero-downtime upgrades. + Use a rolling restart so the cluster keeps serving requests during the upgrade. See [Upgrade](/operations/upgrade). - **OS and Dependencies** Keep the operating system and dependencies (e.g., OpenSSL) updated. diff --git a/content/en/installation/requirement/checklists/software-checklists.md b/content/en/installation/requirement/checklists/software-checklists.md index a3416d7a7..fe950c67e 100644 --- a/content/en/installation/requirement/checklists/software-checklists.md +++ b/content/en/installation/requirement/checklists/software-checklists.md @@ -1,31 +1,34 @@ --- title: "Software Checklist" -description: "Software requirements and considerations." +description: "Check the operating system, file system, and host packages before you install RustFS." --- Ensure the following requirements are met before deployment. -## OS Requirements +## Operating system - **Operating System**: Use LTS versions (Ubuntu 20.04+, RHEL 8/9). -- **Kernel**: Linux 5.x+ is recommended. -- **CPU & Memory**: x86_64 or ARM. Minimum 2 GB RAM for testing, 64 GB+ for production. -- **Disable Interfering Services**: Disable file indexing and auditing services (e.g., `mlocate`, `auditd`, antivirus) to prevent I/O interference. +- **Kernel**: We recommend Linux 5.10 or later. +- **CPU and memory**: x86_64 or ARM. Minimum 2 GB RAM for testing, 64 GB or more for production. +- **Disable interfering services**: Disable file indexing and auditing services (for example, `mlocate`, `auditd`, and antivirus) so they do not compete with RustFS I/O. -> **Why Linux 5.x+?** -> Modern LTS kernels bring mature async I/O and filesystem improvements. RustFS also offers an optional `io_uring` read path (`RUSTFS_IO_URING_READ_ENABLE`, disabled by default), which requires Linux 5.10+ to be effective. +:::note[Why Linux 5.10 or later] -## Binary Deployment +Modern LTS kernels include mature async I/O and file system improvements. RustFS also offers an optional `io_uring` read path (`RUSTFS_IO_URING_READ_ENABLE`, disabled by default), which requires Linux 5.10 or later. + +::: + +## Binary deployment - **Official Download**: Download binaries only from official RustFS channels. - **Integrity Verification**: Verify SHA256 checksums. - **Consistency**: Ensure all nodes run the same RustFS version. - **Installation Location**: Place binaries in `/usr/local/bin` and ensure they are executable (`chmod +x`). -## File System & Disks +## File system and drives - **Dedicated Data Disks**: Use dedicated disks for RustFS data. Do not share with the OS. -- **File system**: Use XFS or ext4 with performance mount options such as `noatime`. +- **File system**: Use XFS with mount options such as `noatime`. RustFS is developed and tested on XFS. See [File system selection](/installation/linux/prerequisites-and-service#file-system-selection). - **Disk Configuration**: Use JBOD (independent volumes). Do not use hardware RAID. - **Permissions**: Ensure the RustFS user has read/write access to data directories. @@ -37,7 +40,7 @@ Ensure the following requirements are met before deployment. - **TLS/Certificates**: Install root certificates and prepare server certificates if using HTTPS. - **Packages**: Ensure standard tools (`bash`, `glibc`, `openssl`) are installed. -## User & Security +## User and security - **Dedicated User**: Run RustFS as a dedicated user (e.g., `rustfs-user`). - **File Permissions**: Restrict access to binaries and configuration files. diff --git a/content/en/integration/virtual.md b/content/en/integration/virtual.md index e8105edda..7b890b02b 100644 --- a/content/en/integration/virtual.md +++ b/content/en/integration/virtual.md @@ -1,65 +1,66 @@ --- -title: "Virtual-Hosted–Style Requests" +title: "Virtual-hosted–style requests" description: "Configure path-style and virtual-hosted–style S3 URLs for RustFS." --- RustFS supports both S3 URL addressing styles: -1. Virtual Host Style -2. Path Style +1. Virtual-hosted–style +2. Path-style -The two styles differ in where the bucket name appears in the URL. +The difference is where the bucket name appears in the URL. -## Path Style +## Path-style addressing Path-style addressing is the default. In a path-style URL, the bucket name follows the endpoint. -Example (Bucket: `test`, Host: `rustfs.yourdomain.com`): +Example (bucket: `my-bucket`, host: `rustfs.example.com`): ```text -http://rustfs.yourdomain.com/test +http://rustfs.example.com/my-bucket ``` -**Note**: No configuration is required for Path Style. +:::note[No extra configuration] -## Virtual Host Style +Path-style addressing works without `RUSTFS_SERVER_DOMAINS`. -In Virtual Host Style, the bucket name is part of the domain. +::: -Example (Bucket: `test`, Host: `rustfs.yourdomain.com`): +## Virtual-hosted–style addressing -```text -http://test.rustfs.yourdomain.com/ -``` +In a virtual-hosted–style URL, the bucket name is part of the hostname. -### Configuration +Example (bucket: `my-bucket`, host: `rustfs.example.com`): -1. **DNS**: Create a wildcard DNS record (for example, `*.rustfs.yourdomain.com` → your server's IP address). -2. **Configuration**: Modify the configuration file (Linux: `/etc/default/rustfs`, Docker/K8s: env vars). -3. **Set Domain**: Set `RUSTFS_SERVER_DOMAINS = "rustfs.yourdomain.com"`. -4. **Restart**: Restart the service (`systemctl restart rustfs`). +```text +http://my-bucket.rustfs.example.com/ +``` -### Port in Domain (Optional) +### Configure the domain -Virtual-host routing applies to the S3 API listener (port 9000 by default); RustFS automatically matches `Host` headers that carry the S3 listener's own port. Only when clients reach RustFS through a **different** port (for example via a proxy) do you need to include that port in `RUSTFS_SERVER_DOMAINS`. +1. Create a wildcard DNS record (for example, `*.rustfs.example.com` → your server's IP address). +2. Set `RUSTFS_SERVER_DOMAINS=rustfs.example.com` in the server configuration (Linux: `/etc/default/rustfs`; Docker or Kubernetes: the same environment variable). Do not include a port when clients use the S3 API listener's own port. +3. Restart RustFS (`sudo systemctl restart rustfs` on a systemd install). -Example (`rustfs.yourdomain.com:8000`): +Virtual-hosted routing applies to the S3 API listener (port `9000` by default). RustFS matches `Host` headers that use that listener's port. Include a port in `RUSTFS_SERVER_DOMAINS` only when clients reach RustFS through a different port, for example a proxy on port `8000`. -```ini -RUSTFS_SERVER_DOMAINS = "rustfs.yourdomain.com:8000" +```ini title="/etc/default/rustfs" +RUSTFS_SERVER_DOMAINS=rustfs.example.com:8000 ``` -This ensures that requests like: +Requests such as the following are then routed with virtual-hosted–style addressing: ```text -http://my-bucket.rustfs.yourdomain.com:8000/ +http://my-bucket.rustfs.example.com:8000/ ``` -are routed correctly with virtual-hosted–style addressing. - :::warning[Match the Host header] The value of `RUSTFS_SERVER_DOMAINS` must exactly match the `Host` header (including the port, if present) that clients send. ::: +## Next steps + +- [S3 API overview](/administration/protocols/s3) +- [Environment variables](/reference/environment-variables) diff --git a/content/en/operations/cluster-lifecycle.md b/content/en/operations/cluster-lifecycle.md index 574c2be69..bc87c0008 100644 --- a/content/en/operations/cluster-lifecycle.md +++ b/content/en/operations/cluster-lifecycle.md @@ -3,7 +3,7 @@ title: "Cluster Lifecycle Operations" description: "Plan, start, expand, rebalance, decommission, heal, and restart erasure-coded RustFS clusters with verified quorum and storage-class behavior." --- -This runbook is the operator entry point for erasure-coded RustFS deployments: layout boundaries, storage classes and quorum, zero-parity mode, expansion, rebalancing, decommissioning, healing, drive replacement, and restarts. Every behavior described here was verified against the RustFS source; the upstream runbook in [rustfs/rustfs#7998](https://github.com/rustfs/rustfs/pull/7998) is the change that introduced it. +This runbook is the operator entry point for erasure-coded RustFS deployments: layout constraints, storage classes and quorum, zero-parity mode, expansion, rebalancing, decommissioning, healing, drive replacement, and restarts. Every behavior described here was verified against the RustFS source; the upstream runbook in [rustfs/rustfs#7998](https://github.com/rustfs/rustfs/pull/7998) is the change that introduced it. Related task pages: [Storage Pool Expansion](./scaling/storage-pool-expansion.md), [Data Rebalancing](./scaling/data-rebalancing.md), [Storage Pool Decommission](./scaling/storage-pool-decommission.md), and [Node Healing](./high-availability/node-healing.md). diff --git a/content/en/operations/scaling/data-rebalancing.md b/content/en/operations/scaling/data-rebalancing.md index 5025f8540..05981b398 100644 --- a/content/en/operations/scaling/data-rebalancing.md +++ b/content/en/operations/scaling/data-rebalancing.md @@ -18,7 +18,7 @@ Before starting, verify that all nodes and disks are healthy, no decommission is ## Operation -### Start rebalancing in the Console +### Start rebalancing on the Console 1. Sign in to the RustFS Console with an account that has rebalance administration permission. 2. Open **Rebalance**. @@ -61,7 +61,7 @@ rc admin rebalance stop rustfs ## Verification -### Verify rebalancing in the Console +### Verify rebalancing on the Console Wait until the Rebalance page reports `Completed`. Confirm that: diff --git a/content/en/operations/scaling/storage-pool-decommission.md b/content/en/operations/scaling/storage-pool-decommission.md index 00ee052ff..97a3cfad6 100644 --- a/content/en/operations/scaling/storage-pool-decommission.md +++ b/content/en/operations/scaling/storage-pool-decommission.md @@ -26,7 +26,7 @@ Canceling a decommission does not roll back completed moves. Objects already rel ## Operation -### Start decommissioning in the Console +### Start decommissioning on the Console 1. Sign in to the RustFS Console with an account that has decommission administration permission. 2. Open **Pool Decommission**. @@ -91,7 +91,7 @@ After the target reports `complete`, remove its expression from `RUSTFS_VOLUMES` ## Verification -### Verify decommissioning in the Console +### Verify decommissioning on the Console Confirm that the target pool reports `Completed`, with zero failed objects and zero failed bytes. After removing the pool from the startup topology and restarting RustFS, verify that: diff --git a/content/en/operations/scaling/storage-pool-expansion.md b/content/en/operations/scaling/storage-pool-expansion.md index e5cb761e7..9df908eb3 100644 --- a/content/en/operations/scaling/storage-pool-expansion.md +++ b/content/en/operations/scaling/storage-pool-expansion.md @@ -41,7 +41,7 @@ The Console displays storage pools but does not add a pool to the server startup 2. Install the same RustFS version and service configuration on the new pool node or nodes. 3. Append the new pool expression to `RUSTFS_VOLUMES` on every existing and new node. Keep the existing expressions unchanged and in the same order. 4. Restart RustFS across all nodes so every process starts with the same expanded topology. -5. Wait for all nodes to become ready, then refresh the pool list in the Console. +5. Wait for all nodes to become ready, then refresh the pool list on the Console. ![RustFS Console showing the original and newly added storage pools](./images/pool-expansion-console.png) @@ -83,7 +83,7 @@ rc admin pool status rustfs 1 --by-id ## Verification -### Verify the expansion in the Console +### Verify the expansion on the Console Confirm that: diff --git a/content/en/operations/status-check.md b/content/en/operations/status-check.md index 16ec93e69..78e93c808 100644 --- a/content/en/operations/status-check.md +++ b/content/en/operations/status-check.md @@ -28,7 +28,7 @@ firewall-cmd --permanent --add-port=9001/tcp firewall-cmd --reload ``` -:::warning[Restrict console access] +:::warning[Restrict Console access] Expose port 9001 only to trusted networks. If you do not need the Console, set `RUSTFS_CONSOLE_ENABLE=false` and leave the port closed. @@ -36,7 +36,7 @@ Expose port 9001 only to trusted networks. If you do not need the Console, set ` ## Health endpoints -The S3 listener on port **9000** serves unauthenticated probe endpoints. Disable them with `RUSTFS_HEALTH_ENDPOINT_ENABLE=false`. The console on port **9001** has its own health path. +The S3 listener on port **9000** serves unauthenticated probe endpoints. Disable them with `RUSTFS_HEALTH_ENDPOINT_ENABLE=false`. The Console on port **9001** has its own health path. | Endpoint | Port | Meaning | | --- | --- | --- | @@ -58,7 +58,7 @@ The `details` object reports `storage` / `iam` / `lock` (and `kms` when configur ## Cluster status -### Check cluster status in the Console +### Check cluster status on the Console 1. Sign in to the RustFS Console. 2. Open **Status**. @@ -83,7 +83,7 @@ rc admin info cluster rustfs --json ## Storage capacity -### Check storage capacity in the Console +### Check storage capacity on the Console 1. Sign in to the RustFS Console and open **Status**. 2. Review the cluster's used and total storage capacity. diff --git a/content/en/security-compliance/iam/access-token.md b/content/en/security-compliance/iam/access-token.md index cdd5bf791..6fa94738f 100644 --- a/content/en/security-compliance/iam/access-token.md +++ b/content/en/security-compliance/iam/access-token.md @@ -9,20 +9,20 @@ Access keys are the credentials that applications and tools use to authenticate - A running RustFS instance. See the [Installation Guide](../../installation/index.md). -## Creating Access Keys +## Create an access key 1. Sign in to the RustFS Console. -2. In the left navigation bar, select **Access Keys**. +2. In the left navigation, select **Access Keys**. 3. On the access keys page, in the upper right corner, click **Add Access Key**. 4. Enter an **Expiration**, **Name**, and **Description** for the key, and then select **Submit**. 5. (Recommended) On the page that appears, select **Copy** or **Export** to save the key. ![access key list page](images/access_token_creation.png) -## Deleting Access Keys +## Delete an access key 1. Sign in to the RustFS Console. -2. In the left navigation bar, select **Access Keys**. +2. In the left navigation, select **Access Keys**. 3. On the access keys page, select the access key you want to delete. 4. Select **Delete** next to the access key, or select **Delete Selected Items** in the upper-right corner. diff --git a/content/en/security-compliance/iam/sts.md b/content/en/security-compliance/iam/sts.md index 8ba58d53b..7a37b9630 100644 --- a/content/en/security-compliance/iam/sts.md +++ b/content/en/security-compliance/iam/sts.md @@ -15,7 +15,7 @@ A service account is an access key/secret key pair that belongs to a parent IAM Service accounts cannot call `AssumeRole`, and a service account access key cannot be turned into a regular IAM user. -In the Console, service accounts are managed on the **Access Keys** page — see [Access Key Management](./access-token.md). The admin API exposes: +On the Console, service accounts are managed on the **Access Keys** page. See [Access keys](./access-token.md). The admin API exposes: | Operation | Method and path | Notes | | --- | --- | --- | diff --git a/content/en/troubleshooting/driver.md b/content/en/troubleshooting/driver.md index 632340d2f..662802900 100644 --- a/content/en/troubleshooting/driver.md +++ b/content/en/troubleshooting/driver.md @@ -1,141 +1,95 @@ --- -title: "Drive Failures" -description: "Replace a failed drive in a RustFS deployment and let RustFS heal the data automatically." +title: "Drive failures" +description: "Replace a failed drive and let RustFS heal the missing data onto the replacement." --- -RustFS uses erasure coding to keep data readable and writable when some drives fail. After you replace a failed drive, RustFS heals the missing data onto it automatically. +RustFS uses erasure coding to keep data readable and writable when some drives fail. After you replace a failed drive, RustFS heals the missing data onto it automatically. For heal status and manual heal tasks, see [Node healing](/operations/high-availability/node-healing). - +Replace `/data/rustfs0` and `/dev/sdb` with the mount and device for the failed drive. Confirm the device name before you format it. `mkfs.xfs` erases the selected device. -### Unmount the failed disk +## 1. Stop RustFS and unmount the failed drive -Before replacing the physical hard drive, unmount the failed disk at the operating system level to prevent I/O errors in the file system or RustFS during replacement. +Unmount the failed file system. If it has more than one mount point, unmount each one. ```bash -# Assume the failed disk is /dev/sdb -umount /dev/sdb +sudo umount /data/rustfs0 ``` -:::note[Notes] +:::note[Device is busy] -* If the disk has multiple mount points, run `umount` on each one. -* If you see a "device is busy" error, stop the RustFS service first: +If `umount` reports that the device is busy, stop RustFS and any other process that still has the mount open, then run `umount` again. ```bash -systemctl stop rustfs +sudo systemctl stop rustfs ``` ::: - +## 2. Replace and prepare the drive -### Replace the failed disk - -After physically replacing the failed disk, you need to partition and format the new disk, and apply the same label as the original disk. +Install a replacement that is at least as large as the failed drive. Use XFS, the same file system as the other RustFS drives. [Disk preparation](/installation/requirement/disk-preparation) explains how to identify the device and choose a unique label. ```bash -# Format as XFS and apply the same label as the original disk (RustFS requires XFS, like the other disks in the deployment) -mkfs.xfs -L DISK1 /dev/sdb +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` -:::note[Requirements] - -* The new disk is at least as large as the original disk. -* Use the same file system as the other disks (XFS; see the [installation guide](../installation/linux/index.md)). -* We recommend mounting file systems by label (LABEL) or UUID so that mounts remain correct if device names change after a restart. - -::: - - - -### Update `/etc/fstab` or the RustFS configuration +## 3. Mount the replacement at the original path -Confirm that the labels or UUIDs in the `/etc/fstab` entries point to the new disk. The mount point must stay identical to the one listed in `RUSTFS_VOLUMES` (in `/etc/default/rustfs`), so the healed disk rejoins the cluster at the same path. +The mount point must stay the path listed in `RUSTFS_VOLUMES` (in `/etc/default/rustfs`). Mount by file-system UUID so a reboot cannot attach the wrong drive if device names change. -```bash -# View current fstab -cat /etc/fstab - -# Example fstab entry (no modification needed if labels are the same) -LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 +```ini title="/etc/fstab" +UUID= /data/rustfs0 xfs defaults,noatime,nodiratime 0 0 ``` -:::tip[Tips] - -* If using UUID: +Read the UUID after formatting: ```bash -blkid /dev/sdb -# Get the new partition's UUID, then replace the corresponding field in fstab +sudo blkid -s UUID -o value /dev/sdb ``` -* After you edit `/etc/fstab`, validate the syntax: +Check `/etc/fstab`, then mount every entry and confirm the path: ```bash -mount -a # If no errors, configuration is correct +sudo mount -a +findmnt /data/rustfs0 ``` -::: - - - -### Remount the new disk - -Run the following commands to mount all configured file systems and start RustFS: +Start RustFS after the replacement is mounted: ```bash -mount -a -systemctl start rustfs +sudo systemctl start rustfs ``` -Verify that all expected file systems are mounted: +Confirm the file system has free space: ```bash -df -h | grep /data/rustfs +df -hT /data/rustfs0 ``` -:::note[Mount failures] +:::note[Mount failed] -If a mount fails, check that the labels or UUIDs in `/etc/fstab` match those on the target file system. +If the mount fails, check that the UUID in `/etc/fstab` matches the new file system. ::: - - -### Trigger and monitor data healing - -Once RustFS detects a freshly formatted disk at a known mount point, its background scanner heals the missing data onto it automatically — no manual command is required. Confirm that recovery has started and track its progress through the service logs: +## 4. Watch healing ```bash -# For systemd-managed installations journalctl -u rustfs -f - -# Or view the log files under the directory set by RUSTFS_OBS_LOG_DIRECTORY tail -f /var/log/rustfs/rustfs.log ``` -You can also open the RustFS Console and check the disk status of the affected node. - -:::note[Notes] - -* Healing runs in the background and usually has little impact on client requests. -* When healing finishes, the logs report success or list objects that failed to heal. - -::: - - - -### Follow-up checks and notes +When RustFS sees a freshly formatted drive at a known mount point, it queues healing for the missing data. You can also check drive status on the Console, or follow the heal queue with `rc` as described in [Node healing](/operations/high-availability/node-healing). -1. **Performance Monitoring** +Healing reads healthy shards and writes reconstructed data, so disk and network utilization can rise while it runs. When the cycle finishes, the logs report success or list objects that failed to heal. - * I/O load may fluctuate during healing. We recommend monitoring disk and network utilization. -2. **Batch Failures** +## 5. Follow-up checks - * If several disks from the same manufacturing batch fail, inspect the remaining disks from that batch more often. -3. **Regular failure tests** +- If several drives from the same manufacturing batch fail, inspect the remaining drives from that batch more often. +- Rehearse this procedure so the team can follow it during an incident. +- When several drives fail together, schedule a maintenance window so replacement and healing do not compete with peak traffic. - * Run regular disk failure drills so your team can practice the recovery procedure. -4. **Maintenance Windows** +## Next steps - * When failure rates are high, schedule dedicated maintenance windows to speed up replacement and healing. +- [Recover a failed node](/troubleshooting/node) +- [Monitor healing](/operations/high-availability/node-healing) diff --git a/content/en/troubleshooting/index.md b/content/en/troubleshooting/index.md index 56ba12d31..8c608f797 100644 --- a/content/en/troubleshooting/index.md +++ b/content/en/troubleshooting/index.md @@ -1,11 +1,11 @@ --- title: "Troubleshooting" -description: "Diagnose and resolve RustFS issues." +description: "Recover a failed node or drive, and follow data healing after the replacement is online." --- This section covers: -- [Node Failures](./node.md) -- [Drive Failures](./driver.md) -- [Node Healing](../operations/high-availability/node-healing.md) +- [Node failures](./node.md) +- [Drive failures](./driver.md) +- [Node healing](../operations/high-availability/node-healing.md) diff --git a/content/en/troubleshooting/node.md b/content/en/troubleshooting/node.md index 51baef42f..70627e9f0 100644 --- a/content/en/troubleshooting/node.md +++ b/content/en/troubleshooting/node.md @@ -1,5 +1,5 @@ --- -title: "Node Failures" +title: "Node failures" description: "Prepare a replacement node, update its configuration, restore cluster membership, and verify data healing." --- @@ -13,16 +13,16 @@ A distributed RustFS cluster uses erasure coding to stay readable and writable w ## 1. Prepare the replacement node -* **Hardware and System Preparation** - Make sure that the replacement node's hardware (CPU, memory, network, and disk type) roughly matches the failed node. Using higher-spec hardware does not affect cluster performance. - Use software versions that match the other nodes, including the operating system, kernel, and dependencies, to avoid problems caused by inconsistent environments. +* **Hardware** + Make sure that the replacement node's hardware (CPU, memory, network, and drive type) roughly matches the failed node. Higher-spec hardware does not hurt cluster performance. + Run the same operating system, kernel, and library versions as the other nodes so the replacement does not behave differently from the rest of the cluster. -* **Exclusive access to drives** +* **Exclusive drive access** As with physical drive operations, RustFS requires exclusive access to its storage volumes. Do not let other processes or scripts modify data on these volumes directly, as this can corrupt data or reduce redundancy. ## 2. Update hostname and network resolution -* **DNS/Hosts Configuration** +* **DNS or `/etc/hosts`** If the replacement node's IP address differs from the failed node, point the old node's hostname (for example, `rustfs-node-2.example.net`) to the new node's IP address so that cluster nodes can still reach each other by the same name. ```bash @@ -34,17 +34,17 @@ A distributed RustFS cluster uses erasure coding to stay readable and writable w ## 3. Deploy and configure RustFS services -* **Download and Installation** +* **Install the same version** Install the same RustFS version as the existing nodes, using the same installation method and directory. Make sure that startup scripts, environment variables, and configuration files (such as `/etc/default/rustfs`) are identical to those on the other nodes. -* **Configuration Verification** +* **Check the configuration** * Check that `RUSTFS_VOLUMES` in `/etc/default/rustfs` is byte-for-byte identical to the other nodes, and that it covers the replacement node's hostname and port. * Make sure that all nodes use the same access keys and permission settings; otherwise, the new node fails to authenticate and cannot join the cluster. ## 4. Rejoin the cluster and trigger data healing -* **Start Service** +* **Start the service** ```bash systemctl start rustfs @@ -52,7 +52,7 @@ A distributed RustFS cluster uses erasure coding to stay readable and writable w Alternatively, start RustFS with your own startup script. Then run `journalctl -u rustfs -f` to confirm that the new node has detected the other nodes and started healing. -* **Monitor Healing Status** +* **Watch healing** Healing runs in the background once the node rejoins; no manual command is required. Watch its progress through the service logs on the replacement node, and check node and disk status in the RustFS Console: ```bash @@ -72,11 +72,11 @@ A distributed RustFS cluster uses erasure coding to stay readable and writable w * **Regular failure testing** Run regular node failure drills and practice the full recovery procedure so your team is familiar with the commands and incident response process. -* **Root Cause Analysis** - Run detailed hardware diagnostics (for example, SMART data and BIOS logs) on nodes or disks that fail repeatedly, and put a preventive maintenance plan in place. +* **Find the cause** + Run detailed hardware diagnostics (for example, SMART data and BIOS logs) on nodes or drives that fail repeatedly, and put a preventive maintenance plan in place. -* **Professional Support** - For help diagnosing the cause of a failure or recovering the cluster, contact the RustFS development team or community. +* **Ask for help** + For in-depth troubleshooting and recovery help, contact the RustFS team or the community. --- diff --git a/content/fr/developer/mcp.md b/content/fr/developer/mcp.md index fd997b019..1d1315433 100644 --- a/content/fr/developer/mcp.md +++ b/content/fr/developer/mcp.md @@ -86,7 +86,7 @@ The server supports various command line options to customize behavior: rustfs-mcp # Or with custom options -rustfs-mcp --log-level debug --region us-west-2 +rustfs-mcp --log-level debug --region us-east-1 ``` ### Integration with Chat Clients @@ -101,7 +101,7 @@ rustfs-mcp --log-level debug --region us-west-2 "args": [ "--access-key-id", "your_access_key", "--secret-access-key", "your_secret_key", - "--region", "us-west-2", + "--region", "us-east-1", "--log-level", "info" ] } @@ -183,7 +183,7 @@ If added successfully, you can list the [available tools](#️-available-tools) In Trae, you can use the corresponding tools by entering the corresponding prompts. For example, in Trae's chat dialog, enter: ```text -Please help me list the buckets in the current rustfs instance, thank you! +List the buckets in this RustFS instance. ``` Returns the following response: diff --git a/content/fr/developer/sdk/java.md b/content/fr/developer/sdk/java.md index 938a7f166..0c57a324a 100644 --- a/content/fr/developer/sdk/java.md +++ b/content/fr/developer/sdk/java.md @@ -217,7 +217,7 @@ GetObjectRequest getObjectRequest = GetObjectRequest.builder() GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .getObjectRequest(getObjectRequest) - .signatureDuration(Duration.ofMinutes(15)) // 15 minutes validity + .signatureDuration(Duration.ofMinutes(15)) // expires in 15 minutes .build(); PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest); diff --git a/content/fr/developer/sdk/other.md b/content/fr/developer/sdk/other.md index 4b4380965..31515ec7d 100644 --- a/content/fr/developer/sdk/other.md +++ b/content/fr/developer/sdk/other.md @@ -30,7 +30,7 @@ If you don't want to implement signatures yourself, you can: For example, call through Shell: ```bash -aws s3 cp local.txt s3://mybucket/myfile.txt --endpoint-url http://rustfs.local:9000 +aws s3 cp /path/to/hello.txt s3://my-bucket/hello.txt --endpoint-url http://localhost:9000 ``` Or write a simple relay service using Node.js/Python SDK, and your language uploads/downloads by calling this service. diff --git a/content/fr/developer/sdk/python.md b/content/fr/developer/sdk/python.md index 672504524..8b49d3edc 100644 --- a/content/fr/developer/sdk/python.md +++ b/content/fr/developer/sdk/python.md @@ -172,7 +172,7 @@ Bucket deleted. url = s3.generate_presigned_url( ClientMethod='get_object', Params={'Bucket': bucket_name, 'Key': 'hello.txt'}, - ExpiresIn=600, # 10 minutes validity + ExpiresIn=600, # expires in 10 minutes ) print('Presigned GET URL:', url) diff --git a/content/fr/installation/linux/multiple-node-multiple-disk.md b/content/fr/installation/linux/multiple-node-multiple-disk.md index 797c9cd9e..5ecf129e7 100644 --- a/content/fr/installation/linux/multiple-node-multiple-disk.md +++ b/content/fr/installation/linux/multiple-node-multiple-disk.md @@ -43,8 +43,7 @@ Configure your DNS resolution server to ensure name continuity. Modify the local alias settings in `/etc/hosts` as follows: -```bash title="/etc/hosts" -vim /etc/hosts +```text title="/etc/hosts" 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 diff --git a/content/fr/installation/requirement/checklists/hardware-checklists.md b/content/fr/installation/requirement/checklists/hardware-checklists.md index 8250d5512..13fd98f8c 100644 --- a/content/fr/installation/requirement/checklists/hardware-checklists.md +++ b/content/fr/installation/requirement/checklists/hardware-checklists.md @@ -122,11 +122,7 @@ def calc_memory(data_tb, access_pattern): ### File System Configuration ```bash -# XFS formatting example -mkfs.xfs -f -L rustfs_disk1 -d su=256k,sw=10 /dev/sdb - -# Recommended mount parameters -UUID=xxxx /mnt/disk1 xfs defaults,noatime,nodiratime,logbsize=256k 0 0 +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` ## High Availability Assurance Measures diff --git a/content/fr/integration/virtual.md b/content/fr/integration/virtual.md index 02a9ac4d5..f5e894751 100644 --- a/content/fr/integration/virtual.md +++ b/content/fr/integration/virtual.md @@ -17,7 +17,7 @@ Path Style is the default. In Path Style, the bucket name follows the endpoint. Example (Bucket: `test`, Host: `rustfs.yourdomain.com`): ```text -http://rustfs.yourdomain.com/test +http://rustfs.example.com/my-bucket ``` **Note**: No configuration is required for Path Style. @@ -29,7 +29,7 @@ In Virtual Host Style, the bucket name is part of the domain. Example (Bucket: `test`, Host: `rustfs.yourdomain.com`): ```text -http://test.rustfs.yourdomain.com/ +http://my-bucket.rustfs.example.com/ ``` ### Configuration @@ -45,14 +45,14 @@ Virtual-host routing applies to the S3 API listener (port 9000 by default); Rust Example (`rustfs.yourdomain.com:8000`): -```ini -RUSTFS_SERVER_DOMAINS = "rustfs.yourdomain.com:8000" +```ini title="/etc/default/rustfs" +RUSTFS_SERVER_DOMAINS=rustfs.example.com:8000 ``` This ensures that requests like: ```text -http://my-bucket.rustfs.yourdomain.com:8000/ +http://my-bucket.rustfs.example.com:8000/ ``` can be correctly resolved in Virtual Host Style mode. diff --git a/content/fr/troubleshooting/driver.md b/content/fr/troubleshooting/driver.md index f0d48390f..df837971c 100644 --- a/content/fr/troubleshooting/driver.md +++ b/content/fr/troubleshooting/driver.md @@ -21,8 +21,7 @@ RustFS ensures read/write access can still be provided when some disks fail thro Before replacing the physical hard drive, you need to safely unmount the failed disk from the operating system level to avoid I/O errors in the file system or RustFS during the replacement process. ```bash -# Assume the failed disk is /dev/sdb -umount /dev/sdb +sudo umount /data/rustfs0 ``` :::note[Notes] @@ -31,7 +30,7 @@ umount /dev/sdb * If encountering "device is busy", you can first stop the RustFS service: ```bash -systemctl stop rustfs +sudo systemctl stop rustfs ``` ::: @@ -43,8 +42,7 @@ systemctl stop rustfs After physically replacing the failed disk, you need to partition and format the new disk, and apply the same label as the original disk. ```bash -# Format as XFS and apply the same label as the original disk (RustFS requires XFS, like the other disks in the deployment) -mkfs.xfs -L DISK1 /dev/sdb +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` > **Requirements** @@ -59,12 +57,8 @@ mkfs.xfs -L DISK1 /dev/sdb Confirm that the mount item labels or UUIDs in `/etc/fstab` point to the new disk. The mount point must stay identical to the one listed in `RUSTFS_VOLUMES` (in `/etc/default/rustfs`), so the healed disk rejoins the cluster at the same path. -```bash -# View current fstab -cat /etc/fstab - -# Example fstab entry (no modification needed if labels are the same) -LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 +```ini title="/etc/fstab" +UUID= /data/rustfs0 xfs defaults,noatime,nodiratime 0 0 ``` :::tip[Tips] @@ -72,14 +66,14 @@ LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 * If using UUID: ```bash -blkid /dev/sdb -# Get the new partition's UUID, then replace the corresponding field in fstab +sudo blkid -s UUID -o value /dev/sdb ``` * After modifying fstab, be sure to validate syntax: ```bash -mount -a # If no errors, configuration is correct +sudo mount -a +findmnt /data/rustfs0 ``` ::: @@ -91,14 +85,13 @@ mount -a # If no errors, configuration is correct Execute the following commands to batch mount all disks and start the RustFS service: ```bash -mount -a -systemctl start rustfs +sudo systemctl start rustfs ``` Confirm all disks are mounted normally: ```bash -df -h | grep /data/rustfs +df -hT /data/rustfs0 ``` :::note @@ -114,10 +107,7 @@ If some mounts fail, please check if fstab entries are consistent with disk labe Once RustFS detects a freshly formatted disk at a known mount point, its background scanner heals the missing data onto it automatically — no manual command is required. Confirm that recovery has started and track its progress through the service logs: ```bash -# For systemd-managed installations journalctl -u rustfs -f - -# Or view the log files under the directory set by RUSTFS_OBS_LOG_DIRECTORY tail -f /var/log/rustfs/rustfs.log ``` diff --git a/content/ja/developer/mcp.md b/content/ja/developer/mcp.md index d00dde9d8..bd9bfd89e 100644 --- a/content/ja/developer/mcp.md +++ b/content/ja/developer/mcp.md @@ -86,7 +86,7 @@ rustfs-mcp --help rustfs-mcp # Or with custom options -rustfs-mcp --log-level debug --region us-west-2 +rustfs-mcp --log-level debug --region us-east-1 ``` ### チャットクライアントとの連携 @@ -101,7 +101,7 @@ rustfs-mcp --log-level debug --region us-west-2 "args": [ "--access-key-id", "your_access_key", "--secret-access-key", "your_secret_key", - "--region", "us-west-2", + "--region", "us-east-1", "--log-level", "info" ] } @@ -183,7 +183,7 @@ Cursor、Windsurf、Trae など、多くの AI IDE が MCP に対応していま Trae で MCP ツールを呼び出すには、チャットにプロンプトを入力します。例: ```text -Please help me list the buckets in the current rustfs instance, thank you! +List the buckets in this RustFS instance. ``` Trae は次の応答を返します。 diff --git a/content/ja/developer/sdk/java.md b/content/ja/developer/sdk/java.md index b4df7d829..f27c2b452 100644 --- a/content/ja/developer/sdk/java.md +++ b/content/ja/developer/sdk/java.md @@ -217,7 +217,7 @@ GetObjectRequest getObjectRequest = GetObjectRequest.builder() GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .getObjectRequest(getObjectRequest) - .signatureDuration(Duration.ofMinutes(15)) // 15 minutes validity + .signatureDuration(Duration.ofMinutes(15)) // expires in 15 minutes .build(); PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest); diff --git a/content/ja/developer/sdk/other.md b/content/ja/developer/sdk/other.md index 7aa60b3a7..6603c99b6 100644 --- a/content/ja/developer/sdk/other.md +++ b/content/ja/developer/sdk/other.md @@ -30,7 +30,7 @@ S3 プロトコルは、標準的な RESTful API です。HTTP リクエスト たとえば、アプリケーションからシェルで次のコマンドを実行します。 ```bash -aws s3 cp local.txt s3://mybucket/myfile.txt --endpoint-url http://rustfs.local:9000 +aws s3 cp /path/to/hello.txt s3://my-bucket/hello.txt --endpoint-url http://localhost:9000 ``` あるいは、Node.js または Python の SDK で小さな中継サービスを作り、アプリケーションから呼び出してオブジェクトをアップロードまたはダウンロードします。 diff --git a/content/ja/developer/sdk/python.md b/content/ja/developer/sdk/python.md index 6a67f868f..ef8c81f56 100644 --- a/content/ja/developer/sdk/python.md +++ b/content/ja/developer/sdk/python.md @@ -172,7 +172,7 @@ Bucket deleted. url = s3.generate_presigned_url( ClientMethod='get_object', Params={'Bucket': bucket_name, 'Key': 'hello.txt'}, - ExpiresIn=600, # 10 minutes validity + ExpiresIn=600, # expires in 10 minutes ) print('Presigned GET URL:', url) diff --git a/content/ja/installation/linux/multiple-node-multiple-disk.md b/content/ja/installation/linux/multiple-node-multiple-disk.md index 4870cd569..0eb2e8b10 100644 --- a/content/ja/installation/linux/multiple-node-multiple-disk.md +++ b/content/ja/installation/linux/multiple-node-multiple-disk.md @@ -43,8 +43,7 @@ RustFS クラスターには、一貫した連番のホスト名(例: `node1` すべてのノードの `/etc/hosts` に、次のエントリを追加します。 -```bash title="/etc/hosts" -vim /etc/hosts +```text title="/etc/hosts" 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 diff --git a/content/ja/installation/requirement/checklists/hardware-checklists.md b/content/ja/installation/requirement/checklists/hardware-checklists.md index 796c19463..0a9058bd0 100644 --- a/content/ja/installation/requirement/checklists/hardware-checklists.md +++ b/content/ja/installation/requirement/checklists/hardware-checklists.md @@ -122,11 +122,7 @@ def calc_memory(data_tb, access_pattern): ### ファイルシステムの設定 ```bash -# XFS formatting example -mkfs.xfs -f -L rustfs_disk1 -d su=256k,sw=10 /dev/sdb - -# Recommended mount parameters -UUID=xxxx /mnt/disk1 xfs defaults,noatime,nodiratime,logbsize=256k 0 0 +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` ## 高可用性 diff --git a/content/ja/integration/virtual.md b/content/ja/integration/virtual.md index 8e74f2ffe..29ea37821 100644 --- a/content/ja/integration/virtual.md +++ b/content/ja/integration/virtual.md @@ -17,7 +17,7 @@ RustFS は、次の 2 つの S3 URL 形式に対応しています。 例(バケット: `test`、ホスト: `rustfs.yourdomain.com`): ```text -http://rustfs.yourdomain.com/test +http://rustfs.example.com/my-bucket ``` **注意**: パススタイルアクセスに設定は不要です。 @@ -29,7 +29,7 @@ http://rustfs.yourdomain.com/test 例(バケット: `test`、ホスト: `rustfs.yourdomain.com`): ```text -http://test.rustfs.yourdomain.com/ +http://my-bucket.rustfs.example.com/ ``` ### 設定 @@ -45,14 +45,14 @@ http://test.rustfs.yourdomain.com/ 例(`rustfs.yourdomain.com:8000`): -```ini -RUSTFS_SERVER_DOMAINS = "rustfs.yourdomain.com:8000" +```ini title="/etc/default/rustfs" +RUSTFS_SERVER_DOMAINS=rustfs.example.com:8000 ``` これにより、次のようなリクエストが、 ```text -http://my-bucket.rustfs.yourdomain.com:8000/ +http://my-bucket.rustfs.example.com:8000/ ``` 仮想ホスト形式で正しくルーティングされます。 diff --git a/content/ja/troubleshooting/driver.md b/content/ja/troubleshooting/driver.md index 702f4aa29..377f570a5 100644 --- a/content/ja/troubleshooting/driver.md +++ b/content/ja/troubleshooting/driver.md @@ -12,8 +12,7 @@ RustFS はイレイジャーコーディングにより、一部のドライブ 物理ハードディスクを交換する前に、OS 上で障害ディスクをアンマウントします。交換中にファイルシステムや RustFS で I/O エラーが起きるのを防ぎます。 ```bash -# Assume the failed disk is /dev/sdb -umount /dev/sdb +sudo umount /data/rustfs0 ``` :::note[注意] @@ -22,7 +21,7 @@ umount /dev/sdb * 「device is busy」エラーが表示された場合は、先に RustFS サービスを停止します。 ```bash -systemctl stop rustfs +sudo systemctl stop rustfs ``` ::: @@ -34,8 +33,7 @@ systemctl stop rustfs 障害ディスクを物理的に交換したあと、新しいディスクをパーティション分割してフォーマットし、元のディスクと同じラベルを付けます。 ```bash -# Format as XFS and apply the same label as the original disk (RustFS requires XFS, like the other disks in the deployment) -mkfs.xfs -L DISK1 /dev/sdb +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` :::note[要件] @@ -52,12 +50,8 @@ mkfs.xfs -L DISK1 /dev/sdb `/etc/fstab` のエントリに書かれたラベルまたは UUID が、新しいディスクを指していることを確認します。マウントポイントは `/etc/default/rustfs` の `RUSTFS_VOLUMES` に記載されたパスと同一である必要があります。これにより、修復対象のディスクが同じパスでクラスターに再参加します。 -```bash -# View current fstab -cat /etc/fstab - -# Example fstab entry (no modification needed if labels are the same) -LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 +```ini title="/etc/fstab" +UUID= /data/rustfs0 xfs defaults,noatime,nodiratime 0 0 ``` :::tip[ヒント] @@ -65,14 +59,14 @@ LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 * UUID を使う場合: ```bash -blkid /dev/sdb -# Get the new partition's UUID, then replace the corresponding field in fstab +sudo blkid -s UUID -o value /dev/sdb ``` * `/etc/fstab` の編集後に、構文を検証します。 ```bash -mount -a # If no errors, configuration is correct +sudo mount -a +findmnt /data/rustfs0 ``` ::: @@ -84,14 +78,13 @@ mount -a # If no errors, configuration is correct 次のコマンドで、設定済みのファイルシステムをすべてマウントし、RustFS を起動します。 ```bash -mount -a -systemctl start rustfs +sudo systemctl start rustfs ``` 想定しているファイルシステムがすべてマウントされていることを確認します。 ```bash -df -h | grep /data/rustfs +df -hT /data/rustfs0 ``` :::note[マウントの失敗] @@ -107,10 +100,7 @@ df -h | grep /data/rustfs RustFS が既知のマウントポイントでフォーマット直後のディスクを検出すると、バックグラウンドスキャナーが欠落データをそのディスクへ自動的に修復します。手動のコマンドは不要です。サービスログで、復旧の開始と進捗を確認します。 ```bash -# For systemd-managed installations journalctl -u rustfs -f - -# Or view the log files under the directory set by RUSTFS_OBS_LOG_DIRECTORY tail -f /var/log/rustfs/rustfs.log ``` diff --git a/content/zh/developer/mcp.md b/content/zh/developer/mcp.md index 4ddbe6261..c236cff32 100644 --- a/content/zh/developer/mcp.md +++ b/content/zh/developer/mcp.md @@ -86,7 +86,7 @@ rustfs-mcp --help rustfs-mcp # Or with custom options -rustfs-mcp --log-level debug --region us-west-2 +rustfs-mcp --log-level debug --region us-east-1 ``` ### 与聊天客户端集成 @@ -101,7 +101,7 @@ rustfs-mcp --log-level debug --region us-west-2 "args": [ "--access-key-id", "your_access_key", "--secret-access-key", "your_secret_key", - "--region", "us-west-2", + "--region", "us-east-1", "--log-level", "info" ] } @@ -183,7 +183,7 @@ docker build -f crates/mcp/Dockerfile -t rustfs/rustfs-mcp . 在 Trae 中,你可以通过输入相应的提示词使用对应工具。例如,在 Trae 的聊天对话框中输入: ```text -Please help me list the buckets in the current rustfs instance, thank you! +List the buckets in this RustFS instance. ``` 将返回以下响应: diff --git a/content/zh/developer/sdk/java.md b/content/zh/developer/sdk/java.md index f41103481..cf2fafb32 100644 --- a/content/zh/developer/sdk/java.md +++ b/content/zh/developer/sdk/java.md @@ -217,7 +217,7 @@ GetObjectRequest getObjectRequest = GetObjectRequest.builder() GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .getObjectRequest(getObjectRequest) - .signatureDuration(Duration.ofMinutes(15)) // 15 minutes validity + .signatureDuration(Duration.ofMinutes(15)) // expires in 15 minutes .build(); PresignedGetObjectRequest presignedRequest = presigner.presignGetObject(presignRequest); diff --git a/content/zh/developer/sdk/other.md b/content/zh/developer/sdk/other.md index 9f7b7bb2b..ede481d8b 100644 --- a/content/zh/developer/sdk/other.md +++ b/content/zh/developer/sdk/other.md @@ -30,7 +30,7 @@ S3 协议是一套标准 RESTful API。你可以使用任何支持 HTTP 请求 例如,通过 Shell 调用: ```bash -aws s3 cp local.txt s3://mybucket/myfile.txt --endpoint-url http://rustfs.local:9000 +aws s3 cp /path/to/hello.txt s3://my-bucket/hello.txt --endpoint-url http://localhost:9000 ``` 或者使用 Node.js/Python SDK 编写简单的中继服务,让你的语言通过调用该服务上传或下载文件。 diff --git a/content/zh/developer/sdk/python.md b/content/zh/developer/sdk/python.md index 9b7fc25ed..ae5508b46 100644 --- a/content/zh/developer/sdk/python.md +++ b/content/zh/developer/sdk/python.md @@ -172,7 +172,7 @@ Bucket deleted. url = s3.generate_presigned_url( ClientMethod='get_object', Params={'Bucket': bucket_name, 'Key': 'hello.txt'}, - ExpiresIn=600, # 10 minutes validity + ExpiresIn=600, # expires in 10 minutes ) print('Presigned GET URL:', url) diff --git a/content/zh/installation/linux/multiple-node-multiple-disk.md b/content/zh/installation/linux/multiple-node-multiple-disk.md index 8d702d975..7acb70a8b 100644 --- a/content/zh/installation/linux/multiple-node-multiple-disk.md +++ b/content/zh/installation/linux/multiple-node-multiple-disk.md @@ -43,8 +43,7 @@ flowchart TD 按如下方式修改 `/etc/hosts` 中的本地别名设置: -```bash title="/etc/hosts" -vim /etc/hosts +```text title="/etc/hosts" 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 diff --git a/content/zh/installation/requirement/checklists/hardware-checklists.md b/content/zh/installation/requirement/checklists/hardware-checklists.md index 5ef2a8689..2c6c1fbde 100644 --- a/content/zh/installation/requirement/checklists/hardware-checklists.md +++ b/content/zh/installation/requirement/checklists/hardware-checklists.md @@ -122,11 +122,7 @@ def calc_memory(data_tb, access_pattern): ### 文件系统配置 ```bash -# XFS formatting example -mkfs.xfs -f -L rustfs_disk1 -d su=256k,sw=10 /dev/sdb - -# Recommended mount parameters -UUID=xxxx /mnt/disk1 xfs defaults,noatime,nodiratime,logbsize=256k 0 0 +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` ## 高可用保障措施 diff --git a/content/zh/integration/virtual.md b/content/zh/integration/virtual.md index bea752dae..d5f31623b 100644 --- a/content/zh/integration/virtual.md +++ b/content/zh/integration/virtual.md @@ -17,7 +17,7 @@ RustFS 遵循 S3 协议。S3 支持两种请求模式: 示例(存储桶:`test`,主机:`rustfs.yourdomain.com`): ```text -http://rustfs.yourdomain.com/test +http://rustfs.example.com/my-bucket ``` **注意**:路径风格无需配置。 @@ -29,7 +29,7 @@ http://rustfs.yourdomain.com/test 示例(存储桶:`test`,主机:`rustfs.yourdomain.com`): ```text -http://test.rustfs.yourdomain.com/ +http://my-bucket.rustfs.example.com/ ``` ### 配置 @@ -45,14 +45,14 @@ http://test.rustfs.yourdomain.com/ 示例(`rustfs.yourdomain.com:8000`): -```ini -RUSTFS_SERVER_DOMAINS = "rustfs.yourdomain.com:8000" +```ini title="/etc/default/rustfs" +RUSTFS_SERVER_DOMAINS=rustfs.example.com:8000 ``` 这样可确保以下请求: ```text -http://my-bucket.rustfs.yourdomain.com:8000/ +http://my-bucket.rustfs.example.com:8000/ ``` 能够在虚拟主机风格模式下正确解析。 diff --git a/content/zh/troubleshooting/driver.md b/content/zh/troubleshooting/driver.md index b0fa2c858..837f50d90 100644 --- a/content/zh/troubleshooting/driver.md +++ b/content/zh/troubleshooting/driver.md @@ -21,8 +21,7 @@ RustFS 通过类似纠删码的机制,在部分磁盘故障时仍可提供读 更换物理硬盘前,需要在操作系统层面安全卸载故障磁盘,避免更换过程中在文件系统或 RustFS 中产生 I/O 错误。 ```bash -# Assume the failed disk is /dev/sdb -umount /dev/sdb +sudo umount /data/rustfs0 ``` :::note[注意事项] @@ -31,7 +30,7 @@ umount /dev/sdb * 如果遇到“device is busy”,可以先停止 RustFS 服务: ```bash -systemctl stop rustfs +sudo systemctl stop rustfs ``` ::: @@ -43,8 +42,7 @@ systemctl stop rustfs 更换物理磁盘后,需要对新磁盘进行分区和格式化,并应用与原磁盘相同的标签。 ```bash -# Format as XFS and apply the same label as the original disk (RustFS requires XFS, like the other disks in the deployment) -mkfs.xfs -L DISK1 /dev/sdb +sudo mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 /dev/sdb ``` > **要求** @@ -59,12 +57,8 @@ mkfs.xfs -L DISK1 /dev/sdb 确认 `/etc/fstab` 中挂载项的标签或 UUID 指向新磁盘。挂载点必须与 `RUSTFS_VOLUMES`(位于 `/etc/default/rustfs`)中列出的路径保持一致,使修复后的磁盘以相同路径重新加入集群。 -```bash -# View current fstab -cat /etc/fstab - -# Example fstab entry (no modification needed if labels are the same) -LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 +```ini title="/etc/fstab" +UUID= /data/rustfs0 xfs defaults,noatime,nodiratime 0 0 ``` :::tip[提示] @@ -72,14 +66,14 @@ LABEL=DISK1 /data/rustfs0 xfs defaults,noatime 0 2 * 如果使用 UUID: ```bash -blkid /dev/sdb -# Get the new partition's UUID, then replace the corresponding field in fstab +sudo blkid -s UUID -o value /dev/sdb ``` * 修改 fstab 后,务必验证语法: ```bash -mount -a # If no errors, configuration is correct +sudo mount -a +findmnt /data/rustfs0 ``` ::: @@ -91,14 +85,13 @@ mount -a # If no errors, configuration is correct 执行以下命令批量挂载所有磁盘并启动 RustFS 服务: ```bash -mount -a -systemctl start rustfs +sudo systemctl start rustfs ``` 确认所有磁盘均已正常挂载: ```bash -df -h | grep /data/rustfs +df -hT /data/rustfs0 ``` :::note @@ -114,10 +107,7 @@ df -h | grep /data/rustfs RustFS 在已知挂载点检测到新格式化的磁盘后,后台扫描器会自动将缺失数据修复到该磁盘,无需手动命令。通过服务日志确认恢复已开始并跟踪进度: ```bash -# For systemd-managed installations journalctl -u rustfs -f - -# Or view the log files under the directory set by RUSTFS_OBS_LOG_DIRECTORY tail -f /var/log/rustfs/rustfs.log ```