解决 OMV 安装 onlyoffice 服务时启动错误

OMV 也玩了有一年了,多数服务都是用 Docker 来安装的,比如 Nextcloud、transmission 等等,期间也遇到过不少坑。近期的一个坑是安装 Onlyoffice-DocumentServer 碰到的,本来是希望给 Nextcloud 提供简单的在线编辑功能,但是陷入这个坑中无法自拔,断断续续也折腾了好长一段时间。问题解决后,发现其实挺简单的,就像福尔摩斯所说:

Omne ignotum pro magnifico.
—— Sherlock Holmes

Everything becomes commonplace by explanation.
—— Doctor Watson.

怎么掉进坑里的

我用的是官方的 Docker 镜像,按照页面上简单的流程安装并启动,但是 Docker 内服务报错了:

postgresql 启动失败

1
2
3
4
5
6
7
8
9
10
11
12
13
 * Starting PostgreSQL 10 database server
* Error: /usr/lib/postgresql/10/bin/pg_ctl /usr/lib/postgresql/10/bin/pg_ctl start -D /var/lib/postgresql/10/main -l /var/log/postgresql/postgresql-10-main.log -s -o -c config_file="/etc/postgresql/10/main/postgresql.conf" exited with status 1:
2020-03-17 11:16:02.056 CST [136] LOG: could not translate host name "localhost", service "5432" to address: Temporary failure in name resolution
2020-03-17 11:16:02.062 CST [136] WARNING: could not create listen socket for "localhost"
2020-03-17 11:16:02.062 CST [136] FATAL: could not create any TCP/IP sockets
2020-03-17 11:16:02.062 CST [136] LOG: database system is shut down
pg_ctl: could not start server
Examine the log output.
...fail!
* Starting RabbitMQ Messaging Server rabbitmq-server
...done.
Starting redis-server: redis-server.
Waiting for connection to the localhost host on port 5432

这里有个临时的解决方案,修改镜像中的 /etc/postgresql/10/main/postgresql.conf 文件。把 listen_addresses = localhost 改成 listen_addresses = '*'

通过以上临时修复方案,postgresql 正常启动了。

Nodejs resolve 错误

1
2
3
4
[ERROR] nodeJS - [AMQP] Error: getaddrinfo EAI_AGAIN localhost localhost:5672
==> /var/log/onlyoffice/documentserver/docservice/out.log <==
[2020-03-17T05:40:52.798] [ERROR] nodeJS - [AMQP] Error: getaddrinfo EAI_AGAIN localhost localhost:5672
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)

看着也是跟 localhost 有关,所以定位到解析问题,也谷歌了一圈,还是没找到解决方案。

后面试着在 github 上面提了个 issue,看看能不能找到解决方案。官方维护的哥们 ShockwaveNN 也是相当热情,虽然没接触过 OMV,还是帮忙在虚拟机上面安装并跑通了,一来一回也花了他很多时间。

可惜的是他没问题,我自己又折腾一阵,还一度怀疑是我路由器导致的解析问题,但是最后碍于不好排查,最终还是放弃了,并关闭了 issue。

爬出坑的方法

从折腾到放弃,停滞了也有一周的时间了,突然又觉得不甘心,再回来试一下。皇天不负有心人啊,终于让我碰到了死老鼠,还真是 resolve 的问题。但是跟路由器、环境什么的都没关系,是因为镜像文件 /etc/hosts 权限有问题,导致 postgresqlnode 读取不到绑定信息,无法解析 localhost

问题找到了就简单了,只要想办法在启动的时候把权限 600 改成 644 就完事了。

额,当我没说简单两个字,OMV 的 Docker-GUI 又让我折腾了好一阵,最后通过修改镜像的 entrypoint 解决了问题。

镜像原来的 entrypoint 是:

1
/bin/sh /app/ds/run-document-server.sh

修改成:

1
/bin/bash -c 'chmod 644 /etc/hosts && ls -l /etc/hosts && /app/ds/run-document-server.sh'

结语

之所以问题一直找不到妥善的解决方案,都是因为查找问题的方向错了。虽然一开始就定位到解析问题,但是自己在 win10 上试过镜像能正常启动,所以就以为是系统的关系,一直往 omvonlyofficepostgresql 等关键信息去找问题。

最后找到解决方案也是精简了这些信息后,直接找的 resolve,网上有人提到是因为 /etc/hosts 的权限问题。

所以,下次找不到问题的时候,可以适当的扩大范围搜索,再一步步缩小,不能一开始就局限于自己的预设。

不过我最终也不知道到底是因为什么引起的文件权限问题。