diff --git a/content/de/administration/protocols/s3.md b/content/de/administration/protocols/s3.md
index 4766bc788..ec298a501 100644
--- a/content/de/administration/protocols/s3.md
+++ b/content/de/administration/protocols/s3.md
@@ -178,7 +178,7 @@ aws --endpoint-url "$RUSTFS_ENDPOINT" s3api delete-bucket \
Ein S3-Bucket muss leer sein, bevor er gelöscht werden kann.
-## Bekannte Kompatibilitätsunterschiede
+## Bekannte Kompatibilitätsunterschiede [#known-compatibility-differences]
Die aktuellen Kompatibilitätstests von RustFS decken die oben beschriebenen gängigen Abläufe ab. Die folgenden Bereiche sind nicht gleichwertig mit AWS S3 oder MinIO:
diff --git a/content/de/developer/examples/rclone.md b/content/de/developer/examples/rclone.md
index ef70dc5c1..fb334ac05 100644
--- a/content/de/developer/examples/rclone.md
+++ b/content/de/developer/examples/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone-Beispiele"
description: "Verbinden Sie rclone mit RustFS und führen Sie grundlegende Objektoperationen aus."
---
diff --git a/content/de/developer/examples/terraform.md b/content/de/developer/examples/terraform.md
index cf5bb0640..50f661b48 100644
--- a/content/de/developer/examples/terraform.md
+++ b/content/de/developer/examples/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform-Beispiele"
description: "Verwalten Sie RustFS-Buckets und -Objekte mit Terraform, indem Sie den AWS-Provider auf einen benutzerdefinierten Endpunkt richten."
---
diff --git a/content/de/developer/integration/devops/meta.json b/content/de/developer/integration/devops/meta.json
index 1f41e2a72..87bd3fe74 100644
--- a/content/de/developer/integration/devops/meta.json
+++ b/content/de/developer/integration/devops/meta.json
@@ -5,7 +5,7 @@
"opensearch",
"gitea",
"jenkins",
- "terraform",
+ "[Terraform](/de/developer/integration/devops/terraform)",
"helm"
]
}
diff --git a/content/de/developer/integration/devops/terraform.md b/content/de/developer/integration/devops/terraform.md
index f7a026a59..5632a7b9e 100644
--- a/content/de/developer/integration/devops/terraform.md
+++ b/content/de/developer/integration/devops/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform-Integration"
description: "Speichern Sie den Terraform-State einschließlich der State-Sperre mit dem S3-Backend im RustFS-Objektspeicher."
---
diff --git a/content/de/developer/integration/observability/index.md b/content/de/developer/integration/observability/index.md
index ae96163b0..e95b4b46e 100644
--- a/content/de/developer/integration/observability/index.md
+++ b/content/de/developer/integration/observability/index.md
@@ -1,5 +1,5 @@
---
-title: "Observability"
+title: "Observability-Integrationen"
description: "Verbinden Sie Observability-Plattformen über S3-kompatible Objektspeicher-Schnittstellen mit RustFS."
---
diff --git a/content/de/developer/integration/others/meta.json b/content/de/developer/integration/others/meta.json
index aeb90a3ff..99cbadf0d 100644
--- a/content/de/developer/integration/others/meta.json
+++ b/content/de/developer/integration/others/meta.json
@@ -4,7 +4,7 @@
"capo",
"juicefs",
"nextcloud",
- "rclone",
+ "[rclone](/de/developer/integration/others/rclone)",
"tusd"
]
}
diff --git a/content/de/developer/integration/others/rclone.md b/content/de/developer/integration/others/rclone.md
index 71074924e..fa0e3f72b 100644
--- a/content/de/developer/integration/others/rclone.md
+++ b/content/de/developer/integration/others/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone-Integration"
description: "Synchronisieren Sie RustFS-Buckets mit rclone, hängen Sie sie ein und stellen Sie sie über die S3-kompatible API bereit."
---
diff --git a/content/de/installation/cloud-native/helm-chart/index.md b/content/de/installation/cloud-native/helm-chart/index.md
index f062f61fe..68024884a 100644
--- a/content/de/installation/cloud-native/helm-chart/index.md
+++ b/content/de/installation/cloud-native/helm-chart/index.md
@@ -1,5 +1,5 @@
---
-title: Überblick
+title: "Überblick über das Helm-Chart"
description: Verstehen Sie, wie das RustFS-Helm-Chart Standalone- und verteilte Cluster auf Kubernetes bereitstellt.
---
diff --git a/content/de/installation/cloud-native/helm-chart/installation.mdx b/content/de/installation/cloud-native/helm-chart/installation.mdx
index 8c28833fa..9e6b92c26 100644
--- a/content/de/installation/cloud-native/helm-chart/installation.mdx
+++ b/content/de/installation/cloud-native/helm-chart/installation.mdx
@@ -1,5 +1,5 @@
---
-title: Installation
+title: "RustFS mit Helm installieren"
description: Installieren Sie RustFS im Standalone- oder verteilten Modus mit dem offiziellen Helm-Chart auf Kubernetes.
---
diff --git a/content/de/installation/cloud-native/helm-chart/meta.json b/content/de/installation/cloud-native/helm-chart/meta.json
index bc612082b..5d9ee51ed 100644
--- a/content/de/installation/cloud-native/helm-chart/meta.json
+++ b/content/de/installation/cloud-native/helm-chart/meta.json
@@ -1,7 +1,7 @@
{
"title": "Helm-Chart",
"pages": [
- "installation",
+ "[Installation](/de/installation/cloud-native/helm-chart/installation)",
"mtls",
"cert-manager"
]
diff --git a/content/de/installation/cloud-native/operator/index.md b/content/de/installation/cloud-native/operator/index.md
index dd3601d71..2278b1bf5 100644
--- a/content/de/installation/cloud-native/operator/index.md
+++ b/content/de/installation/cloud-native/operator/index.md
@@ -1,5 +1,5 @@
---
-title: Überblick
+title: "Überblick über den Operator"
description: Verstehen Sie, wie der RustFS Operator RustFS-Cluster auf Kubernetes verwaltet.
---
diff --git a/content/de/installation/cloud-native/operator/installation.md b/content/de/installation/cloud-native/operator/installation.md
index 84c3acdcc..5d8e7936f 100644
--- a/content/de/installation/cloud-native/operator/installation.md
+++ b/content/de/installation/cloud-native/operator/installation.md
@@ -1,5 +1,5 @@
---
-title: Installation
+title: "RustFS-Operator installieren"
description: Bereiten Sie Kubernetes vor, installieren Sie den RustFS Operator und greifen Sie sicher auf seine Console zu.
---
diff --git a/content/de/installation/cloud-native/operator/meta.json b/content/de/installation/cloud-native/operator/meta.json
index 843952a8b..d012ab6d1 100644
--- a/content/de/installation/cloud-native/operator/meta.json
+++ b/content/de/installation/cloud-native/operator/meta.json
@@ -1,9 +1,9 @@
{
"title": "Operator",
"pages": [
- "installation",
+ "[Installation](/de/installation/cloud-native/operator/installation)",
"tenant",
- "pool-expansion",
+ "[Speicherpool-Erweiterung](/de/installation/cloud-native/operator/pool-expansion)",
"kms"
]
}
\ No newline at end of file
diff --git a/content/de/installation/cloud-native/operator/pool-expansion.md b/content/de/installation/cloud-native/operator/pool-expansion.md
index 707263b17..987d14509 100644
--- a/content/de/installation/cloud-native/operator/pool-expansion.md
+++ b/content/de/installation/cloud-native/operator/pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: Speicherpool-Erweiterung
+title: "Tenant-Speicherpool erweitern"
description: Erweitern Sie die Speicherkapazität eines RustFS-Tenants, indem Sie einen Speicherpool anhängen.
---
diff --git a/content/de/installation/container/docker.md b/content/de/installation/container/docker.md
index fbffd52fe..265bc2ea6 100644
--- a/content/de/installation/container/docker.md
+++ b/content/de/installation/container/docker.md
@@ -1,5 +1,5 @@
---
-title: "Docker"
+title: "RustFS mit Docker installieren und konfigurieren"
description: "Betreiben Sie RustFS mit Docker: Einrichtung auf einem Knoten, Berechtigungen der Host-Verzeichnisse, Docker Compose, TLS und eine Bereitstellung auf mehreren Knoten."
---
@@ -9,7 +9,7 @@ Diese Seite beschreibt, wie Sie das offizielle RustFS-Image mit Docker betreiben
* Docker Engine (≥ 20.10) ist installiert, und Sie können Images abrufen und Container ausführen
* Die Host-Ports 9000 (S3-API) und 9001 (Console, Weboberfläche) sind frei, oder Sie verwenden die Ports, die Sie vorgesehen haben
-* Wenn Sie ein Host-Verzeichnis per Bind-Mount einhängen, muss der Eigentümer des Verzeichnisses dem Container-Benutzer entsprechen — siehe [Host-Verzeichnis per Bind-Mount einbinden](#5-host-verzeichnis-per-bind-mount-einbinden)
+* Wenn Sie ein Host-Verzeichnis per Bind-Mount einhängen, muss der Eigentümer des Verzeichnisses dem Container-Benutzer entsprechen — siehe [Host-Verzeichnis per Bind-Mount einbinden](#bind-mount-a-host-directory)
## 2. Image abrufen
@@ -71,7 +71,7 @@ docker run -d \
/data
```
-## 5. Host-Verzeichnis per Bind-Mount einbinden
+## 5. Host-Verzeichnis per Bind-Mount einbinden [#bind-mount-a-host-directory]
Das benannte Volume oben braucht keine weitere Vorbereitung. Wenn Sie stattdessen ein Host-Verzeichnis einhängen (`-v /path/on/host:/data`), läuft der Container als Benutzer `rustfs` ohne Root-Rechte mit der ID `10001`. Der Eigentümer des Host-Verzeichnisses muss `10001` sein, sonst treten Fehler `permission denied` auf:
diff --git a/content/de/installation/container/meta.json b/content/de/installation/container/meta.json
index be4e8d9a1..9b83e89ff 100644
--- a/content/de/installation/container/meta.json
+++ b/content/de/installation/container/meta.json
@@ -1,7 +1,7 @@
{
"title": "Container",
"pages": [
- "docker",
+ "[Docker](/de/installation/container/docker)",
"podman"
]
}
\ No newline at end of file
diff --git a/content/de/installation/index.md b/content/de/installation/index.md
index a435f26f2..53b18b7e5 100644
--- a/content/de/installation/index.md
+++ b/content/de/installation/index.md
@@ -1,5 +1,5 @@
---
-title: "Installation"
+title: "Installationspfad für RustFS wählen"
description: "Wählen Sie den passenden Bereitstellungspfad für RustFS: lokaler Test, Produktion auf einem oder mehreren Knoten, Container und Kubernetes."
---
@@ -30,7 +30,7 @@ Legen Sie nach der Installation eindeutige Werte für `RUSTFS_ACCESS_KEY` und `R
| Kubernetes / Cloud-native | Bereitstellung mit dem Helm-Chart oder dem Operator | [Cloud-native](./cloud-native/index.md) |
| Windows- oder macOS-Host | Installation des nativen Programms | [Windows](./windows/index.md) · [macOS](./macos/index.md) |
-## Vergleich der Bereitstellungsmodi
+## Vergleich der Bereitstellungsmodi [#deployment-mode-comparison]
| Modus | Knoten | Datenträger | Fehlertoleranz | Typische Verwendung |
| - | - | - | - | - |
diff --git a/content/de/installation/linux/quick-start.md b/content/de/installation/linux/quick-start.md
index d9e52ca22..837d27268 100644
--- a/content/de/installation/linux/quick-start.md
+++ b/content/de/installation/linux/quick-start.md
@@ -3,7 +3,7 @@ title: "Schnellstart"
description: "Installieren Sie RustFS mit dem Installationsskript, melden Sie sich an der Console an und speichern Sie Ihr erstes Objekt — in etwa zehn Minuten."
---
-Diese Anleitung führt Sie von einem leeren Linux-Server zu einer laufenden RustFS-Instanz. Sie installieren RustFS, melden sich an der Console (Weboberfläche) an, legen einen Bucket an und laden Ihr erstes Objekt hoch. Die Produktionsplanung (Aufbau mit mehreren Knoten, Dimensionierung der Hardware) bleibt bewusst dem [nächsten Schritt](#nächste-schritte) vorbehalten.
+Diese Anleitung führt Sie von einem leeren Linux-Server zu einer laufenden RustFS-Instanz. Sie installieren RustFS, melden sich an der Console (Weboberfläche) an, legen einen Bucket an und laden Ihr erstes Objekt hoch. Die Produktionsplanung (Aufbau mit mehreren Knoten, Dimensionierung der Hardware) bleibt bewusst dem [nächsten Schritt](#next-steps) vorbehalten.
**Voraussetzungen**
@@ -80,7 +80,7 @@ rc object list rustfs/my-bucket
-## Nächste Schritte
+## Nächste Schritte [#next-steps]
Mit der Schnellinstallation betreiben Sie RustFS im Modus **Einzelner Knoten mit einem Datenträger (SNSD)** — ohne Redundanz, geeignet für Evaluierung und Entwicklung. So geht es weiter:
diff --git a/content/de/operations/meta.json b/content/de/operations/meta.json
index f8e52bf7c..7c50a809d 100644
--- a/content/de/operations/meta.json
+++ b/content/de/operations/meta.json
@@ -8,7 +8,7 @@
"scaling",
"high-availability",
"cluster-lifecycle",
- "observability",
+ "[Observability](/de/operations/observability)",
"status-check",
"event-notifications"
]
diff --git a/content/de/operations/observability.md b/content/de/operations/observability.md
index 4c014c95b..65ea87af6 100644
--- a/content/de/operations/observability.md
+++ b/content/de/operations/observability.md
@@ -1,5 +1,5 @@
---
-title: "Observability"
+title: "Observability für RustFS"
description: "Exportieren Sie Metriken, Traces und Protokolle von RustFS über OTLP, binden Sie Monitoring-Werkzeuge ein und konfigurieren Sie empfohlene Alarme."
---
diff --git a/content/de/operations/scaling/meta.json b/content/de/operations/scaling/meta.json
index a0bd70cfc..4f299c7c8 100644
--- a/content/de/operations/scaling/meta.json
+++ b/content/de/operations/scaling/meta.json
@@ -1,7 +1,7 @@
{
"title": "Skalierung",
"pages": [
- "storage-pool-expansion",
+ "[Speicherpool-Erweiterung](/de/operations/scaling/storage-pool-expansion)",
"data-rebalancing",
"storage-pool-decommission"
]
diff --git a/content/de/operations/scaling/storage-pool-expansion.md b/content/de/operations/scaling/storage-pool-expansion.md
index dc772bc09..59aab3419 100644
--- a/content/de/operations/scaling/storage-pool-expansion.md
+++ b/content/de/operations/scaling/storage-pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: "Speicherpool-Erweiterung"
+title: "RustFS-Speicherpool erweitern"
description: "Fügen Sie einem RustFS-Cluster einen Speicherpool hinzu und prüfen Sie die erweiterte Topologie über die Console oder mit rc."
---
diff --git a/content/de/reference/environment-variables.md b/content/de/reference/environment-variables.md
index f4ab64d3d..d0dea1fc0 100644
--- a/content/de/reference/environment-variables.md
+++ b/content/de/reference/environment-variables.md
@@ -35,7 +35,7 @@ Boolesche Variablen akzeptieren `true` und `false`. Als „nicht gesetzt“ ange
| `RUSTFS_CONSOLE_ENABLE` | `true` | Aktiviert die eingebettete Console (Weboberfläche) auf einem eigenen Listener. |
| `RUSTFS_CONSOLE_ADDRESS` | `:9001` | Bind-Adresse und Port des Console-Listeners. |
-## CORS
+## CORS [#cors]
| Variable | Standard | Beschreibung |
| --- | --- | --- |
@@ -125,7 +125,7 @@ Intervalle der Metrikerfassung folgen dem Muster `RUSTFS_METRICS__INTERVA
| `RUSTFS_HEAL_MAX_CONCURRENT_HEALS` | `4` | Maximale Anzahl gleichzeitiger Aufgaben der Datenwiederherstellung. |
| `RUSTFS_HEAL_MAX_CONCURRENT_PER_SET` | `1` | Maximale Anzahl gleichzeitiger Aufgaben der Datenwiederherstellung je Erasure-Set. |
-## Speicher und Erasure Coding
+## Speicher und Erasure Coding [#storage--erasure]
| Variable | Standard | Beschreibung |
| --- | --- | --- |
@@ -154,7 +154,7 @@ Die eingebauten Standard-Anmeldedaten `rustfsadmin`/`rustfsadmin` dienen nur der
-## Ereignis- und Audit-Ziele
+## Ereignis- und Audit-Ziele [#event--audit-targets]
Modulschalter:
diff --git a/content/de/security-compliance/encryption/kms.md b/content/de/security-compliance/encryption/kms.md
index b1aceffef..3c1b43bc7 100644
--- a/content/de/security-compliance/encryption/kms.md
+++ b/content/de/security-compliance/encryption/kms.md
@@ -123,7 +123,7 @@ vault write -f transit/keys/rustfs-default-key
-## KMS-gestützte Verschlüsselung prüfen
+## KMS-gestützte Verschlüsselung prüfen [#verify-kms-backed-encryption]
Legen Sie einen Test-Bucket an, konfigurieren Sie SSE-KMS mit dem Standardschlüssel, laden Sie ein Objekt hoch und lesen Sie es zurück:
diff --git a/content/de/security-compliance/iam/index.md b/content/de/security-compliance/iam/index.md
index 6c05af1d4..bd14263f1 100644
--- a/content/de/security-compliance/iam/index.md
+++ b/content/de/security-compliance/iam/index.md
@@ -38,7 +38,7 @@ RustFS liefert diese integrierten Richtlinien (Canned Policies): `readwrite`, `r
-## Auswertungssemantik von Richtlinien
+## Auswertungssemantik von Richtlinien [#policy-evaluation-semantics]
Wenn einer Identität mehrere Richtlinien zugeordnet sind, führt RustFS ihre Statements zusammen (Duplikate entfallen) und wertet das zusammengeführte Dokument aus:
diff --git a/content/de/security-compliance/iam/policies.md b/content/de/security-compliance/iam/policies.md
index 81ebc4d1b..2f6fb5660 100644
--- a/content/de/security-compliance/iam/policies.md
+++ b/content/de/security-compliance/iam/policies.md
@@ -74,7 +74,7 @@ Richtlinienzuordnungen verbinden eine benannte Richtlinie mit einem Benutzer ode
| Richtlinie anlegen oder ersetzen | `PUT /rustfs/admin/v3/add-canned-policy?name=` | Der Request-Body ist das JSON-Dokument der Richtlinie. Erfordert `admin:CreatePolicy`. |
| Richtlinie löschen | `DELETE /rustfs/admin/v3/remove-canned-policy?name=` | Erfordert `admin:DeletePolicy`. |
-## Format des Richtliniendokuments
+## Format des Richtliniendokuments [#policy-document-format]
Ein Richtliniendokument ist ein JSON-Objekt mit den Feldern `Version` und `Statement`. Der einzige akzeptierte Wert für `Version` ist `2012-10-17`.
diff --git a/content/en/administration/protocols/s3.md b/content/en/administration/protocols/s3.md
index cb7d2f2b5..507f84050 100644
--- a/content/en/administration/protocols/s3.md
+++ b/content/en/administration/protocols/s3.md
@@ -178,7 +178,7 @@ aws --endpoint-url "$RUSTFS_ENDPOINT" s3api delete-bucket \
An S3 bucket must be empty before it can be deleted.
-## Known compatibility differences
+## Known compatibility differences [#known-compatibility-differences]
Current RustFS compatibility tests cover the common workflows described above. The following areas are not equivalent to AWS S3 or MinIO:
diff --git a/content/en/developer/examples/rclone.md b/content/en/developer/examples/rclone.md
index b93bedbf9..54e153a45 100644
--- a/content/en/developer/examples/rclone.md
+++ b/content/en/developer/examples/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone examples"
description: "Connect rclone to RustFS and perform basic object operations."
---
diff --git a/content/en/developer/examples/terraform.md b/content/en/developer/examples/terraform.md
index 08b7ea2d1..5e9093d87 100644
--- a/content/en/developer/examples/terraform.md
+++ b/content/en/developer/examples/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform examples"
description: "Manage RustFS buckets and objects with Terraform using the AWS provider pointed at a custom endpoint."
---
diff --git a/content/en/developer/integration/devops/meta.json b/content/en/developer/integration/devops/meta.json
index 1f41e2a72..3b6c93105 100644
--- a/content/en/developer/integration/devops/meta.json
+++ b/content/en/developer/integration/devops/meta.json
@@ -5,7 +5,7 @@
"opensearch",
"gitea",
"jenkins",
- "terraform",
+ "[Terraform](/en/developer/integration/devops/terraform)",
"helm"
]
}
diff --git a/content/en/developer/integration/devops/terraform.md b/content/en/developer/integration/devops/terraform.md
index 8744833a2..92176876e 100644
--- a/content/en/developer/integration/devops/terraform.md
+++ b/content/en/developer/integration/devops/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform integration"
description: "Store Terraform state in RustFS object storage with the S3 backend, including state locking."
---
diff --git a/content/en/developer/integration/observability/index.md b/content/en/developer/integration/observability/index.md
index 86e25a289..ce2f6d4fe 100644
--- a/content/en/developer/integration/observability/index.md
+++ b/content/en/developer/integration/observability/index.md
@@ -1,5 +1,5 @@
---
-title: "Observability"
+title: "Observability integrations"
description: "Connect observability platforms to RustFS through S3-compatible object storage interfaces."
---
diff --git a/content/en/developer/integration/others/meta.json b/content/en/developer/integration/others/meta.json
index 745fde1cd..f8a13046d 100644
--- a/content/en/developer/integration/others/meta.json
+++ b/content/en/developer/integration/others/meta.json
@@ -4,7 +4,7 @@
"capo",
"juicefs",
"nextcloud",
- "rclone",
+ "[rclone](/en/developer/integration/others/rclone)",
"tusd"
]
}
diff --git a/content/en/developer/integration/others/rclone.md b/content/en/developer/integration/others/rclone.md
index 34f9fe4aa..7b35688ca 100644
--- a/content/en/developer/integration/others/rclone.md
+++ b/content/en/developer/integration/others/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone integration"
description: "Sync, mount, and serve RustFS buckets with rclone over its S3-compatible API."
---
diff --git a/content/en/installation/cloud-native/helm-chart/index.md b/content/en/installation/cloud-native/helm-chart/index.md
index 26652e5be..eda49b64d 100644
--- a/content/en/installation/cloud-native/helm-chart/index.md
+++ b/content/en/installation/cloud-native/helm-chart/index.md
@@ -1,5 +1,5 @@
---
-title: Overview
+title: "Helm chart overview"
description: Understand how the RustFS Helm chart deploys standalone and distributed clusters on Kubernetes.
---
diff --git a/content/en/installation/cloud-native/helm-chart/installation.mdx b/content/en/installation/cloud-native/helm-chart/installation.mdx
index 5523fffb9..66e5b6d44 100644
--- a/content/en/installation/cloud-native/helm-chart/installation.mdx
+++ b/content/en/installation/cloud-native/helm-chart/installation.mdx
@@ -1,5 +1,5 @@
---
-title: Install
+title: "Install RustFS with Helm"
description: Install standalone or distributed RustFS on Kubernetes with the official Helm chart.
---
diff --git a/content/en/installation/cloud-native/helm-chart/meta.json b/content/en/installation/cloud-native/helm-chart/meta.json
index c439f5511..68f71580a 100644
--- a/content/en/installation/cloud-native/helm-chart/meta.json
+++ b/content/en/installation/cloud-native/helm-chart/meta.json
@@ -1,7 +1,7 @@
{
"title": "Helm Chart",
"pages": [
- "installation",
+ "[Install](/en/installation/cloud-native/helm-chart/installation)",
"mtls",
"cert-manager"
]
diff --git a/content/en/installation/cloud-native/operator/index.md b/content/en/installation/cloud-native/operator/index.md
index 68777f69c..9a94c87c2 100644
--- a/content/en/installation/cloud-native/operator/index.md
+++ b/content/en/installation/cloud-native/operator/index.md
@@ -1,5 +1,5 @@
---
-title: Overview
+title: "Operator overview"
description: Understand how RustFS Operator manages RustFS clusters on Kubernetes.
---
diff --git a/content/en/installation/cloud-native/operator/installation.md b/content/en/installation/cloud-native/operator/installation.md
index 778625e77..b086baa75 100644
--- a/content/en/installation/cloud-native/operator/installation.md
+++ b/content/en/installation/cloud-native/operator/installation.md
@@ -1,5 +1,5 @@
---
-title: Install
+title: "Install the RustFS Operator"
description: Prepare Kubernetes, install RustFS Operator, and access its Console securely.
---
diff --git a/content/en/installation/cloud-native/operator/meta.json b/content/en/installation/cloud-native/operator/meta.json
index 843952a8b..89f891f4f 100644
--- a/content/en/installation/cloud-native/operator/meta.json
+++ b/content/en/installation/cloud-native/operator/meta.json
@@ -1,9 +1,9 @@
{
"title": "Operator",
"pages": [
- "installation",
+ "[Install](/en/installation/cloud-native/operator/installation)",
"tenant",
- "pool-expansion",
+ "[Pool Expansion](/en/installation/cloud-native/operator/pool-expansion)",
"kms"
]
}
\ No newline at end of file
diff --git a/content/en/installation/cloud-native/operator/pool-expansion.md b/content/en/installation/cloud-native/operator/pool-expansion.md
index 482c99b54..7cb49c451 100644
--- a/content/en/installation/cloud-native/operator/pool-expansion.md
+++ b/content/en/installation/cloud-native/operator/pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: Pool Expansion
+title: "Expand a Tenant storage pool"
description: Add storage capacity to a RustFS Tenant by appending a storage pool.
---
diff --git a/content/en/installation/container/docker.md b/content/en/installation/container/docker.md
index 2c3a90edb..d9dd1a0cb 100644
--- a/content/en/installation/container/docker.md
+++ b/content/en/installation/container/docker.md
@@ -1,5 +1,5 @@
---
-title: "Docker"
+title: "Install and configure RustFS with Docker"
description: "Run RustFS with Docker: single-node setup, host-directory permissions, Docker Compose, TLS, and multi-node deployment."
---
@@ -71,7 +71,7 @@ docker run -d \
/data
```
-## 5. Bind-mount a host directory
+## 5. Bind-mount a host directory [#bind-mount-a-host-directory]
The named volume above needs no extra setup. If you mount a host directory instead (`-v /path/on/host:/data`), keep in mind that the container runs as non-root user `rustfs` with id `10001`. Make the host directory owned by `10001`, otherwise you will encounter permission denied errors:
diff --git a/content/en/installation/container/meta.json b/content/en/installation/container/meta.json
index be4e8d9a1..0cf54127d 100644
--- a/content/en/installation/container/meta.json
+++ b/content/en/installation/container/meta.json
@@ -1,7 +1,7 @@
{
"title": "Container",
"pages": [
- "docker",
+ "[Docker](/en/installation/container/docker)",
"podman"
]
}
\ No newline at end of file
diff --git a/content/en/installation/index.md b/content/en/installation/index.md
index 8f70bb4ab..05fdef4b6 100644
--- a/content/en/installation/index.md
+++ b/content/en/installation/index.md
@@ -1,5 +1,5 @@
---
-title: "Installation"
+title: "Choose how to install RustFS"
description: "Choose the right RustFS deployment path: local trial, single-node or multi-node production, containers, and Kubernetes."
---
@@ -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) |
-## Compare deployment modes
+## Compare deployment modes [#deployment-mode-comparison]
| Mode | Nodes | Disks | Fault Tolerance | Typical Use |
| - | - | - | - | - |
diff --git a/content/en/installation/linux/quick-start.md b/content/en/installation/linux/quick-start.md
index bd665909b..83a0a68af 100644
--- a/content/en/installation/linux/quick-start.md
+++ b/content/en/installation/linux/quick-start.md
@@ -80,7 +80,7 @@ rc object list rustfs/my-bucket
-## Next steps
+## Next steps [#next-steps]
The quick install runs RustFS in **Single Node Single Disk (SNSD)** mode — zero redundancy, right for evaluation and development. Where to go from here:
diff --git a/content/en/operations/meta.json b/content/en/operations/meta.json
index a1903df68..2806e6ea8 100644
--- a/content/en/operations/meta.json
+++ b/content/en/operations/meta.json
@@ -8,7 +8,7 @@
"scaling",
"high-availability",
"cluster-lifecycle",
- "observability",
+ "[Observability](/en/operations/observability)",
"status-check",
"event-notifications"
]
diff --git a/content/en/operations/observability.md b/content/en/operations/observability.md
index 3acc695cb..e926038d6 100644
--- a/content/en/operations/observability.md
+++ b/content/en/operations/observability.md
@@ -1,5 +1,5 @@
---
-title: "Observability"
+title: "RustFS observability"
description: "Export RustFS metrics, traces, and logs over OTLP, integrate with monitoring tools, and configure recommended alerts."
---
diff --git a/content/en/operations/scaling/meta.json b/content/en/operations/scaling/meta.json
index 69f005623..f553c9e85 100644
--- a/content/en/operations/scaling/meta.json
+++ b/content/en/operations/scaling/meta.json
@@ -1,7 +1,7 @@
{
"title": "Scaling",
"pages": [
- "storage-pool-expansion",
+ "[Pool Expansion](/en/operations/scaling/storage-pool-expansion)",
"data-rebalancing",
"storage-pool-decommission"
]
diff --git a/content/en/operations/scaling/storage-pool-expansion.md b/content/en/operations/scaling/storage-pool-expansion.md
index 9df908eb3..8e68595f6 100644
--- a/content/en/operations/scaling/storage-pool-expansion.md
+++ b/content/en/operations/scaling/storage-pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: "Pool Expansion"
+title: "Expand a RustFS storage pool"
description: "Add a storage pool to a RustFS cluster and verify the expanded topology through the Console or rc."
---
diff --git a/content/en/reference/environment-variables.md b/content/en/reference/environment-variables.md
index 9db713983..03f3425f4 100644
--- a/content/en/reference/environment-variables.md
+++ b/content/en/reference/environment-variables.md
@@ -35,7 +35,7 @@ Boolean variables accept `true`/`false`. Values shown as "unset" have no default
| `RUSTFS_CONSOLE_ENABLE` | `true` | Enable the embedded web console (served on a separate listener). |
| `RUSTFS_CONSOLE_ADDRESS` | `:9001` | Bind address and port for the console listener. |
-## CORS
+## CORS [#cors]
| Variable | Default | Description |
| --- | --- | --- |
@@ -125,7 +125,7 @@ Metrics collection intervals follow the pattern `RUSTFS_METRICS__INTERVAL
| `RUSTFS_HEAL_MAX_CONCURRENT_HEALS` | `4` | Maximum concurrent heal tasks. |
| `RUSTFS_HEAL_MAX_CONCURRENT_PER_SET` | `1` | Maximum concurrent heal tasks per erasure set. |
-## Storage & Erasure
+## Storage & Erasure [#storage--erasure]
| Variable | Default | Description |
| --- | --- | --- |
@@ -152,7 +152,7 @@ The built-in default credentials `rustfsadmin`/`rustfsadmin` are for first-boot
:::
-## Event & Audit targets
+## Event & Audit targets [#event--audit-targets]
Module switches:
diff --git a/content/en/security-compliance/encryption/kms.md b/content/en/security-compliance/encryption/kms.md
index 90f3b40c7..983dbc0d8 100644
--- a/content/en/security-compliance/encryption/kms.md
+++ b/content/en/security-compliance/encryption/kms.md
@@ -121,7 +121,7 @@ vault write -f transit/keys/rustfs-default-key
:::
-## Verify KMS-backed encryption
+## Verify KMS-backed encryption [#verify-kms-backed-encryption]
Create a test bucket, configure SSE-KMS with the default key, upload an object, and read it back:
diff --git a/content/en/security-compliance/iam/index.md b/content/en/security-compliance/iam/index.md
index 6ddb84a96..7cd19bddc 100644
--- a/content/en/security-compliance/iam/index.md
+++ b/content/en/security-compliance/iam/index.md
@@ -36,7 +36,7 @@ Policies are named JSON documents stored in RustFS. Attachment works as follows:
RustFS ships these built-in (canned) policies: `readwrite`, `readonly`, `writeonly`, `diagnostics`, and `consoleAdmin`. See [Users, Groups, and Policies](./policies.md) for their contents and for writing custom policies.
-## Policy Evaluation Semantics
+## Policy Evaluation Semantics [#policy-evaluation-semantics]
When an identity has multiple attached policies, RustFS merges their statements (dropping duplicates) and evaluates the merged document:
diff --git a/content/en/security-compliance/iam/policies.md b/content/en/security-compliance/iam/policies.md
index dec6181de..2de37d5ae 100644
--- a/content/en/security-compliance/iam/policies.md
+++ b/content/en/security-compliance/iam/policies.md
@@ -74,7 +74,7 @@ Policy bindings connect a named policy to a user or a group:
| Create/replace policy | `PUT /rustfs/admin/v3/add-canned-policy?name=` | Request body is the policy JSON document. Requires `admin:CreatePolicy`. |
| Delete policy | `DELETE /rustfs/admin/v3/remove-canned-policy?name=` | Requires `admin:DeletePolicy`. |
-## Policy Document Format
+## Policy Document Format [#policy-document-format]
A policy document is a JSON object with `Version` and `Statement` fields. The only accepted `Version` value is `2012-10-17`.
diff --git a/content/fr/administration/data/bucket/policy.md b/content/fr/administration/data/bucket/policy.md
index 5d7b320a5..ce483618f 100644
--- a/content/fr/administration/data/bucket/policy.md
+++ b/content/fr/administration/data/bucket/policy.md
@@ -76,7 +76,7 @@ L’ARN du compartiment et l’ARN d’objet sont distincts :
| Compartiment | `arn:aws:s3:::my-bucket` | `s3:ListBucket`, `s3:GetBucketLocation` |
| Objets | `arn:aws:s3:::my-bucket/*` | `s3:GetObject`, `s3:PutObject`, `s3:DeleteObject` |
-Utilisez un préfixe dans l’ARN d’objet, par exemple `arn:aws:s3:::my-bucket/public/*`, afin de limiter l’accès à une partie du compartiment. Pour le format complet des instructions et les opérateurs de condition pris en charge, consultez [Utilisateurs, groupes et politiques](/fr/security-compliance/iam/policies#format-du-document-de-politique).
+Utilisez un préfixe dans l’ARN d’objet, par exemple `arn:aws:s3:::my-bucket/public/*`, afin de limiter l’accès à une partie du compartiment. Pour le format complet des instructions et les opérateurs de condition pris en charge, consultez [Utilisateurs, groupes et politiques](/fr/security-compliance/iam/policies#policy-document-format).
### Blocage de l’accès public
diff --git a/content/fr/administration/protocols/s3.md b/content/fr/administration/protocols/s3.md
index 0efda538c..2434f43c0 100644
--- a/content/fr/administration/protocols/s3.md
+++ b/content/fr/administration/protocols/s3.md
@@ -30,7 +30,7 @@ Les clients authentifiés signent les requêtes avec une clé d’accès et une
:::note[Périmètre de compatibilité]
-RustFS offre une large compatibilité avec l’API S3 pour les fonctionnalités prises en charge, mais cette API n’est pas identique à chaque API d’AWS S3 ou de MinIO. Consultez les [différences de compatibilité connues](#différences-de-compatibilité-connues) avant de vous appuyer sur un comportement avancé ou propre à un fournisseur, et validez ce comportement sur la version cible de RustFS.
+RustFS offre une large compatibilité avec l’API S3 pour les fonctionnalités prises en charge, mais cette API n’est pas identique à chaque API d’AWS S3 ou de MinIO. Consultez les [différences de compatibilité connues](#known-compatibility-differences) avant de vous appuyer sur un comportement avancé ou propre à un fournisseur, et validez ce comportement sur la version cible de RustFS.
:::
@@ -178,7 +178,7 @@ aws --endpoint-url "$RUSTFS_ENDPOINT" s3api delete-bucket \
Un compartiment S3 doit être vide pour pouvoir être supprimé.
-## Différences de compatibilité connues
+## Différences de compatibilité connues [#known-compatibility-differences]
Les tests de compatibilité actuels de RustFS couvrent les flux courants décrits ci-dessus. Les domaines suivants ne sont pas équivalents à AWS S3 ni à MinIO :
diff --git a/content/fr/developer/examples/rclone.md b/content/fr/developer/examples/rclone.md
index 4b03208bc..cef6f9f29 100644
--- a/content/fr/developer/examples/rclone.md
+++ b/content/fr/developer/examples/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "Exemples rclone"
description: "Connectez rclone à RustFS et effectuez des opérations objet de base."
---
diff --git a/content/fr/developer/examples/terraform.md b/content/fr/developer/examples/terraform.md
index bd545206e..2110bce3a 100644
--- a/content/fr/developer/examples/terraform.md
+++ b/content/fr/developer/examples/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Exemples Terraform"
description: "Gérez les compartiments et les objets RustFS avec Terraform, en pointant le fournisseur AWS vers un point de terminaison personnalisé."
---
diff --git a/content/fr/developer/integration/devops/meta.json b/content/fr/developer/integration/devops/meta.json
index 1f41e2a72..122beedb3 100644
--- a/content/fr/developer/integration/devops/meta.json
+++ b/content/fr/developer/integration/devops/meta.json
@@ -5,7 +5,7 @@
"opensearch",
"gitea",
"jenkins",
- "terraform",
+ "[Terraform](/fr/developer/integration/devops/terraform)",
"helm"
]
}
diff --git a/content/fr/developer/integration/devops/terraform.md b/content/fr/developer/integration/devops/terraform.md
index 7433d3a7a..ff903bba1 100644
--- a/content/fr/developer/integration/devops/terraform.md
+++ b/content/fr/developer/integration/devops/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Intégration Terraform"
description: "Stockez l’état Terraform dans le stockage objet RustFS avec le backend S3, y compris le verrouillage de l’état."
---
diff --git a/content/fr/developer/integration/observability/index.md b/content/fr/developer/integration/observability/index.md
index f7abc4879..4131fbae1 100644
--- a/content/fr/developer/integration/observability/index.md
+++ b/content/fr/developer/integration/observability/index.md
@@ -1,5 +1,5 @@
---
-title: "Observabilité"
+title: "Intégrations d’observabilité"
description: "Connectez les plateformes d’observabilité à RustFS via des interfaces de stockage objet compatibles S3."
---
diff --git a/content/fr/developer/integration/others/meta.json b/content/fr/developer/integration/others/meta.json
index 50a3bf789..7c247cc2a 100644
--- a/content/fr/developer/integration/others/meta.json
+++ b/content/fr/developer/integration/others/meta.json
@@ -4,7 +4,7 @@
"capo",
"juicefs",
"nextcloud",
- "rclone",
+ "[rclone](/fr/developer/integration/others/rclone)",
"tusd"
]
}
diff --git a/content/fr/developer/integration/others/rclone.md b/content/fr/developer/integration/others/rclone.md
index 81187ae06..2f2729cb9 100644
--- a/content/fr/developer/integration/others/rclone.md
+++ b/content/fr/developer/integration/others/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "Intégration rclone"
description: "Synchronisez, montez et servez les compartiments (bucket) RustFS avec rclone, via son API compatible avec S3."
---
diff --git a/content/fr/installation/cloud-native/helm-chart/index.md b/content/fr/installation/cloud-native/helm-chart/index.md
index c2d5b6ace..a08a32b1d 100644
--- a/content/fr/installation/cloud-native/helm-chart/index.md
+++ b/content/fr/installation/cloud-native/helm-chart/index.md
@@ -1,5 +1,5 @@
---
-title: Vue d’ensemble
+title: "Vue d’ensemble du chart Helm"
description: Comprenez comment le chart Helm RustFS déploie des clusters autonomes et distribués sur Kubernetes.
---
diff --git a/content/fr/installation/cloud-native/helm-chart/installation.mdx b/content/fr/installation/cloud-native/helm-chart/installation.mdx
index 28e6d03c9..93efc1dca 100644
--- a/content/fr/installation/cloud-native/helm-chart/installation.mdx
+++ b/content/fr/installation/cloud-native/helm-chart/installation.mdx
@@ -1,5 +1,5 @@
---
-title: Installation
+title: "Installer RustFS avec Helm"
description: Installez RustFS en mode autonome ou distribué sur Kubernetes avec le chart Helm officiel.
---
diff --git a/content/fr/installation/cloud-native/helm-chart/meta.json b/content/fr/installation/cloud-native/helm-chart/meta.json
index 9bec0d52c..58704ed5f 100644
--- a/content/fr/installation/cloud-native/helm-chart/meta.json
+++ b/content/fr/installation/cloud-native/helm-chart/meta.json
@@ -1,7 +1,7 @@
{
"title": "Chart Helm",
"pages": [
- "installation",
+ "[Installation](/fr/installation/cloud-native/helm-chart/installation)",
"mtls",
"cert-manager"
]
diff --git a/content/fr/installation/cloud-native/operator/index.md b/content/fr/installation/cloud-native/operator/index.md
index 0373a91e2..8e01a349d 100644
--- a/content/fr/installation/cloud-native/operator/index.md
+++ b/content/fr/installation/cloud-native/operator/index.md
@@ -1,5 +1,5 @@
---
-title: Vue d’ensemble
+title: "Vue d’ensemble de l’Operator"
description: Comprenez comment l’Operator RustFS gère les clusters RustFS sur Kubernetes.
---
diff --git a/content/fr/installation/cloud-native/operator/installation.md b/content/fr/installation/cloud-native/operator/installation.md
index 219b9ccd3..ee5418954 100644
--- a/content/fr/installation/cloud-native/operator/installation.md
+++ b/content/fr/installation/cloud-native/operator/installation.md
@@ -1,5 +1,5 @@
---
-title: Installation
+title: "Installer l’Operator RustFS"
description: Préparez Kubernetes, installez l’Operator RustFS et accédez à sa Console de façon sécurisée.
---
diff --git a/content/fr/installation/cloud-native/operator/meta.json b/content/fr/installation/cloud-native/operator/meta.json
index 0e069388a..04e620671 100644
--- a/content/fr/installation/cloud-native/operator/meta.json
+++ b/content/fr/installation/cloud-native/operator/meta.json
@@ -1,9 +1,9 @@
{
"title": "Opérateur RustFS",
"pages": [
- "installation",
+ "[Installation](/fr/installation/cloud-native/operator/installation)",
"tenant",
- "pool-expansion",
+ "[Extension de pool](/fr/installation/cloud-native/operator/pool-expansion)",
"kms"
]
}
\ No newline at end of file
diff --git a/content/fr/installation/cloud-native/operator/pool-expansion.md b/content/fr/installation/cloud-native/operator/pool-expansion.md
index 0c8b18a3b..6b6657a45 100644
--- a/content/fr/installation/cloud-native/operator/pool-expansion.md
+++ b/content/fr/installation/cloud-native/operator/pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: Extension de pool
+title: "Étendre le pool de stockage d’un Tenant"
description: Ajoutez de la capacité de stockage à un Tenant RustFS en ajoutant un pool de stockage.
---
diff --git a/content/fr/installation/container/docker.md b/content/fr/installation/container/docker.md
index d68cf9aec..7d6ca8392 100644
--- a/content/fr/installation/container/docker.md
+++ b/content/fr/installation/container/docker.md
@@ -1,5 +1,5 @@
---
-title: "Docker"
+title: "Installer et configurer RustFS avec Docker"
description: "Exécutez RustFS avec Docker : instance à nœud unique, droits des répertoires de l’hôte, Docker Compose, TLS et déploiement multi-nœuds."
---
@@ -9,7 +9,7 @@ Cette page décrit l’exécution de l’image officielle de RustFS avec Docker
* Moteur Docker (≥ 20.10) installé, avec la possibilité de tirer des images et d’exécuter des conteneurs
* Ports de l’hôte 9000 (API S3) et 9001 (Console) disponibles, ou les ports personnalisés que vous prévoyez d’utiliser
-* Si vous montez un répertoire de l’hôte en bind mount, son propriétaire doit correspondre à l’utilisateur du conteneur — voir [Monter un répertoire de l’hôte](#5-monter-un-répertoire-de-lhôte)
+* Si vous montez un répertoire de l’hôte en bind mount, son propriétaire doit correspondre à l’utilisateur du conteneur — voir [Monter un répertoire de l’hôte](#bind-mount-a-host-directory)
## 2. Récupérer l’image
@@ -71,7 +71,7 @@ docker run -d \
/data
```
-## 5. Monter un répertoire de l’hôte
+## 5. Monter un répertoire de l’hôte [#bind-mount-a-host-directory]
Le volume nommé ci-dessus ne demande aucune préparation supplémentaire. Si vous montez plutôt un répertoire de l’hôte (`-v /path/on/host:/data`), gardez à l’esprit que le conteneur s’exécute sous l’utilisateur non root `rustfs`, d’identifiant `10001`. Le répertoire de l’hôte doit appartenir à `10001`, sinon vous rencontrerez des erreurs « permission denied » :
diff --git a/content/fr/installation/container/meta.json b/content/fr/installation/container/meta.json
index 42daf076e..9c16f0dc1 100644
--- a/content/fr/installation/container/meta.json
+++ b/content/fr/installation/container/meta.json
@@ -1,7 +1,7 @@
{
"title": "Conteneurs",
"pages": [
- "docker",
+ "[Docker](/fr/installation/container/docker)",
"podman"
]
}
\ No newline at end of file
diff --git a/content/fr/installation/index.md b/content/fr/installation/index.md
index 4475ca913..564a4c9ed 100644
--- a/content/fr/installation/index.md
+++ b/content/fr/installation/index.md
@@ -1,5 +1,5 @@
---
-title: "Installation"
+title: "Choisir comment installer RustFS"
description: "Choisissez le mode de déploiement RustFS adapté : essai local, production sur un ou plusieurs nœuds, conteneurs et Kubernetes."
---
@@ -30,7 +30,7 @@ Après l’installation, définissez des valeurs uniques pour `RUSTFS_ACCESS_KEY
| Kubernetes / cloud natif | Déploiement avec le chart Helm ou l’Operator | [Cloud natif](./cloud-native/index.md) |
| Hôte Windows ou macOS | Installation native | [Windows](./windows/index.md) · [macOS](./macos/index.md) |
-## Comparaison des modes de déploiement
+## Comparaison des modes de déploiement [#deployment-mode-comparison]
| Mode | Nœuds | Disques | Tolérance aux pannes | Usage typique |
| - | - | - | - | - |
diff --git a/content/fr/installation/linux/quick-start.md b/content/fr/installation/linux/quick-start.md
index a004b9f12..dc6c2728d 100644
--- a/content/fr/installation/linux/quick-start.md
+++ b/content/fr/installation/linux/quick-start.md
@@ -3,7 +3,7 @@ title: "Démarrage rapide"
description: "Installez RustFS avec le script d’installation, connectez-vous à la Console et stockez votre premier objet, en une dizaine de minutes."
---
-Ce guide vous mène d’un serveur Linux vide à une instance RustFS opérationnelle : installez, connectez-vous à la Console, créez un compartiment (bucket) et chargez (upload) votre premier objet. La planification de production (topologie multi-nœuds, dimensionnement matériel) est volontairement renvoyée à [l’étape suivante](#étapes-suivantes).
+Ce guide vous mène d’un serveur Linux vide à une instance RustFS opérationnelle : installez, connectez-vous à la Console, créez un compartiment (bucket) et chargez (upload) votre premier objet. La planification de production (topologie multi-nœuds, dimensionnement matériel) est volontairement renvoyée à [l’étape suivante](#next-steps).
**Prérequis**
@@ -80,7 +80,7 @@ rc object list rustfs/my-bucket
-## Étapes suivantes
+## Étapes suivantes [#next-steps]
L’installation rapide exécute RustFS en mode **nœud unique, disque unique (SNSD)**, sans aucune redondance, adapté à l’évaluation et au développement. La suite dépend de votre objectif :
diff --git a/content/fr/installation/requirement/disk-preparation.md b/content/fr/installation/requirement/disk-preparation.md
index 6bcbe5957..07809e836 100644
--- a/content/fr/installation/requirement/disk-preparation.md
+++ b/content/fr/installation/requirement/disk-preparation.md
@@ -79,5 +79,5 @@ Utilisez les chemins de montage vérifiés lorsque vous configurez `RUSTFS_VOLUM
## Étapes suivantes
-- [Choisir une topologie de déploiement](/fr/installation#comparaison-des-modes-de-déploiement)
+- [Choisir une topologie de déploiement](/fr/installation#deployment-mode-comparison)
- [Poursuivre avec les prérequis Linux et la configuration du service](/fr/installation/linux/prerequisites-and-service)
diff --git a/content/fr/installation/requirement/ec-configuration.md b/content/fr/installation/requirement/ec-configuration.md
index 92877d0af..8687c187b 100644
--- a/content/fr/installation/requirement/ec-configuration.md
+++ b/content/fr/installation/requirement/ec-configuration.md
@@ -111,5 +111,5 @@ Après le démarrage, utilisez la page **Status** de la Console ou `rc admin inf
## Étapes suivantes
- [Préparer les disques de données](./disk-preparation.md)
-- [Choisir une topologie de déploiement](/fr/installation#comparaison-des-modes-de-déploiement)
-- [Consulter toutes les variables d’environnement de stockage](/fr/reference/environment-variables#stockage-et-codage-deffacement)
+- [Choisir une topologie de déploiement](/fr/installation#deployment-mode-comparison)
+- [Consulter toutes les variables d’environnement de stockage](/fr/reference/environment-variables#storage--erasure)
diff --git a/content/fr/installation/requirement/meta.json b/content/fr/installation/requirement/meta.json
index 0759414d1..e4a94d653 100644
--- a/content/fr/installation/requirement/meta.json
+++ b/content/fr/installation/requirement/meta.json
@@ -1,7 +1,7 @@
{
"title": "Prérequis",
"pages": [
- "[Choix de la topologie](/fr/installation#comparaison-des-modes-de-déploiement)",
+ "[Choix de la topologie](/fr/installation#deployment-mode-comparison)",
"ec-configuration",
"disk-preparation",
"checklists"
diff --git a/content/fr/operations/event-notifications.md b/content/fr/operations/event-notifications.md
index 2fb422e12..d10b48380 100644
--- a/content/fr/operations/event-notifications.md
+++ b/content/fr/operations/event-notifications.md
@@ -66,7 +66,7 @@ N’activez pas `RUSTFS_NOTIFY_WEBHOOK_SKIP_TLS_VERIFY_PRIMARY` en production. C
:::
-Pour toutes les familles de cibles et les clés propres à chaque cible, consultez les [variables d’environnement](/fr/reference/environment-variables#cibles-dévénements-et-daudit).
+Pour toutes les familles de cibles et les clés propres à chaque cible, consultez les [variables d’environnement](/fr/reference/environment-variables#event--audit-targets).
## Utilisation
diff --git a/content/fr/operations/meta.json b/content/fr/operations/meta.json
index 7537e94b6..cc6cd985a 100644
--- a/content/fr/operations/meta.json
+++ b/content/fr/operations/meta.json
@@ -8,7 +8,7 @@
"scaling",
"high-availability",
"cluster-lifecycle",
- "observability",
+ "[Observabilité](/fr/operations/observability)",
"status-check",
"event-notifications"
]
diff --git a/content/fr/operations/observability.md b/content/fr/operations/observability.md
index 470541b73..26a760cf6 100644
--- a/content/fr/operations/observability.md
+++ b/content/fr/operations/observability.md
@@ -1,5 +1,5 @@
---
-title: "Observabilité"
+title: "Observabilité de RustFS"
description: "Exportez les métriques, les traces et les journaux RustFS via OTLP, intégrez-les à vos outils de supervision et configurez les alertes recommandées."
---
diff --git a/content/fr/operations/scaling/meta.json b/content/fr/operations/scaling/meta.json
index 24dcdb070..70b99c0db 100644
--- a/content/fr/operations/scaling/meta.json
+++ b/content/fr/operations/scaling/meta.json
@@ -1,7 +1,7 @@
{
"title": "Mise à l’échelle",
"pages": [
- "storage-pool-expansion",
+ "[Extension de pool](/fr/operations/scaling/storage-pool-expansion)",
"data-rebalancing",
"storage-pool-decommission"
]
diff --git a/content/fr/operations/scaling/storage-pool-expansion.md b/content/fr/operations/scaling/storage-pool-expansion.md
index cea8eeadc..082ea8842 100644
--- a/content/fr/operations/scaling/storage-pool-expansion.md
+++ b/content/fr/operations/scaling/storage-pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: "Extension de pool"
+title: "Étendre un pool de stockage RustFS"
description: "Ajoutez un pool de stockage à un cluster RustFS et vérifiez la topologie étendue depuis la Console ou avec rc."
---
diff --git a/content/fr/reference/environment-variables.md b/content/fr/reference/environment-variables.md
index 14777dc8f..520625374 100644
--- a/content/fr/reference/environment-variables.md
+++ b/content/fr/reference/environment-variables.md
@@ -35,7 +35,7 @@ Les variables booléennes acceptent `true`/`false`. Les valeurs indiquées comme
| `RUSTFS_CONSOLE_ENABLE` | `true` | Active la console web intégrée (servie sur un écouteur distinct). |
| `RUSTFS_CONSOLE_ADDRESS` | `:9001` | Adresse et port d’écoute de la Console. |
-## CORS
+## CORS [#cors]
| Variable | Valeur par défaut | Description |
| --- | --- | --- |
@@ -125,7 +125,7 @@ Les intervalles de collecte des métriques suivent le modèle `RUSTFS_METRICS_` | Le corps de la requête est le document JSON de la politique. Exige `admin:CreatePolicy`. |
| Supprimer une politique | `DELETE /rustfs/admin/v3/remove-canned-policy?name=` | Exige `admin:DeletePolicy`. |
-## Format du document de politique
+## Format du document de politique [#policy-document-format]
Un document de politique est un objet JSON comportant les champs `Version` et `Statement`. La seule valeur acceptée pour `Version` est `2012-10-17`.
@@ -161,7 +161,7 @@ Les opérateurs de condition pris en charge sont : `StringEquals`, `StringNotE
:::note
-Un `Deny` explicite l’emporte toujours sur `Allow` : la seconde instruction s’applique donc aux opérations de suppression, même si `s3:*` les inclut. Voir la [sémantique d’évaluation](./index.md#sémantique-dévaluation-des-politiques).
+Un `Deny` explicite l’emporte toujours sur `Allow` : la seconde instruction s’applique donc aux opérations de suppression, même si `s3:*` les inclut. Voir la [sémantique d’évaluation](./index.md#policy-evaluation-semantics).
:::
diff --git a/content/ja/administration/protocols/s3.md b/content/ja/administration/protocols/s3.md
index 9b6bed22d..dac5423a3 100644
--- a/content/ja/administration/protocols/s3.md
+++ b/content/ja/administration/protocols/s3.md
@@ -180,7 +180,7 @@ S3 バケットは、削除する前に空である必要があります。
-## 既知の互換性の違い
+## 既知の互換性の違い [#known-compatibility-differences]
現在の RustFS の互換性テストは、上で説明した一般的なワークフローを対象としています。次の領域は、AWS S3 または MinIO と同等ではありません。
diff --git a/content/ja/developer/examples/rclone.md b/content/ja/developer/examples/rclone.md
index b900c9f1f..27a57b827 100644
--- a/content/ja/developer/examples/rclone.md
+++ b/content/ja/developer/examples/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone の使用例"
description: "rclone を RustFS に接続し、基本的なオブジェクト操作を行います。"
---
diff --git a/content/ja/developer/examples/terraform.md b/content/ja/developer/examples/terraform.md
index 9a017c798..294396a3f 100644
--- a/content/ja/developer/examples/terraform.md
+++ b/content/ja/developer/examples/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform の使用例"
description: "カスタムエンドポイントを指定した AWS プロバイダーを使い、Terraform で RustFS のバケットとオブジェクトを管理します。"
---
diff --git a/content/ja/developer/integration/devops/meta.json b/content/ja/developer/integration/devops/meta.json
index 1f41e2a72..7fb503c03 100644
--- a/content/ja/developer/integration/devops/meta.json
+++ b/content/ja/developer/integration/devops/meta.json
@@ -5,7 +5,7 @@
"opensearch",
"gitea",
"jenkins",
- "terraform",
+ "[Terraform](/ja/developer/integration/devops/terraform)",
"helm"
]
}
diff --git a/content/ja/developer/integration/devops/terraform.md b/content/ja/developer/integration/devops/terraform.md
index f4a227234..3bbf89b7b 100644
--- a/content/ja/developer/integration/devops/terraform.md
+++ b/content/ja/developer/integration/devops/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform 連携"
description: "ステートロックを含め、S3 バックエンドで Terraform のステートを RustFS のオブジェクトストレージに保存します。"
---
diff --git a/content/ja/developer/integration/observability/index.md b/content/ja/developer/integration/observability/index.md
index ae1e264d0..22e55eadd 100644
--- a/content/ja/developer/integration/observability/index.md
+++ b/content/ja/developer/integration/observability/index.md
@@ -1,5 +1,5 @@
---
-title: "オブザーバビリティ"
+title: "オブザーバビリティ連携"
description: "S3 互換オブジェクトストレージインターフェースを経由して、オブザーバビリティプラットフォームを RustFS に接続します。"
---
diff --git a/content/ja/developer/integration/others/meta.json b/content/ja/developer/integration/others/meta.json
index 186c1ffca..5634758b4 100644
--- a/content/ja/developer/integration/others/meta.json
+++ b/content/ja/developer/integration/others/meta.json
@@ -4,7 +4,7 @@
"capo",
"juicefs",
"nextcloud",
- "rclone",
+ "[rclone](/ja/developer/integration/others/rclone)",
"tusd"
]
}
diff --git a/content/ja/developer/integration/others/rclone.md b/content/ja/developer/integration/others/rclone.md
index f96af63b7..f561af66e 100644
--- a/content/ja/developer/integration/others/rclone.md
+++ b/content/ja/developer/integration/others/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone 連携"
description: "rclone の S3 互換 API 経由で、RustFS のバケットの同期、マウント、配信を行います。"
---
diff --git a/content/ja/installation/cloud-native/helm-chart/index.md b/content/ja/installation/cloud-native/helm-chart/index.md
index 0b50a58f0..a1f7eab4a 100644
--- a/content/ja/installation/cloud-native/helm-chart/index.md
+++ b/content/ja/installation/cloud-native/helm-chart/index.md
@@ -1,5 +1,5 @@
---
-title: 概要
+title: "Helm チャートの概要"
description: RustFS の Helm チャートが、Kubernetes 上のスタンドアロンおよび分散クラスターをどのようにデプロイするかを説明します。
---
diff --git a/content/ja/installation/cloud-native/helm-chart/installation.mdx b/content/ja/installation/cloud-native/helm-chart/installation.mdx
index 04fb872af..68e105615 100644
--- a/content/ja/installation/cloud-native/helm-chart/installation.mdx
+++ b/content/ja/installation/cloud-native/helm-chart/installation.mdx
@@ -1,5 +1,5 @@
---
-title: インストール
+title: "Helm で RustFS をインストールする"
description: 公式の Helm チャートを使い、Kubernetes 上にスタンドアロンまたは分散構成の RustFS をインストールします。
---
diff --git a/content/ja/installation/cloud-native/helm-chart/meta.json b/content/ja/installation/cloud-native/helm-chart/meta.json
index cb1b40b42..4f30721b4 100644
--- a/content/ja/installation/cloud-native/helm-chart/meta.json
+++ b/content/ja/installation/cloud-native/helm-chart/meta.json
@@ -1,7 +1,7 @@
{
"title": "Helm チャート",
"pages": [
- "installation",
+ "[インストール](/ja/installation/cloud-native/helm-chart/installation)",
"mtls",
"cert-manager"
]
diff --git a/content/ja/installation/cloud-native/operator/index.md b/content/ja/installation/cloud-native/operator/index.md
index b74deaaa3..e21e4f0e2 100644
--- a/content/ja/installation/cloud-native/operator/index.md
+++ b/content/ja/installation/cloud-native/operator/index.md
@@ -1,5 +1,5 @@
---
-title: 概要
+title: "Operator の概要"
description: RustFS Operator が Kubernetes 上の RustFS クラスターをどのように管理するかを説明します。
---
diff --git a/content/ja/installation/cloud-native/operator/installation.md b/content/ja/installation/cloud-native/operator/installation.md
index 2b0fde43b..95dd31c63 100644
--- a/content/ja/installation/cloud-native/operator/installation.md
+++ b/content/ja/installation/cloud-native/operator/installation.md
@@ -1,5 +1,5 @@
---
-title: インストール
+title: "RustFS Operator をインストールする"
description: Kubernetes を準備し、RustFS Operator をインストールして、Console へ安全にアクセスします。
---
diff --git a/content/ja/installation/cloud-native/operator/meta.json b/content/ja/installation/cloud-native/operator/meta.json
index 843952a8b..ac098f13f 100644
--- a/content/ja/installation/cloud-native/operator/meta.json
+++ b/content/ja/installation/cloud-native/operator/meta.json
@@ -1,7 +1,7 @@
{
"title": "Operator",
"pages": [
- "installation",
+ "[インストール](/ja/installation/cloud-native/operator/installation)",
"tenant",
"pool-expansion",
"kms"
diff --git a/content/ja/installation/container/docker.md b/content/ja/installation/container/docker.md
index 51245045b..82d5715fc 100644
--- a/content/ja/installation/container/docker.md
+++ b/content/ja/installation/container/docker.md
@@ -1,5 +1,5 @@
---
-title: "Docker"
+title: "Docker で RustFS をインストールして設定する"
description: "Docker で RustFS を実行するときの、シングルノード構成、ホストディレクトリの権限、Docker Compose、TLS、マルチノードデプロイを説明します。"
---
diff --git a/content/ja/installation/container/index.md b/content/ja/installation/container/index.md
index 99ee37383..60b06ea7b 100644
--- a/content/ja/installation/container/index.md
+++ b/content/ja/installation/container/index.md
@@ -1,5 +1,5 @@
---
-title: "コンテナ"
+title: "コンテナで RustFS を実行する"
description: "公式の RustFS コンテナイメージを、Docker または Podman で実行します。"
---
diff --git a/content/ja/installation/container/meta.json b/content/ja/installation/container/meta.json
index 66218df5d..9785bb63c 100644
--- a/content/ja/installation/container/meta.json
+++ b/content/ja/installation/container/meta.json
@@ -1,7 +1,7 @@
{
"title": "コンテナ",
"pages": [
- "docker",
+ "[Docker](/ja/installation/container/docker)",
"podman"
]
}
\ No newline at end of file
diff --git a/content/ja/installation/index.md b/content/ja/installation/index.md
index 99315ed6d..9a4986d6d 100644
--- a/content/ja/installation/index.md
+++ b/content/ja/installation/index.md
@@ -1,5 +1,5 @@
---
-title: "インストール"
+title: "RustFS のインストール方法を選ぶ"
description: "ローカルでの試用、シングルノードまたはマルチノードの本番、コンテナ、Kubernetes の中から、目的に合った RustFS のデプロイ方法を選びます。"
---
diff --git a/content/ja/installation/linux/quick-start.md b/content/ja/installation/linux/quick-start.md
index 8ff91aa38..aadb02f6c 100644
--- a/content/ja/installation/linux/quick-start.md
+++ b/content/ja/installation/linux/quick-start.md
@@ -81,7 +81,7 @@ rc object list rustfs/my-bucket
-## 次のステップ
+## 次のステップ [#next-steps]
クイックインストールでは、RustFS を **シングルノード・シングルディスク(SNSD)** モードで実行します。冗長性はなく、評価と開発に適しています。ここからの進め方は次のとおりです。
diff --git a/content/ja/operations/meta.json b/content/ja/operations/meta.json
index ee638b09a..0e993775b 100644
--- a/content/ja/operations/meta.json
+++ b/content/ja/operations/meta.json
@@ -8,7 +8,7 @@
"scaling",
"high-availability",
"cluster-lifecycle",
- "observability",
+ "[オブザーバビリティ](/ja/operations/observability)",
"status-check",
"event-notifications"
]
diff --git a/content/ja/operations/observability.md b/content/ja/operations/observability.md
index c85788654..b82d14c70 100644
--- a/content/ja/operations/observability.md
+++ b/content/ja/operations/observability.md
@@ -1,5 +1,5 @@
---
-title: "オブザーバビリティ"
+title: "RustFS のオブザーバビリティ"
description: "OTLP で RustFS のメトリクス、トレース、ログをエクスポートし、監視ツールと連携して、推奨アラートを設定する方法を説明します。"
---
diff --git a/content/ja/operations/upgrade/container/index.md b/content/ja/operations/upgrade/container/index.md
index 509ca378f..f5b2a1e48 100644
--- a/content/ja/operations/upgrade/container/index.md
+++ b/content/ja/operations/upgrade/container/index.md
@@ -1,5 +1,5 @@
---
-title: "コンテナ"
+title: "RustFS コンテナをアップグレードする"
description: "永続データを維持したまま、Docker、Podman、または Docker Compose で起動した RustFS コンテナをアップグレードします。"
---
diff --git a/content/ja/security-compliance/encryption/kms.md b/content/ja/security-compliance/encryption/kms.md
index 4fcb8715a..d8a72c606 100644
--- a/content/ja/security-compliance/encryption/kms.md
+++ b/content/ja/security-compliance/encryption/kms.md
@@ -123,7 +123,7 @@ vault write -f transit/keys/rustfs-default-key
-## KMS を使った暗号化を確認する
+## KMS を使った暗号化を確認する [#verify-kms-backed-encryption]
テスト用バケットを作成し、デフォルト鍵で SSE-KMS を設定し、オブジェクトをアップロードして読み戻します。
diff --git a/content/ja/security-compliance/iam/index.md b/content/ja/security-compliance/iam/index.md
index 98e8e0f9d..4fe61b337 100644
--- a/content/ja/security-compliance/iam/index.md
+++ b/content/ja/security-compliance/iam/index.md
@@ -38,7 +38,7 @@ RustFS には、次の組み込み(canned)ポリシーがあります。`rea
-## ポリシー評価の意味
+## ポリシー評価の意味 [#policy-evaluation-semantics]
アイデンティティに複数のポリシーが割り当てられている場合、RustFS はステートメントを統合し(重複は除く)、統合したドキュメントを評価します。
diff --git a/content/zh/administration/protocols/s3.md b/content/zh/administration/protocols/s3.md
index d4f4352e6..5c5afb615 100644
--- a/content/zh/administration/protocols/s3.md
+++ b/content/zh/administration/protocols/s3.md
@@ -178,7 +178,7 @@ aws --endpoint-url "$RUSTFS_ENDPOINT" s3api delete-bucket \
删除 S3 存储桶前必须将其清空。
-## 已知兼容性差异
+## 已知兼容性差异 [#known-compatibility-differences]
当前 RustFS 兼容性测试涵盖上述常见工作流。以下领域与 AWS S3 或 MinIO 不等同:
diff --git a/content/zh/developer/examples/rclone.md b/content/zh/developer/examples/rclone.md
index b77c964f3..4719f10e0 100644
--- a/content/zh/developer/examples/rclone.md
+++ b/content/zh/developer/examples/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone 示例"
description: "将 rclone 连接到 RustFS,并执行基本对象操作。"
---
diff --git a/content/zh/developer/examples/terraform.md b/content/zh/developer/examples/terraform.md
index 1a88233eb..a9d92a158 100644
--- a/content/zh/developer/examples/terraform.md
+++ b/content/zh/developer/examples/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform 示例"
description: "使用指向自定义端点的 AWS provider,通过 Terraform 管理 RustFS 存储桶和对象。"
---
diff --git a/content/zh/developer/integration/devops/meta.json b/content/zh/developer/integration/devops/meta.json
index 1f41e2a72..cd6f0e05c 100644
--- a/content/zh/developer/integration/devops/meta.json
+++ b/content/zh/developer/integration/devops/meta.json
@@ -5,7 +5,7 @@
"opensearch",
"gitea",
"jenkins",
- "terraform",
+ "[Terraform](/zh/developer/integration/devops/terraform)",
"helm"
]
}
diff --git a/content/zh/developer/integration/devops/terraform.md b/content/zh/developer/integration/devops/terraform.md
index 7b0ca970a..828fbdbf2 100644
--- a/content/zh/developer/integration/devops/terraform.md
+++ b/content/zh/developer/integration/devops/terraform.md
@@ -1,5 +1,5 @@
---
-title: "Terraform"
+title: "Terraform 集成"
description: "使用 S3 后端把 Terraform 状态(含状态锁)存储在 RustFS 对象存储中。"
---
diff --git a/content/zh/developer/integration/observability/index.md b/content/zh/developer/integration/observability/index.md
index b32860701..dfe5fa16e 100644
--- a/content/zh/developer/integration/observability/index.md
+++ b/content/zh/developer/integration/observability/index.md
@@ -1,5 +1,5 @@
---
-title: "可观测性"
+title: "可观测性集成"
description: "通过 S3 兼容对象存储接口,将可观测性平台连接到 RustFS。"
---
diff --git a/content/zh/developer/integration/others/meta.json b/content/zh/developer/integration/others/meta.json
index 3b601ed81..61ae53615 100644
--- a/content/zh/developer/integration/others/meta.json
+++ b/content/zh/developer/integration/others/meta.json
@@ -4,7 +4,7 @@
"capo",
"juicefs",
"nextcloud",
- "rclone",
+ "[rclone](/zh/developer/integration/others/rclone)",
"tusd"
]
}
diff --git a/content/zh/developer/integration/others/rclone.md b/content/zh/developer/integration/others/rclone.md
index ec78c47ca..994fb85a7 100644
--- a/content/zh/developer/integration/others/rclone.md
+++ b/content/zh/developer/integration/others/rclone.md
@@ -1,5 +1,5 @@
---
-title: "rclone"
+title: "rclone 集成"
description: "通过 rclone 的 S3 兼容 API 对 RustFS 存储桶执行 sync、mount 与 serve。"
---
diff --git a/content/zh/installation/cloud-native/helm-chart/index.md b/content/zh/installation/cloud-native/helm-chart/index.md
index af3bd8480..5b94e6a56 100644
--- a/content/zh/installation/cloud-native/helm-chart/index.md
+++ b/content/zh/installation/cloud-native/helm-chart/index.md
@@ -1,5 +1,5 @@
---
-title: 概述
+title: "Helm Chart 概述"
description: 了解 RustFS Helm chart 如何在 Kubernetes 上部署单机和分布式集群。
---
diff --git a/content/zh/installation/cloud-native/helm-chart/installation.mdx b/content/zh/installation/cloud-native/helm-chart/installation.mdx
index b79a1cfb0..6d879b0a4 100644
--- a/content/zh/installation/cloud-native/helm-chart/installation.mdx
+++ b/content/zh/installation/cloud-native/helm-chart/installation.mdx
@@ -1,5 +1,5 @@
---
-title: 安装
+title: "使用 Helm 安装 RustFS"
description: 使用官方 Helm chart 在 Kubernetes 上安装单机或分布式 RustFS。
---
diff --git a/content/zh/installation/cloud-native/helm-chart/meta.json b/content/zh/installation/cloud-native/helm-chart/meta.json
index c439f5511..45a15341e 100644
--- a/content/zh/installation/cloud-native/helm-chart/meta.json
+++ b/content/zh/installation/cloud-native/helm-chart/meta.json
@@ -1,7 +1,7 @@
{
"title": "Helm Chart",
"pages": [
- "installation",
+ "[安装](/zh/installation/cloud-native/helm-chart/installation)",
"mtls",
"cert-manager"
]
diff --git a/content/zh/installation/cloud-native/operator/index.md b/content/zh/installation/cloud-native/operator/index.md
index 5b8bf927f..3dc2ea5b6 100644
--- a/content/zh/installation/cloud-native/operator/index.md
+++ b/content/zh/installation/cloud-native/operator/index.md
@@ -1,5 +1,5 @@
---
-title: 概述
+title: "Operator 概述"
description: 了解 RustFS Operator 如何在 Kubernetes 上管理 RustFS 集群。
---
diff --git a/content/zh/installation/cloud-native/operator/installation.md b/content/zh/installation/cloud-native/operator/installation.md
index 8be11bc6b..9d8e91375 100644
--- a/content/zh/installation/cloud-native/operator/installation.md
+++ b/content/zh/installation/cloud-native/operator/installation.md
@@ -1,5 +1,5 @@
---
-title: 安装
+title: "安装 RustFS Operator"
description: 准备 Kubernetes、安装 RustFS Operator 并安全访问其控制台。
---
diff --git a/content/zh/installation/cloud-native/operator/meta.json b/content/zh/installation/cloud-native/operator/meta.json
index 843952a8b..bafc1f34d 100644
--- a/content/zh/installation/cloud-native/operator/meta.json
+++ b/content/zh/installation/cloud-native/operator/meta.json
@@ -1,9 +1,9 @@
{
"title": "Operator",
"pages": [
- "installation",
+ "[安装](/zh/installation/cloud-native/operator/installation)",
"tenant",
- "pool-expansion",
+ "[存储池扩容](/zh/installation/cloud-native/operator/pool-expansion)",
"kms"
]
}
\ No newline at end of file
diff --git a/content/zh/installation/cloud-native/operator/pool-expansion.md b/content/zh/installation/cloud-native/operator/pool-expansion.md
index f2c9f541d..4b221e1b7 100644
--- a/content/zh/installation/cloud-native/operator/pool-expansion.md
+++ b/content/zh/installation/cloud-native/operator/pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: 存储池扩容
+title: "扩展 Tenant 存储池"
description: 通过追加存储池增加 RustFS Tenant 的存储容量。
---
diff --git a/content/zh/installation/container/docker.md b/content/zh/installation/container/docker.md
index e35b34269..2f76ff949 100644
--- a/content/zh/installation/container/docker.md
+++ b/content/zh/installation/container/docker.md
@@ -1,5 +1,5 @@
---
-title: "Docker"
+title: "使用 Docker 安装并配置 RustFS"
description: "使用 Docker 运行 RustFS:单节点部署、主机目录权限、Docker Compose、TLS 和多节点部署。"
---
@@ -71,7 +71,7 @@ docker run -d \
/data
```
-## 5. 绑定挂载主机目录
+## 5. 绑定挂载主机目录 [#bind-mount-a-host-directory]
上面的命名卷无需额外设置。如果改用主机目录挂载(`-v /path/on/host:/data`),请注意容器以非 root 用户 `rustfs`(ID `10001`)运行。请确保主机目录的所有者为 `10001`,否则会遇到权限拒绝错误:
diff --git a/content/zh/installation/container/meta.json b/content/zh/installation/container/meta.json
index c6d8b8bba..38a9478de 100644
--- a/content/zh/installation/container/meta.json
+++ b/content/zh/installation/container/meta.json
@@ -1,7 +1,7 @@
{
"title": "容器",
"pages": [
- "docker",
+ "[Docker](/zh/installation/container/docker)",
"podman"
]
}
\ No newline at end of file
diff --git a/content/zh/installation/index.md b/content/zh/installation/index.md
index 1a0d0a337..5c9e7057f 100644
--- a/content/zh/installation/index.md
+++ b/content/zh/installation/index.md
@@ -1,5 +1,5 @@
---
-title: "安装"
+title: "选择 RustFS 的安装方式"
description: "根据本地试用、单节点或多节点生产环境、容器及 Kubernetes 场景选择合适的 RustFS 部署方式。"
---
@@ -30,7 +30,7 @@ Windows 版本的 RustFS 仅适用于开发和调试,**不建议用于生产
| Kubernetes/云原生 | 容器编排部署 | [云原生](./cloud-native/index.md) |
| Windows 或 macOS 主机 | 原生安装 | [Windows](./windows/index.md) · [macOS](./macos/index.md) |
-## 部署模式对比
+## 部署模式对比 [#deployment-mode-comparison]
| 模式 | 节点 | 磁盘 | 容错能力 | 典型用途 |
| - | - | - | - | - |
diff --git a/content/zh/installation/linux/quick-start.md b/content/zh/installation/linux/quick-start.md
index 0713754e3..426565312 100644
--- a/content/zh/installation/linux/quick-start.md
+++ b/content/zh/installation/linux/quick-start.md
@@ -80,7 +80,7 @@ rc object list rustfs/my-bucket
-## 后续步骤
+## 后续步骤 [#next-steps]
快速安装以**单节点单磁盘(SNSD)**模式运行 RustFS。该模式没有冗余,适合评估和开发。接下来可以:
diff --git a/content/zh/operations/meta.json b/content/zh/operations/meta.json
index 2a2e442c1..f6ec9ed32 100644
--- a/content/zh/operations/meta.json
+++ b/content/zh/operations/meta.json
@@ -8,7 +8,7 @@
"scaling",
"high-availability",
"cluster-lifecycle",
- "observability",
+ "[可观测性](/zh/operations/observability)",
"status-check",
"event-notifications"
]
diff --git a/content/zh/operations/observability.md b/content/zh/operations/observability.md
index 22ea84144..e456594d5 100644
--- a/content/zh/operations/observability.md
+++ b/content/zh/operations/observability.md
@@ -1,5 +1,5 @@
---
-title: "可观测性"
+title: "RustFS 可观测性"
description: "本文介绍 RustFS 遥测导出、监控集成、指标名称和标签、建议告警以及日志采集。"
---
diff --git a/content/zh/operations/scaling/meta.json b/content/zh/operations/scaling/meta.json
index 1f6b31819..e7580794e 100644
--- a/content/zh/operations/scaling/meta.json
+++ b/content/zh/operations/scaling/meta.json
@@ -1,7 +1,7 @@
{
"title": "扩缩容",
"pages": [
- "storage-pool-expansion",
+ "[存储池扩容](/zh/operations/scaling/storage-pool-expansion)",
"data-rebalancing",
"storage-pool-decommission"
]
diff --git a/content/zh/operations/scaling/storage-pool-expansion.md b/content/zh/operations/scaling/storage-pool-expansion.md
index f9547f4e9..b732af65c 100644
--- a/content/zh/operations/scaling/storage-pool-expansion.md
+++ b/content/zh/operations/scaling/storage-pool-expansion.md
@@ -1,5 +1,5 @@
---
-title: "存储池扩容"
+title: "扩展 RustFS 存储池"
description: "向 RustFS 集群添加存储池,并通过控制台或 rc 验证扩展后的拓扑。"
---
diff --git a/content/zh/reference/environment-variables.md b/content/zh/reference/environment-variables.md
index 09d12850b..800a8ab53 100644
--- a/content/zh/reference/environment-variables.md
+++ b/content/zh/reference/environment-variables.md
@@ -35,7 +35,7 @@ description: "介绍用于配置 RustFS 服务器、控制台、TLS、KMS、可
| `RUSTFS_CONSOLE_ENABLE` | `true` | 启用内嵌 Web 控制台(通过单独的监听器提供服务)。 |
| `RUSTFS_CONSOLE_ADDRESS` | `:9001` | 控制台监听器的绑定地址和端口。 |
-## CORS
+## CORS [#cors]
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
@@ -125,7 +125,7 @@ description: "介绍用于配置 RustFS 服务器、控制台、TLS、KMS、可
| `RUSTFS_HEAL_MAX_CONCURRENT_HEALS` | `4` | 最大并发修复任务数。 |
| `RUSTFS_HEAL_MAX_CONCURRENT_PER_SET` | `1` | 每个纠删集的最大并发修复任务数。 |
-## 存储和纠删码
+## 存储和纠删码 [#storage--erasure]
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
@@ -152,7 +152,7 @@ description: "介绍用于配置 RustFS 服务器、控制台、TLS、KMS、可
:::
-## 事件和审计目标
+## 事件和审计目标 [#event--audit-targets]
模块开关:
diff --git a/content/zh/security-compliance/encryption/kms.md b/content/zh/security-compliance/encryption/kms.md
index 863de9717..b01f97da8 100644
--- a/content/zh/security-compliance/encryption/kms.md
+++ b/content/zh/security-compliance/encryption/kms.md
@@ -121,7 +121,7 @@ vault write -f transit/keys/rustfs-default-key
:::
-## 验证 KMS 支持的加密
+## 验证 KMS 支持的加密 [#verify-kms-backed-encryption]
创建测试存储桶,使用默认密钥配置 SSE-KMS,上传对象并将其读回:
diff --git a/content/zh/security-compliance/iam/index.md b/content/zh/security-compliance/iam/index.md
index 392ad3834..e3460bf58 100644
--- a/content/zh/security-compliance/iam/index.md
+++ b/content/zh/security-compliance/iam/index.md
@@ -36,7 +36,7 @@ RustFS 区分以下身份类型:
RustFS 附带以下内置(预定义)策略:`readwrite`、`readonly`、`writeonly`、`diagnostics` 和 `consoleAdmin`。有关这些策略的内容以及如何编写自定义策略,请参阅[用户、组和策略](./policies.md)。
-## 策略评估语义
+## 策略评估语义 [#policy-evaluation-semantics]
当一个身份附加了多个策略时,RustFS 会合并这些策略的语句(删除重复项),并评估合并后的文档:
diff --git a/content/zh/security-compliance/iam/policies.md b/content/zh/security-compliance/iam/policies.md
index fa5a66d3a..f3b19966d 100644
--- a/content/zh/security-compliance/iam/policies.md
+++ b/content/zh/security-compliance/iam/policies.md
@@ -74,7 +74,7 @@ description: "介绍 RustFS IAM 用户和组的管理、策略文档 JSON 格式
| 创建/替换策略 | `PUT /rustfs/admin/v3/add-canned-policy?name=` | 请求正文为策略 JSON 文档。需要 `admin:CreatePolicy`。 |
| 删除策略 | `DELETE /rustfs/admin/v3/remove-canned-policy?name=` | 需要 `admin:DeletePolicy`。 |
-## 策略文档格式
+## 策略文档格式 [#policy-document-format]
策略文档是一个包含 `Version` 和 `Statement` 字段的 JSON 对象。`Version` 唯一可接受的值是 `2012-10-17`。
diff --git a/press.config.tsx b/press.config.tsx
index 8bb27ab9f..7b2f92d4d 100644
--- a/press.config.tsx
+++ b/press.config.tsx
@@ -50,16 +50,37 @@ const translations = i18n
displayName: "Deutsch",
"Blog(blog)": "Blog",
"All Tags(blog tags page)": "Alle Tags",
+ "Search(search trigger)": "Suche",
+ "Search(search dialog)": "Suche",
+ "Open Search(search trigger)(aria-label)": "Suche öffnen",
+ "Close Search(search dialog)(aria-label)": "Suche schließen",
+ "On this page(table of contents)": "Auf dieser Seite",
+ "Copy Markdown(page actions)": "Markdown kopieren",
+ "Copied Markdown(page actions)": "Markdown kopiert",
},
fr: {
displayName: "Français",
"Blog(blog)": "Blog",
"All Tags(blog tags page)": "Tous les tags",
+ "Search(search trigger)": "Rechercher",
+ "Search(search dialog)": "Rechercher",
+ "Open Search(search trigger)(aria-label)": "Ouvrir la recherche",
+ "Close Search(search dialog)(aria-label)": "Fermer la recherche",
+ "On this page(table of contents)": "Sur cette page",
+ "Copy Markdown(page actions)": "Copier le Markdown",
+ "Copied Markdown(page actions)": "Markdown copié",
},
ja: {
displayName: "日本語",
"Blog(blog)": "ブログ",
"All Tags(blog tags page)": "すべてのタグ",
+ "Search(search trigger)": "検索",
+ "Search(search dialog)": "検索",
+ "Open Search(search trigger)(aria-label)": "検索を開く",
+ "Close Search(search dialog)(aria-label)": "検索を閉じる",
+ "On this page(table of contents)": "このページの内容",
+ "Copy Markdown(page actions)": "Markdown をコピー",
+ "Copied Markdown(page actions)": "Markdown をコピーしました",
},
});
@@ -230,15 +251,12 @@ gtag('config', 'G-TWW7WMTWL9');`,
>
);
},
- // Per-page (VitePress emitted this from frontmatter).
+ // FumaPress already emits from frontmatter.
+ // Keep a single site-wide fallback for pages that have no description.
page(page) {
+ if (page.data.description) return null;
return (
- <>
-
- >
+
);
},
},
diff --git a/public/_redirects b/public/_redirects
index e83e18215..095631ba5 100644
--- a/public/_redirects
+++ b/public/_redirects
@@ -5,6 +5,9 @@
/installation/console-first-steps /en/administration/console 301
/administration/data/data-tiering /en/administration/data/tiered-storage 301
/management /en/administration 301
+# Bucket management moved under Data. Keep these exact rules ahead of the splat.
+/management/bucket /en/administration/data/bucket/creation 301
+/management/bucket/index /en/administration/data/bucket/creation 301
/management/* /en/administration/:splat 301
/administration/iam /en/security-compliance/iam 301
/administration/iam/oidc /en/security-compliance/oidc 301
@@ -60,3 +63,18 @@
/features/integration /en/developer/integration 301
/features/ai /en 301
/features/data-lake /en 301
+# One-to-one moves. worker.mjs applies the same path to zh/de/fr/ja.
+/installation/docker/index /en/installation/container/docker 301
+/features/s3-compatibility /en/reference/s3-compatibility 301
+/developer/api /en/administration/protocols/s3 301
+/developer/integration/big-data/clickhouse /en/developer/integration/database/clickhouse 301
+/developer/integration/big-data/doris /en/developer/integration/database/doris 301
+/developer/integration/big-data/duckdb /en/developer/integration/database/duckdb 301
+/developer/integration/big-data/influxdb /en/developer/integration/database/influxdb 301
+/developer/integration/big-data/milvus /en/developer/integration/database/milvus 301
+/developer/integration/big-data/trino /en/developer/integration/database/trino 301
+/developer/integration/big-data/vitess /en/developer/integration/database/vitess 301
+/developer/integration/big-data/lakefs /en/developer/integration/storage/lakefs 301
+/developer/integration/big-data/opendal /en/developer/integration/storage/opendal 301
+/developer/integration/big-data/zerofs /en/developer/integration/storage/zerofs 301
+/developer/integration/big-data/mlflow /en/developer/integration/ai/mlflow 301
diff --git a/scripts/language-redirects.mjs b/scripts/language-redirects.mjs
index f42cf332e..48acff9a1 100644
--- a/scripts/language-redirects.mjs
+++ b/scripts/language-redirects.mjs
@@ -30,7 +30,7 @@ export function collectLanguageRedirects() {
if (!source || !target || !status) continue;
// Keep only base rules in _redirects to stay below Cloudflare's 100 dynamic rule limit.
- // Locale-aware variants are resolved at runtime by worker.mjs.
+ // worker.mjs reuses exact rules for en/zh/de/fr/ja by swapping the /en prefix.
rules.set(source, `${target} ${status}`);
}
diff --git a/scripts/worker-redirects.test.mjs b/scripts/worker-redirects.test.mjs
index 8206c4531..6992abb36 100644
--- a/scripts/worker-redirects.test.mjs
+++ b/scripts/worker-redirects.test.mjs
@@ -118,18 +118,27 @@ test("root and /index.html redirect permanently to the default language", async
test("unknown paths fall through to assets (no crash, no bogus redirect)", async () => {
const env = makeEnv(FIXTURE_RULES);
- for (const candidate of ["/never-heard-of-it/", "/never-heard-of-it", "/en/never-heard-of-it/"]) {
+ for (const candidate of ["/never-heard-of-it", "/en/never-heard-of-it"]) {
const res = await request(env, candidate);
assert.equal(res.status, 200, candidate);
assert.equal(await res.text(), `asset:${candidate}`, candidate);
}
});
-test("localized page with trailing slash is deferred to the asset layer, no double redirect", async () => {
+test("trailing slash on an unknown path is a permanent canonical redirect", async () => {
+ const env = makeEnv(FIXTURE_RULES);
+ for (const candidate of ["/never-heard-of-it/", "/en/never-heard-of-it/"]) {
+ const res = await request(env, candidate);
+ assert.equal(res.status, 301, candidate);
+ assert.equal(res.headers.get("location"), `https://docs.rustfs.com${candidate.slice(0, -1)}`, candidate);
+ }
+});
+
+test("localized page with trailing slash is a permanent redirect, not an asset 307", async () => {
const env = makeEnv(FIXTURE_RULES, { assetPaths: new Set(["/en/installation"]) });
const res = await request(env, "/en/installation/");
- assert.equal(res.status, 308); // emitted by the (simulated) asset layer, not the worker
- assert.equal(res.headers.get("location"), "/en/installation");
+ assert.equal(res.status, 301);
+ assert.equal(res.headers.get("location"), "https://docs.rustfs.com/en/installation");
});
test("locale fallback reuses the base rule and keeps the locale", async () => {
@@ -166,7 +175,109 @@ test("loop protection: a request that already equals its target falls through",
const rules = "/a /b 301\n";
const env = makeEnv(rules);
assert.equal((await request(env, "/b")).status, 200);
- assert.equal((await request(env, "/b/")).status, 200);
+ const slashed = await request(env, "/b/");
+ assert.equal(slashed.status, 301);
+ assert.equal(slashed.headers.get("location"), "https://docs.rustfs.com/b");
+});
+
+/** @param {string} text */
+function productionRuleOrder(text) {
+ const lines = text
+ .split("\n")
+ .map((line) => line.trim())
+ .filter((line) => line && !line.startsWith("#"));
+ const exact = lines.filter((line) => {
+ const source = line.split(/\s+/)[0];
+ return Boolean(source && !source.includes("*"));
+ });
+ const dynamic = lines.filter((line) => {
+ const source = line.split(/\s+/)[0];
+ return Boolean(source && source.includes("*"));
+ });
+ return [...exact, ...dynamic].join("\n");
+}
+
+test("historical and migrated paths redirect permanently for every locale", async () => {
+ const rules = productionRuleOrder(
+ readFileSync(path.join(here, "..", "public", "_redirects"), "utf8"),
+ );
+ const env = makeEnv(rules);
+ const cases = [
+ ["/de/installation/docker/index", "/de/installation/container/docker"],
+ ["/de/installation/docker/index/", "/de/installation/container/docker"],
+ ["/de/installation/docker/index.html", "/de/installation/container/docker"],
+ ["/zh/installation/docker", "/zh/installation/container/docker"],
+ ["/fr/installation/docker/", "/fr/installation/container/docker"],
+ ["/ja/upgrade-scale/upgrade", "/ja/operations/upgrade"],
+ ["/de/upgrade-scale/upgrade/", "/de/operations/upgrade"],
+ ["/en/upgrade-scale/upgrade", "/en/operations/upgrade"],
+ ["/de/features/s3-compatibility", "/de/reference/s3-compatibility"],
+ ["/de/features/s3-compatibility/", "/de/reference/s3-compatibility"],
+ ["/fr/features/s3-compatibility?from=old", "/fr/reference/s3-compatibility?from=old"],
+ ["/de/management/bucket/index", "/de/administration/data/bucket/creation"],
+ ["/management/bucket/index", "/en/administration/data/bucket/creation"],
+ ["/zh/management/bucket", "/zh/administration/data/bucket/creation"],
+ ["/ja/developer/api", "/ja/administration/protocols/s3"],
+ ["/developer/api/", "/en/administration/protocols/s3"],
+ ["/en/developer/integration/big-data/duckdb", "/en/developer/integration/database/duckdb"],
+ ["/zh/developer/integration/big-data/trino/", "/zh/developer/integration/database/trino"],
+ ["/de/developer/integration/big-data/clickhouse", "/de/developer/integration/database/clickhouse"],
+ ["/fr/developer/integration/big-data/doris", "/fr/developer/integration/database/doris"],
+ ["/ja/developer/integration/big-data/influxdb", "/ja/developer/integration/database/influxdb"],
+ ["/en/developer/integration/big-data/milvus", "/en/developer/integration/database/milvus"],
+ ["/zh/developer/integration/big-data/vitess", "/zh/developer/integration/database/vitess"],
+ ["/de/developer/integration/big-data/lakefs", "/de/developer/integration/storage/lakefs"],
+ ["/fr/developer/integration/big-data/opendal", "/fr/developer/integration/storage/opendal"],
+ ["/ja/developer/integration/big-data/zerofs", "/ja/developer/integration/storage/zerofs"],
+ ["/en/developer/integration/big-data/mlflow", "/en/developer/integration/ai/mlflow"],
+ ];
+
+ for (const pair of cases) {
+ const from = pair[0];
+ const to = pair[1];
+ if (!from || !to) throw new Error("incomplete redirect case");
+ const res = await request(env, from);
+ assert.equal(res.status, 301, from);
+ assert.equal(res.headers.get("location"), `https://docs.rustfs.com${to}`, from);
+ }
+
+ const head = await request(env, "/de/developer/integration/big-data/duckdb", { method: "HEAD" });
+ assert.equal(head.status, 301);
+ assert.equal(
+ head.headers.get("location"),
+ "https://docs.rustfs.com/de/developer/integration/database/duckdb",
+ );
+
+ // English homepage dumps stay English-only. Other locales are not sent home.
+ const enHome = await request(env, "/en/concepts/architecture");
+ assert.equal(enHome.status, 301);
+ assert.equal(enHome.headers.get("location"), "https://docs.rustfs.com/en");
+ const deHome = await request(env, "/de/concepts/architecture");
+ assert.equal(deHome.status, 200);
+
+ // Splats stay English-only so /de/management/iam/users is not guessed.
+ const enSplat = await request(env, "/en/management/iam/users");
+ assert.equal(enSplat.status, 301);
+ assert.equal(enSplat.headers.get("location"), "https://docs.rustfs.com/en/administration/iam/users");
+ const deSplat = await request(env, "/de/management/iam/users");
+ assert.equal(deSplat.status, 200);
+
+ const pretty = await request(env, "/ja/installation/linux/quick-start.html");
+ assert.equal(pretty.status, 301);
+ assert.equal(pretty.headers.get("location"), "https://docs.rustfs.com/ja/installation/linux/quick-start");
+ const index = await request(env, "/ja/installation/linux/index");
+ assert.equal(index.status, 301);
+ assert.equal(index.headers.get("location"), "https://docs.rustfs.com/ja/installation/linux");
+ const root = await request(env, "/ja/");
+ assert.equal(root.status, 301);
+ assert.equal(root.headers.get("location"), "https://docs.rustfs.com/ja");
+ const verify = await request(env, "/baidu_verify_codeva-Q10h8gcgwD.html");
+ assert.equal(verify.status, 200);
+
+ const canonical = await request(env, "/de/reference/s3-compatibility");
+ assert.equal(canonical.status, 200);
+ const duck = await request(env, "/de/developer/integration/database/duckdb");
+ assert.equal(duck.status, 200);
});
test("language redirect rules pin the docs root to English", () => {
@@ -223,6 +334,16 @@ test("real build output (if present): /installation and /installation/ both 301"
const enHtml = readFileSync(path.join(here, "..", "dist", "public", "en", "index.html"), "utf8");
const zhHtml = readFileSync(path.join(here, "..", "dist", "public", "zh", "index.html"), "utf8");
+ const deDocker = readFileSync(
+ path.join(here, "..", "dist", "public", "de", "installation", "container", "docker", "index.html"),
+ "utf8",
+ );
+ assert.equal((enHtml.match(/]*name="description"/g) ?? []).length, 1);
+ assert.match(deDocker, /RustFS mit Docker installieren und konfigurieren<\/title>/);
+ assert.equal(existsSync(path.join(here, "..", "dist", "public", "ja", "developer", "integration", "database", "trino", "index.html")), true);
+ const built = await request(env, "/de/developer/integration/big-data/duckdb");
+ assert.equal(built.status, 301);
+ assert.equal(built.headers.get("location"), "https://docs.rustfs.com/de/developer/integration/database/duckdb");
assert.match(enHtml, /RustFS Documentation \| S3-Compatible Object Storage<\/title>/);
assert.match(enHtml, /MinIO-compatible migration, and cluster operations\./);
assert.match(zhHtml, /RustFS 文档 \| 兼容 S3 的对象存储<\/title>/);
diff --git a/worker.mjs b/worker.mjs
index ca2939868..d87b24681 100644
--- a/worker.mjs
+++ b/worker.mjs
@@ -1,5 +1,7 @@
const redirectRulesByEnv = new WeakMap();
const DEFAULT_LOCALE = "en";
+const LOCALES = ["en", "zh", "de", "fr", "ja"];
+const LOCALE_SET = new Set(LOCALES);
async function loadRedirectRules(env) {
// Use the built _redirects file from the assets bundle so build-time generated rules are honored.
@@ -40,9 +42,12 @@ async function getRedirectRules(env) {
return pending;
}
-function matchRedirect(pathname, rules) {
+function matchRedirect(pathname, rules, exactOnly = false) {
for (const rule of rules) {
const { source, target, status } = rule;
+ // Non-English locales reuse exact historical rules only. Splats such as
+ // /management/* guess a prefix that is wrong for several moved sections.
+ if (exactOnly && source.includes("*")) continue;
if (source.endsWith("/*")) {
const prefix = source.slice(0, -1);
@@ -68,7 +73,7 @@ function splitLocale(pathname) {
if (parts.length === 0) return { locale: null, remainder: pathname };
const locale = parts[0];
- if (locale !== DEFAULT_LOCALE) return { locale: null, remainder: pathname };
+ if (!LOCALE_SET.has(locale)) return { locale: null, remainder: pathname };
const remainder = `/${parts.slice(1).join("/")}`;
return { locale, remainder: remainder === "/" ? "/" : remainder };
@@ -84,38 +89,79 @@ function normalizePathname(pathname) {
return pathname;
}
-function isLocalizedPath(pathname) {
- return pathname === `/${DEFAULT_LOCALE}` || pathname.startsWith(`/${DEFAULT_LOCALE}/`);
-}
-
-function applyLocaleToTarget(target, locale) {
+function localizeTarget(target, locale) {
if (!target.startsWith("/")) return target;
- if (isLocalizedPath(target)) return target;
+ if (target === `/${DEFAULT_LOCALE}`) return `/${locale}`;
+ if (target.startsWith(`/${DEFAULT_LOCALE}/`)) {
+ return `/${locale}${target.slice(DEFAULT_LOCALE.length + 1)}`;
+ }
if (target === "/") return `/${locale}`;
+ const first = target.split("/")[1];
+ if (LOCALE_SET.has(first)) return target;
return `/${locale}${target}`;
}
+// Base rules are written for English (/old /en/new). Every locale reuses the
+// exact rules; the /en prefix is swapped for the locale that was requested.
+function resolveRedirect(pathname, rules) {
+ const direct = matchRedirect(pathname, rules);
+ if (direct) return direct;
+
+ const { locale, remainder } = splitLocale(pathname);
+ // "/" is the docs root rule, not a per-locale page move.
+ if (!locale || remainder === "/") return null;
+
+ const base = matchRedirect(remainder, rules, locale !== DEFAULT_LOCALE);
+ if (!base) return null;
+
+ const target = localizeTarget(base.target, locale);
+ // Do not publish English homepage dumps (for example /concepts/architecture
+ // → /en) as locale homepages. Those old URLs stay unmatched.
+ if (locale !== DEFAULT_LOCALE && target === `/${locale}`) return null;
+ return { status: base.status, target };
+}
+
+// Permanent pretty-URL canonicalization. Cloudflare's asset html_handling
+// does the same rewrites with a temporary 307; these shapes never change.
+// Root-level files such as /baidu_verify_*.html stay addressable.
+function canonicalizePath(pathname) {
+ let path = pathname;
+ for (let i = 0; i < 6; i++) {
+ let next = path;
+ if (
+ next.endsWith(".html") &&
+ (next === "/index.html" || next.lastIndexOf("/") > 0)
+ ) {
+ next = next.slice(0, -".html".length);
+ }
+ if (next.length > 1 && next.endsWith("/")) {
+ next = next.slice(0, -1);
+ }
+ if (next === "/index" || next.endsWith("/index")) {
+ next = next.slice(0, -"/index".length);
+ if (next.length > 1 && next.endsWith("/")) next = next.slice(0, -1);
+ if (next === "") next = "/";
+ }
+ if (next === path) return path || "/";
+ path = next;
+ }
+ return path || "/";
+}
+
export default {
async fetch(request, env) {
const method = request.method.toUpperCase();
if (method === "GET" || method === "HEAD") {
const url = new URL(request.url);
const rules = await getRedirectRules(env);
- const pathname = normalizePathname(url.pathname);
- let matched = matchRedirect(pathname, rules);
-
- // English-only fallback: /en/foo can reuse base rule /foo -> /en/bar.
- if (!matched) {
- const { locale, remainder } = splitLocale(pathname);
- if (locale) {
- const baseMatch = matchRedirect(remainder, rules);
- if (baseMatch) {
- matched = {
- status: baseMatch.status,
- target: applyLocaleToTarget(baseMatch.target, locale),
- };
- }
- }
+ const originalPath = url.pathname;
+ const pathname = normalizePathname(originalPath);
+ let matched = resolveRedirect(pathname, rules);
+ const canonical = canonicalizePath(originalPath);
+
+ // /installation/docker/index.html should hit /installation/docker in one hop.
+ if (!matched && canonical !== pathname) {
+ matched = resolveRedirect(canonical, rules);
}
if (matched) {
@@ -123,10 +169,17 @@ export default {
targetUrl.search = url.search;
// Avoid redirect loops caused by equivalent source/target paths.
- if (`${targetUrl.pathname}${targetUrl.search}` !== `${pathname}${url.search}`) {
+ // Compare with the original path so a trailing slash still redirects.
+ if (`${targetUrl.pathname}${targetUrl.search}` !== `${originalPath}${url.search}`) {
return Response.redirect(targetUrl.toString(), matched.status);
}
}
+
+ if (canonical !== originalPath) {
+ const targetUrl = new URL(canonical, url);
+ targetUrl.search = url.search;
+ return Response.redirect(targetUrl.toString(), 301);
+ }
}
return env.ASSETS.fetch(request);