使用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,输入密码开始安装。

image-1781780249813.png

安装完成后点击头像 --> 管理设置,找到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容器名

image-1781780416207.png

完善配置

安装好之后,实际上使用过程中还会遇到一些问题,下面列出一些我遇到的问题及解决方案(有些其实也没有完全解决,也是能用就凑合着用了),还有一些优化的配置。

需要完善的配置有一些严重的问题需要解决,优化性质的就按需配置。下面分为严重和优化两类

缺陷

配置可信域名

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
方案二:直接编辑配置文件
  1. 进入容器运行目录:
cd /data/container/nextcloud-onlyoffice
  1. 编辑配置文件 config.php:
vim nextcloud/config/www/nextcloud/config/config.php
  1. 按照下面的修改,把需要访问nextcloud
'trusted_domains' => 
  array (
    0 => 'cloud.example.com', // nginx中配置的域名
    1 => 'nextcloud', // nextcloud容器名
    2 => '192.168.0.100', // nextcloud所在服务器的局域网IP
  ),

添加后再使用trusted_domains中的域名或IP访问就不会报错了,onlyoffice的连接报错也解决了。