不想用 Office365 订阅?OnlyOffice 自托管在线协作 VPS 搭建

在 VPS 上用 Docker 跑 OnlyOffice,配 Nginx 反代+HTTPS,对接 Nextcloud/自建网盘做私有在线文档协作,讲清内存(4GB 起步)与端口。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用ARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?【VPS 硬件选型指南 (内存 篇) 02】大内存 VPS 能干嘛?2026 独立站 PCI-DSS 自查清单:SAQ A 还是 A-E

一、为什么要把在线 Office 搬到自己的 VPS 上

说起在线文档,大多数人第一反应是 Office365 或者谷歌文档。Office365 个人版年年续费,价格一年比一年离谱;谷歌文档免费但文档全躺在 Google 的服务器上,哪天账号被封、政策变动,你的合同和报表就悬了。更别说很多公司明令禁止把敏感文件传到第三方云。

自托管在线协作的本质,就是把编辑引擎和数据都留在你自己的机器上。好处很直接:第一,一次性部署,没有订阅费;第二,数据物理上归你,合规无忧;第三,可以和私有网盘(Nextcloud、OwnCloud)、甚至内网系统打通;第四,断外网也能用。对于个人博主、小团队、外贸公司,这是性价比最高的方案。

二、OnlyOffice 到底是个什么

OnlyOffice 是一套开源的在线办公套件,底层以 AGPLv3 协议发布,编辑器原生兼容 .docx、.xlsx、.pptx 这些 Office Open XML 格式,并且支持多人实时协作编辑。它和微软那套最大的区别是:你完全拥有它。

理解 OnlyOffice 要分清楚三个角色:Document Server 是真正的编辑与转换引擎,它没有自己的文件管理界面;连接器(Connector) 负责把它嵌进 Nextcloud、OwnCloud、WordPress、Seafile 等 40 多个平台;前端界面 则由 Nextcloud 或 OnlyOffice 自家的 DocSpace 提供。我们这篇要搭的核心,就是这个 Document Server 容器。

版本上,OnlyOffice 分 Community 和 Enterprise 两档。Community 版免费、基于 AGPLv3,官方建议并发连接数上限约 20;Enterprise 是付费商业版,解除并发限制并带商业支持。对个人和小团队来说,Community 版完全够用。到 2026 年 5 月,官方已经发布 Docs 9.4,带来许可证更新、表格深色模式等新特性。

常被拿来对比的是 Collabora Online。Collabora 同样开源,集成进 Nextcloud 也很成熟,但界面和 MS Office 差异更大、兼容性略逊;OnlyOffice 胜在界面更像 Office、docx 还原度高。内存吃紧又想极致省钱的人可以看看 Collabora,否则更推荐 OnlyOffice。

三、VPS 怎么挑,内存是命门

官方给出的硬指标是:双核 2GHz 以上 CPU、至少 4GB 内存、40GB 以上磁盘空闲、至少 4GB 的 swap 交换分区、amd64 或 arm64 架构的 Linux(内核 3.10 及以上)。注意,4GB 是底线不是舒适线。

实际跑起来,每打开一个文档、每多一个协作用户,内存就往上爬。官方排错文档里也明确写了:几十个活跃用户时,2 到 4GB 内存占用是正常现象。所以我的建议是:4GB 能跑但紧巴,8GB 才用得舒心。另外务必开 4GB 的 swap,文档转换(尤其是大 PPT、长 PDF)是 CPU 和内存双高负载,没有 swap 很容易 OOM 被系统杀掉。

2026 年这两家最适合自托管:Contabo 的 Cloud VPS S 仅 6.99 美元/月,给到 4 vCPU、8GB 内存、200GB 硬盘、32TB 流量,几乎是同价位的资源怪兽,跑 OnlyOffice 相当宽裕;RackNerd 的 4GB 套餐年付只要 43.88 美元(折合约 310 元/年),配置是 3 vCPU、4GB 内存、105GB、9TB 流量,刚好踩在最低要求线上,适合预算紧的个人玩家,而且支持支付宝。两家都是 KVM 虚拟化、给独立 IPv4。提醒一句:OnlyOffice 是 CPU 密集型应用,别贪便宜用 OpenVZ 或严重超售的 NAT 小机。

四、用 Docker 一把梭跑起来

最省事的方式就是 Docker。先装好 Docker 引擎,然后一条命令拉起:

sudo docker run -i -t -d -p 80:80 --restart=always   -e JWT_SECRET=你的强密钥 onlyoffice/documentserver

几个关键点:容器内 OnlyOffice 默认监听 80 端口,上面把它映射到主机的 80;如果你想和别的服务共存,可以改成 8080:80 之类。从 7.2 版本起,OnlyOffice 会随机生成 JWT 密钥,如果不手动指定,每次重启服务器密钥都会变,导致 Nextcloud 等集成全部失效,所以一定要用 -e JWT_SECRET 固定一个强随机串。纯测试图省事可以加 -e JWT_ENABLED=false 关掉鉴权,但生产环境千万别这么干。

为了升级不丢数据,强烈建议把数据挂到宿主机:

sudo docker run -i -t -d -p 80:80 --restart=always   -v /app/onlyoffice/logs:/var/log/onlyoffice   -v /app/onlyoffice/data:/var/www/onlyoffice/Data   -v /app/onlyoffice/lib:/var/lib/onlyoffice   -e JWT_SECRET=你的强密钥 onlyoffice/documentserver

启动后用 curl -I http://localhost 看到 HTTP 200,或浏览器打开 http://你的服务器IP 看到欢迎页,就说明引擎起来了。生产环境通常用 docker-compose 管理,把 nextcloud、数据库、onlyoffice、nginx 写在一个文件里,一条 up -d 全拉起,这里不展开。

五、配 Nginx 反代加 HTTPS

生产环境必须上 HTTPS。原因很简单:一来浏览器在 http 下会限制部分特性;二来 JWT token 明文传输等于没加密;三来你总不想文档地址是 http://1.2.3.4 这种裸 IP。

做法是在 VPS 上另起一个 Nginx,把子域名(比如 office.yourdomain.com,A 记录指向 VPS)反代到 OnlyOffice 容器。最关键的是WebSocket 支持,实时协作靠它传光标和变更,漏了就会“能打开但不能协同”。配置要点如下:

server {
    listen 443 ssl;
    server_name office.yourdomain.com;

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

    location / {
        proxy_pass http://127.0.0.1:80;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

证书用 certbot 申请 Let's Encrypt 免费证书即可。如果你的 OnlyOffice 容器直接暴露 80/443,也可以偷懒用官方自带的 LETS_ENCRYPT_DOMAIN 和 LETS_ENCRYPT_MAIL 环境变量让它自动签,但那会占用 80 端口,和上面的 Nginx 反代会冲突,二选一。

六、对接 Nextcloud 做私有网盘协作

光有编辑引擎不够,得有个地方管文件。Nextcloud 是开源私有网盘首选。进 Nextcloud 后台,应用市场里搜 ONLYOFFICE(在 Office 与文本分类下),下载并启用。

然后到管理设置里的 ONLYOFFICE 配置页:文档服务地址填 https://office.yourdomain.com,密钥填和容器里 JWT_SECRET 一模一样的串。如果你用了反代,还可以填一个“内部地址”让 Nextcloud 走内网访问 Document Server,避免回环抽风。保存后状态变绿就成功了。

测一下:在 Nextcloud 文件里点新建文档,输入几个字,再开个无痕窗口用另一个账号同时打开同一个文件,能看到对方光标在动,说明实时协作打通了。除了 Nextcloud,OnlyOffice 还能接 OwnCloud、Seafile、WordPress 等 40 多个平台,思路完全一致。

七、中文和字体这个大坑

新手十有八九会栽在字体上。官方镜像默认不带中文字体,你打开一份中文 docx,文字会变成方块或回退成难看的默认字形。解决办法是把字体文件挂进容器:

# 在宿主机准备好字体目录,放入 Windows 或 Mac 的 .ttf 字体
mkdir -p /app/onlyoffice/fonts
# 启动容器时挂载
docker run -d -p 80:80   -v /app/onlyoffice/fonts:/usr/share/fonts/truetype/custom   -e JWT_SECRET=你的强密钥 onlyoffice/documentserver
# 进容器刷新字体缓存
docker exec -it 容器名 fc-cache -fv

嫌拷字体麻烦,也可以在容器里直接 apt 装 fonts-noto-cjk 这类开源中文字体。注意别随便分发商业字体文件,有版权风险。顺带一提,PDF 表单、电子书转换也都依赖字体,这一步别省。

八、性能、排错与升级维护

内存占用和打开的文档数、并发用户数正相关,几十个活跃用户 2 到 4GB 很正常,不是泄漏。如果容器反复重启,先看 docker logs:最常见是内存不足被 OOM、80 端口被 Apache/Nginx 占着、或数据库初始化失败。文档打开后一直转圈加载不出来,多半是回环访问问题——服务器得能访问到自己,需要用 iptables 把公网 IP 转发到本地,或者 Nextcloud 的 trusted_domains 没把域名加进去。

转换失败(比如老 .doc、.ppt 报错)通常是磁盘满了或缺字体,看 /var/log/onlyoffice/documentserver/converter/out.log 排查。升级很简单,因为数据都在外挂卷里,直接 docker pull 新镜像再重启容器即可,数据不丢。备份就定期打包那几个挂载目录,外加 /var/lib/postgresql 里的数据库。

最后给个运维小建议:廉价 VPS 常常超售,建议装个 node_exporter 或最简的监控脚本,盯着内存和磁盘水位。一旦可用内存长期低于 500MB,就该考虑升配置或限制并发数了。另外把容器日志接进 logrotate,避免只有几 MB 的日志把小盘写满。做好这两点,这台私有文档服务器基本就能长期稳定运行。