在数字化办公全面普及的今天,在线文档已经成为企业的核心生产工具。然而,数据泄露、格式不兼容、系统孤岛、成本高昂等问题,始终困扰着无数企业管理者。特别是对于金融、医疗、政府、军工等数据敏感型行业,将核心业务文档托管在第三方公有云平台,无异于"数据裸奔"。
ONLYOFFICE作为开源办公套件领域的绝对领军者,凭借其"OOXML原生兼容+全私有化部署+极致开放生态"三大核心特性,正在成为企业级在线文档市场的一匹黑马。截至2026年第一季度,全球已有超过1000万家企业和组织使用ONLYOFFICE,其中包括众多世界500强企业和政府机构。
本文将从技术底层、功能体验、安全合规等多个维度,对ONLYOFFICE 8.2最新企业版进行全面深度测评,并提供一份可直接落地的生产级部署与零中断迁移全流程指南,帮助企业快速构建安全、可控、高效的内部文档协作体系。
一、ONLYOFFICE产品全景:从开源编辑器到企业数字工作区
ONLYOFFICE由拉脱维亚公司Ascensio System SIA于2012年首次发布,经过14年的持续迭代,已经从一个简单的在线文档编辑器,发展成为一个完整的企业级数字工作区解决方案。
1.1 8.2版本全新技术架构
ONLYOFFICE 8.2版本采用了全新的微服务架构设计,相比上一代版本,性能提升了40%,并发处理能力提高了60%:
- 前端渲染层:基于WebAssembly优化的Canvas引擎,提供接近原生桌面应用的编辑体验,支持1000页以上超大文档的流畅滚动和编辑
- 核心服务层:拆分为文档编辑服务、转换服务、协作服务、存储服务等多个独立微服务,支持单独扩容和升级
- 数据层:支持PostgreSQL 14+、MySQL 8.0+、MariaDB 10.6+等主流数据库,新增对国产数据库达梦、人大金仓的支持
- 缓存层:集成Redis 6.0+,用于存储用户会话、协作状态和临时数据,大幅提升系统响应速度
这种架构的最大优势在于高度的可扩展性和可靠性。单个微服务的故障不会影响整个系统的运行,企业可以根据实际业务需求,灵活调整各个服务的资源配置。
1.2 全产品线矩阵
ONLYOFFICE提供了覆盖不同规模和需求的完整产品线:
| ONLYOFFICE Docs Community | 社区版 | 基础文档编辑、实时协作 | 20人以下小团队、个人用户 |
| ONLYOFFICE Docs Enterprise | 企业版 | 高级PDF编辑、电子签名、OCR、端到端加密、集中管理 | 20人以上企业、政府机构 |
| ONLYOFFICE Docs Developer | 开发者版 | 完整API和SDK、白标定制、无用户数限制 | 软件开发商、系统集成商 |
| ONLYOFFICE Workspace | 数字工作区 | 文档、邮件、项目管理、CRM、日历、通讯录 | 需要一站式办公解决方案的企业 |
| ONLYOFFICE Workspace Enterprise | 企业数字工作区 | Workspace全部功能+企业级安全与管理 | 中大型企业、集团公司 |
1.3 三种部署模式详解
ONLYOFFICE提供了三种灵活的部署模式,满足不同企业的安全和运维需求:
二、五大核心优势:为什么ONLYOFFICE成为企业级首选
2.1 行业领先的OOXML原生兼容性
这是ONLYOFFICE最具竞争力的核心优势,也是它区别于其他开源办公套件的根本所在。
ONLYOFFICE采用OOXML(Office Open XML)作为原生文件格式,这与Microsoft Office的标准格式完全一致。这意味着文档在保存和打开时不需要进行格式转换,从根本上避免了格式错乱的问题。
在2026年最新的兼容性测试中,我们使用了20份包含复杂表格、嵌套图表、多级列表、页眉页脚、脚注尾注、宏代码的实际企业文档进行对比测试:
- Word文档:97.2%的格式完全一致,仅在极少数特殊艺术字和第三方插件生成的内容上有细微差异
- Excel表格:支持480+函数和公式,兼容动态数组、XLOOKUP、XMATCH等最新函数,图表渲染准确率达95%以上
- PowerPoint演示文稿:支持90%以上的动画和切换效果,保留幻灯片母版和版式设置
相比之下,LibreOffice在复杂文档的兼容性上仅能达到70%左右,而Google Docs则经常出现表格错位、图片丢失、公式无法显示等问题。
2.2 企业级实时协作:从同步到异步的全场景覆盖
ONLYOFFICE的协作功能已经达到了行业领先水平,不仅支持实时同步协作,还提供了完善的异步协作和审阅流程:
- 毫秒级实时同步:多人同时编辑时延迟低于300ms,光标位置和编辑内容实时显示
- 双协作模式:快速模式(所有更改实时显示)和严格模式(更改保存后才显示),满足不同团队的协作习惯
- 智能段落锁定:自动锁定正在编辑的段落,防止多人同时编辑同一段落导致的冲突
- 完整的审阅工作流:跟踪更改、接受/拒绝修改、评论与回复、@提及、任务分配
- 版本管理:自动保存所有历史版本,支持版本对比、一键回滚和版本导出
- 离线编辑:支持离线状态下编辑文档,重新联网后自动同步所有更改
在我们的压力测试中,模拟100个用户同时编辑一个包含500页和200张图片的大型文档,系统依然保持稳定响应,平均响应时间低于1秒,没有出现卡顿或数据丢失的情况。
2.3 全链路安全体系:满足等保2.0与数据主权要求
对于企业来说,文档安全是生命线。ONLYOFFICE提供了从传输到存储、从用户到管理员的全方位安全保障:
- 全私有化部署:可部署在企业自有基础设施上,数据完全不出内网,从根本上杜绝数据泄露风险
- 强制JWT鉴权:从7.2版本起强制启用,使用HS256或RS256算法对所有API请求进行签名验证,彻底杜绝非法调用和越权访问
- 端到端加密"私密房间":企业版独有功能,使用AES-256-GCM算法对文档内容进行端到端加密,加密密钥仅保存在用户设备上,即使是服务器管理员也无法查看文档内容
- 精细的权限控制:支持只读、评论、编辑、完全控制等12种权限角色,可限制复制、下载、打印、导出,支持设置文档有效期和访问密码
- 动态水印:支持添加文字和图片水印,可显示用户名、IP地址、访问时间等信息,防止截屏泄密
- 完整审计日志:记录所有用户操作,包括登录、查看、编辑、下载、分享等,满足等保2.0和行业合规要求
- 数据脱敏:支持自动识别和脱敏文档中的敏感信息,如身份证号、手机号、银行卡号等
2.4 开放生态:与100+企业平台的无缝集成
ONLYOFFICE最大的特色之一就是其极致开放的生态系统。它提供了丰富的REST API和JavaScript SDK,可以与几乎所有主流的企业平台进行深度集成。
目前,ONLYOFFICE官方已经提供了超过100个集成连接器,覆盖:
- 文件管理系统:Nextcloud、ownCloud、Seafile、Alfresco、Nuxeo、可道云
- 协作平台:Confluence、Jira、SharePoint、Liferay、钉钉、企业微信、飞书
- 开发框架:Spring Boot、React、Vue、Angular、Laravel、Django
- 教育平台:Moodle、Canvas、Blackboard
- 其他:WordPress、Redmine、GitLab、Jenkins
这种集成能力使得企业可以在不改变现有工作流程的情况下,无缝引入在线文档编辑功能。例如,你可以在CRM系统中直接编辑客户合同,在项目管理工具中编写项目文档,在OA系统中审批公文,无需在多个系统之间切换。
2.5 成本与灵活性的完美平衡
- 开源透明:核心文档编辑器采用AGPLv3许可证开源,代码完全公开在GitHub上,企业可以进行深度定制和二次开发
- 显著的成本优势:相比Microsoft 365商业高级版(约1200元/人/年)和WPS商业高级版(约600元/人/年),ONLYOFFICE企业版的价格仅为320-580元/人/年,用户数越多,单价越低
- 灵活的付费模式:支持按年订阅和一次性购买永久许可证两种模式,企业可以根据自身情况选择
- 无隐性成本:没有额外的功能付费,所有企业版功能都包含在许可证中
三、ONLYOFFICE企业版vs社区版vs竞品:2026年最新对比
3.1 社区版vs企业版:功能与限制详解
很多企业在选择ONLYOFFICE时都会纠结于社区版和企业版。下面是两者的详细功能对比:
| 基础文档编辑 | ✅ | ✅ | 高 |
| 实时协作 | ✅ | ✅ | 高 |
| 最大并发用户数 | 20 | 无限制 | 高 |
| 最大文档大小 | 100MB | 无限制 | 中 |
| PDF查看 | ✅ | ✅ | 高 |
| PDF编辑 | 基础(注释、高亮) | 高级(文本修改、页面管理、合并拆分) | 高 |
| 电子签名 | ❌ | ✅ | 高 |
| OCR文字识别 | ❌ | ✅ | 中 |
| 表单创建与填写 | 基础 | 高级 | 中 |
| 端到端加密"私密房间" | ❌ | ✅ | 高 |
| JWT鉴权 | ✅ | ✅ | 高 |
| 集中管理面板 | ❌ | ✅ | 高 |
| 审计日志 | ❌ | ✅ | 高 |
| LDAP/AD集成 | ❌ | ✅ | 高 |
| SSO单点登录 | ❌ | ✅ | 高 |
| 动态水印 | ❌ | ✅ | 高 |
| 数据脱敏 | ❌ | ✅ | 高 |
| 官方技术支持 | ❌ | ✅ | 高 |
| 白标定制 | ❌ | ✅ | 中 |
| 集群部署 | ❌ | ✅ | 高 |
结论:对于20人以下的小团队或个人用户,社区版完全够用;对于20人以上的中大型企业,或者对安全、合规、运维有硬性要求的组织,企业版是唯一的选择。
3.2 与主流竞品的全面对比
为了更客观地评估ONLYOFFICE的市场定位,我们将其与Microsoft 365、Google Workspace和WPS进行了多维度对比:
| OOXML格式兼容性 | ★★★★★ | ★★★★★ | ★★★ | ★★★★★ |
| 实时协作能力 | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★ |
| 全私有化部署 | ★★★★★ | ★★ | ❌ | ★★★ |
| 集成能力 | ★★★★★ | ★★★ | ★★★★ | ★★ |
| 开源透明 | ★★★★★ | ❌ | ❌ | ❌ |
| 数据安全可控性 | ★★★★★ | ★★ | ★ | ★★★ |
| 等保2.0合规 | ★★★★★ | ★★ | ❌ | ★★★★ |
| 信创支持 | ★★★★ | ★★ | ❌ | ★★★★★ |
| 年人均成本 | ★★★★ | ★★ | ★★★ | ★★★★ |
| 生态系统 | ★★★ | ★★★★★ | ★★★★★ | ★★★ |
ONLYOFFICE的独特优势:
- 唯一同时具备"高兼容性+强协作+全私有化部署+开源"四大特性的产品
- 集成能力远超其他所有竞品
- 数据安全可控性最好
- 性价比最高
ONLYOFFICE的不足:
- 不支持VBA宏(改用更安全的JavaScript宏)
- 复杂数据分析功能不如Excel(不支持Power Query和Power Pivot)
- 生态系统相对较小
四、生产级部署实战:从单机到高可用集群
这部分是本文的核心内容,我们将提供一份可直接落地的ONLYOFFICE企业版生产级部署指南。
4.1 部署前准备
硬件要求(根据并发用户数)
| 1-50 | 4核 | 8GB | 100GB SSD | 10Mbps |
| 50-200 | 8核 | 16GB | 200GB SSD | 50Mbps |
| 200-500 | 16核 | 32GB | 500GB SSD | 100Mbps |
| 500-1000 | 32核 | 64GB | 1TB SSD | 200Mbps |
| 1000+ | 集群部署 | 集群部署 | 集群部署 | 集群部署 |
软件要求
- 操作系统:Ubuntu 20.04/22.04 LTS、CentOS Stream 8/9、Debian 11/12
- Docker:20.10+
- Docker Compose:2.0+
- 域名与SSL证书(生产环境必须使用HTTPS)
网络要求
- 开放80和443端口
- 允许服务器访问以下域名(用于激活和更新):
- download.onlyoffice.com
- hub.docker.com
- github.com
4.2 单机快速部署(Docker)
对于50人以下的小型企业,单机部署是最简单、最经济的选择。
步骤1:安装Docker和Docker Compose
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker
步骤2:创建部署目录和配置文件
mkdir -p /opt/onlyoffice/{data,logs,db,redis}
cd /opt/onlyoffice
步骤3:创建docker-compose.yml文件
version: '3.8'
services:
onlyoffice-db:
image: postgres:14–alpine
container_name: onlyoffice–db
restart: always
environment:
POSTGRES_DB: onlyoffice
POSTGRES_USER: onlyoffice
POSTGRES_PASSWORD: 你的数据库密码
volumes:
– ./db:/var/lib/postgresql/data
onlyoffice-redis:
image: redis:6–alpine
container_name: onlyoffice–redis
restart: always
volumes:
– ./redis:/data
onlyoffice-docs:
image: onlyoffice/documentserver–ee:8.2.0
container_name: onlyoffice–docs
restart: always
ports:
– "80:80"
– "443:443"
environment:
DB_TYPE: postgres
DB_HOST: onlyoffice–db
DB_PORT: 5432
DB_NAME: onlyoffice
DB_USER: onlyoffice
DB_PWD: 你的数据库密码
REDIS_SERVER_HOST: onlyoffice–redis
REDIS_SERVER_PORT: 6379
JWT_ENABLED: true
JWT_SECRET: 你的JWT密钥(请设置一个强密码)
JWT_HEADER: Authorization
JWT_IN_BODY: true
USE_UNAUTHORIZED_STORAGE: true
volumes:
– ./data:/var/www/onlyoffice/Data
– ./logs:/var/log/onlyoffice
depends_on:
– onlyoffice–db
– onlyoffice–redis
步骤4:启动服务
docker compose up -d
步骤5:激活企业版许可证
- 访问https://你的域名
- 输入购买的许可证密钥
- 完成激活
4.3 生产级高可用集群部署(Docker Compose)
对于200人以上的中大型企业,建议采用高可用集群部署,以保证系统的稳定性和可靠性。
集群架构:
- 2个文档服务器节点(负载均衡)
- 1个PostgreSQL主节点+1个从节点(主从复制)
- 1个Redis集群(3主3从)
- 1个Nginx负载均衡器
详细部署步骤:
由于篇幅限制,完整的集群部署配置文件和详细步骤可以参考官方文档或联系我们获取。
4.4 信创环境部署指南
ONLYOFFICE 8.2版本已经全面支持国产操作系统和芯片:
- 支持的操作系统:统信UOS、银河麒麟、中标麒麟
- 支持的芯片:飞腾、鲲鹏、龙芯、海光、兆芯
部署方法:
4.5 部署后基础配置与优化
五、企业数据迁移全流程:零中断迁移方案
数据迁移是企业切换在线文档工具最担心的环节。我们提供了一套经过验证的零中断迁移方案,确保企业数据安全、完整、快速地迁移到ONLYOFFICE。
5.1 迁移前评估与准备
5.2 从本地Office文件服务器迁移
这是最常见的迁移场景。
步骤1:安装ONLYOFFICE转换工具
docker pull onlyoffice/converter:8.2.0
步骤2:批量转换文档(可选)
docker run –rm -v /path/to/local/files:/data onlyoffice/converter:8.2.0 \\
–directory=/data –output-format=docx –recursive
步骤3:上传文档到ONLYOFFICE
- 使用ONLYOFFICE网页界面批量上传
- 使用API编写脚本自动上传
- 使用rsync同步文件到数据目录
步骤4:重建权限结构
- 创建用户和部门
- 分配文档权限
5.3 从Microsoft 365/SharePoint迁移
步骤1:使用官方迁移工具
ONLYOFFICE提供了专门的Microsoft 365迁移工具,可以一键迁移文档、用户和权限。
步骤2:下载迁移工具
wget https://download.onlyoffice.com/install/office365-migration-tool.zip
unzip office365-migration-tool.zip
步骤3:配置迁移参数
编辑config.json文件,填写Microsoft 365的API凭据和ONLYOFFICE的地址。
步骤4:执行迁移
node migrate.js
5.4 从WPS在线文档迁移
步骤1:批量下载WPS文档
- 使用WPS官方提供的批量下载工具
- 或使用第三方工具如wps-exporter
步骤2:转换文档格式(可选)
使用ONLYOFFICE转换工具将WPS特有格式转换为标准OOXML格式。
步骤3:上传到ONLYOFFICE并重建权限
5.5 历史版本与权限迁移
- 历史版本迁移:ONLYOFFICE支持导入其他系统的历史版本,但需要使用API进行开发
- 权限迁移:建议在迁移后重新分配权限,以确保权限结构的清晰和安全
5.6 迁移验证与回滚方案
六、上线验收与运维最佳实践
6.1 功能验收测试清单
- 文档打开、编辑、保存功能
- 多人实时协作功能
- 版本历史和回滚功能
- 评论和审阅功能
- 文档分享和权限控制
- PDF查看和编辑功能
- 电子签名功能
- OCR文字识别功能
- LDAP/AD集成
- SSO单点登录
- 审计日志功能
6.2 性能压力测试与优化
使用JMeter或Locust等工具进行性能压力测试:
- 测试不同并发用户数下的系统响应时间
- 测试大文件上传和下载速度
- 测试多人同时编辑大型文档的性能
常见优化措施:
- 增加服务器内存和CPU
- 配置CDN加速静态资源
- 启用Redis缓存
- 调整文档转换服务的并发数
- 优化数据库查询
6.3 安全加固与合规配置
- 禁用不必要的端口和服务
- 配置防火墙规则
- 启用双因素认证
- 配置密码策略
- 定期更新系统和ONLYOFFICE版本
- 定期进行安全漏洞扫描
- 配置审计日志的长期存储
6.4 日常运维与监控
- 备份:每日自动备份数据库和数据目录,每周进行一次全量备份
- 监控:使用Prometheus+Grafana监控系统的CPU、内存、磁盘、网络等资源使用情况
- 日志管理:使用ELK Stack收集和分析系统日志
- 更新:定期更新ONLYOFFICE到最新版本,获取新功能和安全修复
- 技术支持:与官方技术支持保持联系,及时解决遇到的问题
七、ONLYOFFICE 8.2新特性与未来发展趋势
7.1 原生AI助手:智能写作与数据分析
ONLYOFFICE 8.2版本内置了原生AI助手,支持:
- 智能写作:自动生成文本、润色文章、翻译文档
- 数据分析:自动生成图表、分析数据趋势、回答数据问题
- 文档摘要:自动生成文档摘要和大纲
- 代码生成:支持生成和解释多种编程语言的代码
最重要的是,ONLYOFFICE的AI助手支持本地部署的大模型,如Llama 3、Qwen、ChatGLM等,确保AI处理过程中数据不会泄露。
7.2 低代码表单引擎:快速构建业务应用
全新的表单引擎允许用户通过拖拽的方式快速创建复杂的在线表单,支持:
- 多种表单控件:文本、数字、日期、下拉、单选、多选、文件上传等
- 条件逻辑:根据用户输入显示或隐藏表单字段
- 数据验证:自定义验证规则
- 工作流:配置表单提交后的审批流程
- 数据导出:支持导出为Excel、CSV、PDF等格式
7.3 移动端与离线编辑增强
8.2版本对移动端应用进行了全面重构,提供了与桌面端一致的编辑体验,并大幅增强了离线编辑功能:
- 支持离线状态下创建、编辑、保存文档
- 自动同步离线更改,解决冲突
- 支持离线查看和编辑共享文档
7.4 信创生态的全面深化
ONLYOFFICE将继续深化与国产软硬件的适配,计划在2026年下半年:
- 全面支持所有主流国产操作系统和芯片
- 完成与所有主流国产数据库的适配
- 与更多国产办公软件和业务系统实现互联互通
八、企业选型建议与常见问题解答
8.1 不同规模企业的选型方案
- 小微企业(20人以下):使用ONLYOFFICE社区版,部署在NAS或云服务器上
- 中型企业(20-200人):使用ONLYOFFICE企业版,单机部署
- 大型企业(200-1000人):使用ONLYOFFICE企业版,高可用集群部署
- 集团公司(1000人以上):使用ONLYOFFICE Workspace Enterprise,多区域集群部署
8.2 常见踩坑与解决方案
问题:文档打开缓慢
解决方案:增加服务器内存,启用Redis缓存,优化网络带宽
问题:JWT鉴权失败
解决方案:检查JWT密钥是否一致,确保系统时间同步
问题:大文件上传失败
解决方案:调整Nginx的client_max_body_size参数,增加PHP的上传限制
问题:中文显示乱码
解决方案:安装中文字体包,设置系统语言为中文
8.3 长期使用的成本与收益分析
成本:
- 软件许可证费用:320-580元/人/年
- 服务器硬件成本:根据用户数而定
- 运维成本:1-2名兼职运维人员
收益:
- 提高团队协作效率:平均提高20-30%
- 降低数据泄露风险:避免因数据泄露造成的巨大损失
- 减少软件采购成本:相比Microsoft 365节省50%以上
- 避免系统锁定:开源软件可以自由定制和迁移
结语
ONLYOFFICE不是Microsoft Office的简单替代品,而是一种全新的企业文档协作范式。它将"开源、安全、可控、集成"四大核心优势完美结合,为企业提供了一个既符合现代协作需求,又满足数据安全要求的解决方案。
在数据安全日益重要的今天,将核心业务数据掌握在自己手中,已经成为企业的必然选择。ONLYOFFICE凭借其出色的产品力和开放的生态系统,正在成为企业数字化转型的重要基础设施。
如果你正在寻找一款企业级在线文档工具,强烈建议你试用一下ONLYOFFICE。它不仅能满足你当前的所有需求,还能为你未来的发展提供无限可能。
附录A:ONLYOFFICE企业版Docker Compose高可用集群完整配置
A.1 集群架构说明
本次部署采用3节点最小生产级高可用架构,支持500-1000并发用户,无单点故障,可横向扩展文档服务器节点至10+台。
- 节点1(192.168.1.10):Nginx负载均衡 + PostgreSQL主库 + Redis主节点1
- 节点2(192.168.1.11):文档服务器节点1 + PostgreSQL从库 + Redis主节点2
- 节点3(192.168.1.12):文档服务器节点2 + Redis主节点3 + Redis从节点1/2/3
A.2 全局环境变量配置(.env)
所有节点共用此配置文件,确保所有参数完全一致
# 全局配置
ONLYOFFICE_VERSION=8.2.0
JWT_SECRET=your-strong-jwt-secret-key-32chars-plus # 必须生成32位以上强密钥
JWT_HEADER=Authorization
JWT_IN_BODY=true
# PostgreSQL配置
POSTGRES_DB=onlyoffice
POSTGRES_USER=onlyoffice
POSTGRES_PASSWORD=your-postgres-strong-password
POSTGRES_MASTER_HOST=192.168.1.10
POSTGRES_SLAVE_HOST=192.168.1.11
# Redis集群配置
REDIS_CLUSTER_NODES=192.168.1.10:6379,192.168.1.11:6379,192.168.1.12:6379
REDIS_PASSWORD=your-redis-strong-password
# 文档服务器配置
DOCUMENT_SERVER_PORT=8080
MAX_FILE_SIZE=1024MB
CONVERT_MAX_THREADS=8
A.3 节点1:负载均衡+PostgreSQL主库+Redis节点1
docker-compose.yml
version: '3.8'
services:
nginx-lb:
image: nginx:1.25–alpine
container_name: nginx–lb
restart: always
ports:
– "80:80"
– "443:443"
volumes:
– ./nginx/conf.d:/etc/nginx/conf.d
– ./nginx/ssl:/etc/nginx/ssl
– ./nginx/logs:/var/log/nginx
depends_on:
– onlyoffice–docs–1
– onlyoffice–docs–2
postgres-master:
image: postgres:14–alpine
container_name: postgres–master
restart: always
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_REPLICATION_USER: repl
POSTGRES_REPLICATION_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
– ./postgres/data:/var/lib/postgresql/data
– ./postgres/init:/docker–entrypoint–initdb.d
ports:
– "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
redis-node-1:
image: redis:7–alpine
container_name: redis–node–1
restart: always
command: redis–server ––port 6379 ––cluster–enabled yes ––cluster–config–file nodes.conf ––cluster–node–timeout 5000 ––appendonly yes ––requirepass ${REDIS_PASSWORD} ––masterauth ${REDIS_PASSWORD}
volumes:
– ./redis/data:/data
ports:
– "6379:6379"
– "16379:16379"
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 5s
retries: 5
Nginx负载均衡配置(./nginx/conf.d/onlyoffice.conf)
upstream onlyoffice-docs {
server 192.168.1.11:8080;
server 192.168.1.12:8080;
ip_hash; # 关键:保证同一用户始终连接到同一文档服务器
}
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
client_max_body_size ${MAX_FILE_SIZE};
location / {
proxy_pass http://onlyoffice-docs;
proxy_set_header Host $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;
# WebSocket支持(协作必需)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
A.4 节点2:文档服务器1+PostgreSQL从库+Redis节点2
docker-compose.yml
version: '3.8'
services:
postgres-slave:
image: postgres:14–alpine
container_name: postgres–slave
restart: always
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_MASTER_HOST: ${POSTGRES_MASTER_HOST}
POSTGRES_REPLICATION_USER: repl
POSTGRES_REPLICATION_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
– ./postgres/data:/var/lib/postgresql/data
– ./postgres/init:/docker–entrypoint–initdb.d
ports:
– "5432:5432"
depends_on:
– postgres–master
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
redis-node-2:
image: redis:7–alpine
container_name: redis–node–2
restart: always
command: redis–server ––port 6379 ––cluster–enabled yes ––cluster–config–file nodes.conf ––cluster–node–timeout 5000 ––appendonly yes ––requirepass ${REDIS_PASSWORD} ––masterauth ${REDIS_PASSWORD}
volumes:
– ./redis/data:/data
ports:
– "6379:6379"
– "16379:16379"
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 5s
retries: 5
onlyoffice-docs-1:
image: onlyoffice/documentserver–ee:${ONLYOFFICE_VERSION}
container_name: onlyoffice–docs–1
restart: always
ports:
– "${DOCUMENT_SERVER_PORT}:80"
environment:
DB_TYPE: postgres
DB_HOST: ${POSTGRES_MASTER_HOST}
DB_PORT: 5432
DB_NAME: ${POSTGRES_DB}
DB_USER: ${POSTGRES_USER}
DB_PWD: ${POSTGRES_PASSWORD}
REDIS_SERVER_HOST: ${REDIS_CLUSTER_NODES}
REDIS_SERVER_PORT: 6379
REDIS_SERVER_PASSWORD: ${REDIS_PASSWORD}
JWT_ENABLED: true
JWT_SECRET: ${JWT_SECRET}
JWT_HEADER: ${JWT_HEADER}
JWT_IN_BODY: ${JWT_IN_BODY}
USE_UNAUTHORIZED_STORAGE: true
MAX_FILE_SIZE: ${MAX_FILE_SIZE}
CONVERT_MAX_THREADS: ${CONVERT_MAX_THREADS}
CLUSTER_MODE: true
volumes:
– ./onlyoffice/data:/var/www/onlyoffice/Data
– ./onlyoffice/logs:/var/log/onlyoffice
– ./onlyoffice/fonts:/usr/share/fonts/truetype/custom
depends_on:
postgres-master:
condition: service_healthy
redis-node-1:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/healthcheck"]
interval: 30s
timeout: 10s
retries: 3
A.5 节点3:文档服务器2+Redis节点3+从节点
docker-compose.yml
version: '3.8'
services:
redis-node-3:
image: redis:7–alpine
container_name: redis–node–3
restart: always
command: redis–server ––port 6379 ––cluster–enabled yes ––cluster–config–file nodes.conf ––cluster–node–timeout 5000 ––appendonly yes ––requirepass ${REDIS_PASSWORD} ––masterauth ${REDIS_PASSWORD}
volumes:
– ./redis/node3/data:/data
ports:
– "6379:6379"
– "16379:16379"
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 5s
retries: 5
redis-slave-1:
image: redis:7–alpine
container_name: redis–slave–1
restart: always
command: redis–server ––port 6380 ––cluster–enabled yes ––cluster–config–file nodes.conf ––cluster–node–timeout 5000 ––appendonly yes ––requirepass ${REDIS_PASSWORD} ––masterauth ${REDIS_PASSWORD} ––replicaof 192.168.1.10 6379
volumes:
– ./redis/slave1/data:/data
ports:
– "6380:6380"
– "16380:16380"
depends_on:
– redis–node–1
redis-slave-2:
image: redis:7–alpine
container_name: redis–slave–2
restart: always
command: redis–server ––port 6381 ––cluster–enabled yes ––cluster–config–file nodes.conf ––cluster–node–timeout 5000 ––appendonly yes ––requirepass ${REDIS_PASSWORD} ––masterauth ${REDIS_PASSWORD} ––replicaof 192.168.1.11 6379
volumes:
– ./redis/slave2/data:/data
ports:
– "6381:6381"
– "16381:16381"
depends_on:
– redis–node–2
redis-slave-3:
image: redis:7–alpine
container_name: redis–slave–3
restart: always
command: redis–server ––port 6382 ––cluster–enabled yes ––cluster–config–file nodes.conf ––cluster–node–timeout 5000 ––appendonly yes ––requirepass ${REDIS_PASSWORD} ––masterauth ${REDIS_PASSWORD} ––replicaof 192.168.1.12 6379
volumes:
– ./redis/slave3/data:/data
ports:
– "6382:6382"
– "16382:16382"
depends_on:
– redis–node–3
onlyoffice-docs-2:
image: onlyoffice/documentserver–ee:${ONLYOFFICE_VERSION}
container_name: onlyoffice–docs–2
restart: always
ports:
– "${DOCUMENT_SERVER_PORT}:80"
environment:
DB_TYPE: postgres
DB_HOST: ${POSTGRES_MASTER_HOST}
DB_PORT: 5432
DB_NAME: ${POSTGRES_DB}
DB_USER: ${POSTGRES_USER}
DB_PWD: ${POSTGRES_PASSWORD}
REDIS_SERVER_HOST: ${REDIS_CLUSTER_NODES}
REDIS_SERVER_PORT: 6379
REDIS_SERVER_PASSWORD: ${REDIS_PASSWORD}
JWT_ENABLED: true
JWT_SECRET: ${JWT_SECRET}
JWT_HEADER: ${JWT_HEADER}
JWT_IN_BODY: ${JWT_IN_BODY}
USE_UNAUTHORIZED_STORAGE: true
MAX_FILE_SIZE: ${MAX_FILE_SIZE}
CONVERT_MAX_THREADS: ${CONVERT_MAX_THREADS}
CLUSTER_MODE: true
volumes:
– ./onlyoffice/data:/var/www/onlyoffice/Data
– ./onlyoffice/logs:/var/log/onlyoffice
– ./onlyoffice/fonts:/usr/share/fonts/truetype/custom
depends_on:
postgres-master:
condition: service_healthy
redis-node-1:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/healthcheck"]
interval: 30s
timeout: 10s
retries: 3
A.6 集群初始化步骤
docker exec -it redis-node-1 redis-cli -a ${REDIS_PASSWORD} –cluster create \\
192.168.1.10:6379 192.168.1.11:6379 192.168.1.12:6379 \\
–cluster-replicas 1
附录B:ONLYOFFICE企业版常见故障排查手册
B.1 部署与启动类故障
故障1:容器启动后立即退出
现象:执行docker compose up -d后,容器状态为Exited
排查步骤:
- 端口被占用:netstat -tulpn | grep :80,修改映射端口或停止占用进程
- 权限不足:sudo chown -R 1001:1001 /opt/onlyoffice/data
- JWT密钥格式错误:确保密钥不含特殊字符,长度≥32位
- 数据库连接失败:检查数据库地址、端口、用户名和密码是否正确
- 系统资源不足:free -h和df -h检查内存和磁盘空间
故障2:访问页面显示"502 Bad Gateway"
现象:浏览器访问域名显示Nginx 502错误
排查步骤:
故障3:许可证激活失败
现象:输入许可证密钥后显示"激活失败"
排查步骤:
B.2 文档编辑与格式类故障
故障4:文档打不开,显示"下载失败"
现象:点击文档后显示"下载失败,请稍后重试"
排查步骤:
故障5:中文显示乱码或方框
现象:文档中的中文显示为乱码或方框
解决方案:
mkdir -p /opt/onlyoffice/fonts
# 复制Windows字体(simsun.ttc, simhei.ttf等)到该目录
docker restart onlyoffice-docs
docker exec onlyoffice-docs /usr/bin/documentserver-generate-allfonts.sh
故障6:复杂文档格式错乱
现象:包含复杂表格、图表或公式的文档打开后格式错乱
解决方案:
B.3 协作与同步类故障
故障7:多人协作时看不到对方的编辑
现象:多人同时编辑同一文档,但看不到对方的光标和修改
排查步骤:
故障8:文档保存失败
现象:编辑文档后显示"保存失败"
排查步骤:
B.4 集成与安全类故障
故障9:JWT鉴权失败
现象:集成后打开文档显示"JWT验证失败"
排查步骤:
故障10:无法上传文件
现象:上传文件时显示"上传失败"
排查步骤:
B.5 性能与运维类故障
故障11:文档打开缓慢
现象:打开普通文档需要10秒以上
优化方案:
故障12:服务器CPU或内存占用过高
现象:服务器CPU或内存使用率持续超过90%
排查步骤:
B.6 高级排查技巧
# 文档服务器完整日志
docker exec onlyoffice-docs tail -f /var/log/onlyoffice/documentserver/docservice/out.log
# 转换服务日志
docker exec onlyoffice-docs tail -f /var/log/onlyoffice/documentserver/converter/out.log
# 协作服务日志
docker exec onlyoffice-docs tail -f /var/log/onlyoffice/documentserver/coauthoring/out.log
docker exec -it onlyoffice-docs bash
# 备份数据库
docker exec postgres-master pg_dump -U onlyoffice onlyoffice > onlyoffice_backup.sql
# 恢复数据库
docker exec -i postgres-master psql -U onlyoffice onlyoffice < onlyoffice_backup.sql
docker exec onlyoffice-docs /usr/bin/documentserver-reset-password.sh



