正在加载…

Post cover image

用 Silo 把电视盒子变成自己的 S3 存储

2026年9月18日 • 分享

1.5k 字-

一直想弄个自己的类 S3 文件存储,最近 RustFS 正式版上线,pigsty 创始人维护的 MinIO 分支 Silo 也正式发布了文档,正好我搞链上小草项目时买了好几个电视盒子闲置,配置是 CM311-1a(S905L3a,2GB RAM,16GB eMMC),干脆拿一个来试试。七牛的免费空间只有 10G,折腾一下我又可以多10G存储空间了。对比之后选了 Silo,装好使用下来非常顺滑。

为什么选 Silo

选型时在 RustFS 和 Silo 之间纠结了一下:

对比项SiloRustFS
文件系统要求任意目录即可,非强制 XFS强烈推荐 XFS,要求独立分区
单盘部署支持,灵活支持,但要求专用磁盘
Docker 部署镜像成熟,多架构支持可用

我的盒子是 eMMC 存储,再分区太折腾了,Silo 随便指个空目录就能跑。另外 Silo 是 MinIO 的分支,S3 接口兼容,mc、各语言 SDK 这些客户端拿来就能用,生态这块不用操心。

部署方式选了 Docker:就一个服务,管理简单;2GB 内存下 Docker 额外开销(约 110MB)完全可以接受;后面升级、回滚也方便。

环境准备

  • 硬件:CM311-1a(S905L3a,2GB RAM,16GB eMMC)
  • 系统:Armbian 6.1.96-ophub
  • 网络:公网服务器 + FRP + Caddy 反向代理

先看看 eMMC 的健康状态,顺便确认一下架构和内存:

bash
sudo apt install mmc-utils -y
sudo mmc extcsd read /dev/mmcblk0 | grep -E "DEVICE_LIFE_TIME|PRE_EOL_INFO"

uname -m    # 应为 aarch64
free -h

PRE_EOL_INFO0x01 就说明磨损还正常,我这台显示寿命消耗才 0-10%,放心折腾。

时区和时间同步也顺手设置一下,对象存储对时间比较敏感:

bash
sudo timedatectl set-timezone Asia/Shanghai
sudo timedatectl set-ntp true
timedatectl

确认 System clock synchronized: yesNTP service: active 就 OK。

安装 Docker

bash
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable --now docker

eMMC 经不起无限制的日志写入,顺手把 Docker 日志轮转配上:

bash
sudo tee /etc/docker/daemon.json <<EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
EOF
sudo systemctl restart docker

部署 Silo

拉取镜像,版本号到 Silo Releases 取最新的:

bash
docker pull pgsty/silo:RELEASE.2026-09-16T00-00-00Z

创建数据目录,Silo 任意空目录都能用:

bash
mkdir -p ~/silo/data
sudo chown -R 1001:1001 ~/silo/data   # 容器以非 root 用户运行,需要设置权限

启动容器:

bash
docker run -d --name silo --restart unless-stopped \
  -p 9000:9000 \
  -p 9001:9001 \
  -v ~/silo/data:/data \
  -e "MINIO_UPDATE=off" \
  -e "MINIO_ROOT_USER=你的用户名" \
  -e "MINIO_ROOT_PASSWORD=你的强密码" \
  docker.io/pgsty/silo:RELEASE.2026-09-16T00-00-00Z \
  server /data --console-address ":9001"

几个关键参数:

参数作用
--restart unless-stopped开机自启
-p 9000:9000S3 API 端口
-p 9001:9001Web 控制台端口
-v ~/silo/data:/data数据持久化
MINIO_ROOT_PASSWORD至少 8 字符,否则启动失败

验证一下:

bash
docker ps
docker logs silo
docker stats silo --no-stream
free -h

正常日志长这样:

Silo Object Storage Server
Version: RELEASE.2026-09-16T00-00-00Z (go1.27.1 linux/arm64)
API: http://127.0.0.1:9000
WebUI: http://127.0.0.1:9001

实测内存占用约 136MB,2GB 的盒子跑起来毫无压力。

FRP + Caddy 对外暴露

盒子在内网,走 FRP 转发到公网服务器,再用 Caddy 套上 HTTPS。

内网盒子的 frpc.toml 里新增:

toml
[[proxies]]
name = "silo-s3"
type = "http"
localPort = 9000
subdomain = "s3"   # 最终访问 s3.xxx.com

subdomainHost = "xxx.com" 已在 frps 中配置,frpc 这边只需指定子域名前缀。

公网服务器的 Caddyfile 里,给 S3 单独写一个站点块,不要复用通配符块

caddy
s3.xxx.com {
    # 强制 HTTPS
    @http protocol http
    redir @http https://{host}{uri} permanent

    reverse_proxy 127.0.0.1:9090 {
        header_up Host {host}
        header_up X-Forwarded-Host {host}
        flush_interval -1
        transport http {
            read_timeout 300s
            write_timeout 300s
        }
    }
}

改完 sudo systemctl reload caddy 重载。

为什么要单独写块:

  • 通配符块里的 WAF 可能改写请求头,导致 S3 签名校验失败(SignatureDoesNotMatch
  • S3 大文件上传需要关闭缓冲(flush_interval -1)、加大超时
  • Caddy 主机名匹配规则是具体域名优先于通配符,单独写块不会影响其他子域名

最后确认 *.xxx.com 的泛解析指向公网服务器 IP 就通了。

只读权限设置

建桶之后想给应用只读访问,用 mc 客户端最方便:

bash
# 下载 mc(ARM64)
wget https://dl.min.io/client/mc/release/linux-arm64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# 添加别名
mc alias set my-silo http://localhost:9000 YOUR_ACCESS_KEY YOUR_SECRET_KEY

# 设置只读(允许下载,不允许上传/删除)
mc anonymous set download my-silo/你的桶名

如果还想更严格一点——只允许下载、连列目录都不行,就写个自定义策略:

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowReadOnlyAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": ["s3:GetObject"],
      "Resource": ["arn:aws:s3:::你的桶名/*"]
    }
  ]
}
bash
mc anonymous set-json my-silo/你的桶名 readonly-policy.json

策略里只有 s3:GetObject,没有 s3:ListBucket,用户无法列出桶内文件,只能通过确切 URL 访问,适合做静态资源托管。

日常维护

bash
# 看日志
docker logs silo --tail 100

# 看资源占用
free -h
docker stats silo --no-stream

# 备份(eMMC 单盘无冗余,重要数据定期同步出去)
mc mirror my-silo/你的桶名 /backup/local-dir

# 升级
docker pull pgsty/silo:新版本号
docker stop silo && docker rm silo
# 用新版本号重新执行 docker run 即可

总结

折腾下来几个结论:

  1. CM311-1a(2GB)跑 Silo 完全够用,实测内存占用约 136MB。
  2. eMMC 部署无需额外分区,Silo 支持任意空目录,这是它相对 RustFS 最大的优势。
  3. FRP 子域名 + Caddy 单独站点块是内网盒子对外暴露 S3 的最佳组合,记得绕开 WAF。
  4. 只读权限用 mc anonymous set download 或者自定义 JSON 策略,按场景选。

当然也有局限:公网服务器就一根 5M 小水管,传个小文件没问题,大文件就别想了。不过平时作为应用程序的 S3 存储,这点带宽完全够用了,又多了10G免费存储。

用 Silo 把电视盒子变成自己的 S3 存储
在转载或引用本文时,请务必遵守许可协议并注明来源
远山's Avatar

远山

那远山呼唤我,曾千百次走过。

云存储提供商
热门标签
S3
Silo
MinIO
Docker
电视盒子
AI
Skills
Stitch
Google AI Studio
Trae IDE
claude code
cc-switch
nvidia api
openrouter
ai
coding plan
WiFi6
E2633
Mesh
caddy
acme
群辉
RSA
非对称加密
AES
对称加密
Umami
数据分析
云存储
CDN
七牛云
EdgeOne
本地服务器
Artalk
图床
upgit
静态博客
Valaxy