强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 作为主存储,也可以挂载为外部存储:

  1. 安装 External Storage 应用
  2. 管理后台 → 设置 → 管理 → 外部存储
  3. 添加 “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挂载本地目录
FTPFTP/FTPSfiles_externalFTP 服务器
SFTPSSHfiles_externalSSH 文件传输
SMB/CIFSSMBfiles_externalWindows 共享
WebDAVHTTPfiles_externalWebDAV 服务器
Amazon S3S3 APIfiles_externalS3 兼容存储
DropboxAPIfiles_externalDropbox
Google DriveAPIfiles_externalGoogle 云盘
OneDriveAPIfiles_externalMicrosoft OneDrive
OpenStack SwiftSwift APIfiles_externalSwift 对象存储

安装外部存储应用

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

使用方式:

  1. 桌面/移动客户端中启用 E2EE
  2. 创建加密文件夹
  3. 设置恢复密钥(重要!丢失后无法恢复)

注意: 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 注意事项

  1. data 目录权限: 确保 data/ 目录对 Web 服务器用户可写,但 Web 服务器不能直接访问
  2. S3 兼容性: 不是所有 S3 兼容存储都完全兼容,MinIO 和 AWS S3 测试最充分
  3. 加密性能: 服务端加密会增加 CPU 开销,大文件场景建议评估性能影响
  4. E2EE 限制: 启用 E2EE 的文件夹无法使用在线预览和协作编辑
  5. 外部存储权限: 外部存储的权限由挂载配置决定,与 Nextcloud 内置权限独立
  6. 文件扫描: 在外部存储上手动添加文件后,需要运行 files:scan 才能在 Nextcloud 中显示

5.9 扩展阅读


上一章: 04 - 数据库管理 下一章: 06 - 应用生态 — Office 协作、日历、联系人、邮件等应用。