Mac Mini打造外网可访问的S3&WebDAV存储

利用域名和闲置的Mac Mini实现云存储

对于研究者而言,拥有一个大容量、高可用且外网可随时访问的数据中转站至关重要。本文将详细介绍如何利用闲置的 Mac mini,通过纯原生方式部署 MinIO(S3 兼容存储)和 Rclone(转换为 WebDAV),并结合 Cloudflare Tunnel 实现免公网 IP 的安全域名访问。整个方案资源占用极低,且能完美绕过 Cloudflare 免费版的单次 100MB 上传限制。


零、 基础环境与网络准备

1. 禁用 Mac mini 休眠

为保证服务器 24 小时在线,需彻底关闭休眠机制:

# 禁用系统休眠
sudo pmset -a disablesleep 1
# 开启断电后自动重启
sudo pmset -a autorestart 1

2. 开启 SSH 访问

进入 系统设置 > 通用 > 共享,打开 远程登录 开关,以便后续无头(Headless)管理。


一、 原生部署 MinIO (S3 兼容存储)

相比 Docker 虚拟机,原生安装能最大化压榨 Mac 的读写性能。

1. 安装与目录准备

# 使用 Homebrew 安装 MinIO 服务端
brew install minio

# 创建数据存储目录与配置目录
mkdir -p ~/S3_Data
mkdir -p ~/.minio_config

2. 配置环境变量

创建一个环境变量文件来存储账号密码和公网域名(假设您之后打算绑定的域名为 s3.yourdomain.com 和 console.yourdomain.com):

cat <<EOF > ~/.minio_config/minio.env
MINIO_ROOT_USER="admin_ai_research"
MINIO_ROOT_PASSWORD="YourStrongPassword123"
MINIO_SERVER_URL="<https://s3.yourdomain.com>"
MINIO_BROWSER_REDIRECT_URL="<https://console.yourdomain.com>"
EOF

⚠️ 注意:MINIO_ROOT_PASSWORD 必须至少 8 位,否则服务无法启动。

3. 配置开机自启 (Launchd)

创建 macOS 原生的 LaunchAgent 服务文件。首先使用 whoami 查看您的系统用户名(例如 rubo)。

新建并编辑配置文件:

nano ~/Library/LaunchAgents/com.user.minio.plist

粘贴以下内容(务必将所有的 rubo 替换为您真实的用户名):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "<http://www.apple.com/DTDs/PropertyList-1.0.dtd>">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.minio</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/bin/minio</string>
        <string>server</string>
        <string>/Users/rubo/S3_Data</string>
        <string>--console-address</string>
        <string>:9001</string>
    </array>
    <key>EnvironmentVariables</key>
    <dict>
        <key>MINIO_CONFIG_ENV_FILE</key>
        <string>/Users/rubo/.minio_config/minio.env</string>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/Users/rubo/.minio_config/minio.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/rubo/.minio_config/minio.err</string>
</dict>
</plist>

保存后,加载并启动服务:

launchctl load ~/Library/LaunchAgents/com.user.minio.plist
launchctl start com.user.minio

此时 MinIO 已经在本地的 9000 (API) 和 9001 (Web 控制台) 端口运行了。


二、 部署 Rclone (将 S3 桥接为 WebDAV)

许多文献管理软件(如 Zotero)只支持 WebDAV,我们可以用 Rclone 在本地将 S3 实时映射为 WebDAV 服务。

1. 安装与配置 Rclone

brew install rclone

运行 rclone config,按以下交互指引配置本地 MinIO 节点:

  • 按 n 新建 remote,命名为 myminio
  • Storage 选 s3
  • Provider 选 Minio
  • env_auth 选 false
  • access_key_id 填您上面设置的 admin_ai_research
  • secret_access_key 填 YourStrongPassword123
  • region 填 us-east-1
  • endpoint 填 http://127.0.0.1:9000 (内网通信,填本地地址)
  • 其余选项一路回车默认,最后按 y 保存并 q 退出。

2. 配置 WebDAV 开机自启

创建日志目录:

mkdir -p ~/.config/rclone/

新建 plist 服务文件:

nano ~/Library/LaunchAgents/com.user.rclone-webdav.plist

粘贴以下内容(注意替换 rubo 为您的用户名,并自定义 WebDAV 的独立账号 davuser 和密码 davpass123):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "<http://www.apple.com/DTDs/PropertyList-1.0.dtd>">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.rclone-webdav</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/bin/rclone</string>
        <string>serve</string>
        <string>webdav</string>
        <string>myminio:</string>
        <string>--addr</string>
        <string>127.0.0.1:8080</string>
        <string>--user</string>
        <string>davuser</string>
        <string>--pass</string>
        <string>davpass123</string>
        <string>--vfs-cache-mode</string>
        <string>writes</string>
        <string>--webdav-disable-propfind-get</string>
        <string>--vfs-cache-max-age</string>
        <string>1h</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/Users/rubo/.config/rclone/webdav.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/rubo/.config/rclone/webdav.err</string>
</dict>
</plist>

加载并启动服务:

launchctl load ~/Library/LaunchAgents/com.user.rclone-webdav.plist
launchctl start com.user.rclone-webdav

现在 WebDAV 运行在本地的 8080 端口。


三、 配置 Cloudflare Tunnel (公网域名访问)

通过零信任隧道,无需公网 IP 即可安全暴露服务。

1. 安装并授权 Tunnel

在 Mac mini 终端安装 cloudflared:

brew install cloudflared

登录 Cloudflare Zero Trust,在 Networks > Tunnels 点击 Create a tunnel。
选择 Cloudflared,选择 Mac 操作系统,复制并执行控制台提供的以 sudo cloudflared service install... 开头的长命令。
随后启动隧道:

sudo launchctl start com.cloudflare.cloudflared

2. 配置路由映射 (Public Hostnames)

在隧道的配置页面,添加以下三条映射记录(注意 Type 全部选 HTTP):

  1. MinIO API (用于代码读写大模型)

    • Subdomain: s3
    • URL: localhost:9000
  2. MinIO Console (用于浏览器管理和分享链接)

    • Subdomain: console
    • URL: localhost:9001
  3. WebDAV (用于 Zotero 或访达挂载)

    • Subdomain: webdav
    • URL: 127.0.0.1:8080 (⚠️ 注意这里填 127.0.0.1 而非 localhost,以避免 502 报错)

💡 关键修复:WebDAV 防 400 报错设置
编辑刚刚建好的 webdav 规则,展开 Additional application settings > HTTP settings,在 HTTP Host Header 中填入 webdav.yourdomain.com,然后保存。这能解决因反向代理导致 Rclone 域名验证失败的问题。


四、 优雅绕过 Cloudflare 的 100MB 上传限制

Cloudflare 免费版限制单次 HTTP 请求不得超过 100MB。突破此限制的核心是强制使用 S3 的分块上传(Multipart Upload)。

1. 在 Python 代码中(boto3)

使用 TransferConfig 封装上传函数:

import boto3
from boto3.s3.transfer import TransferConfig

# 强制 8MB 阈值,16MB 分块并发上传
config = TransferConfig(
    multipart_threshold=8 * 1024 * 1024,
    multipart_chunksize=16 * 1024 * 1024
)

s3 = boto3.client(
    's3',
    endpoint_url='<https://s3.yourdomain.com>',
    aws_access_key_id='admin_ai_research',
    aws_secret_access_key='YourStrongPassword123'
)

# 使用此方法上传数百 GB 的数据集也毫无压力
s3.upload_file('./huge_dataset.zip', 'ai-datasets', 'data.zip', Config=config)

2. 在命令行中(AWS CLI)

在使用 AWS CLI 的机器上执行一次全局配置:

aws configure set default.s3.multipart_threshold 8MB
aws configure set default.s3.multipart_chunksize 16MB

此后所有的 aws s3 cp 都会自动分块绕过限制。

⚠️ 避坑指南:避免在 Web Console (浏览器) 或 WebDAV 挂载端上传大于 100MB 的单体文件,大模型权重和数据集请统一走 S3 API/CLI。

至此,您的 Mac mini 已经成为了一台安全、高效且跨网可达的数据中心。

Loading...
Rubo Wang

Rubo Wang
A website for sharing my study and think.
2023-2026