自架 S3 物件儲存完整教學 2026:MinIO 社群版停止維護後該選誰?Garage、SeaweedFS、RustFS、AIStor Free 完整比較+Docker 實戰、boto3 / rclone / restic 範例

MinIO 社群版(AGPLv3)已在 2025 年底進入維護模式、不再提供預編譯二進位檔,官方要使用者改用商業版 AIStor Free/Enterprise。這篇 2026 完整教學整理五個自架 S3 相容物件儲存的實測比較(MinIO 舊版、AIStor Free、Garage、SeaweedFS、RustFS、Ceph RGW),附上 Garage 單節點 Docker Compose 可直接執行的安裝步驟、boto3 上傳程式碼、rclone 設定、restic 備份指令、成本試算表(自架 vs Cloudflare R2 vs Backblaze B2)與 5 個實戰踩雷。

  • Dennis
  • 9 分鐘閱讀
自架 S3 物件儲存完整教學 2026:MinIO 社群版停止維護後該選誰?Garage、SeaweedFS、RustFS、AIStor Free 完整比較+Docker 實戰、boto3 / rclone / restic 範例

MinIO 社群版(AGPLv3)已進入維護模式、官方不再提供預編譯二進位檔,2026 年自架 S3 相容物件儲存的主流答案變成兩條路:單節點用 MinIO 舊版或 AIStor Free,多節點就用 Garage(最輕量、適合跨機房)或 SeaweedFS(Apache-2.0、海量小檔首選)。

如果你只是想要一個「自己的 S3」,現在比以前更需要想清楚選型——因為預設選項(MinIO 社群版)已經停止維護,而它的替代品不像以前那樣可以無腦沿用同一套 Docker 指令。這篇把五個選項攤開比較,並且給你可以直接複製執行的 Garage 單節點實戰步驟。

一句話結論

單節點、能接受專有授權 → AIStor Free 或 MinIO 舊版映像;要多節點、要輕量、要跨機房 → Garage;海量小檔案或要 Iceberg/POSIX 掛載 → SeaweedFS;已有一整套 Ceph → Ceph RGW;不想維運 → 直接用 Cloudflare R2 或 Backblaze B2。

2026 年到底發生了什麼?MinIO 停止維護時間線

時間事件對你的影響
2025-10-15最後一個社群版二進位 Release:RELEASE.2025-10-15T17-29-55Z這是「最後一個官方編譯檔」,之後不再更新
2025-12-03官方在 README 標記進入維護模式(maintenance mode),開發重心轉向商業產品 AIStor功能差距開始擴大
2026-01 ~ 02README 正式改為「THIS REPOSITORY IS NO LONGER MAINTAINED」,並列出 AIStor Free/Enterprise 為替代方案新專案不該再以社群版為預設
目前社群版改為 source-only 發佈:只能用 go install 或自行 build Docker image,官方不再提供預編譯二進位檔你現有的 quay.io/minio/minio 映像還能跑,但不會再有安全性修補

官方 README 的原文寫得很直接:這個 repo 不再維護,請改用 AIStor Free(免費授權、單節點)或 AIStor Enterprise(分散式+商業支援)。於是問題變成:AIStor Free 的限制你能接受嗎?

AIStor Free 的免費授權,限制在哪裡

依 MinIO 官方文件與 AIStor Free 授權條款(2026 年最新版):

  • 允許商業生產環境使用,也可以用在個人專案、Homelab、研究與教育
  • 僅限 standalone 單節點,不能組分散式叢集、沒有 HA
  • ❌ 沒有 Site/Bucket 複製、沒有物件分層(tiering)與生命週期轉移、沒有特定版本刪除
  • ❌ 沒有 profiling/診斷、效能測試工具、telemetry 與 console log、mc support 相關指令
  • ⚠️ 授權到期機制:授權過期 30 天內是寬限期;過期 30~90 天轉唯讀(阻擋新寫入);超過 90 天進入離線模式,所有 S3 操作被封鎖(只剩管理 API 讓你更新授權)

最後那一點是自架最常被忽略的營運風險:它不是「不能更新」,而是「有一天會變成唯讀,然後連讀都讀不到」。如果你要把它當長期歸檔的儲存層,務必把授權更新排進維運排程。至於多節點的 AIStor Enterprise,社群引述的公開入門門檻大約是每年 US$96,000 起(實際報價需洽 MinIO),對中小團隊與獨立開發者並不友善。

五大自架選項完整比較

方案授權最新狀態資源需求冗餘機制最適合
MinIO 社群版(legacy)AGPLv3維護模式,source-only,最後 binary 2025-10-15單節點 1 CPU/1GB RAM 起Erasure Coding現有部署過渡期、單節點小規模
MinIO AIStor Free專有免費授權持續更新(需註冊取得授權)單節點無(單節點磁碟)單節點生產環境、要官方維護版本
GarageAGPLv3(Rust)活躍開發,官方 Docker 映像 dxflrs/garage:v2.3.0極輕量:怠速記憶體約 20 MiB多副本(replication factor,建議 3)跨機房異地備份、VPS 小叢集(≤ 100 節點)
SeaweedFSApache-2.0(Go)活躍,最新版 4.47(2026-09-14)Master/Volume/Filer 分離,核心需求低副本;企業版支援自訂 EC海量小檔案、POSIX 掛載、Iceberg 資料湖
RustFSApache-2.0(Rust)活躍,GitHub 約 3.2 萬星新專案,迭代中副本想避開 AGPL 的 MinIO 替代實驗
Ceph RGWLGPL成熟穩定極高:MON 5GB+ RAM、每顆 OSD 4GB 起、RGW 建議 6-8 核心/32-64GB RAMCRUSH+副本/EC已有 Ceph 基礎設施的大型機房

社群目前的推薦排序大致是:SeaweedFS(Apache-2.0、小檔 O(1) 讀取)→ Garage(最輕量、跨機房最強)→ RustFS(新星)→ Ceph RGW(企業基石但維運極重)。而 MinIO 的社群分支(例如保留傳統 Web UI 的社群維護版本)仍然受 AGPLv3 約束,選擇前要先確認你的法務立場。

flowchart TB
    Q1{"需要多節點<br/>或 HA 嗎?"}
    Q1 -->|不需要| A["單節點路線<br/>MinIO 舊版映像<br/>或 AIStor Free"]
    Q1 -->|需要| Q2{"主要瓶頸是?"}
    Q2 -->|跨機房、機器很弱| B["Garage<br/>單一二進位、20MiB 記憶體"]
    Q2 -->|海量小檔案/POSIX/Iceberg| C["SeaweedFS<br/>Apache-2.0、O(1) 尋址"]
    Q2 -->|已有 Ceph 團隊與機房| D["Ceph RGW"]
    Q2 -->|不想維運| E["Cloudflare R2 / Backblaze B2<br/>SaaS、egress 成本低"]

實戰:Garage 單節點 Docker 部署(可直接複製)

Garage 是這一輪選型裡「手感最像舊 MinIO」的選項:單一 Rust 二進位、Docker 映像官方就有,v2.3.0 起更加了 --single-node--default-bucket 兩個旗標,可以用一行指令就把單節點叢集與預設金鑰、預設 bucket 建好。

步驟 1:建立設定檔 garage.toml

metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"
replication_factor = 1

rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "請用 openssl rand -hex 32 產生"

[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage.localhost"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.garage.localhost"
index = "index.html"

[admin]
api_bind_addr = "[::]:3903"
admin_token = "請用 openssl rand -base64 32 產生"
metrics_token = "請用 openssl rand -base64 32 產生"

產生密鑰:

echo "rpc_secret: $(openssl rand -hex 32)"
echo "admin_token: $(openssl rand -base64 32)"
echo "metrics_token: $(openssl rand -base64 32)"
echo "GK$(openssl rand -hex 16)   # 這是你的 S3 Access Key ID"

步驟 2:Docker Compose(含資料持久化)

services:
  garage:
    image: dxflrs/garage:v2.3.0
    container_name: garage
    restart: unless-stopped
    ports:
      - "3900:3900"   # S3 API
      - "3901:3901"   # 節點間 RPC
      - "3902:3902"   # 靜態網站託管
      - "3903:3903"   # Admin API / metrics
    environment:
      GARAGE_DEFAULT_ACCESS_KEY: "GKGKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      GARAGE_DEFAULT_SECRET_KEY: "請用 openssl rand -hex 32 產生"
      GARAGE_DEFAULT_BUCKET: "default-bucket"
    volumes:
      - ./garage.toml:/etc/garage.toml:ro
      - ./meta:/var/lib/garage/meta
      - ./data:/var/lib/garage/data
    command: ["/garage", "server", "--single-node", "--default-bucket"]
mkdir -p ~/garage/{meta,data} && cd ~/garage
# 把上面兩個檔案寫進來後:
docker compose up -d
docker exec garage /garage status

garage status 應該看到類似輸出(HEALTHY NODES、狀態為 v2.3.0)。注意:官方 quick start 的 docker 範例沒有掛 volume,容器一刪資料就沒了;上面這份 compose 已經補上持久化。

步驟 3:驗證 S3 API(aws cli)

export AWS_ENDPOINT_URL='http://localhost:3900'
export AWS_DEFAULT_REGION='garage'
export AWS_ACCESS_KEY_ID='你的 Access Key'
export AWS_SECRET_ACCESS_KEY='你的 Secret Key'

aws s3 ls
aws s3 cp ./logo.png s3://default-bucket/logo.png
aws s3 ls s3://default-bucket/

步驟 4:Python boto3 上傳(可直接執行)

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="http://localhost:3900",   # 自架 S3 一定要指定
    aws_access_key_id="你的 Access Key",
    aws_secret_access_key="你的 Secret Key",
    region_name="garage",
)

print(s3.list_buckets()["Buckets"])

s3.upload_file("logo.png", "default-bucket", "logo.png")
for obj in s3.list_objects_v2(Bucket="default-bucket").get("Contents", []):
    print(obj["Key"], obj["Size"])

步驟 5:rclone 與 restic 接上(備份最實用)

rclone(~/.config/rclone/rclone.conf):

[garage]
type = s3
provider = Other
access_key_id = 你的 Access Key
secret_access_key = 你的 Secret Key
endpoint = http://localhost:3900
region = garage
rclone lsd garage:
rclone sync /var/backups garage:default-bucket/backups --progress

restic 直接備份到自架 S3:

export AWS_ACCESS_KEY_ID='你的 Access Key'
export AWS_SECRET_ACCESS_KEY='你的 Secret Key'
export AWS_DEFAULT_REGION='garage'

restic -r s3:http://localhost:3900/default-bucket/restic init
restic -r s3:http://localhost:3900/default-bucket/restic backup /etc /opt/app
restic -r s3:http://localhost:3900/default-bucket/restic snapshots

這套組合(Garage+restic)是家用/小型 VPS 目前很常見的備份目標方案:備份放自己的機器、又是 S3 協定,隨時可以搬到雲端。

成本試算:自架 vs 雲端 S3(以 1 TB 為例)

方案月費概估出站流量備註
Cloudflare R2(Standard)US$15.36(1024 GB × $0.015)免費(不計 egress 費)免費額度 10 GB;Class A $4.50/百萬次、Class B $0.36/百萬次
Backblaze B2US$6.14(1024 GB × $0.006)每月前 3 倍儲存量免費,超出 $0.01/GB免費額度 10 GB
自架 Garage(單 VPS)約一台 VPS 費用(US$5~15 起)+你的人力看 VPS 流量方案資料完全自持;要自己做備份、監控與升級
MinIO AIStor Enterprise入門約 US$96,000/年 起(社群引述,需洽業務)多節點+商業支援,中小團隊通常不適用

結論其實很樸素:若你只是想放 100 GB~1 TB 的備份、而且流量不小,R2 的免 egress 費用常常比自架更划算;自架的價值在「資料主權」與可搬遷性。 但如果你已經有一台 Proxmox 主機(Proxmox VE 9 完整教學),多跑一個 Garage 容器幾乎沒有額外成本,這就是自架的甜蜜點。

5 個實戰踩雷

  1. Presigned URL 一掛反向代理就爛掉。 自架 S3 前面加 Caddy/Nginx 時,若沒正確轉發 Host 標頭、region 對不上,AWS SDK 簽出來的 URL 會回 SignatureDoesNotMatchInvalidAccessKeyId。解法:反向代理保留原始 Host,或改用與外部網址一致的 endpoint 設定。
  2. S3 的 key 命名跟 POSIX 檔案系統衝突。 S3 允許 foofoo/bar 同時存在,但掛載成檔案系統(s3fs、goofys)時 foo 不能同時是檔案又是目錄,會出現映射錯誤。
  3. Multipart ETag 的 -N 後綴。 分片上傳的 ETag 長得像 d41d8cd...-3,部分簡化實作的 S3 gateway 校驗不完整,會讓 rclone/s3cmd 的分片校驗失敗——遇到就先降到單次上傳測試。
  4. Garage 沒有 Erasure Coding、也少了 Raft。 它靠多副本與 CRDT 做跨機房同步(replication_factor = 3 時,寫入 quorum 2、讀取 quorum 2),硬碟成本比 EC 高;大檔高併發寫入時要留意 last-writer-wins 的覆蓋行為。
  5. MinIO 家族要看清授權與到期日。 社群版是 AGPLv3(商用前請評估 AGPL 的網路傳播條款風險),AIStor Free 是專有免費授權且單節點限定+授權過期會轉唯讀/離線。這兩件事都應該寫進你的維運手冊。

一句話總結

MinIO 世代結束不是災難,而是選型題回到你手上:單節點 MinIO 舊版/AIStor Free 能撐過渡期,多節點交給 Garage 與 SeaweedFS,整合層只要 S3 API 相容,boto3、rclone、restic 這類工具幾乎都能無痛搬家。先確認你的「節點數、檔案大小分布、備份目標」三個條件,答案就會自己浮出來。

延伸閱讀

原始來源

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友