Onlyoffice 文档服务器

来自 ArchWiki

Onlyoffice 文档服务器是一个功能齐全的后端,用于在线在浏览器中编辑不同的办公文档,如 Open Document、Word、Excel 等。该软件是开源的,可以轻松部署并集成到现有的服务器软件中。可用的前端是 Nextcloud 或 Onlyoffice CommunityServer。它也可以在自己的软件中使用,请参阅以下 PHP、Nodejs 等示例

安装

安装 onlyoffice-documentserver-binAUR 软件包。此外,您还需要 PostgreSQLMariaDB 作为数据库后端,并安装 Redisrabbitmq 服务。

或者,通过 docker 安装并运行

$ docker pull onlyoffice/documentserver
$ docker run -i -t -d -p PORT:80 --restart=always onlyoffice/documentserver

其中 PORT 可以是 80(如果未被其他 Web 服务器使用),也可以是其他端口,例如 9980。

配置

local.json

您可以在 /etc/webapps/onlyoffice/documentserver 中创建 local.json,可以在其中覆盖配置的任何部分(以下是包含 rabbitmq、mariadb、redis 和 accesskey 配置的完整 local.json)

/etc/webapps/onlyoffice/documentserver/local.json
{
        "queue": {
                "type": "rabbitmq"
        },
        "rabbitmq": {
                "url": "amqp://onlyoffice:onlyoffice@127.0.0.1:5672/onlyoffice"
        },
        "services": {
                "CoAuthoring": {
                        "sql": {
                                "type": "mariadb",
                                "dbHost": "127.0.0.1",
                                "dbPort": 3306,
                                "dbName": "onlyoffice",
                                "dbUser": "onlyoffice",
                                "dbPass": "ONLYOFFICE_DB_PASSWD"
                        },
                        "redis": {
                                "name": "redis",
                                "host": "127.0.0.1",
                                "port": 6379,
                                "db": "10"
                        },
                        "server": {
                                "port": 8000,
                                "workerpercpu": 1,
                                "mode": "production"
                        },
                        "secret": {
                                "browser": {"string": "YOUR SECRET IN NEXTCLOUD"},
                                "inbox": {"string": "YOUR SECRET IN NEXTCLOUD"},
                                "outbox": {"string": "YOUR SECRET IN NEXTCLOUD"},
                                "session": {"string": "YOUR SECRET IN NEXTCLOUD"}
                        },
                        "token": {
                                "enable": {
                                        "browser": true,
                                        "request": {
                                                "inbox": true,
                                                "outbox": true
                                        }
                                 }
                        }
}
}
}

您不应该编辑 default.json 配置文件。

RabbitMQ

您可以在 RabbitMQ 中为 onlyoffice 创建 vhost,并在 local.json 中选择它。

$ rabbitmqctl add_vhost onlyoffice
$ rabbitmqctl add_user onlyoffice onlyoffice
$ rabbitmqctl set_permissions -p onlyoffice onlyoffice ".*" ".*" ".*"

数据库

PostgreSQL

需要配置 PostgreSQL 数据库后端。这是一个数据库设置示例

[postgres]$ psql -c "CREATE DATABASE onlyoffice;"
[postgres]$ psql -c "CREATE USER onlyoffice WITH password 'onlyoffice';"
[postgres]$ psql -c "GRANT ALL privileges ON DATABASE onlyoffice TO onlyoffice;"

从 PostgreSQL 15 开始,需要在 psql 中为 onlyoffice 用户授予 admin 权限,以便数据库模式迁移命令成功执行。

[postgres]$ psql -c "ALTER DATABASE onlyoffice OWNER TO onlyoffice;"

要迁移 documentserver 数据库模式,请运行以下命令

$ psql -hlocalhost -Uonlyoffice -d onlyoffice -f /usr/share/webapps/onlyoffice/documentserver/server/schema/postgresql/createdb.sql

MariaDB

登录 mariadb 并创建数据库和用户

$ create database onlyoffice;
$ create user 'onlyoffice'@'localhost' identified by 'ONLYOFFICE_DB_PASSWD';
$ grant all on onlyoffice.* to 'onlyoffice'@'localhost';
$ flush privileges;

然后导入 schemadb

$ mysql -uonlyoffice -p onlyoffice < /usr/share/webapps/onlyoffice/documentserver/server/schema/mysql/createdb.sql

更改您的 local.json 中的 sql 部分

/etc/webapps/onlyoffice/documentserver/local.json
"sql": {
    "type": "mariadb",
    "dbHost": "localhost",
    "dbPort": "3306",
    "dbName": "onlyoffice",
    "dbUser": "onlyoffice",
    "dbPass": "ONLYOFFICE_DB_PASSWD"
},

限制访问

限制对您的文档服务器的访问。

启用安全令牌

/etc/webapps/onlyoffice/documentserver/local.json
"token": {
    "enable": {
        "browser": true,
        "request": {
            "inbox": true,
            "outbox":true
        }
    },
    ...
},

设置密钥

/etc/webapps/onlyoffice/documentserver/local.json
"secret": {
    "browser": {"string": "DOC_SERVER_PASSWD", "file": ""},
    "inbox": {"string": "DOC_SERVER_PASSWD", "file": ""},
    "outbox": {"string": "DOC_SERVER_PASSWD", "file": ""},
    "session": {"string": "DOC_SERVER_PASSWD", "file": ""}
},

最后,在 “Nextcloud > 管理设置 > ONLYOFFICE” 中设置相同的密钥。

Web服务器

Nginx / 无 SSL

这是 Nginx Web 服务器的示例

/etc/nginx/sites-available/onlyoffice-documentserver
map $http_host $this_host {
  "" $host;
  default $http_host;
}
map $http_x_forwarded_proto $the_scheme {
  default $http_x_forwarded_proto;
  "" $scheme;
}
map $http_x_forwarded_host $the_host {
  default $http_x_forwarded_host;
  "" $this_host;
}
map $http_upgrade $proxy_connection {
  default upgrade;
  "" close;
}
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Forwarded-Host $the_host;
proxy_set_header X-Forwarded-Proto $the_scheme;
server {
  listen 0.0.0.0:80;
  listen [::]:80 default_server;
  server_tokens off;
  rewrite ^\/OfficeWeb(\/apps\/.*)$ /web-apps$1 redirect;
  location / {
    proxy_pass https://127.0.0.1:8000;
    proxy_buffers 4 256k; 
    proxy_max_temp_file_size 0;
  }
  location /spellchecker/ {
    proxy_pass https://127.0.0.1:8080/;
  }
}

Nginx / 使用 SSL 的反向代理

创建如下所示的 Nginx 配置文件

/etc/nginx/conf.d/onlyoffice.conf
upstream docservice {
  server 127.0.0.1:PORT;
}

map $http_host $this_host {
    "" $host;
    default $http_host;
}

map $http_x_forwarded_proto $the_scheme {
     default $http_x_forwarded_proto;
     "" $scheme;
}

map $http_x_forwarded_host $the_host {
    default $http_x_forwarded_host;
    "" $this_host;
}

map $http_upgrade $proxy_connection {
  default upgrade;
  "" close;
}

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Forwarded-Host $the_host;
proxy_set_header X-Forwarded-Proto $the_scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server {
    listen 0.0.0.0:443 ssl;
    listen [::]:443 ssl default_server;
    server_name SERVER_NAME
    server_tokens off;
    root /usr/share/nginx/html;

    ssl_certificate SSL_CERT;
    ssl_certificate_key SSL_KEY;
    ssl_verify_client off;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_prefer_server_ciphers   on;

    add_header X-Content-Type-Options nosniff;
    location / {
      proxy_pass http://docservice;
      proxy_http_version 1.1;
  }
}

填写 PORT(默认为 8000)、SERVER_NAME、SSL_CERT 和 SSL_KEY。这取自 nginx 参考配置

重载 Nginx

$ nginx -t
$ nginx -s reload

启动

启用/启动以下服务,如果您希望在同一台机器上本地使用它们。

  • rabbitmq.service
  • redis.service
  • postgresql.service

最后,启动 documentserver 服务

  • onlyoffice-fileconverter.service
  • onlyoffice-docservice.service

Nextcloud 应用

在 Nextcloud 中安装 ONLYOFFICE 应用。进入 “Nextcloud > 设置 > ONLYOFFICE”,并在 “Onlyoffice Docs address” 中填写 https://SERVER_NAME。

故障排除

ZFS 上的 Onlyoffice Docker 容器

当以 Docker 容器运行 onlyoffice/documentserver 且 data-root 指向 ZFS 设备时(例如,当 /var 挂载为 ZFS 池时),docker run 可能会失败,并显示错误:Error: Daemon failed to copy files

在这种情况下,让 Docker 的 data-root 位于 ext4 分区上,例如 /var_ext4/lib/docker

/etc/docker/daemon.json
{
    "data-root": "/var_ext4/lib/docker"
}

Pkg: 读取文件时出错。

如果 docservice 以以上错误退出,请在构建之前将 /etc/makepkg.conf 中的 OPTIONS 设置为给定的默认值

/etc/makepkg.conf
...
OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps)
...

升级到 8.2.0 后无法访问 ONLYOFFICE

清空您的 redis 数据库,例如通过执行

$ redis-cli flushall