侧边栏壁纸
  • 累计撰写 58 篇文章
  • 累计创建 14 个标签
  • 累计收到 14 条评论

目 录CONTENT

文章目录

Ubuntu安装RustFS

Ywxmz
2026-10-06 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

一、前言:什么是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": {}
    }
  ]
}

0

评论区