使用Docker部署NextCloud和Onlyoffice
使用Docker部署NextCloud和Onlyoffice
Nextcloud 是目前最流行的开源私有云盘方案,而 OnlyOffice 提供了强大的在线文档编辑能力。两者结合可以实现文档在线编辑和协作。
但在实际部署中,会遇到很多问题,本文记录部署过程和一些问题及解决方法。
环境准备
环境介绍
以下是我使用的硬件和软件情况
| 项目 | 版本 |
|---|---|
| 架构 | x64 |
| CPU核心 | 8核 |
| 内存 | 16G |
| 操作系统 | Linux(Fedora 43) |
| Docker | Docker version 29.5.3 |
| Docker Compose | Docker Compose version v5.1.4 |
硬件要求
| 项目 | 要求 |
|---|---|
| 内存 | 4G以上(推荐8G) |
| 磁盘 | 20G以上可用空间 |
使用镜像
| 服务 | 镜像 |
|---|---|
| Nextcloud | linuxserver/nextcloud:34.0.0 |
| onlyoffice | onlyoffice/documentserver:9.4.0.1 |
拉取镜像
可以先不用拉取镜像,使用compose部署会自动拉取
docker pull linuxserver/nextcloud:34.0.0
docker pull onlyoffice/documentserver:9.4.0.1
检查环境:
使用以下命令检查docker/docker compose
docker --v
docker compose version
输出版本即表示docker已安装,如果没有安装,需要安装一下可以参考Linux一键安装Docker。
文件准备
运行目录
安装nextcloud和onlyoffice之前,先创建运行目录
mkdir -p /data/container/nextcloud-onlyoffice && cd /data/container/nextcloud-onlyoffice
docker-compose.yml
vim docker-compose.yml
写入以下内容
services:
# ===== Nextcloud (linuxserver 镜像) =====
nextcloud:
image: linuxserver/nextcloud:34.0.0
container_name: nextcloud
restart: unless-stopped
ports:
- "8080:80"
- "8443:443" # HTTPS 端口(可选)
volumes:
- ./nextcloud/config:/config # Nextcloud 程序 + 配置
- ./nextcloud/data:/data # 用户数据
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
networks:
- 1panel-network
# ===== OnlyOffice Document Server =====
onlyoffice:
image: onlyoffice/documentserver:latest
container_name: onlyoffice
restart: unless-stopped
ports:
- "8090:80"
volumes:
- ./onlyoffice/data:/var/www/onlyoffice/Data
- ./onlyoffice/config:/etc/onlyoffice/documentserver
- ./onlyoffice/logs:/var/log/onlyoffice
- ./onlyoffice/fonts:/usr/share/fonts/truetype/custom
environment:
# ⭐ 关键:必须手动指定 JWT 密钥(否则重启后密钥变化导致连接断开)
- JWT_SECRET=${JWT_SECRET}
- JWT_HEADER=${JWT_HEADER}
- JWT_ENABLED=true
- ALLOW_PRIVATE_IP_ADDRESS=true
- TZ=${TZ}
networks:
- 1panel-network
# ==== 网络,我的redis和mysql使用1panel部署的,使用同一网络
networks:
1panel-network:
external: true
环境变量
vim .env
写入以下内容,按需修改
# ===== Nextcloud 配置 =====
# ===== 用户权限=====
PUID=1000
PGID=1000
# ===== OnlyOffice JWT 密钥(如果启用必须手动指定,否则容器重启后会重新生成导致连接断开)=====
JWT_SECRET=你的随机密钥至少32位
JWT_HEADER=AuthorizationJwt
# ===== 时区 =====
TZ=Asia/Shanghai
准备中文字体
onlyoffice缺少中文字体(应该是有的,但是仅仅能显示中文而已,常用的字体基本都没有)。准备字体文件,在 /data/container/nextcloud-onlyoffice目录下新建 onlyoffice/fonts目录(docker-compose.yml中指定的目录),将字体文件放在该目录
初始化
启动容器
完成compose和.env后,启动容器
docker compose up -d
等待容器创建并启动,如果前边没有拉取镜像,这里会自动拉取
初始化Nextcloud
初始化之前可以先配置以下域名,自行配置nginx代理(抽空补充)。
使用浏览器访问http://<your_ip>:<nextcloud_http_port>或者配置的域名,设置管理员用户名和密码,并输入数据库信息,这里使用MySQL/MariaDB(我只比较熟悉MySQL)数据库需要提前创建。如果数据库使用root用户,不提前创建也行,不过不能与已有数据库名重复。
等待初始化完成,会展示推荐的应用,直接跳过,随后再安装
集成onlyoffice
进入NextCloud后,点击头像 --> 应用,找到Office & Text,点一下Nextcloud Office,输入密码开始安装。

安装完成后点击头像 --> 管理设置,找到ONLYOFFICE,填写配置项,然后点保存即可。如果保存报错连接时发生异常 (文档服务内部发生异常: Error while downloading the document file to be converted.),可以查看配置可信域名
ONLYOFFICE Docs地址:http://<your_ip>:<onlyoffice_http_port> ## 或nginx配置的onlyoffice域名,如果要公网访问,必须使用域名或者有公网IP直接使用公网IP也行,推荐域名。如果只是局域网使用,ip:端口即可
秘钥: .env中设置的JWT_SECRET
授权标头: .env中设置的JWT_HEADER
服务器内部请求 ONLYOFFICE Docs 的地址: http://onlyoffice容器名
ONLYOFFICE Docs 内部请求服务器的地址: http://nextcloud容器名

完善配置
安装好之后,实际上使用过程中还会遇到一些问题,下面列出一些我遇到的问题及解决方案(有些其实也没有完全解决,也是能用就凑合着用了),还有一些优化的配置。
需要完善的配置有一些严重的问题需要解决,优化性质的就按需配置。下面分为严重和优化两类
缺陷
配置可信域名
Nextcloud 默认只允许初始化时的域名或 IP 访问,通过其他 IP 或域名访问时会提示"通过不受信任的域访问"。前边集成onlyoffice提到的报错其实也是这个原因。添加信任的域名即可。
方案一:通过occ命令添加
# 查看当前可信域名
docker exec nextcloud occ config:system:get trusted_domains
# 添加新的可信域名
docker exec nextcloud occ config:system:set trusted_domains 1 --value=cloud.example.com # nginx中配置的域名
docker exec nextcloud occ config:system:set trusted_domains 2 --value=nextcloud # nextcloud容器名
docker exec nextcloud occ config:system:set trusted_domains 2 --value=192.168.0.100 # nextcloud所在服务器的局域网IP
方案二:直接编辑配置文件
- 进入容器运行目录:
cd /data/container/nextcloud-onlyoffice
- 编辑配置文件
config.php:
vim nextcloud/config/www/nextcloud/config/config.php
- 按照下面的修改,把需要访问nextcloud
'trusted_domains' =>
array (
0 => 'cloud.example.com', // nginx中配置的域名
1 => 'nextcloud', // nextcloud容器名
2 => '192.168.0.100', // nextcloud所在服务器的局域网IP
),
添加后再使用trusted_domains中的域名或IP访问就不会报错了,onlyoffice的连接报错也解决了。