Wiki.js 无法通过公司代理

Wiki.js can't go through corporate proxy

我是 Ubuntu 的新手,但我有一份工作要用 docker 安装 Wiki.JS。它有效,服务器是 运行,但由于某种原因它无法访问 GraphQL API。

我 运行 遇到了以下问题:


服务器:

2020-06-14T11:43:53.980Z [MASTER] 错误:从 Graph 端点获取最新更新:[失败]

2020-06-14T11:43:53.980Z [MASTER] 错误:请求 https://graph.requarks.io 失败,原因:连接 ETIMEDOUT 104.26.14.122:443

2020-06-14T11:43:56.028Z [MASTER] 错误:将区域设置与 Graph 端点同步:[失败]

2020-06-14T11:43:56.028Z [MASTER] 错误:请求 https://graph.requarks.io 失败,原因:连接 ETIMEDOUT 104.26.15.122:443

客户:

错误:GraphQL 错误:无效的语言环境或命名空间

堆栈跟踪:

n@http://server.mydomain.test/_assets/js/app.js?1591384357:2:125092
["./node_modules/apollo-client/bundle.umd.js"]/i/k</e.prototype.queryListenerForObserver/<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:146832
["./node_modules/apollo-client/bundle.umd.js"]/i/k</e.prototype.broadcastQueries/</<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:153007
["./node_modules/apollo-client/bundle.umd.js"]/i/k</e.prototype.broadcastQueries/<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:152971
["./node_modules/apollo-client/bundle.umd.js"]/i/k</e.prototype.broadcastQueries@http://server.mydomain.test/_assets/js/app.js?1591384357:2:152920
["./node_modules/apollo-client/bundle.umd.js"]/i/k</e.prototype.fetchRequest/</b<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:154884
["./node_modules/zen-observable/lib/Observable.js"]/j</<.value/</<.next@http://server.mydomain.test/_assets/js/app.js?1591384357:333:17099
b@http://server.mydomain.test/_assets/js/app.js?1591384357:333:14921
y@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15429
["./node_modules/zen-observable/lib/Observable.js"]/w</<.value@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15982
w/</n<.next/<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:140468
w/</n<.next@http://server.mydomain.test/_assets/js/app.js?1591384357:2:140430
b@http://server.mydomain.test/_assets/js/app.js?1591384357:333:14921
y@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15429
["./node_modules/zen-observable/lib/Observable.js"]/w</<.value@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15982
o/</</r<.next@http://server.mydomain.test/_assets/js/app.js?1591384357:2:169810
b@http://server.mydomain.test/_assets/js/app.js?1591384357:333:14921
y@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15429
["./node_modules/zen-observable/lib/Observable.js"]/w</<.value@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15982
["./node_modules/apollo-link-batch/lib/batching.js"]/o</e.prototype.consumeQueue/<.next/</<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:168733
["./node_modules/apollo-link-batch/lib/batching.js"]/o</e.prototype.consumeQueue/<.next/<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:168700
["./node_modules/apollo-link-batch/lib/batching.js"]/o</e.prototype.consumeQueue/<.next@http://server.mydomain.test/_assets/js/app.js?1591384357:2:168669
b@http://server.mydomain.test/_assets/js/app.js?1591384357:333:14921
y@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15429
["./node_modules/zen-observable/lib/Observable.js"]/w</<.value@http://server.mydomain.test/_assets/js/app.js?1591384357:333:15982
t/n.batcher<.batchHandler/</<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:165472
["./node_modules/core-js/modules/es.promise.js"]/J/<@http://server.mydomain.test/_assets/js/app.js?1591384357:2:450433
["./node_modules/core-js/internals/microtask.js"]/i@http://server.mydomain.test/_assets/js/app.js?1591384357:2:412213

请记住,我之前在 Windows 上测试过,我的同事在 Linux 上测试过。只要虚拟机没有代理,两者都可以工作。 我尝试为机器设置代理并设置环境变量,但它似乎仍然不起作用。

我该如何解决这个问题?

您无法 Wiki.JS 在公司防火墙后工作的原因是未实现此功能。

基于this GitHub issue you can vote for this feature here.

问题 (1.) 中提到了解决方法,但您也可以 sideload 丢失的文件 (2.)。

1. Workaround

我想出了一个解决方法: 使用 https://github.com/rofl0r/proxychains-ng 和 LD_PRELOAD。就我而言,我使用 docker-compose.

你必须:

  • 将编译好的proxychains4.so合并到/lib/中,并设置 环境变量
  • 创建你自己的proxychains.conf

这是一个例子:

Dockerfile

FROM requarks/wiki:2

USER root

ADD ./libproxychains4.so /lib/

RUN echo -e 'localnet 192.168.0.0/255.255.0.0\n\
[ProxyList]\n\
http <YOUR PROXY> <PROXY PORT>\n'\
> /etc/proxychains.conf

USER node

docker-compose.yaml

version: "3"
services:

  db:
    image: postgres:11-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_PASSWORD: wikijsrocks
      POSTGRES_USER: wikijs
    restart: unless-stopped
    volumes:
      - /data/wikijs/postgresql/data:/var/lib/postgresql/data

  wiki:
    image: wikijs-proxychains:1
    depends_on:
      - db
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijsrocks
      DB_NAME: wiki
      LD_PRELOAD: /lib/libproxychains4.so
    restart: unless-stopped
    ports:
      - "80:3000"

2. Sideload

如果您的 wiki 安装在与 Internet 隔离的环境中,您可以旁加载通常从 Internet 下载的数据。

这是通过手动下载一组文件并将它们放在 wiki 安装的特定目录中来实现的。这些文件将在初始化期间导入。

入门 在 Wiki.js 安装文件夹内的路径 data/sideload 处创建一个新文件夹。例如,如果您的 wiki 安装在路径 /home/wiki,您需要在路径 /home/wiki/data/sideload

创建一个文件夹

语言环境为了安装语言环境包,您需要主语言环境文件+至少一个语言环境包文件。

文件可以从https://github.com/Requarks/wiki-localization下载。这些文件每晚都会更新。

1 - 主文件

主文件 locales.json 包含有关所有可用语言的信息,并且是安装任何语言环境所必需的。

将此文件放在之前创建的 sideload 文件夹中。

2 - 语言环境包

语言环境包文件 xx.json 或 xx-zz.json 包含您选择的语言的所有翻译。您可以同时加载任意数量的语言环境。

英文包 en.json 是必需的,因为这是安装期间的默认语言。您之后可以更改语言。

将文件放入先前与主文件一起创建的 sideload 文件夹中。您的文件夹中现在应该有 locales.json、en.json 和任何其他语言。

3 - 侧载

运行 Wiki.js(如果已经 运行 则重新启动进程)以自动旁加载位于 data/sideload 文件夹中的文件。

由于 2.5 之前的版本存在错误,区域设置文件加载顺序不正确,导致客户端无法获取翻译。

作为解决方法,一旦 Wiki.js 完全启动,再次重新启动服务器。语言环境数据(现在在数据库中)将被正确加载。我遇到了同样的问题,只要此功能尚未实现,我就会使用 BlueSpice MediaWiki,因为 Wiki.JS 在其路线图上有“从 MediaWiki 导入”。

为了解释 Docker 提供的旁路解决方案 @GanjalfTheGreen,首先你需要克隆 Wiki.js localization repository(或从该存储库下载选定的本地化版本;只需确保您在选定的项目旁边有 locales.jsonen.json)。然后需要将包含本地化文件的文件夹绑定到容器内的/wiki/data/sideload目录。

您还需要在 config.yml 文件中设置 offline 参数,让 wiki.js 知道它应该使用旁加载的本地化文件。为此,您需要在主机中创建一个 config.yml 文件并将其绑定到容器配置文件。

这是一个例子:

docker-compose.json

version: "3"
services:

  db:
    image: postgres:11-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_PASSWORD: wikijsrocks
      POSTGRES_USER: wikijs
    logging:
      driver: "none"
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data

  wiki:
    image: requarks/wiki:2
    depends_on:
      - db
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijsrocks
      DB_NAME: wiki
      OFFLINE_ACTIVE: 1
    restart: unless-stopped
    ports:
      - "80:3000"
    volumes:
      - ./sideload:/wiki/data/sideload
      - ./config.yml:/wiki/config.yml

volumes:
  db-data:

config.yml

port: 3000
bindIP: 0.0.0.0
db:
  type: $(DB_TYPE)
  host: '$(DB_HOST)'
  port: $(DB_PORT)
  user: '$(DB_USER)'
  pass: '$(DB_PASS)'
  db: $(DB_NAME)
  storage: $(DB_FILEPATH)
  ssl: $(DB_SSL)
ssl:
  enabled: $(SSL_ACTIVE)
  port: 3443
  provider: letsencrypt
  domain: $(LETSENCRYPT_DOMAIN)
  subscriberEmail: $(LETSENCRYPT_EMAIL)
logLevel: info
ha: $(HA_ACTIVE)
offline: $(OFFLINE_ACTIVE)