Nextcloud 私有云部署教程 / 05 - 存储方案
05 - 存储方案
掌握 Nextcloud 的多种存储后端:本地存储、S3 对象存储、外部存储挂载,以及加密与配额管理。
5.1 存储架构概述
┌─────────────────────────────────────────────────────────┐
│ Nextcloud 存储架构 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 用户 A │ │ 用户 B │ │ 用户 C │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └─────────────┼─────────────┘ │
│ │ │
│ ┌────────┴────────┐ │
│ │ 文件缓存层 │ │
│ │ (filecache) │ │
│ └────────┬────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ 存储后端 (Storage) │ │
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌────┐ │ │
│ │ │ 本地 │ │ S3 │ │ FTP │ │SMB │ │ │
│ │ │ 存储 │ │ 对象 │ │ │ │ │ │ │
│ │ └──────┘ └──────┘ └──────┘ └────┘ │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
5.2 本地存储
默认数据目录
// config/config.php
'datadirectory' => '/var/www/nextcloud/data',
更改数据目录
# 1. 开启维护模式
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --on
# 2. 移动数据目录
sudo mv /var/www/nextcloud/data /data/nextcloud-data
# 3. 修改 config.php
sudo -u www-data php /var/www/nextcloud/occ config:system:set datadirectory --value="/data/nextcloud-data"
# 4. 确保权限正确
sudo chown -R www-data:www-data /data/nextcloud-data
sudo chmod 750 /data/nextcloud-data
# 5. 关闭维护模式
sudo -u www-data php /var/www/nextcloud/occ maintenance:mode --off
目录结构
data/
├── admin/ # 管理员用户目录
│ ├── files/ # 用户文件
│ ├── cache/ # 文件缓存
│ └── uploads/ # 临时上传
├── appdata_xxx/ # 应用数据(预览图等)
├── files_external/ # 外部存储缓存
└── .htaccess # Apache 访问控制
磁盘类型建议
| 磁盘类型 | 适用场景 | IOPS | 成本 |
|---|---|---|---|
| HDD (SATA) | 冷数据存储、大文件 | 100-200 | 低 |
| SSD (SATA) | 普通文件存储 | 5,000-50,000 | 中 |
| NVMe SSD | 高频读写、元数据 | 100,000+ | 高 |
| NFS | 多节点共享存储 | 取决于网络 | 中 |
| CephFS | 分布式文件系统 | 取决于集群 | 高 |
5.3 S3 对象存储
适用场景
| 场景 | 说明 |
|---|---|
| 海量文件存储 | PB 级数据,本地磁盘无法满足 |
| 多数据中心 | 跨地域冗余 |
| 成本优化 | 冷热数据分层 |
| 高可用 | S3 天然支持多副本 |
使用主存储(Primary Object Storage)
将 S3 作为 Nextcloud 的主存储后端,所有用户文件存储在 S3 中。
// config/config.php
'objectstore' => array(
'class' => '\\OC\\Files\\ObjectStore\\S3',
'arguments' => array(
'bucket' => 'nextcloud-bucket',
'autocreate' => true,
'key' => 'YOUR-ACCESS-KEY',
'secret' => 'YOUR-SECRET-KEY',
'region' => 'us-east-1',
'hostname' => 's3.amazonaws.com',
'port' => 443,
'use_ssl' => true,
'use_path_style' => false,
'proxy' => false,
'timeout' => 15,
'uploadPartSize' => 524288000, // 500MB 分片大小
),
),
使用 MinIO 自建 S3
# 启动 MinIO
docker run -d \
--name minio \
-p 9000:9000 \
-p 9001:9001 \
-v /data/minio:/data \
-e "MINIO_ROOT_USER=minioadmin" \
-e "MINIO_ROOT_PASSWORD=minioadmin" \
minio/minio server /data --console-address ":9001"
# 创建 bucket
mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/nextcloud-bucket
mc admin user add local nextcloud-user nextcloud-password
mc admin policy set local readwrite user=nextcloud-user
MinIO 配置:
'objectstore' => array(
'class' => '\\OC\\Files\\ObjectStore\\S3',
'arguments' => array(
'bucket' => 'nextcloud-bucket',
'autocreate' => false,
'key' => 'nextcloud-user',
'secret' => 'nextcloud-password',
'region' => '',
'hostname' => 'minio.example.com',
'port' => 9000,
'use_ssl' => true,
'use_path_style' => true, // MinIO 需要路径风格
),
),
S3 作为外部存储
如果不想将 S3 作为主存储,也可以挂载为外部存储:
- 安装 External Storage 应用
- 管理后台 → 设置 → 管理 → 外部存储
- 添加 “Amazon S3” 类型
# 或通过命令行添加
sudo -u www-data php /var/www/nextcloud/occ files_external:create \
"S3存储" \
amazons3 \
amazons3::accesskey \
-c bucket=nextcloud-bucket \
-c key=YOUR-KEY \
-c secret=YOUR-SECRET \
-c hostname=s3.amazonaws.com \
-c use_ssl=true
5.4 外部存储挂载
支持的存储类型
| 类型 | 协议 | 应用名称 | 说明 |
|---|---|---|---|
| 本地 | — | files_external | 挂载本地目录 |
| FTP | FTP/FTPS | files_external | FTP 服务器 |
| SFTP | SSH | files_external | SSH 文件传输 |
| SMB/CIFS | SMB | files_external | Windows 共享 |
| WebDAV | HTTP | files_external | WebDAV 服务器 |
| Amazon S3 | S3 API | files_external | S3 兼容存储 |
| Dropbox | API | files_external | Dropbox |
| Google Drive | API | files_external | Google 云盘 |
| OneDrive | API | files_external | Microsoft OneDrive |
| OpenStack Swift | Swift API | files_external | Swift 对象存储 |
安装外部存储应用
sudo -u www-data php /var/www/nextcloud/occ app:enable files_external
挂载本地目录
# 创建挂载目录
sudo mkdir -p /mnt/shared
sudo chown www-data:www-data /mnt/shared
# 通过命令行添加
sudo -u www-data php /var/www/nextcloud/occ files_external:create \
"共享文件夹" \
local \
null::null \
-c datadir=/mnt/shared
# 设置挂载 ID 为全局可见
sudo -u www-data php /var/www/nextcloud/occ files_external:option <mount_id> enable_sharing true
挂载 SMB/CIFS
# 安装 SMB 客户端库
sudo apt install -y php8.2-smbclient libsmbclient-dev
# 添加 SMB 挂载
sudo -u www-data php /var/www/nextcloud/occ files_external:create \
"公司文件服务器" \
smb \
password::password \
-c host=fileserver.local \
-c share=shared \
-c domain=WORKGROUP \
-c username=ncuser \
-c password=SmbPassword
挂载 SFTP
sudo -u www-data php /var/www/nextcloud/occ files_external:create \
"远程备份" \
sftp \
password::password \
-c host=sftp.example.com \
-c root=/upload \
-c username=ncuser \
-c password=SftpPassword \
-c port=22
5.5 文件加密
服务端加密
服务端加密(Server-Side Encryption)在文件写入存储后端之前加密,读取时解密。
# 启用默认加密模块
sudo -u www-data php /var/www/nextcloud/occ app:enable encryption
sudo -u www-data php /var/www/nextcloud/occ encryption:enable
// config/config.php(加密相关参数)
'encryption.legacy_format_support' => false,
'encryption.key_storage_migrated' => false,
加密工作原理:
┌─────────┐ 明文文件 ┌──────────┐ 加密文件 ┌─────────┐
│ 用户 │ ──────────→ │ Nextcloud │ ──────────→ │ 存储 │
│ │ ←────────── │ 加密层 │ ←────────── │ 后端 │
└─────────┘ 明文文件 └──────────┘ 加密文件 └─────────┘
加密密钥层次:
├── 主密钥 (Master Key) ← 管理员持有,恢复用
│ └── 用户密钥 (User Key) ← 每个用户独立
│ └── 文件密钥 (File Key) ← 每个文件独立
端到端加密 (E2EE)
端到端加密确保服务器管理员也无法查看文件内容。
# 安装 E2EE 应用
sudo -u www-data php /var/www/nextcloud/occ app:enable end_to_end_encryption
使用方式:
- 桌面/移动客户端中启用 E2EE
- 创建加密文件夹
- 设置恢复密钥(重要!丢失后无法恢复)
注意: E2EE 文件夹不支持在线预览、全文搜索和 WebDAV 直接访问。
加密方案对比
| 特性 | 服务端加密 | 端到端加密 (E2EE) |
|---|---|---|
| 加密位置 | 服务端 | 客户端 |
| 管理员可读 | ✅ 是 | ❌ 否 |
| 在线预览 | ✅ 支持 | ❌ 不支持 |
| 全文搜索 | ✅ 支持 | ❌ 不支持 |
| WebDAV | ✅ 支持 | ⚠️ 受限 |
| 适用场景 | 保护存储后端 | 敏感数据保护 |
5.6 存储配额管理
设置默认配额
# 设置默认配额(新用户)
sudo -u www-data php /var/www/nextcloud/occ config:system:set default_quota --value="10GB"
可选值:1GB, 5GB, 10GB, unlimited 等。
设置单个用户配额
# 设置特定用户配额
sudo -u www-data php /var/www/nextcloud/occ user:setting admin files quota 50GB
# 查看用户当前配额
sudo -u www-data php /var/www/nextcloud/occ user:setting admin files quota
# 设置无限配额
sudo -u www-data php /var/www/nextcloud/occ user:setting admin files quota unlimited
查看存储使用情况
# 查看所有用户存储使用量
sudo -u www-data php /var/www/nextcloud/occ user:report
# 输出示例:
# - user_accounts: 25
# - user_total_space: 268435456000
# - user_space_used: 53687091200
配额管理脚本
#!/bin/bash
# 配额告警脚本
THRESHOLD=80 # 使用率告警阈值
sudo -u www-data php /var/www/nextcloud/occ user:report | while read line; do
# 解析用户配额使用率并告警
echo "$line"
done
5.7 存储性能优化
文件扫描
# 扫描所有用户的文件
sudo -u www-data php /var/www/nextcloud/occ files:scan --all
# 扫描特定用户
sudo -u www-data php /var/www/nextcloud/occ files:scan username
# 扫描特定路径
sudo -u www-data php /var/www/nextcloud/occ files:scan --path="/username/files/Documents"
# 并行扫描(大部署)
sudo -u www-data php /var/www/nextcloud/occ files:scan --all --sharable --home-only
预览图生成优化
# 预生成预览图(可加入 cron)
sudo -u www-data php /var/www/nextcloud/occ preview:generate-all
# 修复预览图
sudo -u www-data php /var/www/nextcloud/occ preview:repair
// config/config.php - 预览配置
'preview_max_x' => 1024,
'preview_max_y' => 1024,
'preview_max_scale_factor' => 1,
'preview_lib' => 'Imagick', // 或 GD
'enabledPreviewProviders' => array(
'OC\\Preview\\Image',
'OC\\Preview\\MP3',
'OC\\Preview\\TXT',
'OC\\Preview\\MarkDown',
'OC\\Preview\\OpenDocument',
'OC\\Preview\\PDF',
'OC\\Preview\\Movie', // 需要 ffmpeg
),
5.8 注意事项
- data 目录权限: 确保
data/目录对 Web 服务器用户可写,但 Web 服务器不能直接访问 - S3 兼容性: 不是所有 S3 兼容存储都完全兼容,MinIO 和 AWS S3 测试最充分
- 加密性能: 服务端加密会增加 CPU 开销,大文件场景建议评估性能影响
- E2EE 限制: 启用 E2EE 的文件夹无法使用在线预览和协作编辑
- 外部存储权限: 外部存储的权限由挂载配置决定,与 Nextcloud 内置权限独立
- 文件扫描: 在外部存储上手动添加文件后,需要运行
files:scan才能在 Nextcloud 中显示
5.9 扩展阅读
上一章: 04 - 数据库管理 下一章: 06 - 应用生态 — Office 协作、日历、联系人、邮件等应用。