skip to content
Logo 三七の小站

通过 rclone 将 R2 挂载到 Memos 容器完整配置指南

/ 5 min read

0. 为什么不直接使用 Memos 内置的 S3 存储?

Memos 内置的 S3存储 通过 Presigned URLs 生成资源链接,这种方式有很多好处,但是最大的问题是访问资源(Memos 上的图片)的时候,没办法通过 CDN 缓存。可能有恶意刷 B类 操作的风险。

rclone 是一个可以将网盘、对象存储等 挂载到本地文件系统的工具

  1. 通过 rclone 将 Cloudflare R2 挂载到本地 Memos 容器上
  2. 将 Memo 设置为 本地文件系统 ,实际上还是将资源存到 R2 上
  3. rclone 可以设置缓存,不会频繁访问 R2

这样设置之后,可能是目前最完美的方案,相当于使用我们的服务器,为 R2 套了一层 CDN,且不用将 R2 公开,只有我们的服务器可以访问 R2。

Memos 内置 S3R2 + Rclone 挂载
资源访问方式Presigned URL(5天刷新动态链接)静态文件路径(通过本地挂载映射)
CDN 兼容性❌ 无法缓存(每次直接请求 R2)✅ 完美支持(固定路径可被 CDN 缓存)
存储桶安全性✅ 存储桶不需公开访问权限✅ 存储桶完全私有(仅服务器可访问)
防恶意刷流量❌ 高风险(Presigned URL 无法套CDN)✅ 高防御(CDN + Rclone 缓存双重防护)
R2 API 请求量⚠️ 高(每次资源访问都调用 API)✅ 低(rclone 缓存减少 API 调用)
架构复杂度✅ 简单(原生集成)⚠️ 需配置 rclone 挂载

1. 准备工作

1.1 安装 FUSE 支持

Terminal window
sudo apt-get update
sudo apt-get -y install fuse3

1.2 创建必要目录

Terminal window
sudo mkdir -p /var/lib/docker-plugins/rclone/config
sudo mkdir -p /var/lib/docker-plugins/rclone/cache

1.3 安装 rclone 管理插件

安装 rclone Docker 插件

Terminal window
docker plugin install rclone/docker-volume-rclone:amd64 \
--alias rclone \
--grant-all-permissions \
args="-v --allow-other"

验证安装

Terminal window
docker plugin list

2. 配置 Cloudflare R2

2.1 创建 rclone 配置文件

创建配置文件(路径不可改):

Terminal window
sudo nano /var/lib/docker-plugins/rclone/config/rclone.conf

添加以下内容(替换实际的 R2 凭据):

[r2]
type = s3
provider = Cloudflare
access_key_id = YOUR_R2_ACCESS_KEY
secret_access_key = YOUR_R2_SECRET_KEY
region = auto
endpoint = https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com
acl = private

2.2 设置文件权限

Terminal window
sudo chmod 600 /var/lib/docker-plugins/rclone/config/rclone.conf

3. 更新 Docker Compose 配置

3.1 修改 docker-compose.yml

version: '3.8'
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: unless-stopped
ports:
- "5230:5230"
volumes:
- ./.memos:/var/opt/memos
- memos-assets:/var/opt/memos/assets
depends_on:
- volume-check
healthcheck:
test: ["CMD", "ls", "/var/opt/memos/assets"]
interval: 30s
timeout: 10s
retries: 3
start_period: 15s
# 用于确保卷正确挂载的检查服务
volume-check:
image: busybox
command: |
sh -c "
echo 'Checking rclone mount...'
ls -la /mnt/assets || exit 1
echo 'Mount check passed'
"
volumes:
- memos-assets:/mnt/assets
restart: "no"
volumes:
memos-assets:
driver: rclone
driver_opts:
remote: 'r2:memos/assets'
allow_other: 'true'
vfs_cache_mode: 'full'
vfs_cache_max_age: '24h'
vfs_cache_max_size: '1G'
poll_interval: 0

3.2 高级配置选项说明

  • vfs-cache-mode=full: 启用完整的 VFS 缓存,提高读写性能
  • vfs-cache-max-age=24h: 缓存文件最大保存时间
  • vfs-cache-max-size=1G: 缓存最大大小
  • poll_interval=0: 检查远程更改的间隔,设置为0表示不检查,减少A类操作次数
  • allow-other=true: 允许其他用户访问挂载点

4. 迁移(可选)

如果已经部署了 Memos ,且资源存在 本地文件系统,可以将资源从本地迁移到 R2

Terminal window
apt install rclone
cp /var/lib/docker-plugins/rclone/config/rclone.conf /root/.config/rclone/rclone.conf
rclone copy /path_to_your_docker/.memos/assets/ r2:memos/assets/

5. 启动服务

5.1 启动容器组

Terminal window
# 确保在 docker-compose.yml 目录中
docker-compose up -d

5.2 检查服务状态

Terminal window
# 查看服务状态
docker-compose ps
# 查看卷挂载状态
docker volume ls
# 检查 memos 容器中的挂载
docker exec memos ls -la /var/opt/memos/assets

6. 验证和测试

6.1 测试挂载功能

Terminal window
# 在容器中创建测试文件
docker exec memos touch /var/opt/memos/assets/test.txt
# 检查文件是否存在于 R2 存储桶中 ( 网页上看看 )
docker exec memos ls -la /var/opt/memos/assets/

6.2 监控日志

Terminal window
# 查看 memos 容器日志
docker-compose logs -f memos
# 查看 rclone 插件日志
sudo journalctl -u docker -f | grep rclone

7. 备份和维护

7.1 定期备份配置

Terminal window
# 备份 rclone 配置
sudo cp /var/lib/docker-plugins/rclone/config/rclone.conf /backup/rclone.conf.backup
# 备份 docker-compose 配置
cp docker-compose.yml docker-compose.yml.backup

7.2 更新插件

Terminal window
# 停止相关服务
docker-compose down
# 更新插件
docker plugin rm rclone
docker plugin install rclone/docker-volume-rclone:amd64 --alias rclone --grant-all-permissions args="-v --allow-other"
# 重新启动服务
docker-compose up -d