部署Nextcloud与Onlyoffice(二)安装Onlyofiice

目录

概述

  1. Nextcloud与Onlyoffice主要解决公司内部文档存储与在线编辑问题,部署过程中涉及的问题比较多,故整理部署过程如下。
  2. 受限时间,只做了基础单点部署,后续有时间尝试Nextcloud与Onlyoffice的集群模式(主要解决Onlyoffice的多节点之间状态同步问题)

参考

  1. github: ONLYOFFICE/Docker-DocumentServer
  2. Onlyoffice 文档
  3. 配置 ONLYOFFICE 文档社区版

限制

  1. Onlyoffice社区版本有最大并发编辑20的限制,意味着最大只能有20个人同时编辑同一文件或20个不同文件。超过20数量后,多余人员只能读取,不能修改。
  2. 此限制会影响用户体验。目前查阅的可能解决的方案有两种(待测试):
    • 自行编译Onlyoffice的DocService服务,修改配置文件,加大20限制数量。
    • 使用s3外部对象存储,将多个Onlyoffice服务变成无状态服务,突破单节点20的限制。

环境

  1. 虚拟机

    • 8C/32G/200G 192.168.16.41 主节点
    • 8C/32G/200G 192.168.16.51 冷备节点
  2. 操作系统

    Ubuntu24.04

  3. 数据库

    • 172.28.3.12 主MySQL 8.4.8 和Redis 7.2.5
    • 172.28.3.6 从MySQL 8.4.8 和Redis 7.2.5
  4. 对象存储(本例未使用,待后续测试)

    • Minio集群(因Minio社区版已进入维护期,后续考虑替换其它对象存储)
  5. 容器

    • docker

安装服务

Onlyoffice安装步骤

  1. 创建外部数据库
  2. 创建外部rabbitmq
  3. 使用docker启动服务,服务使用外部数据库和对象存储

创建数据库

  1. 172.28.3.12和172.28.3.6服务器上预装好MySQL8.4.8和Redis7.2.5
  2. 172.28.3.12上MySQL数据库创建nextcloud数据库
sql 复制代码
CREATE DATABASE IF NOT EXISTS onlyoffice DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
sql 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| nextcloud          |
| onlyoffice         |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

创建目录

  1. Onlyoffice使用docker容器运行,宿主机需预创建挂载目录和自定义配置文件存储目录
  2. 目录结构如下
bash 复制代码
root@192-168-016-021:/public/application/nextcloud# tree -L 1
.
├── cache
├── custom_config
├── data
├── documentserver-example
├── fonts
├── log
└── rabbitmq
  • cache: onlyoffice的本地缓存文件目录
  • custom_config: onlyoffice官方支持自定义配置文件目录
  • data:onlyoffice的数据目录
  • docker-compose.yml:docker compose文件
  • fonts: onlyoffice字体目录
  • log:onlyoffice日志目录
  • rabbitmq:rabbitmq本地目录

创建docker-compose文件

  1. 配置项说明:

    • 因为使用专用虚拟机运行nextcloud和onlyoffice,所以docker直接使用host网络模式,提升性能
    • onlyoffice使用当前最新版镜像onlyoffice/documentserver:9.3.1
    • 使用外部MySQL数据库,便于提升性能和冷热备份。
    • 使用外部Redis数据库,便于提升性能和冷热备份,如果高负载请按官方建议使用Redis集群
    • 使用外部Rabbitmq,支持仲裁队列,后续可以升级为3节点
    • 定义了JWT配置,Nextcloud集成onlyoffice插件时需要与之匹配
    • Rabbitmq定义了与宿主机相同的hostname(192-168-016-041.host.xk.in,这个内部域名已解析),并且使用了docker的host网络模式,为了方便rabbitmq集群节点间通讯。
    • 服务相关配置,详见 docker-compose.yml中的说明
  2. docker-compose.yml

yaml 复制代码
services:
  onlyoffice-documentserver:
    #build:                                         # 如果需要从本地构建可以下载官方Dockerfile文件
    #  context: .

    image: onlyoffice/documentserver:9.3.1
    container_name: onlyoffice-documentserver
    restart: always

    network_mode: host                              # host模式,提升网络性能
    #ports:
    #  - '9000:80'
    #  - '443:443
    
    # 新增:永久绑定域名到本机或内网Nginx负载均衡 IP(内网用)
    extra_hosts:
      - "cloud.xk.com:127.0.0.1"     # 绑定本机IP,使用本机服务
      - "office.xk.com:127.0.0.1"    # 绑定本机IP,使用本机服务

    depends_on:
      onlyoffice-rabbitmq:
        condition: service_healthy

    # 官方文档:https://github.com/ONLYOFFICE/Docker-DocumentServer?tab=readme-ov-file#available-configuration-parameters
    environment:
      # 外部 Mysql
      - DB_TYPE=mysql
      - DB_HOST=nextcloud.mysql.xk.in
      - DB_PORT=3306
      - DB_NAME=onlyoffice
      - DB_USER=root
      - DB_PWD=Kx0000xK

      # 外部 Rabbitmq 
      - AMQP_URI=amqp://admin:Kx0000xK@onlyoffice.mq.xk.in

      # 外部 Redis 配置
      - REDIS_SERVER_HOST=onlyoffice.redis.xk.in   		# Redis 主机
      - REDIS_SERVER_PORT=6379                        # Redis 端口
      - REDIS_SERVER_PASS=Kx0000xK               			# Redis 密码
      - REDIS_SERVER_DB=2                             # 使用db 2(区别nextcloud)

      # 开启JWT核心配置(必须)
      - JWT_ENABLED=true                              # 启用 JWT
      - JWT_SECRET=7e9f2b7aasdfassdferweerqwre8e9f0a1bef   # 替换为你的密钥(如:7e9f2b7aasdfassdferweerqwre8e9f0a1bef)
      - JWT_HEADER=AuthorizationJwt                   # 从请求头读取密钥 (标准做法)
      #- JWT_HEADER=Authorization                     # 从请求头读取密钥 (标准做法)
      - JWT_IN_BODY=false                             # 关闭在 Body 中查找密钥,避免冲突
      - JWT_EXPIRATION_TIME=12h                       # JWT 令牌(Token)的有效期,默认值1h

      # 内网互通 (必须,因为 NextCloud 和 OnlyOffice 都在内网)
      - ALLOW_PRIVATE_IP_ADDRESS=true            # 允许 OO 回调内网 NC 地址
      - USE_UNAUTHORIZED_STORAGE=false           # NC 证书是有效的;若使用自签名则改为 true(不验证签名)
      
    volumes:
      - /public/application/onlyoffice/data:/var/www/onlyoffice/Data
      - /public/application/onlyoffice/log:/var/log/onlyoffice
      - /public/application/onlyoffice/cache:/var/lib/onlyoffice/documentserver/App_Data/cache/files

      - /public/application/onlyoffice/documentserver-example:/var/www/onlyoffice/documentserver-example/public/files
      - /public/application/onlyoffice/fonts:/usr/share/fonts
      # 挂载宿主机时区文件
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      # 挂载自定义配置文件(使用仲裁队列)启动之前,要先删除MQ中已创建的同名经典队列 
      - /public/application/onlyoffice/custom_config/local-production-linux.json:/etc/onlyoffice/documentserver/local-production-linux.json
       

    # 传统模式:内存硬限制
    mem_limit: 8G
    # 传统模式:内存预留
    mem_reservation: 4G
    ulimits:                  # 增大容器内文件句柄数量,默认是1024
      nofile:
        soft: 65535
        hard: 65535

    stdin_open: true
    stop_grace_period: 60s

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/healthcheck"]   # 官方健康检查接口 http://localhost/healthcheck
      interval: 30s
      retries: 5
      start_period: 60s
      timeout: 10s
     

  onlyoffice-rabbitmq:
    image: rabbitmq:4.1.4-management
    container_name: onlyoffice-rabbitmq
    hostname: 192-168-016-041.host.xk.in         # 定义与宿主机一致,为了方便内部DNS解析

    network_mode: host                              # host模式,提升主从复制性能

    environment:
      - RABBITMQ_USE_LONGNAME=true                  # 强制开启长节点名(FQDN)
      - RABBITMQ_DEPRECATED_FEATURES_PERMIT_MANAGEMENT_METRICS_COLLECTION=false  # 消除未来会废弃的指标收集功能
      #- RABBITMQ_DEPRECATED_FEATURES_PERMIT_MANAGEMENT_METRICS_COLLECTION=true
      - RABBITMQ_ERLANG_COOKIE=kx0000xk&kx0000xk     # 集群密钥,所有节点必须一致
      - RABBITMQ_DEFAULT_USER=admin                 # 管理界面用户名
      - RABBITMQ_DEFAULT_PASS=Kx0000xK              # 管理界面密码
    volumes:
      - /public/application/onlyoffice/rabbitmq:/var/lib/rabbitmq
      # 挂载宿主机时区文件
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro

    # 传统模式:内存硬限制
    mem_limit: 8G
    # 传统模式:内存预留
    mem_reservation: 4G        
    ulimits:                  # 增大容器内文件句柄数量,默认是1024
      nofile:
        soft: 65535
        hard: 65535

    restart: always

    #expose:
    #  - '5672'
    #  - '15672'
    #  - '25672'
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "ping"]
      interval: 10s
      retries: 3
      start_period: 10s
      timeout: 10s

自定义配置文件

local-production-linux.json(文件名不能改)

  1. 创建自定配置文件,增加rabbitmq使用仲裁队列(quorum)的配置,支持RabbitMQ 4.0+版本
    官方社区:issue-setting-prefix-jwt-in-local-json
    官方社区:docker-relation-between-default-json-and-local-json
    官方文档:docs-community-configuring
bash 复制代码
vim /public/application/onlyoffice/custom_config/local-production-linux.json
bash 复制代码
{
  "services": {
    "CoAuthoring": {
      "server": {
        "limits_tempfile_upload": 524288000
      }
    }
  },
  "FileConverter": {
    "converter": {
      "maxDownloadBytes": 524288000,
      "inputLimits": [
        {
          "type": "docx;dotx;docm;dotm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        },
        {
          "type": "xlsx;xltx;xlsm;xltm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        },
        {
          "type": "pptx;ppsx;potx;pptm;ppsm;potm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        },
        {
          "type": "vsdx;vstx;vssx;vsdm;vstm;vssm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        }
      ]
    }
  },
  "rabbitmq": {
    "queueconverttask": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    },
    "queueconvertresponse": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    },
    "queueconvertdead": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    },
    "queuedelayed": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    }
  }
}

自定义配置说明

  1. 官方docker-compose.yml文件使用的是rabbitmq3,队列是经典队列。rabbitmq从4.0+版本启用了仲裁队列,支持集群。本例中使用了rabbitmq:4.1.4-management,支持web页面管理,同时方便后续搭建集群或升级。
bash 复制代码
{
  "rabbitmq": {
    "queueconverttask": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    },
    "queueconvertresponse": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    },
    "queueconvertdead": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    },
    "queuedelayed": {
      "options": {
        "arguments": {
          "x-queue-type": "quorum"
        }
      }
    }
  }
}
  1. 增大Onlyoffice处理文件的大小限制
  • services.CoAuthoring.server.limits_tempfile_upload:
    • 默认 104857600 (100MB)
    • 增大 524288000 (500MB)
  • FileConverter.converter.maxDownloadBytes:
    • 默认 104857600 (100MB)
    • 增大 524288000 (500MB)
  • FileConverter.converter.inputLimits 数组中各种类型的 zip.uncompressed:
    • 默认 Word 50MB, Excel 300MB, PPT 50MB, Visio 50MB
    • 增大 Word 500MB, Excel 500MB, PPT 500MB, Visio 500MB
bash 复制代码
{
  "services": {
    "CoAuthoring": {
      "server": {
        "limits_tempfile_upload": 524288000
      }
    }
  },
  "FileConverter": {
    "converter": {
      "maxDownloadBytes": 524288000,
      "inputLimits": [
        {
          "type": "docx;dotx;docm;dotm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        },
        {
          "type": "xlsx;xltx;xlsm;xltm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        },
        {
          "type": "pptx;ppsx;potx;pptm;ppsm;potm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        },
        {
          "type": "vsdx;vstx;vssx;vsdm;vstm;vssm",
          "zip": {
            "uncompressed": "500MB",
            "template": "*.xml"
          }
        }
      ]
    }
  }
}

自定义配置文件赋权

bash 复制代码
# 保证与容器内属主权限一致(ds用户)
chown -R 105:107 /public/application/onlyoffice/custom_config
chmod 644 /public/application/onlyoffice/custom_config/local-production-linux.json
# 查看权限
ll /public/application/onlyoffice/config/local.json
-rw-r--r-- 1 105 107 6898 Mar 26 21:02 /public/application/onlyoffice/config/local.json

启用自定义配置注意事项

bash 复制代码
# 如果此前已经创建经典队列,需要删掉(也可以登录web界面,手动删除)
rm -rf rabbitmq/*
rm -rf rabbitmq/.*

启动服务

  1. 启动服务
bash 复制代码
cd /public/application/onlyoffice

docker compose up -d
  1. 查看服务
bash 复制代码
docker compose ps
NAME                        IMAGE                             COMMAND                  SERVICE                     CREATED         STATUS                   PORTS
onlyoffice-documentserver   onlyoffice/documentserver:9.3.1   "/app/ds/run-documen..."   onlyoffice-documentserver   3 minutes ago   Up 3 minutes (healthy)   
onlyoffice-rabbitmq         rabbitmq:4.1.4-management         "docker-entrypoint.s..."   onlyoffice-rabbitmq         3 minutes ago   Up 3 minutes (healthy)   
  1. 查看日志
bash 复制代码
# 执行命令,没有错误
docker compose logs onlyoffice-rabbitmq
  1. 查看onlyoffice
  1. 查看RabbitMQ
相关推荐
xuanwenchao2 小时前
Mac M1/M2/M3/M4/M5芯片-系统安装Ubuntu
linux·ubuntu·macos
白毛大侠2 小时前
Docker vs 虚拟机 vs Go 用户态/内核态:这三组概念
运维·docker·golang·kvm
芝士就是力量啊 ೄ೨2 小时前
提高服务器安全-采用密钥公钥登录而非密码登录-详细操作步骤
运维·服务器·安全
渠过客3 小时前
【运维】PM2 使用完全指南:Node.js 应用进程管理利器
运维·node.js
木下~learning3 小时前
Linux 驱动:RK3399 从零手写 GT911 电容触摸屏驱动(完整可运行)
linux·运维·服务器
摸爬滚打的小李3 小时前
tmux命令
linux
wanhengidc4 小时前
流量清洗的作用是什么?
运维·服务器·网络·安全·web安全·智能手机
全栈工程师修炼指南4 小时前
Nginx | 磁盘IO层面性能优化秘诀:error 日志内存环形缓冲区及小文件 sendfile 零拷贝技术
运维·网络·nginx·性能优化
@LuckY BoY4 小时前
Linux Mint 上开启 VNC 远程桌面
linux·运维·服务器