使用 Docker 部署企业级在线办公套件——OnlyOffice Workspace

本文主要介绍使用 Docker 部署 OnlyOffice Workspace(包括 Community Server、Control Panel、Document Server) 的详细步骤。

OnlyOffice 版本:7.4.1(目前最新版本)

官网地址

前言

OnlyOffice Workspace 是一个开源免费的企业级办公套件,由文档服务(Document Server)、控制面板(Control Panel)、社区服务(Community Server)和邮件服务(Mail Server)四个组件构成,提供了文档管理、项目管理、成员、邮件、日历和推送等功能。支持私有化部署,企业内部使用,保证数据安全。

部署

本文不涉及邮件服务(Mail Server)的部署,如有需要,请参考官方部署文档

服务器要求

服务器空闲内存至少要 8GB,Community Server 服务依赖 Elasticsearch,内存不足会导致 Elasticsearch 服务启动失败。本人实际搭建 OnlyOffice Workspace,内存总共消耗 10GB 左右。

配置
CPU 最低 4 核,推荐 6 核
内存 最低 8GB,推荐 12GB
磁盘 40 GB
操作系统 Linux amd64 架构,内核 3.10 版本及之后版本

创建网络

lua 复制代码
docker network create --driver bridge onlyoffice

MySQL

  1. 创建挂载目录。
arduino 复制代码
sudo mkdir -p "/app/onlyoffice/mysql/conf.d";
sudo mkdir -p "/app/onlyoffice/mysql/data";
sudo mkdir -p "/app/onlyoffice/mysql/initdb";
  1. 创建配置文件。
ini 复制代码
echo "[mysqld]
sql_mode = 'NO_ENGINE_SUBSTITUTION'
max_connections = 1000
max_allowed_packet = 1048576000
group_concat_max_len = 2048" > /app/onlyoffice/mysql/conf.d/onlyoffice.cnf
  1. 创建脚本文件。
scss 复制代码
echo "ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'my-secret-pw';
CREATE USER IF NOT EXISTS 'onlyoffice_user'@'%' IDENTIFIED WITH mysql_native_password BY 'onlyoffice_pass';
CREATE USER IF NOT EXISTS 'mail_admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Isadmin123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'onlyoffice_user'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'mail_admin'@'%';
FLUSH PRIVILEGES;" > /app/onlyoffice/mysql/initdb/setup.sql
  1. 启动容器,映射端口可以根据情况调整。
ini 复制代码
sudo docker run --net onlyoffice -i -t -d -p 3306:3306 --restart=always --name onlyoffice-mysql-server \
-v /app/onlyoffice/mysql/conf.d:/etc/mysql/conf.d \
-v /app/onlyoffice/mysql/data:/var/lib/mysql \
-v /app/onlyoffice/mysql/initdb:/docker-entrypoint-initdb.d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-e MYSQL_DATABASE=onlyoffice \
mysql:8.0.29

Document Server

Document Server (6.0 版本之后更名为 OnlyOffice Docs)是一个功能强大的在线文档编辑和协作平台,允许用户在 Web 浏览器中操作各种文档(Word、Excel、PPT 等)。支持单独部署,集成到已有项目中。

  • 支持多种文档格式,如 .docx、.xlsx、.pptx 等。
  • 支持同一文档实时协作与共享,多个用户可以同时编辑文档。
  • 支持私有化部署,相比市面上的在线文档,用户能够完全掌控数据安全,实现自主托管和数据隐私控制。
  1. 创建挂载目录。
arduino 复制代码
sudo mkdir -p "/app/onlyoffice/DocumentServer/data";
sudo mkdir -p "/app/onlyoffice/DocumentServer/logs";
  1. 启动容器。JWT_SECRET用来配置密钥。
bash 复制代码
sudo docker run --net onlyoffice -i -t -d --restart=always --name onlyoffice-document-server  -e JWT_SECRET=my_jwt_secret  \
-v /app/onlyoffice/DocumentServer/logs:/var/log/onlyoffice  \
-v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data  \
-v /app/onlyoffice/DocumentServer/fonts:/usr/share/fonts/truetype/custom \
-v /app/onlyoffice/DocumentServer/forgotten:/var/lib/onlyoffice/documentserver/App_Data/cache/files/forgotten onlyoffice/documentserver

Control Panel

Control Panel 提供了丰富的功能用来快速配置和管理 Workspace,包括 LDAP 和 SSO 配置、HTTPS 配置、查看登陆日志和用户操作日志等功能。

  1. 创建挂载目录
arduino 复制代码
sudo mkdir -p "/app/onlyoffice/ControlPanel/data";
sudo mkdir -p "/app/onlyoffice/ControlPanel/logs";
  1. 启动容器
ini 复制代码
docker run --net onlyoffice -i -t -d --restart=always --name onlyoffice-control-panel -v /var/run/docker.sock:/var/run/docker.sock -v /app/onlyoffice/CommunityServer/data:/app/onlyoffice/CommunityServer/data -v /app/onlyoffice/ControlPanel/data:/var/www/onlyoffice/Data -v /app/onlyoffice/ControlPanel/logs:/var/log/onlyoffice onlyoffice/controlpanel

Community Server

Community Server是一个开源的协作平台,包括文档管理、项目管理、邮件管理、成员管理等功能。

  1. 创建挂载目录。
arduino 复制代码
sudo mkdir -p "/app/onlyoffice/CommunityServer/data";
sudo mkdir -p "/app/onlyoffice/CommunityServer/logs";
sudo mkdir -p "/app/onlyoffice/CommunityServer/letsencrypt";
  1. 启动容器。配置信息可以根据情况调整(映射端口,MySQL 配置信息)
ini 复制代码
sudo docker run --net onlyoffice -i -t -d --privileged --restart=always --name onlyoffice-community-server -p 9101:80 -p 5222:5222 --cgroupns=host \
 -e MYSQL_SERVER_ROOT_PASSWORD=my-secret-pw \
 -e MYSQL_SERVER_DB_NAME=onlyoffice \
 -e MYSQL_SERVER_HOST=onlyoffice-mysql-server \
 -e MYSQL_SERVER_USER=onlyoffice_user \
 -e MYSQL_SERVER_PASS=onlyoffice_pass \
 -e DOCUMENT_SERVER_PORT_80_TCP_ADDR=onlyoffice-document-server \
 -e CONTROL_PANEL_PORT_80_TCP=80 \
 -e CONTROL_PANEL_PORT_80_TCP_ADDR=onlyoffice-control-panel \
 -v /app/onlyoffice/CommunityServer/data:/var/www/onlyoffice/Data \
 -v /app/onlyoffice/CommunityServer/logs:/var/log/onlyoffice \
 -v /app/onlyoffice/CommunityServer/letsencrypt:/etc/letsencrypt \
 -v /sys/fs/cgroup:/sys/fs/cgroup:rw \
 onlyoffice/communityserver
  1. 服务正常启动,会自动创建名为 onlyoffice 的数据库并生成所需的表,过程需要耗费一段时间。

页面

浏览器访问ip:9101,填写用户名、密码和邮箱注册登录。登录成功后首页如下所示。至此 OnlyOffice Workspace 搭建成功。

Vue 集成 Document Server

  1. public/index.html文件中添加如下命令。IP:端口 为 Document Server 服务的地址。
xml 复制代码
<script type="text/javascript" src="http://IP:端口/web-apps/apps/api/documents/api.js"></script>
  1. 新增 OnlyOffice 组件。jsonwebtoken依赖安装:npm install --save jsonwebtoken@8.5.1
xml 复制代码
<template>
  <div>
    <div id='OnlyOffice'></div>
  </div>
</template>
​
<script>
import jwt from 'jsonwebtoken'
export default {
  name: 'OnlyOffice',
  props: {
    option: {
      type: Object,
      default: () => {
        return {}
      },
    },
  },
  data() {
    return {
      doctype: '',
      docEditor: null,
    }
  },
  mounted() {
    if (this.option.url) {
      this.setEditor(this.option)
    }
  },
  methods: {
    // 用于初始化编辑器。参数 option,包含编辑器的各种配置选项。
    async setEditor(option) { 
      if (this.docEditor !== null) {
        this.docEditor.destroyEditor();
        this.docEditor = null;
      }
      this.doctype = this.getFileType(option.fileType)
      const document = {
        fileType: option.fileType,      // 文档类型
        key: option.key || '',          // 唯一值
        title: option.title,            // 文件名称
        permissions: {                  
          edit: option.isEdit,          // 是否可以编辑
          print: option.isPrint,
          download: option.isDownload,
          fillForms: true,              // 是否可以填写表格
          review: true                  // 跟踪变化
        },
        url: option.url                // 指定需打开加载文档的URL
      }
​
      const editorConfig = {
        callbackUrl: option.callbackUrl, // 编辑word后保存时回调的地址,这个回调用于后端接收你改变后的数据
        lang: option.lang,              // 语言设置
        chat: {
          autosave: true,              // 是否自动保存
          chat: false,
          comments: false,
          help: false,
          //是否显示插件
          plugins: false,
        },
        user: {   // 用户信息
          id: option.user.id,
          name: option.user.name
        },
        mode: option.model ? option.model : 'edit',
      }
​
      const tokenInfo = {
        'document':document,
        'editorConfig': editorConfig 
      }
​
      const config = {
        document: document,
        documentType: this.doctype,
        editorConfig: editorConfig,
        events: {
          onAppReady: this.onAppReady,   // 应用程序被加载到浏览器中。
          onDocumentStateChange: this.onDocumentStateChange,        //文档被修改。
        },
        width: '100%',          // 定义浏览器窗口中的档高度(默认为 100%)。
        height: '800px',        // 定义浏览器窗口中的文档宽度(默认为 100%)。
        token: jwt.sign( tokenInfo , "my_jwt_secret", { expiresIn: '3h' })
      }
      console.log('config', config)
      this.docEditor = new DocsAPI.DocEditor('OnlyOffice', config)
    },
    // 当文档被修改后调用
    onDocumentStateChange(event) { 
      console.log(event)
    },  
    /* OnlyOffice 编辑器加载完成后调用 */
    onAppReady() {
       // 创建connector连接器
      this.connector = this.docEditor.createConnector(); 
      console.log(this.docEditor, '创建connector连接器');
    },
​
    /* getFileType 方法用于根据文件类型(fileType)返回对应的文档类型(docType) */
    getFileType(fileType) {
      let docType = ''
      let fileTypesDoc = [
        'doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'epub', 'fodt', 'htm', 'html', 'mht', 'odt', 'ott', 'pdf', 'rtf', 'txt', 'djvu', 'xps', 'word',
      ]
      let fileTypesCsv = [
        'csv', 'fods', 'ods', 'ots', 'xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx',
      ]
      let fileTypesPPt = [
        'fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx',
      ]
      if (fileTypesDoc.includes(fileType)) {
        docType = 'text'
      }
      if (fileTypesCsv.includes(fileType)) {
        docType = 'spreadsheet'
      }
      if (fileTypesPPt.includes(fileType)) {
        docType = 'presentation'
      }
      return docType
    }
  },
  watch: {
    option: {
      handler: function (n) {
        this.setEditor(n)
        this.doctype = this.getFileType(n.fileType)
      },
      deep: true,
    },
  },
}
</script>
  1. 使用组件
xml 复制代码
<template>
  <div>
    <only-office :option="option"></only-office>
  </div>
</template>
​
<script>
import OnlyOffice from '@/components/OnlyOffice'
export default {
    data() {
        return {
            option: {
                url: 'http://ip:端口/aa.xlsx',  // 文档访问地址
                callbackUrl:'',     // 关闭文档后会调用callbackurl地址进行文档保存
                fileType: 'xlsx',   // 文件扩展名 
                key: '2222',        // key 不能为空
                title: 'Vue集成',  // 文档文件名   
                isEdit: true,         // 是否可以编辑
                isDownload:true,      // 是否可以下载 
                lang: 'zh-CN',        // 语言:zh-CN简体中文/en英文           
                isPrint: true,        // 是否可以导出                                                 
                user: {               // 文档作者信息
                  id: 666, 
                  name: 'Cleaner'
                }
            }                                    
        }
    }
}
</script>

问题

梳理部署和使用 OnlyOffice Worksapce 过程中出现的问题,希望对大家有所帮助,如果你遇到了其他问题,欢迎留言讨论,建议大家多查看 Github Issues。

Community Server 启动失败

Community Server 容器内部依赖于许多其他三方服务(如 Nginx、Elasticsearch、MySQL 等)。服务启动失败时,可以通过查看容器日志或者进入容器内部查看依赖服务的状态来定位问题。

  1. 服务器内存不足,Elasticsearch 服务启动失败:扩充服务器内存。
  2. MailAggregator、MailWatchdog 服务启动失败:容器启动命令中 MySQL 的配置信息有误,检查 MySQL 用户名密码等配置信息。

文档安全令牌未正确形成

原因:OnlyOffice 从 7.2 版本开始,加入了 JWT 验证。Document Server 和 Community Server 加密和验证时密钥不一致。解决方案有两个:一、更换 OnlyOffice 版本为 7.1,二、在 Community Server 中加入 secret 配置。

  1. 进入 Document Server 容器,查看/etc/onlyoffice/documentserver/local.json文件中 secret 的配置信息。

    json 复制代码
    "secret": {
        "inbox": {
            "string": "my_jwt_secret"
        },
        "outbox": {
            "string": "my_jwt_secret"
        },
        "session": {
            "string": "my_jwt_secret"
        }
    }
  2. 进入 Community Server 容器中,编辑/var/www/onlyoffice/WebStudio/web.appsettings.config配置文件。找到如下配置信息并修改。

    ini 复制代码
    <add key="files.docservice.secret" value="my_jwt_secret" />
    <add key="files.docservice.secret.header" value="Authorization" />
  3. 重启 Community Server 容器

    bash 复制代码
    docker restart 容器id

末尾

如果本文对你有帮助的话,欢迎 点赞 + 收藏 ,非常感谢!

我是 Cleaner,我们下期再见~

相关推荐
伏虎山真人18 分钟前
开源数据库 - mysql - mysql-server-8.4(gtid主主同步+ keepalived热切换)部署方案
数据库·mysql·开源
2401_8576363918 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
小牛itbull3 小时前
ReactPress:构建高效、灵活、可扩展的开源发布平台
react.js·开源·reactpress
IT规划师4 小时前
开源 - Ideal库 - 常用枚举扩展方法(一)
开源·c#·.net core·ideal库·枚举转换
2401_857610035 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫5 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
OpenI启智社区5 小时前
共筑开源技术新篇章 | 2024 CCF中国开源大会盛大开幕
人工智能·开源·ccf中国开源大会·大湾区
AI服务老曹5 小时前
建立更及时、更有效的安全生产优化提升策略的智慧油站开源了
大数据·人工智能·物联网·开源·音视频
颜淡慕潇6 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决