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

Nextcloud 私有云部署教程 / 09 - 在线协作

09 - 在线协作

掌握 Nextcloud 与 OnlyOffice / Collabora 的集成配置,实现在线文档实时协作编辑。


9.1 在线协作方案对比

Nextcloud 支持两种主流在线文档协作方案:

特性OnlyOfficeCollabora Online
产品类型独立商业办公套件基于 LibreOffice 的在线版本
开源协议AGPLv3 (社区版)MPL 2.0
格式支持DOCX, XLSX, PPTX (原生)ODF, DOCX, XLSX 等
协作体验极佳(Google Docs 级别)良好
功能丰富度非常丰富丰富
资源占用较高(推荐 4GB+ RAM)较高(推荐 2GB+ RAM)
许可限制社区版限 20 并发无限制(自建)
部署复杂度中等中等
推荐场景需要最佳协作体验需要 ODF 支持 / 无限制

9.2 OnlyOffice 集成

方案一:使用 Nextcloud 内置 OnlyOffice

Nextcloud 22+ 支持内置 OnlyOffice 功能(需社区服务器)。

方案二:自建 OnlyOffice Document Server

Docker 部署

# 创建数据目录
mkdir -p /data/onlyoffice/{data,logs,lib,rabbitmq,redis,postgres}

# 启动 OnlyOffice Document Server
docker run -d \
  --name onlyoffice \
  -p 8080:80 \
  -v /data/onlyoffice/data:/var/www/onlyoffice/Data \
  -v /data/onlyoffice/logs:/var/log/onlyoffice \
  -v /data/onlyoffice/lib:/var/lib/onlyoffice \
  -v /data/onlyoffice/rabbitmq:/var/lib/rabbitmq \
  -v /data/onlyoffice/redis:/var/lib/redis \
  -v /data/onlyoffice/postgres:/var/lib/postgresql \
  -e JWT_ENABLED=true \
  -e JWT_SECRET=YourJWTSecretKey \
  onlyoffice/documentserver:latest

Docker Compose 部署

# docker-compose.yml
version: '3.8'

services:
  onlyoffice:
    image: onlyoffice/documentserver:latest
    container_name: onlyoffice
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      - JWT_ENABLED=true
      - JWT_SECRET=YourJWTSecretKey
    volumes:
      - ./data:/var/www/onlyoffice/Data
      - ./logs:/var/log/onlyoffice
      - onlyoffice_lib:/var/lib/onlyoffice
      - onlyoffice_rabbitmq:/var/lib/rabbitmq
      - onlyoffice_redis:/var/lib/redis
      - onlyoffice_postgres:/var/lib/postgresql

volumes:
  onlyoffice_lib:
  onlyoffice_rabbitmq:
  onlyoffice_redis:
  onlyoffice_postgres:
docker compose up -d

Nginx 反向代理配置

server {
    listen 443 ssl http2;
    server_name office.example.com;

    ssl_certificate     /etc/letsencrypt/live/office.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/office.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        client_max_body_size 100M;
    }
}

安装 Nextcloud OnlyOffice 应用

# 安装 OnlyOffice 集成应用
sudo -u www-data php /var/www/nextcloud/occ app:install onlyoffice

配置连接:

# 设置 OnlyOffice 服务器地址
sudo -u www-data php /var/www/nextcloud/occ config:app:set \
  onlyoffice DocumentServerUrl --value="https://office.example.com/"

# 设置 JWT 密钥
sudo -u www-data php /var/www/nextcloud/occ config:app:set \
  onlyoffice jwt_secret --value="YourJWTSecretKey"

或通过管理界面配置:

设置 → 管理 → OnlyOffice

Document Server URL: https://office.example.com/
Secret Key (JWT): YourJWTSecretKey

高级设置:
├── 默认打开格式: DOCX
├── 编辑器主题: 现代深色
└── 启用聊天: ✅

9.3 Collabora Online 集成

Docker 部署 Collabora

# 使用官方 Docker 镜像
docker run -d \
  --name collabora \
  -p 9980:9980 \
  -e "domain=cloud\\.example\\.com" \
  -e "username=admin" \
  -e "password=AdminPassword" \
  -e "extra_params=--o:ssl.enable=false" \
  --cap-add MKNOD \
  collabora/code:latest

Docker Compose 部署

# docker-compose.yml
version: '3.8'

services:
  collabora:
    image: collabora/code:latest
    container_name: collabora
    restart: unless-stopped
    ports:
      - "9980:9980"
    environment:
      - domain=cloud\.example\.com
      - username=admin
      - password=AdminPassword
      - extra_params=--o:ssl.enable=false
    cap_add:
      - MKNOD
    volumes:
      - collabora_data:/opt/collaboraoffice/user

volumes:
  collabora_data:

Nginx 反向代理

server {
    listen 443 ssl http2;
    server_name collabora.example.com;

    ssl_certificate     /etc/letsencrypt/live/collabora.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/collabora.example.com/privkey.pem;

    # Allow large uploads
    client_max_body_size 200M;

    # Collabora Discovery
    location /hosting/discovery {
        proxy_pass http://127.0.0.1:9980;
        proxy_set_header Host $http_host;
    }

    # Collabora WebSocket
    location ~ ^/lool/(.*)/ws$ {
        proxy_pass http://127.0.0.1:9980;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_read_proxy 36000s;
    }

    # Collabora Admin Console
    location /lool/adminws {
        proxy_pass http://127.0.0.1:9980;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }

    # Collabora Main
    location / {
        proxy_pass http://127.0.0.1:9980;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

安装 Collabora 应用

sudo -u www-data php /var/www/nextcloud/occ app:install richdocuments

配置:

# 设置 Collabora 服务器地址
sudo -u www-data php /var/www/nextcloud/occ config:app:set \
  richdocuments wopi_url --value="https://collabora.example.com"

# 添加可信域名
sudo -u www-data php /var/www/nextcloud/occ config:system:set \
  richdocuments wopi_allowlist --type=array --value="10.0.0.0/8"

9.4 实时协作编辑

协作模式

┌─────────────────────────────────────────────────────────┐
│                   实时协作编辑模式                       │
│                                                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐             │
│  │  用户 A  │  │  用户 B  │  │  用户 C  │             │
│  │  光标红  │  │  光标蓝  │  │  光标绿  │             │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘             │
│       │             │             │                     │
│       └─────────────┼─────────────┘                     │
│                     │                                   │
│              ┌──────┴──────┐                            │
│              │  协作服务器  │                            │
│              │(OnlyOffice/ │                            │
│              │ Collabora)  │                            │
│              └──────┬──────┘                            │
│                     │                                   │
│              ┌──────┴──────┐                            │
│              │  Nextcloud  │                            │
│              │   存储      │                            │
│              └─────────────┘                            │
└─────────────────────────────────────────────────────────┘

协作特性

特性OnlyOfficeCollabora
实时光标显示
评论功能
版本历史
跟踪修订
聊天
@提及
表单填写
宏支持
条件格式
数据透视表⚠️ 有限

9.5 文件版本控制

Nextcloud 内置文件版本管理,无需额外配置。

版本管理机制

文件变更过程:
├── v1: report.docx (初始版本)
├── v2: report.docx (第 1 次修改)
├── v3: report.docx (第 2 次修改)
└── ... (最多保留配置的版本数)

版本配置

// config/config.php

// 版本保留间隔(秒)- 使用指数退避
'versions_retention_obligation' => 'auto,60',
// 格式: 'min,max'
// auto = 根据文件大小自动决定
// 数字 = 天数

// 示例:最少保留 7 天,最多保留 60 天
// 'versions_retention_obligation' => '7,60',

// 禁用版本管理(不推荐)
// 'versions_retention_obligation' => 'disabled',

// 版本最大数量
// 'file_storage.save_version_files' => true,

版本操作

# 查看文件版本(通过 API)
curl -s -u admin:password \
  "https://cloud.example.com/remote.php/dav/versions/admin/versions/12345" \
  -X PROPFIND -H "Depth: 1" | xmllint --format -

# 恢复文件版本
# 通过 Web 界面:文件详情 → 版本 → 点击恢复按钮

版本清理

# 手动触发版本清理
sudo -u www-data php /var/www/nextcloud/occ versions:cleanup

# 清理所有用户的旧版本
sudo -u www-data php /var/www/nextcloud/occ versions:cleanup --all

9.6 文件锁定

锁定机制

锁定类型:
├── 协作锁 (Collaborative Lock) - OnlyOffice/Collabora 编辑时自动锁定
├── 手动锁 (Manual Lock) - 用户手动锁定文件
└── 系统锁 (System Lock) - 系统操作时锁定

手动锁定

# 通过 WebDAV 锁定文件
curl -s -u admin:password \
  -X LOCK \
  "https://cloud.example.com/remote.php/dav/files/admin/report.docx" \
  -H "Timeout: Second-3600" \
  -d '<?xml version="1.0" encoding="UTF-8"?>
<D:lockinfo xmlns:D="DAV:">
  <D:lockscope><D:exclusive/></D:lockscope>
  <D:locktype><D:write/></D:locktype>
  <D:owner>admin</D:owner>
</D:lockinfo>'

锁定配置

// config/config.php
// 文件锁定已默认启用,配合 Redis 使用效果最佳
'filelocking.enabled' => true,
'memcache.locking' => '\\OC\\Memcache\\Redis',

9.7 协作场景最佳实践

场景一:团队文档协作

配置步骤:
1. 安装 OnlyOffice 或 Collabora
2. 创建团队群组文件夹
3. 设置共享权限(读写)
4. 团队成员直接在 Web 界面编辑文档
5. 利用版本历史追踪变更
6. 使用评论功能进行文档评审

场景二:合同审批流程

流程:
1. 创建合同模板(OnlyOffice 模板)
2. 指定编辑者填写合同内容
3. 启用跟踪修订功能
4. 审批人查看修订并添加评论
5. 批准后锁定文件(防篡改)
6. 下载 PDF 最终版本

场景三:远程会议

集成方案:
1. Talk 创建视频会议
2. 会议中共享文档链接
3. 参会者同时编辑议程/纪要
4. Deck 创建行动项
5. 日历安排下次会议

9.8 注意事项

  1. 资源需求: OnlyOffice/Collabora 都需要较大内存,建议至少 4GB RAM
  2. 网络延迟: 协作体验与网络延迟密切相关,建议部署在低延迟网络
  3. JWT 安全: OnlyOffice 务必配置 JWT 认证,防止未授权访问
  4. SSL: 生产环境必须使用 HTTPS,否则浏览器会阻止 WebSocket 连接
  5. 大文件: 超过 100MB 的文档编辑可能会卡顿,建议拆分
  6. 版本清理: 定期清理旧版本,避免存储空间浪费

9.9 扩展阅读


上一章: 08 - 客户端 下一章: 10 - 安全加固 — 双因素认证、SSO/LDAP 集成与审计日志。