一、前言:什么是RustFS
RustFS 是一个基于 Rust 构建的高性能分布式对象存储系统。Rust 是全球最受开发者喜爱的编程语言之一,RustFS 结合了 MinIO 的简洁性与 Rust 的内存安全及高性能优势。它为已支持功能提供广泛的 S3 API 兼容性,完全开源,并专为数据湖、人工智能(AI)和大数据负载进行了优化。[Github上的简介是这么说的]
为什么我要安装RustFS,这就要追溯到我搭建的镜像站了,镜像站的缓存我是采用的缓存在对象存储上的,然后存储量有100多GB,我的图床存储量占用了700多GB,其他的一些杂七杂八的数据又占了300多GB,导致我现在的每月的对象存储费用偏高。索性搞了个3TB的大盘鸡,每月出口流量6TB,价格9美元每月,感觉差不多,前面套了CF和其他的一些CDN,流量应该跑不了那么多。索性就搞了起来,截至发文,还在不断迁移数据,两边同时运行。
二、安装
1.环境
我这里的环境是使用的Ubuntu 26.04(至于为什么不用24、22版本,只是因为这种服务器肯定是长久运行,不可能后边又去切换系统的版本,索性一次性用新版本,长久一点)、3核心6GB内存、3TB存储空间,其他没什么环境。
注意:Nginx等基本环境我这里不再赘述,可以使用宝塔面板,我这里仅做安装教程。
2.安装
这里我是选用的单机单盘的安装模式,因此安装相对简单些,并且单机单盘也有一键安装脚本:
curl -O https://rustfs.com/install_rustfs.sh && bash install_rustfs.sh当然,你也可以选择使用Docker安装,我这里就不再多说。可以看这个:rustfs/README_ZH.md at main · rustfs/rustfs
我这里弄了个脚本,用来安装。不过注意修改下访问凭证和虚拟主机域名(如果你要开启虚拟主机模式)
首先创建文件
vim install-rustfs.sh将下方的内容粘贴到文档中,并修改保存。
#!/usr/bin/env bash
# =============================================================================
# RustFS 单机单盘(SNSD)安装脚本
# 目标系统:Ubuntu 26(最新版)
# 部署模式:单机单盘 + 虚拟主机模式(Virtual Host Style)
# 虚拟主机域名:*.s3.inxw.com -> 桶名.s3.inxw.com
# 参考文档:https://rustfs.org.cn/installation/linux/single-node-single-disk.html
# =============================================================================
set -euo pipefail
# ----------------------------- 可配置变量 -----------------------------
# 访问凭证(务必修改为你自己的值;留空则自动生成强密钥)
RUSTFS_ACCESS_KEY="${RUSTFS_ACCESS_KEY:-}"
RUSTFS_SECRET_KEY="${RUSTFS_SECRET_KEY:-}"
# 数据盘设备名(务必确认,会格式化该磁盘!)
# 例:/dev/sdb 或 /dev/nvme0n1
# 留空 = 不格式化独立数据盘,直接用系统盘上的目录(仅测试)
DATA_DISK="${DATA_DISK:-}"
# 挂载点 / 数据目录
DATA_DIR="/data/rustfs0"
# 服务监听地址
RUSTFS_ADDRESS=":9000"
# 虚拟主机域名(桶名.域名)
SERVER_DOMAIN="s3.inxw.com"
# ---------------------------------------------------------------------
log() { echo -e "\033[1;32m[OK]\033[0m $*"; }
warn() { echo -e "\033[1;33m[!!]\033[0m $*"; }
err() { echo -e "\033[1;31m[ERR]\033[0m $*"; exit 1; }
# 必须以 root 运行
if [[ $EUID -ne 0 ]]; then
err "请使用 root 或 sudo 运行本脚本"
fi
echo "=============================================================="
echo " RustFS 单机单盘安装脚本 (Ubuntu 26)"
echo " 虚拟主机域名:*.$SERVER_DOMAIN"
echo "=============================================================="
# --------------------------- 1. 先决条件检查 ---------------------------
log "检查系统环境..."
echo " - 系统版本: $(lsb_release -ds 2>/dev/null || grep PRETTY_NAME /etc/os-release | cut -d'\"' -f2)"
echo " - 内核版本: $(uname -r)"
# 时间同步
TIMESYNC=$(timedatectl status | grep -i synchronized | awk '{print $NF}')
if [[ "$TIMESYNC" == "yes" ]]; then
log "时间同步正常"
else
warn "时间同步未开启,正在启用 systemd-timesyncd..."
timedatectl set-ntp true || warn "无法自动开启时间同步,请手动检查"
fi
# --------------------------- 2. 数据盘处理 ---------------------------
if [[ -n "$DATA_DISK" ]]; then
warn "即将格式化磁盘 $DATA_DISK 为 XFS(该磁盘数据将全部丢失!)"
lsblk "$DATA_DISK"
read -r -p "确认格式化 $DATA_DISK ? 输入 yes 继续: " CONFIRM
if [[ "$CONFIRM" != "yes" ]]; then
err "用户取消,退出"
fi
log "安装 xfsprogs..."
apt-get update -y
apt-get install -y xfsprogs
log "格式化 $DATA_DISK 为 XFS (label=RUSTFS0)..."
mkfs.xfs -f -i size=512 -n ftype=1 -L RUSTFS0 "$DATA_DISK"
log "配置 /etc/fstab..."
grep -q "LABEL=RUSTFS0" /etc/fstab || echo "LABEL=RUSTFS0 $DATA_DIR xfs defaults,noatime,nodiratime 0 0" >> /etc/fstab
else
warn "未指定 DATA_DISK,跳过磁盘格式化,使用系统盘目录 $DATA_DIR(仅测试环境)"
fi
mkdir -p "$DATA_DIR"
mount -a 2>/dev/null || true
df -h "$DATA_DIR"
# --------------------------- 3. 下载安装二进制包 ---------------------------
log "安装依赖 (wget/unzip)..."
apt-get update -y
apt-get install -y wget unzip
log "下载 RustFS 官方二进制包..."
cd /tmp
wget -q https://dl.rustfs.com/artifacts/rustfs/release/rustfs-linux-x86_64-musl-latest.zip
unzip -o rustfs-linux-x86_64-musl-latest.zip
chmod +x rustfs
mv rustfs /usr/local/bin/
log "RustFS 版本: $(/usr/local/bin/rustfs --version 2>&1 | head -1)"
# --------------------------- 4. 生成访问凭证 ---------------------------
if [[ -z "$RUSTFS_ACCESS_KEY" || -z "$RUSTFS_SECRET_KEY" ]]; then
log "自动生成强访问凭证..."
RUSTFS_ACCESS_KEY=$(openssl rand -hex 16)
RUSTFS_SECRET_KEY=$(openssl rand -hex 32)
warn "已自动生成凭证,请保存以下信息:"
fi
# --------------------------- 5. 配置环境变量 ---------------------------
log "创建目录..."
mkdir -p "$DATA_DIR" /var/logs/rustfs /opt/tls
chmod -R 750 "$DATA_DIR" /var/logs/rustfs
log "写入 /etc/default/rustfs 配置..."
tee /etc/default/rustfs > /dev/null <<EOF
RUSTFS_ACCESS_KEY=$RUSTFS_ACCESS_KEY
RUSTFS_SECRET_KEY=$RUSTFS_SECRET_KEY
RUSTFS_VOLUMES="$DATA_DIR"
RUSTFS_ADDRESS="$RUSTFS_ADDRESS"
RUSTFS_CONSOLE_ENABLE=true
RUSTFS_SERVER_DOMAINS="$SERVER_DOMAIN"
RUST_LOG=error
RUSTFS_OBS_LOG_DIRECTORY="/var/logs/rustfs/"
EOF
# --------------------------- 6. 配置 systemd 服务 ---------------------------
# 注意:不要配置 StandardOutput/StandardError 到 rustfs.log,
# 否则会与 RustFS 自身的滚动日志(RUSTFS_OBS_LOG_DIRECTORY)产生 sink 冲突,
# 导致 "Log sink conflict" 的 FATAL 报错而无法启动。
log "创建 systemd 服务文件..."
tee /etc/systemd/system/rustfs.service > /dev/null <<'EOF'
[Unit]
Description=RustFS Object Storage Server
Documentation=https://rustfs.com/docs/
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
NotifyAccess=main
User=root
Group=root
WorkingDirectory=/usr/local
EnvironmentFile=-/etc/default/rustfs
ExecStart=/usr/local/bin/rustfs $RUSTFS_VOLUMES
LimitNOFILE=1048576
LimitNPROC=32768
TasksMax=infinity
Restart=always
RestartSec=10s
OOMScoreAdjust=-1000
SendSIGKILL=no
TimeoutStartSec=30s
TimeoutStopSec=30s
NoNewPrivileges=true
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectClock=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictSUIDSGID=true
RestrictRealtime=true
[Install]
WantedBy=multi-user.target
EOF
log "重载并启动服务..."
systemctl daemon-reload
systemctl enable --now rustfs
# --------------------------- 7. 防火墙放行 ---------------------------
log "配置防火墙放行端口 9000/9001..."
if command -v ufw > /dev/null && ufw status 2>/dev/null | grep -q "Status: active"; then
ufw allow 9000/tcp
ufw allow 9001/tcp
log "ufw 已放行 9000/9001"
elif command -v firewalld > /dev/null && systemctl is-active firewalld > /dev/null 2>&1; then
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9001/tcp --permanent
firewall-cmd --reload
log "firewalld 已放行 9000/9001"
else
warn "未检测到启用的 ufw/firewalld,请确认云厂商安全组已放行 9000/9001 端口"
fi
# --------------------------- 8. 验证 ---------------------------
sleep 2
log "服务状态:"
systemctl status rustfs --no-pager -l || true
echo ""
echo "=============================================================="
echo " 安装完成!"
echo "=============================================================="
echo " 访问凭证:"
echo " Access Key: $RUSTFS_ACCESS_KEY"
echo " Secret Key: $RUSTFS_SECRET_KEY"
echo ""
echo " 控制台地址: http://<服务器IP>:9001"
echo " S3 端点: http://<服务器IP>:9000"
echo " 虚拟主机: http://桶名.$SERVER_DOMAIN"
echo ""
echo " 日志查看: tail -f /var/logs/rustfs/rustfs*.log"
echo ""
echo " 【重要】请到域名控制台为 inxw.com 添加泛解析:"
echo " 类型 A 主机记录 *.s3 记录值 <服务器公网IP>"
echo "=============================================================="
然后按ESC退出编辑,输入:wq保存退出。然后设置权限。
chmod +x install-rustfs.sh然后执行脚本。
sudo ./install-rustfs.sh到这里,就可以根据提示访问即可。
自行进行反向代理。
3.基本配置
我们一般存储桶都是公共读私有写,但是RustFS只有私有和公共两种选项,因此,需要我们手动配置。点击存储桶的设置,访问策略选择自定义,然后将下方的复制,粘贴,按照你的存储桶名称修改后保存。
{
"ID": "",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetObject"
],
"NotAction": [],
"Resource": [
"arn:aws:s3:::你的存储桶名称/*"
],
"NotResource": [],
"Condition": {}
}
]
}
评论区