目录
概述
- Nextcloud与Onlyoffice主要解决公司内部文档存储与在线编辑问题,部署过程中涉及的问题比较多,故整理部署过程如下。
- 受限时间,只做了基础单点部署,后续有时间尝试Nextcloud与Onlyoffice的集群模式(主要解决Onlyoffice的多节点之间状态同步问题)
参考
限制
- Onlyoffice社区版本有最大并发编辑20的限制,意味着最大只能有20个人同时编辑同一文件或20个不同文件。超过20数量后,多余人员只能读取,不能修改。
- 此限制会影响用户体验。目前查阅的可能解决的方案有两种(待测试):
- 自行编译Onlyoffice的DocService服务,修改配置文件,加大20限制数量。
- 使用s3外部对象存储,将多个Onlyoffice服务变成无状态服务,突破单节点20的限制。
环境
-
虚拟机
- 8C/32G/200G 192.168.16.41 主节点
- 8C/32G/200G 192.168.16.51 冷备节点
-
操作系统
Ubuntu24.04
-
数据库
- 172.28.3.12 主MySQL 8.4.8 和Redis 7.2.5
- 172.28.3.6 从MySQL 8.4.8 和Redis 7.2.5
-
对象存储(本例未使用,待后续测试)
- Minio集群(因Minio社区版已进入维护期,后续考虑替换其它对象存储)
-
容器
- docker
安装服务
Onlyoffice安装步骤
- 创建外部数据库
- 创建外部rabbitmq
- 使用docker启动服务,服务使用外部数据库和对象存储
创建数据库
- 172.28.3.12和172.28.3.6服务器上预装好MySQL8.4.8和Redis7.2.5
- 172.28.3.12上MySQL数据库创建nextcloud数据库
sql
CREATE DATABASE IF NOT EXISTS onlyoffice DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| nextcloud |
| onlyoffice |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql>
创建目录
- Onlyoffice使用docker容器运行,宿主机需预创建挂载目录和自定义配置文件存储目录
- 目录结构如下
bash
root@192-168-016-021:/public/application/nextcloud# tree -L 1
.
├── cache
├── custom_config
├── data
├── documentserver-example
├── fonts
├── log
└── rabbitmq
- cache: onlyoffice的本地缓存文件目录
- custom_config: onlyoffice官方支持自定义配置文件目录
- data:onlyoffice的数据目录
- docker-compose.yml:docker compose文件
- fonts: onlyoffice字体目录
- log:onlyoffice日志目录
- rabbitmq:rabbitmq本地目录
创建docker-compose文件
-
配置项说明:
- 因为使用专用虚拟机运行nextcloud和onlyoffice,所以docker直接使用host网络模式,提升性能
- onlyoffice使用当前最新版镜像onlyoffice/documentserver:9.3.1
- 使用外部MySQL数据库,便于提升性能和冷热备份。
- 使用外部Redis数据库,便于提升性能和冷热备份,如果高负载请按官方建议使用Redis集群
- 使用外部Rabbitmq,支持仲裁队列,后续可以升级为3节点
- 定义了JWT配置,Nextcloud集成onlyoffice插件时需要与之匹配
- Rabbitmq定义了与宿主机相同的hostname(192-168-016-041.host.xk.in,这个内部域名已解析),并且使用了docker的host网络模式,为了方便rabbitmq集群节点间通讯。
- 服务相关配置,详见 docker-compose.yml中的说明
-
docker-compose.yml
yaml
services:
onlyoffice-documentserver:
#build: # 如果需要从本地构建可以下载官方Dockerfile文件
# context: .
image: onlyoffice/documentserver:9.3.1
container_name: onlyoffice-documentserver
restart: always
network_mode: host # host模式,提升网络性能
#ports:
# - '9000:80'
# - '443:443
# 新增:永久绑定域名到本机或内网Nginx负载均衡 IP(内网用)
extra_hosts:
- "cloud.xk.com:127.0.0.1" # 绑定本机IP,使用本机服务
- "office.xk.com:127.0.0.1" # 绑定本机IP,使用本机服务
depends_on:
onlyoffice-rabbitmq:
condition: service_healthy
# 官方文档:https://github.com/ONLYOFFICE/Docker-DocumentServer?tab=readme-ov-file#available-configuration-parameters
environment:
# 外部 Mysql
- DB_TYPE=mysql
- DB_HOST=nextcloud.mysql.xk.in
- DB_PORT=3306
- DB_NAME=onlyoffice
- DB_USER=root
- DB_PWD=Kx0000xK
# 外部 Rabbitmq
- AMQP_URI=amqp://admin:Kx0000xK@onlyoffice.mq.xk.in
# 外部 Redis 配置
- REDIS_SERVER_HOST=onlyoffice.redis.xk.in # Redis 主机
- REDIS_SERVER_PORT=6379 # Redis 端口
- REDIS_SERVER_PASS=Kx0000xK # Redis 密码
- REDIS_SERVER_DB=2 # 使用db 2(区别nextcloud)
# 开启JWT核心配置(必须)
- JWT_ENABLED=true # 启用 JWT
- JWT_SECRET=7e9f2b7aasdfassdferweerqwre8e9f0a1bef # 替换为你的密钥(如:7e9f2b7aasdfassdferweerqwre8e9f0a1bef)
- JWT_HEADER=AuthorizationJwt # 从请求头读取密钥 (标准做法)
#- JWT_HEADER=Authorization # 从请求头读取密钥 (标准做法)
- JWT_IN_BODY=false # 关闭在 Body 中查找密钥,避免冲突
- JWT_EXPIRATION_TIME=12h # JWT 令牌(Token)的有效期,默认值1h
# 内网互通 (必须,因为 NextCloud 和 OnlyOffice 都在内网)
- ALLOW_PRIVATE_IP_ADDRESS=true # 允许 OO 回调内网 NC 地址
- USE_UNAUTHORIZED_STORAGE=false # NC 证书是有效的;若使用自签名则改为 true(不验证签名)
volumes:
- /public/application/onlyoffice/data:/var/www/onlyoffice/Data
- /public/application/onlyoffice/log:/var/log/onlyoffice
- /public/application/onlyoffice/cache:/var/lib/onlyoffice/documentserver/App_Data/cache/files
- /public/application/onlyoffice/documentserver-example:/var/www/onlyoffice/documentserver-example/public/files
- /public/application/onlyoffice/fonts:/usr/share/fonts
# 挂载宿主机时区文件
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
# 挂载自定义配置文件(使用仲裁队列)启动之前,要先删除MQ中已创建的同名经典队列
- /public/application/onlyoffice/custom_config/local-production-linux.json:/etc/onlyoffice/documentserver/local-production-linux.json
# 传统模式:内存硬限制
mem_limit: 8G
# 传统模式:内存预留
mem_reservation: 4G
ulimits: # 增大容器内文件句柄数量,默认是1024
nofile:
soft: 65535
hard: 65535
stdin_open: true
stop_grace_period: 60s
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/healthcheck"] # 官方健康检查接口 http://localhost/healthcheck
interval: 30s
retries: 5
start_period: 60s
timeout: 10s
onlyoffice-rabbitmq:
image: rabbitmq:4.1.4-management
container_name: onlyoffice-rabbitmq
hostname: 192-168-016-041.host.xk.in # 定义与宿主机一致,为了方便内部DNS解析
network_mode: host # host模式,提升主从复制性能
environment:
- RABBITMQ_USE_LONGNAME=true # 强制开启长节点名(FQDN)
- RABBITMQ_DEPRECATED_FEATURES_PERMIT_MANAGEMENT_METRICS_COLLECTION=false # 消除未来会废弃的指标收集功能
#- RABBITMQ_DEPRECATED_FEATURES_PERMIT_MANAGEMENT_METRICS_COLLECTION=true
- RABBITMQ_ERLANG_COOKIE=kx0000xk&kx0000xk # 集群密钥,所有节点必须一致
- RABBITMQ_DEFAULT_USER=admin # 管理界面用户名
- RABBITMQ_DEFAULT_PASS=Kx0000xK # 管理界面密码
volumes:
- /public/application/onlyoffice/rabbitmq:/var/lib/rabbitmq
# 挂载宿主机时区文件
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
# 传统模式:内存硬限制
mem_limit: 8G
# 传统模式:内存预留
mem_reservation: 4G
ulimits: # 增大容器内文件句柄数量,默认是1024
nofile:
soft: 65535
hard: 65535
restart: always
#expose:
# - '5672'
# - '15672'
# - '25672'
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "ping"]
interval: 10s
retries: 3
start_period: 10s
timeout: 10s
自定义配置文件
local-production-linux.json(文件名不能改)
- 创建自定配置文件,增加rabbitmq使用仲裁队列(quorum)的配置,支持RabbitMQ 4.0+版本
官方社区:issue-setting-prefix-jwt-in-local-json
官方社区:docker-relation-between-default-json-and-local-json
官方文档:docs-community-configuring
bash
vim /public/application/onlyoffice/custom_config/local-production-linux.json
bash
{
"services": {
"CoAuthoring": {
"server": {
"limits_tempfile_upload": 524288000
}
}
},
"FileConverter": {
"converter": {
"maxDownloadBytes": 524288000,
"inputLimits": [
{
"type": "docx;dotx;docm;dotm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
},
{
"type": "xlsx;xltx;xlsm;xltm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
},
{
"type": "pptx;ppsx;potx;pptm;ppsm;potm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
},
{
"type": "vsdx;vstx;vssx;vsdm;vstm;vssm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
}
]
}
},
"rabbitmq": {
"queueconverttask": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
},
"queueconvertresponse": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
},
"queueconvertdead": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
},
"queuedelayed": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
}
}
}
自定义配置说明
- 官方docker-compose.yml文件使用的是rabbitmq3,队列是经典队列。rabbitmq从4.0+版本启用了仲裁队列,支持集群。本例中使用了rabbitmq:4.1.4-management,支持web页面管理,同时方便后续搭建集群或升级。
bash
{
"rabbitmq": {
"queueconverttask": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
},
"queueconvertresponse": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
},
"queueconvertdead": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
},
"queuedelayed": {
"options": {
"arguments": {
"x-queue-type": "quorum"
}
}
}
}
}
- 增大Onlyoffice处理文件的大小限制
- services.CoAuthoring.server.limits_tempfile_upload:
- 默认 104857600 (100MB)
- 增大 524288000 (500MB)
- FileConverter.converter.maxDownloadBytes:
- 默认 104857600 (100MB)
- 增大 524288000 (500MB)
- FileConverter.converter.inputLimits 数组中各种类型的 zip.uncompressed:
- 默认 Word 50MB, Excel 300MB, PPT 50MB, Visio 50MB
- 增大 Word 500MB, Excel 500MB, PPT 500MB, Visio 500MB
bash
{
"services": {
"CoAuthoring": {
"server": {
"limits_tempfile_upload": 524288000
}
}
},
"FileConverter": {
"converter": {
"maxDownloadBytes": 524288000,
"inputLimits": [
{
"type": "docx;dotx;docm;dotm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
},
{
"type": "xlsx;xltx;xlsm;xltm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
},
{
"type": "pptx;ppsx;potx;pptm;ppsm;potm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
},
{
"type": "vsdx;vstx;vssx;vsdm;vstm;vssm",
"zip": {
"uncompressed": "500MB",
"template": "*.xml"
}
}
]
}
}
}
自定义配置文件赋权
bash
# 保证与容器内属主权限一致(ds用户)
chown -R 105:107 /public/application/onlyoffice/custom_config
chmod 644 /public/application/onlyoffice/custom_config/local-production-linux.json
# 查看权限
ll /public/application/onlyoffice/config/local.json
-rw-r--r-- 1 105 107 6898 Mar 26 21:02 /public/application/onlyoffice/config/local.json
启用自定义配置注意事项
bash
# 如果此前已经创建经典队列,需要删掉(也可以登录web界面,手动删除)
rm -rf rabbitmq/*
rm -rf rabbitmq/.*
启动服务
- 启动服务
bash
cd /public/application/onlyoffice
docker compose up -d
- 查看服务
bash
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
onlyoffice-documentserver onlyoffice/documentserver:9.3.1 "/app/ds/run-documen..." onlyoffice-documentserver 3 minutes ago Up 3 minutes (healthy)
onlyoffice-rabbitmq rabbitmq:4.1.4-management "docker-entrypoint.s..." onlyoffice-rabbitmq 3 minutes ago Up 3 minutes (healthy)
- 查看日志
bash
# 执行命令,没有错误
docker compose logs onlyoffice-rabbitmq
- 查看onlyoffice
- 查看RabbitMQ
- 访问 http://192.168.16.41:15672
- onlyoffice 已自动创建4个仲裁队列

