
如果你正在负责一个需要集成在线文档编辑能力的项目(OA系统、企业云盘、知识库、教育平台等),并且选择了 OnlyOffice 中国版作为文档引擎,本文将为你提供从服务部署到业务集成的完整技术路径。
本文不会重复官方文档的每一个配置项,而是聚焦于企业级落地过程中最容易踩坑的环节,以及中国版独有功能的正确使用方式。
OnlyOffice 中国版通过 Docker 镜像分发,支持 AMD64 和 ARM64 架构。
# Docker Hub 直接拉取
docker pull moqisoft/documentserver:9.3.0
# 国内加速(推荐)
docker pull docker.1ms.run/moqisoft/documentserver:9.3.0以下是一个包含高级版所需参数的完整启动命令:
docker run -itd \
--name ds-china \
-p 9000:80 \
-p 9090:8000 \
--restart=always \
--privileged \
-e ALLOW_PRIVATE_IP_ADDRESS=true \
-e JWT_ENABLED=false \
-v /data/onlyoffice/Data:/var/www/onlyoffice/Data \
-v /data/onlyoffice/App_Data:/var/www/onlyoffice/App_Data \
-v /data/onlyoffice/sdkjs-plugins:/var/www/onlyoffice/documentserver/sdkjs-plugins \
-v /proc/cpuinfo:/host/proc/cpuinfo \
-v /sys/class:/host/sys/class \
moqisoft/documentserver:9.3.0参数说明:
参数 | 说明 | 是否必须 |
|---|---|---|
| 编辑服务端口映射 | 是 |
| 管理接口端口映射 | 建议 |
| 特权模式,高级版获取机器码必须 | 高级版必须 |
| 允许内网IP地址,解决容器内下载文件失败 | 是 |
| 关闭JWT认证(开发阶段方便调试) | 按需 |
| 数据目录,存放license等文件 | 高级版必须 |
| 应用数据目录,文档缓存等 | 建议 |
| 插件目录,方便管理自定义插件 | 建议 |
| CPU信息映射,高级版机器码依赖 | 高级版必须 |
| 系统信息映射,高级版机器码依赖 | 高级版必须 |
# 查看容器日志,确认无报错
docker logs -f ds-china
# 访问版本信息
curl http://your-server-ip:9090/info
# 访问欢迎页面
# 浏览器打开 http://your-server-ip:9000/welcome/注意:访问地址不能使用
localhost或127.0.0.1,因为容器内部需要通过这个地址下载文件,使用本地回环地址会导致容器请求到自身内部。
现象 | 原因 | 解决方案 |
|---|---|---|
文档下载失败 | 文件地址在容器内不可达 | 使用容器可访问的IP/域名 |
安全令牌格式不正确 | JWT认证未关闭但未正确配置token | 设置 |
机器码每次重启都变化 | 未正确挂载目录或未开启特权模式 | 检查 |
部分http请求 | CDN回源协议与访问协议不一致 | 确保CDN回源协议与源站一致 |
OnlyOffice 中国版已经预置了常用的中文办公字体,开箱即可满足大部分中文办公场景。这是相比官方社区版的一大优势——官方版默认不包含中文字体,打开中文文档时经常出现字体缺失导致的排版异常。
如果企业有特殊字体需求(如品牌字体、行业专用字体),可以通过挂载方式追加:
# 启动时挂载自定义字体目录
docker run -itd \
--name ds-china \
# 其他参数...
-v /data/onlyoffice/custom-fonts:/usr/share/fonts/truetype/custom \
moqisoft/documentserver:9.3.0将需要的字体文件(.ttf / .otf)放入宿主机的 /data/onlyoffice/custom-fonts 目录,重启容器即可生效。
推荐做法:使用追加方式而非完整替换。完整替换(挂载 core-fonts 目录)可能因缺失核心字体导致文件导出失败。
中国版高级版支持通过配置修改编辑器的默认字体和字号:
{
"editorConfig": {
"customization": {
"font": {
"size": 14,
"name": "SimSun"
}
}
}
}对于企业内部系统,建议将默认字体设置为宋体或微软雅黑,默认字号设置为四号(14pt)或小四号(12pt),符合中文公文排版习惯。
OnlyOffice 的文档打开流程涉及多个阶段:加载 JavaScript SDK → 下载原始文档 → 转换为中间格式 → 下载字体 → 渲染页面。中国版提供了多个优化手段。
从 9.2.1 版本开始,支持在打开文档前预先加载静态资源(HTML、CSS、JS、字体),加速首次打开速度。
方式一:使用 placeholder 参数
<!-- 文档列表页面 -->
<div id="preloadPlaceholder" style="display:none"></div>
<script
type="text/javascript"
src="https://your-ds-server:9000/web-apps/apps/api/documents/api.js?placeholder=preloadPlaceholder"
></script>当用户浏览文档列表时,SDK 会在后台预加载编辑器所需的静态资源。等用户点击打开文档时,这些资源已经在浏览器缓存中,可以显著减少加载时间。
方式二:手动插入预加载 iframe
<iframe
src="https://your-ds-server:9000/web-apps/apps/api/documents/preload.html"
style="display:none;"
></iframe>适用场景:在文档列表、工作台等用户打开文档前会停留的页面中使用。
注意:预加载会消耗服务器带宽和用户流量,不建议在所有页面都启用,只在用户即将打开文档的场景中使用。
原理是将字体请求分散到多个域名,绕过浏览器对单域名的并发连接限制(通常为6个),实现并行下载。
第一步:导出字体文件
docker cp ds-china:/var/www/onlyoffice/documentserver/fonts ./fonts第二步:部署字体到多个域名
将导出的字体文件分别部署到不同的域名/CDN,确保可以通过类似 https://font1.yourdomain.com/fonts/000 的地址正常下载。
第三步:配置编辑器
{
"editorConfig": {
"customization": {
"resPrefix": [
"https://font1.yourdomain.com",
"https://font2.yourdomain.com",
"https://font3.yourdomain.com"
]
}
}
}第四步:配置字体域名的CORS
字体服务器需要允许跨域访问:
# 字体服务器的 Nginx 配置
location /fonts/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET;
expires 30d;
}实测效果:3个域名并行下载字体时,字体加载时间可缩短约 50%-60%。
在前端的 Nginx 反向代理上,也可以做一些通用的性能优化:
location / {
proxy_pass http://127.0.0.1:9000;
# 开启 gzip 压缩
gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 1024;
# 静态资源缓存
location ~* \.(js|css|png|jpg|gif|ico|woff|woff2|ttf)$ {
proxy_pass http://127.0.0.1:9000;
expires 7d;
add_header Cache-Control "public, immutable";
}
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
# 超时设置(协同编辑需要长连接)
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}在某些企业环境中,可能需要将 OnlyOffice 部署在反向代理的子目录下(如 /office/ 而非根路径)。中国版完整支持子目录部署。
location /office/ {
proxy_pass http://127.0.0.1:9000/;
# 关键头部:告知后端应用实际访问路径
proxy_set_header X-Forwarded-Prefix /office;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
# 超时设置
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}关键要点:
X-Forwarded-Prefix 头部是必须的,告知后端实际访问路径location /office/ 对应 proxy_pass .../)将编辑器的 Logo 和品牌信息替换为企业自有标识:
{
"editorConfig": {
"customization": {
"logo": {
"visible": true,
"image": "https://your-domain.com/logo.png",
"imageEmbedded": "https://your-domain.com/logo-small.png",
"url": "https://your-domain.com"
},
"customer": {
"address": "北京市朝阳区XX路XX号",
"mail": "support@your-domain.com",
"logo": "https://your-domain.com/logo-big.png",
"name": "XX科技有限公司",
"phone": "400-XXX-XXXX",
"www": "your-domain.com"
}
}
}
}根据业务需要隐藏不需要的界面元素:
{
"editorConfig": {
"customization": {
"about": false,
"feedback": false,
"goback": false,
"help": false,
"loaderLogo": "https://your-domain.com/loading-logo.png",
"loaderName": "正在加载文档...",
"features": {
"spellcheck": false
}
}
}
}建议:
spellcheck: false),避免不必要的红色波浪线干扰在政务或涉密网络环境中,网闸设备可能不允许WebSocket长连接通过。中国版高级版支持将 WebSocket 强制降级为长轮询:
{
"editorConfig": {
"customization": {
"polling": true
}
}
}降级后,协同编辑功能不受影响,只是通信方式从 WebSocket 切换为 HTTP 长轮询,上层业务完全无感知。这对于需要穿越网闸的政务和军工项目尤为重要。
中国版在官方社区版基础上,提供了一系列增强功能,可显著提升用户体验。
迷你工具栏是 WPS 风格的浮动工具栏,在用户选中文本时自动显示,提供快速的字体和段落格式化功能。
开启配置:
{
"editorConfig": {
"customization": {
"miniToolbar": true
}
}
}适用场景:
注意:该功能为高级版功能,需要额外授权
针对中文字体体积大、加载慢的问题,中国版提供了"本地字体"功能。通过智能裁剪 CJK 字体,仅保留排版计算需要的测量表,渲染时自动探测浏览器本地字体回落,可将字体加载体积减少 95%。
开启配置:
{
"editorConfig": {
"customization": {
"browserFonts": true
}
}
}效果对比:
对比项 | 优化前 | 优化后 |
|---|---|---|
中文字体下载(SimSun) | 18MB | 289KB |
打开时间 | 8~12s | 2~4s(速度提升 3~4 倍) |
完整字体目录 | 416MB | 21MB(减少 95%) |
注意:该功能为高级版功能,需要额外授权
在多人协作编辑 Excel 时,中国版支持"筛选仅对自己可见"功能,类似 WPS 的表格体验。不同用户可以在同一工作表设置不同的筛选条件,互不干扰。
开启配置:
{
"editorConfig": {
"customization": {
"privateView": true
}
}
}适用场景:
注意:该功能为高级版功能,需要额外授权
社区版 PPT 不支持播放视频,中国版对此做了能力增强,支持在编辑器中直接预览和播放 PPT 中插入的视频。
特性:
注意:该功能为高级版功能,需要额外授权
一个典型的文档编辑集成架构如下:

理解 OnlyOffice 的文档编辑保存机制是成功集成的关键:
开档流程:
document.key、document.url、权限等)document.url 下载原始文件,转换为中间格式保存流程:
{"error": 0} 确认处理成功回调接口示例(Node.js):
app.post("/onlyoffice/callback", async (req, res) => {
const { status, url, key, users } = req.body;
switch (status) {
case 1:
// 正在编辑中,有用户连接
console.log(`文档 ${key} 正在被编辑,用户: ${users}`);
break;
case 2:
// 文档已保存(所有用户退出编辑后触发)
// 下载最新文档并更新存储
await downloadAndSave(url, key);
console.log(`文档 ${key} 已保存`);
break;
case 6:
// 强制保存触发
await downloadAndSave(url, key);
console.log(`文档 ${key} 强制保存完成`);
break;
case 4:
// 关闭文档,无更改
console.log(`文档 ${key} 已关闭,无更改`);
break;
}
// 必须返回 {"error": 0}
res.json({ error: 0 });
});
async function downloadAndSave(fileUrl, docKey) {
const response = await fetch(fileUrl);
const buffer = await response.buffer();
// 根据 docKey 找到对应的文档记录
const doc = await findDocByKey(docKey);
// 将新文件保存到存储(OSS/本地)
await saveToStorage(doc.storagePath, buffer);
// 更新文档版本号
await updateDocVersion(doc.id);
}document.key 是 OnlyOffice 缓存机制的核心。关键规则:
推荐的 key 管理策略:
// 方式一:使用自增版本号
const key = `doc_${documentId}_v${versionNumber}`;
// 方式二:使用文件内容的 hash
const key = `doc_${documentId}_${fileContentHash}`;
// 方式三:使用时间戳(简单但不适合需要协同的场景)
const key = `doc_${documentId}_${lastModifiedTimestamp}`;核心原则:key 与文件内容严格对应。保存回调处理完成后,下次打开必须使用新的 key。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>文档编辑</title>
<!-- 引入 OnlyOffice API -->
<script src="http://your-ds-server:9000/web-apps/apps/api/documents/api.js"></script>
</head>
<body>
<div id="editor-container" style="width:100%;height:100vh;"></div>
<script>
// 从后端获取开档配置
async function openDocument(docId) {
const response = await fetch(`/api/documents/${docId}/editor-config`);
const config = await response.json();
// 初始化编辑器
const docEditor = new DocsAPI.DocEditor("editor-container", {
document: {
fileType: config.fileType,
key: config.key,
title: config.title,
url: config.fileUrl,
permissions: config.permissions
},
documentType: config.documentType, // word, cell, slide
editorConfig: {
callbackUrl: config.callbackUrl,
lang: "zh",
mode: config.mode, // edit 或 view
user: {
id: config.userId,
name: config.userName
},
customization: {
about: false,
feedback: false,
forcesave: true, // 支持手动保存
font: {
size: 14,
name: "SimSun"
}
}
},
events: {
onReady: function () {
console.log("编辑器加载完成");
},
onError: function (event) {
console.error("编辑器错误:", event.data);
}
}
});
}
// 页面加载时打开文档
const docId = new URLSearchParams(location.search).get("id");
if (docId) openDocument(docId);
</script>
</body>
</html>中国版保留了 adminpanel 管理面板功能(官方社区版自 9.3.0 已移除),提供图形化的配置管理界面。
docker exec ds-china sudo supervisorctl start ds:adminpanel首次启动后,在容器日志中会输出类似信息:
AdminPanel SETUP REQUIRED | Bootstrap code: IK6HKVU0YMB3 | Expires: ...浏览器访问 http://your-server-ip:9000/adminpanel,输入 Bootstrap code 完成初始化。
管理面板可以在图形界面中修改常用配置,免去直接编辑配置文件的麻烦。
在正式上线前,建议逐项检查:
--restart=always排查思路:
api.js 是否正确加载(检查网络请求)curl)排查思路:
callbackUrl 是否正确配置且可被容器访问forcesave(如需手动保存触发回调){"error": 0}排查思路:
document.keyOnlyOffice 中国版的企业级落地不仅仅是"把容器跑起来"这么简单。从部署到字体定制、性能优化、品牌个性化、业务集成,每一步都有需要注意的细节。
本文覆盖的核心环节:
阶段 | 核心任务 |
|---|---|
部署阶段 | Docker启动、参数配置、环境验证、子目录部署 |
字体定制 | 中文字体预置、自定义字体追加、默认字体设置、本地字体加速 |
性能加速 | 资源预加载、字体多域名并行、Nginx优化 |
品牌定制 | Logo替换、界面简化、加载页定制 |
功能增强 | 迷你工具栏、筛选对自己可见、PPT视频播放、长轮询降级 |
业务集成 | 开档配置、回调处理、key管理、前端嵌入 |
运维保障 | 管理面板、生产检查清单、问题排查思路 |
成功的文档编辑集成,需要的不是某一个环节的极致优化,而是全链路每个环节都做到位。希望本文能帮助你少走弯路,快速将 OnlyOffice 中国版落地到你的业务系统中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。