基于 NextCloud + OnlyOffice 搭建协同编辑平台

I. 技术架构

Office 协同编辑平台基于 OnlyOffice 和 NextCloud 搭建。 OnlyOffice 提供 Office 文档协同编辑能力(文件同步服务),NextCloud 提供多账户的文件管理能力(文件管理服务)。

II. 搭建平台说明

为避免繁琐的依赖安装与环境配置,平台基于 Docker 搭建,宿主机为 CentOS 7 服务器(内核版本 Linux 5.4.275-1.el7.elrepo.x86_64),以下为建议配置。

操作系统 内核版本 磁盘容量 内存大小 CPU Docker 版本
CentOS 7 5.4.275 > 100G > 4G > 8 Core 23.0.2

III. 搭建步骤

3.1 Docker 安装

为避免繁琐的环境配置,建议采用 Docker 的方式安装 MySQL。本章节介绍 Docker 的离线安装方式,具体步骤如下:

Step1. 下载 Docker 安装包 【docker-23.0.2.tgz】 并解压到服务器本地

1
2
sudo tar -xvf docker-3.0..tar
sudo mv docker/* /usr/bin/

Step2. 将 Docker 注册为 Service

  • 将以下内容保存为 docker.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
  • docker.service 注册为系统服务
1
2
sudo chmod +x /etc/systemd/system/docker.service
sudo systemctl daemon-reload

Step3. 启动 Docker 服务并验证

1
2
sudo service docker restart
sudo docker -v

3.2 镜像下载与容器启动

3.2.1 镜像下载

镜像名称 镜像说明
OnlyOffice Document Server 7.1 提供协同编辑服务
MySQL 8.0.25 为 NextCloud 提供元数据存储服务
NextCloud 23.0.0 提供多账户文件管理服务

下载上述镜像,并导入为本地 Docker 镜像

1
2
3
sudo docker pull onlyoffice-doc-server:7.1
sudo docker pull mysql:8.0.25
sudo docker pull nextcloud

3.2.2 容器创建与启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 创建挂载目录
sudo mkdir -p "/data/mysql/conf.d";
sudo mkdir -p "/data/mysql/data";
sudo mkdir -p "/data/onlyoffice/DocumentServer/data";
sudo mkdir -p "/data/onlyoffice/DocumentServer/logs";
sudo mkdir -p "/data/nextcloud";

# 创建 docker 网络
sudo docker network create --driver bridge onlyoffice

# 创建 OnlyOffice Document Server 容器
sudo docker run --net onlyoffice -i -t -d -p 4015:80 --restart=always --name onlyoffice-document-server \
-v /data/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \
-v /data/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \
-v /data/onlyoffice/DocumentServer/fonts:/usr/share/fonts/truetype/custom \
-v /data/onlyoffice/DocumentServer/forgotten:/var/lib/onlyoffice/documentserver/App_Data/cache/files/forgotten \
onlyoffice/documentserver:7.1

# 自定义 MySQL 配置
echo "[mysqld]
skip_host_cache
skip-name-resolve = 1
sql_mode = 'NO_ENGINE_SUBSTITUTION'
max_connections = 1000
max_allowed_packet = 1048576000
group_concat_max_len = 2048" > /data/mysql/conf.d/onlyoffice.cnf

# 创建 MySQL 容器
sudo docker run --name mysql --net onlyoffice -i -t -d -p 3306:3306 --restart=always \
-v /data/mysql/conf.d:/etc/mysql/conf.d \
-v /data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=${root-password} \
mysql:8.0.25

# 进入 MySQL 容器
sudo docker exec -it mysql /bin/bash
# 登录
mysql -uroot -p
# 输入 MySQL root 账户密码
${root-password}
# 配置 MySQL 允许远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
# 创建 nextcould 数据库
CREATE DATABASE IF NOT EXISTS nextcould DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
# 退出 (CTRL+P+Q)

# 创建 NextCloud 容器
sudo docker run -d --net onlyoffice \
-v /data/nextcloud/html:/var/www/html \
-v /data/nextcloud/apps:/var/www/html/custom_apps \
-v /data/nextcloud/config:/var/www/html/config \
-v /data/nextcloud/nextcloud/data:/var/www/html/data \
-v /data/nextcloud/themes:/var/www/html/themes \
-p 4000:80 --name nextcloud --restart="always" nextcloud

3.3 NextCloud 平台配置

3.3.1 数据库连接配置

访问 http://${server-ip}:4000,进入 NextCloud 首页配置管理员账户与数据库。由于 mysql 与 nextcloud 容器处于同一 docker 网络 onlyoffice 下,数据库主机可填写为容器名+端口号,即:mysql:3306

img

3.3.2 OnlyOffice 插件安装

NextCloud 本身是多账户网盘平台,为了实现对于 Office 文件的协同编辑,需要借助 OnlyOffice 提供的协同编辑能力,因此需要在 NextCloud 上安装 OnlyOffice 应用插件并做简要配置,用户可在【应用管理】页面在线下载安装插件。

下面介绍离线安装 OnlyOffice 插件的方式。

Step1. 进入 NextCloud Apps 下载与当前 NextCloud 版本对应的 OnlyOffice 插件

Step2. 解压到 NextCloud 应用插件目录,由于创建容器时做了目录挂载,解压到绑定的宿主机目录即可

1
2
sudo tar zxvf onlyoffice-nextcloud-23.tar.gz
sudo mv onlyoffice/ /data/nextcloud/apps

Step3. 配置 OnlyOffice 插件。无需重启 NextCloud 容器,登录管理员账号后进入【应用】管理,启用并配置 OnlyOffice 服务地址为服务器地址:端口号,如下图所示。

img

3.3.3 Registration 插件安装

NextCloud 默认不支持外部用户注册,若要允许用户注册,可在 NextCloud 上安装 Registration 应用插件并做简要配置。用户可在【应用管理】页面在线下载安装插件。

下面介绍离线安装 Registration 插件的方式。

Step1. 进入 NextCloud Apps 下载与当前 NextCloud 版本对应的 Registration 插件

Step2. 解压到 NextCloud 应用插件目录,由于创建容器时做了目录挂载,解压到绑定的宿主机目录即可

1
2
sudo tar zxvf registration-v1.5.0.tar.gz
sudo mv registration/ /data/nextcloud/apps

Step3. 配置 Registration 插件。无需重启 NextCloud 容器,登录管理员账号后进入【应用】管理,启用并配置 Registration 插件。

IV. OnlyOffice 添加中文字体支持

OnlyOffice 中文字体库不全,需要手动安装,将字体文件(格式为 .ttf)移动到 OnlyOffice 自定义字体目录下并重新编译。

注:请先将字体文件放置到服务器目录 ./fonts

1
2
3
4
sudo mv ./fonts/* /data/onlyoffice/DocumentServer/fonts/
# 进入 OnlyOffice Document Server 容器
sudo docker exec -it onlyoffice-document-server /bin/bash
sudo /usr/bin/documentserver-generate-allfonts.sh

V. 其他说明

[1] CentOS 服务器内核版本不能过低,建议在 5.4.275 以上,否则 NextCloud 容器可能无法启动,原因为:Linux 低内核版本不支持 clone3 等 NextCloud 依赖的指令。

[2] NextCloud 插件下载地址:http://apps.nextcloud.com,注意选择与 NextCloud 软件版本匹配的插件安装包,本教程基于 NextCloud 23.0.0 搭建。

[3] 注意将容器搭建在同一 Docker 网络下,便于容器间的相互访问

[4] 本教程基于 OnlyOffice Document Server 7.1 搭建,对于 7.2 及以上的版本,OnlyOffice 提供了 JWT_SECRET 支持,建议关闭(创建容器时添加参数 --JWT_SECRET_ENABLED=false)