RustFS est un stockage objet S3 haute performance écrit en Rust et distribué sous licence Apache 2.0. Inspiré de l'architecture de MinIO, il promet des performances 2,3x supérieures pour les petits objets (4 Ko) grâce aux optimisations de Rust. Ce guide déploie un cluster distribué 4 nœuds avec erasure coding, teste l'API S3 complète et configure un service systemd, le tout sur des machines virtuelles Ubuntu 24.04 avec RustFS 1.0.1. Il s'adresse à qui sait déjà utiliser un terminal Linux et a entendu parler de S3 ; chaque notion nouvelle est définie en route.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Architecture : comprendre le modèle peer-to-peer sans master et l'erasure coding
- Mode single-node : démarrer RustFS sur un seul serveur pour le test
- Cluster distribué : déployer un cluster 4 nœuds avec systemd
- API S3 : créer des buckets, uploader/télécharger des fichiers avec AWS CLI
- Contrôle d'accès : restreindre un utilisateur à un préfixe et brancher une fédération OIDC
- Dépannage : résoudre les problèmes courants (503, convergence, secret RPC, format)
Qu'est-ce que RustFS ?
Section intitulée « Qu'est-ce que RustFS ? »RustFS est un système de stockage objet distribué open source développé en Rust (compilateur Rust 1.93+). Il fournit une API compatible S3 (avec des limites, voir l'encadré plus bas) et une console d'administration web, le tout dans un unique binaire statique sans dépendance. Le projet a été créé en 2024 et reste en développement actif sur GitHub.
Ce qui distingue RustFS
Section intitulée « Ce qui distingue RustFS »Deux arguments du tableau ci-dessous ressortent et méritent d'être pesés séparément. Le premier, la performance, reste à confirmer par vos propres mesures, le chiffre « 2,3x plus rapide que MinIO » venant du projet lui-même. Le second, la licence Apache 2.0, est un fait juridique vérifiable et souvent le vrai motif de migration : il évite la clause copyleft de l'AGPLv3 que MinIO impose à quiconque expose son API.
| Caractéristique | Description |
|---|---|
| Haute performance | Écrit en Rust, optimisé pour les petits objets (2,3x plus rapide que MinIO sur 4 Ko) |
| Peer-to-peer | Pas de nœud maître, tous les nœuds sont égaux et interchangeables |
| Erasure coding | Reed-Solomon intégré : protège les données avec moins d'espace que la réplication |
| Binaire unique | Un seul exécutable statique (~270 Mo décompressé), aucune dépendance système |
| S3 compatible | API S3 compatible, utilisable avec AWS CLI, MinIO Client (mc) et les SDK S3 (quelques requêtes ne sont pas implémentées) |
| Console web | Interface d'administration intégrée (port 9001) |
| Apache 2.0 | Licence permissive, sans la contrainte copyleft de l'AGPLv3 |
Architecture et concepts clés
Section intitulée « Architecture et concepts clés »Trois idées suffisent à comprendre le fonctionnement de RustFS : un modèle peer-to-peer sans nœud maître, la protection des données par erasure coding, et une poignée de ports réseau à ouvrir. Le schéma ci-dessous relie ces trois briques ; les sous-sections qui suivent les détaillent une à une.
Modèle peer-to-peer
Section intitulée « Modèle peer-to-peer »Contrairement à SeaweedFS (master + volume servers) ou Ceph (monitors + OSDs), RustFS utilise une architecture entièrement décentralisée. Tous les nœuds sont identiques : chacun expose l'API S3 sur le port 9000 et la console web sur le port 9001. N'importe quel nœud peut recevoir les requêtes client.
Les nœuds communiquent entre eux via gRPC pour coordonner les opérations d'écriture et distribuer les fragments d'erasure coding.
Erasure coding (Reed-Solomon)
Section intitulée « Erasure coding (Reed-Solomon) »L'erasure coding est la méthode utilisée par RustFS pour protéger les données. Au lieu de copier 3 fois chaque fichier (réplication 3x), l'erasure coding découpe les données en fragments de données et génère des fragments de parité supplémentaires.
Comment ça fonctionne :
| Concept | Explication |
|---|---|
| Drive | Un disque physique ou un répertoire de stockage sur un nœud |
| Set (erasure set) | Un groupe de drives répartis sur plusieurs nœuds. Chaque objet vit dans un seul set |
| Fragments de données | Les morceaux du fichier original, répartis entre les drives du set |
| Fragments de parité | Des données de correction calculées par l'algorithme Reed-Solomon |
Exemple avec 4 nœuds et 1 drive chacun (notre lab) :
- 1 erasure set de 4 drives
- 2 fragments de données + 2 fragments de parité (EC:2)
- Tolérance : jusqu'à 2 drives en panne simultanée sans perte
Comparaison avec la réplication :
| Méthode | Stockage pour 1 Go utile | Tolérance de panne |
|---|---|---|
| Réplication 3x | 3 Go (300 %) | 2 copies perdues |
| Erasure coding EC:2 (4 drives) | 2 Go (200 %) | 2 drives perdus |
| EC:4 (configuration 12+4) | 1,33 Go (133 %) | 4 drives perdus |
Modes de déploiement
Section intitulée « Modes de déploiement »RustFS supporte 3 modes de déploiement :
| Mode | Description | Minimum |
|---|---|---|
| SNSD (Single-Node Single-Drive) | Un nœud, un disque. Pour le test uniquement | 1 nœud, 1 disque |
| SNMD (Single-Node Multi-Drive) | Un nœud, plusieurs disques. Erasure coding local | 1 nœud, 4 disques |
| MNMD (Multi-Node Multi-Drive) | Plusieurs nœuds, chacun avec 1+ disques. Production | 4 nœuds minimum |
Ports réseau
Section intitulée « Ports réseau »RustFS n'ouvre que deux ports, et la confusion entre les deux est une source d'erreur fréquente. Le 9000 porte à la fois l'API S3 des clients et le trafic gRPC entre nœuds : c'est le seul port strictement nécessaire au fonctionnement du cluster. Le 9001 ne sert qu'à la console web et peut rester fermé aux clients, voire restreint à un réseau d'administration.
| Port | Usage |
|---|---|
| 9000 | API S3 (requêtes client, communication inter-nœuds) |
| 9001 | Console web d'administration |
Lab : mode single-node (test rapide)
Section intitulée « Lab : mode single-node (test rapide) »Avant de déployer un cluster complet, commençons par un nœud unique pour valider l'installation et tester l'API S3.
Prérequis
Section intitulée « Prérequis »- 1 machine Linux (VM, serveur, WSL)
- Ubuntu 24.04 (ou toute distribution Linux x86_64)
- 2 Go de RAM minimum
- wget et unzip (absents des images Ubuntu minimales :
sudo apt install -y wget unzip) - AWS CLI installé (le paquet
awsclin'existe plus dans les dépôts d'Ubuntu 24.04 : suivez le guide AWS CLI)
Installer RustFS
Section intitulée « Installer RustFS »-
Télécharger le binaire :
Le téléchargement est épinglé à la version testée dans ce guide (
v1.0.1) plutôt qu'au fluxlatest, pour que la sortie derustfs --versioncorresponde à ce qui est décrit ici. Le projet publie un fichier de sommesSHA256SUMSavec chaque release sur GitHub : contrôlez l'archive avant de l'extraire. Si la commandesha256sumn'affiche pasOK, arrêtez-vous.Fenêtre de terminal wget https://dl.rustfs.com/artifacts/rustfs/release/rustfs-linux-x86_64-musl-v1.0.1.zipwget https://github.com/rustfs/rustfs/releases/download/1.0.1/SHA256SUMSgrep rustfs-linux-x86_64-musl-v1.0.1.zip SHA256SUMS | sha256sum --checkunzip rustfs-linux-x86_64-musl-v1.0.1.zipsudo mv rustfs /usr/local/bin/sudo chmod +x /usr/local/bin/rustfsLa vérification doit afficher
rustfs-linux-x86_64-musl-v1.0.1.zip: OK. L'archive contient deux exécutables,rustfsetrustfs-cli: seul le premier sert dans ce guide.Vérification :
Fenêtre de terminal rustfs --versionLa première ligne de la sortie donne la version, suivie des informations de compilation :
rustfs 1.0.1 -
Créer le répertoire de données :
Fenêtre de terminal sudo mkdir -p /data/rustfs0sudo chown "$USER": /data/rustfs0Le
chownest nécessaire : le serveur est lancé sous votre compte à l'étape suivante, et un répertoire créé parsudoappartient àroot. Sans lui, le démarrage échoue avecServer runtime failed: Io error: Permission denied. -
Démarrer en mode single-node :
Fenêtre de terminal rustfs --address :9000 \--console-enable \--access-key rustfsadmin \--secret-key rustfsadmin \/data/rustfs0Le serveur n'affiche rien par défaut et garde le terminal : c'est normal. Depuis un second terminal, la sonde de santé confirme qu'il répond :
Fenêtre de terminal curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9000/healthLa commande doit afficher
200. Pour suivre le démarrage, relancez le serveur avecRUST_LOG=infodevant la commande : il écrit alors un journal JSON sur la sortie d'erreur, qui contient les adresses de l'API et de la console, puis la ligneRustFS server ready.
Tester l'API S3
Section intitulée « Tester l'API S3 »Ouvrez un second terminal et configurez les variables d'environnement pour AWS CLI :
export AWS_ACCESS_KEY_ID=rustfsadminexport AWS_SECRET_ACCESS_KEY=rustfsadminexport AWS_DEFAULT_REGION=us-east-1Créer un bucket :
aws --endpoint-url http://localhost:9000 s3 mb s3://test-bucketmake_bucket: test-bucketUploader un fichier :
echo "Hello RustFS!" > /tmp/test.txtaws --endpoint-url http://localhost:9000 s3 cp /tmp/test.txt s3://test-bucket/docs/upload: /tmp/test.txt to s3://test-bucket/docs/test.txtLister les objets :
aws --endpoint-url http://localhost:9000 s3 ls s3://test-bucket --recursive2026-03-01 10:27:16 14 docs/test.txtTélécharger un fichier :
aws --endpoint-url http://localhost:9000 s3 cp s3://test-bucket/docs/test.txt /tmp/download.txtcat /tmp/download.txtHello RustFS!Générer une URL pré-signée (accès temporaire sans authentification) :
aws --endpoint-url http://localhost:9000 s3 presign s3://test-bucket/docs/test.txt --expires-in 3600http://localhost:9000/test-bucket/docs/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&...Upload multipart (fichiers volumineux) :
dd if=/dev/urandom of=/tmp/bigfile.bin bs=1M count=10 2>/dev/nullaws --endpoint-url http://localhost:9000 s3 cp /tmp/bigfile.bin s3://test-bucket/data/upload: /tmp/bigfile.bin to s3://test-bucket/data/bigfile.binLab : cluster distribué 4 nœuds
Section intitulée « Lab : cluster distribué 4 nœuds »Le mode distribué est le déploiement réel de RustFS. Il nécessite au minimum 4 serveurs pour former un erasure set fonctionnel.
Prérequis
Section intitulée « Prérequis »- 4 machines avec Ubuntu 24.04
- 2 Go de RAM et 1 vCPU par nœud
- Connectivité réseau entre tous les nœuds (port 9000)
- Le binaire RustFS installé sur chaque nœud
Préparer les nœuds
Section intitulée « Préparer les nœuds »-
Configurer la résolution DNS sur chaque nœud :
Ajoutez dans
/etc/hostsde chaque nœud les 4 adresses :Fenêtre de terminal sudo tee -a /etc/hosts << 'EOF'192.168.122.31 node1192.168.122.20 node2192.168.122.64 node3192.168.122.212 node4EOFRemplacez les adresses IP par celles de vos machines.
Vérification : depuis chaque nœud, les 3 autres doivent répondre au ping :
Fenêtre de terminal ping -c1 node1 && ping -c1 node2 && ping -c1 node3 && ping -c1 node4 -
Créer le répertoire de données sur chaque nœud :
Fenêtre de terminal sudo mkdir -p /data/rustfs0sudo mkdir -p /var/logs/rustfs -
Configurer les variables d'environnement :
Créez le fichier
/etc/default/rustfssur chaque nœud (contenu identique) :Fenêtre de terminal sudo tee /etc/default/rustfs << 'EOF'RUSTFS_ACCESS_KEY=rustfsadminRUSTFS_SECRET_KEY=rustfsadminRUSTFS_VOLUMES="http://node{1...4}:9000/data/rustfs0"RUSTFS_ADDRESS=":9000"RUSTFS_CONSOLE_ENABLE=trueRUST_LOG=errorRUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/"RUSTFS_RPC_SECRET="REMPLACEZ-PAR-UN-SECRET-ALEATOIRE"EOFRemplacez la valeur de
RUSTFS_RPC_SECRETpar une chaîne aléatoire (par exemple le résultat deopenssl rand -base64 24), identique sur les 4 nœuds. Ce secret authentifie les échanges gRPC entre nœuds. Sans lui, et tant que les identifiants restent les valeurs par défautrustfsadmin/rustfsadmin(qu'il refuse de réutiliser pour en dériver un), le service échoue au démarrage avecendpoints include remote nodes but RPC authentication secret is not configured.La syntaxe
{1...4}(trois points) est spécifique à RustFS, elle génère automatiquement les URLs pour node1 à node4. Ne confondez pas avec la syntaxe shell{1..4}(deux points). -
Créer le service systemd :
Le fichier
/etc/systemd/system/rustfs.serviceest identique sur chaque nœud :Fenêtre de terminal sudo tee /etc/systemd/system/rustfs.service << 'EOF'[Unit]Description=RustFS Object Storage ServerDocumentation=https://rustfs.com/docs/After=network-online.targetWants=network-online.target[Service]Type=notifyNotifyAccess=mainUser=rootGroup=rootWorkingDirectory=/usr/localEnvironmentFile=-/etc/default/rustfsExecStart=/usr/local/bin/rustfs $RUSTFS_VOLUMESLimitNOFILE=1048576TasksMax=infinityRestart=alwaysRestartSec=10s[Install]WantedBy=multi-user.targetEOFLe
Type=notifyindique que RustFS notifie systemd une fois prêt à recevoir des requêtes. Le service redémarre automatiquement en cas de crash (Restart=always).
Démarrer le cluster
Section intitulée « Démarrer le cluster »Démarrez sur les 4 nœuds simultanément :
sudo systemctl enable --now rustfsVérification (sur chaque nœud) :
sudo systemctl is-active rustfsRésultat attendu : active.
Confirmez ensuite que l'API répond sur chaque nœud :
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9000/healthLa commande doit afficher 200. Avec RUST_LOG=error, le journal systemd (sudo journalctl -u rustfs --no-pager -n 5) ne contient que les lignes Starting rustfs.service et Started rustfs.service, sans message de RustFS : l'absence d'erreur est le signe que tout va bien. Pour voir le détail du démarrage, passez RUST_LOG=info dans /etc/default/rustfs, puis redémarrez le service : les messages, au format JSON, sont écrits dans /var/logs/rustfs/rustfs.log et se terminent par RustFS server ready.
La convergence prend quelques secondes : le temps que chaque nœud contacte les 3 autres et synchronise les métadonnées de format (format.json).
Tester le cluster distribué
Section intitulée « Tester le cluster distribué »Configurez AWS CLI pour pointer vers n'importe quel nœud du cluster :
export AWS_ACCESS_KEY_ID=rustfsadminexport AWS_SECRET_ACCESS_KEY=rustfsadminexport AWS_DEFAULT_REGION=us-east-1Créer un bucket via node1 :
aws --endpoint-url http://node1:9000 s3 mb s3://cluster-bucketmake_bucket: cluster-bucketUploader via node1, lire depuis node2 :
echo "Test distribué RustFS" > /tmp/cluster-test.txtaws --endpoint-url http://node1:9000 s3 cp /tmp/cluster-test.txt s3://cluster-bucket/docs/test.txtaws --endpoint-url http://node2:9000 s3 ls s3://cluster-bucket --recursive2026-03-01 10:37:39 23 docs/test.txtLe fichier uploadé sur node1 est immédiatement accessible depuis node2 : les métadonnées et fragments d'erasure coding sont distribués entre les 4 nœuds.
Télécharger depuis node3 :
aws --endpoint-url http://node3:9000 s3 cp s3://cluster-bucket/docs/test.txt /tmp/dl.txtcat /tmp/dl.txtTest distribué RustFSUpload multipart via node1, vérification depuis node4 :
dd if=/dev/urandom of=/tmp/bigfile.bin bs=1M count=10 2>/dev/nullaws --endpoint-url http://node1:9000 s3 cp /tmp/bigfile.bin s3://cluster-bucket/data/bigfile.binaws --endpoint-url http://node4:9000 s3 ls s3://cluster-bucket --recursive2026-03-01 10:37:50 10485760 data/bigfile.bin2026-03-01 10:37:39 23 docs/test.txtChaque objet est réparti en fragments d'erasure coding sur les 4 drives du cluster. N'importe quel nœud peut servir n'importe quel objet.
Console web
Section intitulée « Console web »RustFS fournit une interface d'administration web accessible sur le port 9001 :
http://node1:9001/rustfs/console/index.htmlConnectez-vous avec les identifiants configurés dans /etc/default/rustfs (rustfsadmin / rustfsadmin). La console permet de parcourir les buckets, gérer les utilisateurs et surveiller l'état du cluster.
Contrôle d'accès : préfixe, OIDC et STS
Section intitulée « Contrôle d'accès : préfixe, OIDC et STS »RustFS reprend le modèle IAM de MinIO (IAM : la gestion des utilisateurs et de leurs droits) : des politiques au format S3, la restriction par préfixe, la fédération OIDC (se connecter avec un compte d'un fournisseur d'identité externe) et des identifiants temporaires STS (Security Token Service) obtenus par AssumeRoleWithWebIdentity. Les exemples ci-dessous supposent le client mc (MinIO Client), jq, Docker et un fournisseur OIDC existant ; ce sont des extraits à adapter, pas un lab pas à pas. L'OIDC demande une subtilité de configuration propre à RustFS.
Restreindre un utilisateur à un préfixe
Section intitulée « Restreindre un utilisateur à un préfixe »La politique cible les objets sous data/equipe-a/* et conditionne le listage avec s3:prefix :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::data"], "Condition": { "StringLike": { "s3:prefix": ["equipe-a/*"] } } }, { "Effect": "Allow", "Action": ["s3:GetObject","s3:PutObject","s3:DeleteObject"], "Resource": ["arn:aws:s3:::data/equipe-a/*"] } ]}mc alias set rustfs http://127.0.0.1:9000 <accessKey> <secretKey>mc admin policy create rustfs equipe-a /tmp/policy-equipe-a.jsonmc admin user add rustfs alice AliceSecret123mc admin policy attach rustfs equipe-a --user aliceL'utilisateur alice lit et écrit alors sous equipe-a/ uniquement ; tout autre préfixe renvoie AccessDenied.
Fédération OIDC via variables d'environnement
Section intitulée « Fédération OIDC via variables d'environnement »On passe les variables RUSTFS_IDENTITY_OPENID_* au conteneur ou au service. Le claim (une information portée par le jeton d'identité, ici une liste de rôles) désigné par ROLES_CLAIM fournit le nom de la politique attachée aux identifiants temporaires (il doit correspondre à une politique existante) :
docker run -d --name rustfs -p 9000:9000 \ -e RUSTFS_ACCESS_KEY=<accessKey> -e RUSTFS_SECRET_KEY=<secretKey> -e RUSTFS_VOLUMES=/data \ -e RUSTFS_IDENTITY_OPENID_ENABLE=true \ -e RUSTFS_IDENTITY_OPENID_CONFIG_URL="https://sso.example.com/realms/stockage/.well-known/openid-configuration" \ -e RUSTFS_IDENTITY_OPENID_CLIENT_ID=rustfs \ -e RUSTFS_IDENTITY_OPENID_CLIENT_SECRET=<secret> \ -e RUSTFS_IDENTITY_OPENID_SCOPES=openid \ -e RUSTFS_IDENTITY_OPENID_ROLES_CLAIM=roles \ rustfs/rustfs:1.0.1@sha256:1803faef57627e2d9c2e7d89d655d712ddded5389040054987163043fecb6a3cLe tag de l'image est épinglé sur la même version que le binaire installé
plus haut, et sur son empreinte (@sha256:...), pour éviter que le flux latest ne fasse dériver le comportement de l'OIDC entre deux exécutions. L'image déclare un volume sur /data : pour arrêter le test sans laisser de volume orphelin, utilisez docker rm -fv rustfs.
Créez ensuite une politique nommée comme la valeur du claim (par exemple s3-read-write si le jeton porte roles: ["s3-read-write"]), scopée au préfixe voulu. L'échange STS se fait en POST :
TOKEN=$(curl -s https://sso.example.com/realms/stockage/protocol/openid-connect/token \ -d grant_type=password -d client_id=rustfs -d client_secret=<secret> \ -d username=<user> -d password=<pwd> -d scope=openid | jq -r .access_token)
curl -s -X POST http://127.0.0.1:9000/ \ --data-urlencode "Action=AssumeRoleWithWebIdentity" \ --data-urlencode "Version=2011-06-15" \ --data-urlencode "WebIdentityToken=$TOKEN"# -> <Credentials> : AccessKeyId, SecretAccessKey, SessionToken temporairesLes identifiants temporaires portent la politique nommée par le claim : leur détenteur est cloisonné au préfixe et l'accès expire automatiquement.
Bonnes pratiques
Section intitulée « Bonnes pratiques »Comme tous les nœuds sont équivalents, aucun n'est un point d'entrée naturel : c'est à vous de placer un répartiteur devant le cluster et de fiabiliser la résolution de noms. Les trois points ci-dessous couvrent l'entrée du trafic, la résolution et le filtrage.
- Load balancer : en production, placez un reverse proxy (HAProxy, Nginx) devant les nœuds pour distribuer les requêtes en round-robin sur le port 9000
- DNS : utilisez un enregistrement DNS qui résout vers tous les nœuds plutôt que
/etc/hosts - Pare-feu : ouvrez les ports 9000 (S3 inter-nœuds + clients) et 9001 (console, accès restreint)
Dimensionnement
Section intitulée « Dimensionnement »Le dimensionnement d'un cluster d'erasure coding ne se résume pas au nombre de nœuds : le nombre de drives compte tout autant, car c'est lui qui fixe le rapport données/parité et donc la tolérance de panne. Visez plusieurs disques par nœud plutôt qu'un seul gros disque.
- 4 nœuds minimum pour le mode distribué (MNMD)
- Disques XFS en JBOD pour la meilleure performance avec l'erasure coding
- Plusieurs disques par nœud en production : la syntaxe
http://node{1...4}:9000/data/rustfs{0...3}crée 4 drives par nœud, soit 16 drives au total pour un meilleur erasure set
Sécurité
Section intitulée « Sécurité »RustFS démarre avec des identifiants d'administration en clair et sans chiffrement de transport : les deux réglages par défaut à ne jamais laisser en production. Le premier point ci-dessous est le plus urgent, un rustfsadmin/rustfsadmin exposé donne un accès total au stockage.
- Changez les identifiants par défaut :
rustfsadmin/rustfsadminest uniquement pour le test - TLS : configurez un certificat pour chiffrer les communications S3 et inter-nœuds
- Réseau dédié : isolez le trafic inter-nœuds sur un VLAN ou réseau privé
Dépannage
Section intitulée « Dépannage »La quasi-totalité des blocages en mode distribué se ramène à un même thème : la
convergence initiale du cluster, ce moment où les quatre nœuds échangent
leur format.json. Tant qu'elle n'a pas abouti, l'API répond 503, le service reste activating et les logs répètent la recherche des formats. Avant tout, vérifiez donc que tous les nœuds tournent
et se joignent sur le port 9000 ; la plupart des lignes du tableau en découlent.
| Symptôme | Cause probable | Solution |
|---|---|---|
503 Service Unavailable sur S3, service activating | Le cluster n'a pas convergé : au moins un nœud n'est pas démarré ou pas joignable | Démarrez les nœuds manquants : les autres convergent d'eux-mêmes. Si tous tournent, vérifiez /etc/hosts et le port 9000 entre nœuds |
load_format_erasure err: ... RemoteClientUnavailable("transport error") dans /var/logs/rustfs/rustfs.log | Un pair ne répond pas pendant la recherche des métadonnées de format (visible avec RUST_LOG=warn ou info, répété toutes les 16 secondes environ) | Vérifiez que tous les nœuds exécutent rustfs, la résolution DNS et la connectivité (port 9000) |
endpoints include remote nodes but RPC authentication secret is not configured | Aucun RUSTFS_RPC_SECRET et identifiants par défaut | Ajoutez le même RUSTFS_RPC_SECRET dans /etc/default/rustfs sur chaque nœud |
UnsupportedSnsdExpansion dans les logs | Un nœud conserve les données d'un ancien déploiement single-node | Supprimez tout le répertoire, dossier caché .rustfs.sys compris : sudo rm -rf /data/rustfs0 |
Console web renvoie 403 | Accès à la racine du port 9001 avec curl | Normal : ouvrez /rustfs/console/index.html dans un navigateur |
WARNING: Host local has more than 0 drives of set | Plus d'un drive du même erasure set sur le même nœud | Acceptable en lab. En production, répartissez les drives sur des nœuds différents |
| Service systemd échoue au démarrage | Données résiduelles d'un déploiement précédent incompatible | sudo rm -rf /data/rustfs0 && sudo mkdir -p /data/rustfs0, puis redémarrez |
À retenir
Section intitulée « À retenir »- RustFS est un stockage objet S3 haute performance écrit en Rust, sous licence Apache 2.0
- L'architecture peer-to-peer sans master simplifie le déploiement : tous les nœuds sont identiques et interchangeables
- L'erasure coding (Reed-Solomon) protège les données plus efficacement que la réplication, avec 4 drives, 2 peuvent tomber sans perte
- Le mode distribué (MNMD) nécessite au minimum 4 nœuds ; les nœuds se rejoignent à la convergence initiale (un nœud démarré seul attend les autres), avec un
RUSTFS_RPC_SECRETidentique partout - La syntaxe d'expansion
{1...4}(trois points) est spécifique à RustFS pour décrire les endpoints du cluster - L'OIDC se configure par variables d'environnement, pas par
mc admin config set - Le projet est stable depuis le 16 septembre 2026 (1.0.0) mais récent : évaluez-le sur vos charges avant d'y placer des données critiques
- En production, utilisez XFS en JBOD, un load balancer devant les nœuds et des identifiants forts
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources
Section intitulée « Ressources »- Site officiel : rustfs.com
- Code source : github.com/rustfs/rustfs
- Documentation : docs.rustfs.com
- Téléchargement : dl.rustfs.com