在反向代理后面运行Neo4J(网络)并连接到“ bolt:// localhost:7687”

时间:2019-01-16 19:32:17

标签: docker https neo4j reverse-proxy traefik

我正在Traefik之后的Docker中运行Neo4J。 Web界面(7474)在https上公开,可以正常使用。

通过Web界面,我尝试连接到bolt:// localhost:7687,毕竟它在同一个容器中运行,所以我希望它能正常工作。相反,我收到消息:

“ ServiceUnavailable:WebSocket连接失败。由于Web浏览器中的安全限制,因此Neo4j驱动程序不知道失败的原因。请使用浏览器开发控制台来确定失败的根本原因。常见原因包括数据库不可用,使用错误的连接URL或临时网络问题。如果启用了加密,请确保将浏览器配置为信任Neo4j配置为使用的证书。WebSocket readyState为:3“

反向代理使用由我们公司CA签名的内部证书。 Neo4J容器具有可用的根证书。 客户端连接也具有可用的根证书。

尝试在容器本身中连接到localhost:7687时,它可以按预期工作; Cypher外壳也是如此。

在GitHub上也有一些有关Java版本的帖子,这些帖子可能会导致这些问题-我已经尝试过使用Oracle JDK 8,OpenJDK 8(HotSpot和J9)。

浏览器似乎也不相关-所描述的问题在FF,Chrome和Safari中重现。

1 个答案:

答案 0 :(得分:1)

我处于相同的情况,这是我的解决方案,以便在使用Traefik 2.0.2的Docker集群中运行Neo4j实例(在我的情况下为Bloodhound)。由于Traefik的新路由器概念,它非常冗长且难以阅读,因为您必须定义五个路由器。但是至少它可以工作,并且使您能够通过wss和bolt访问Web界面和实际数据库。也许可以简化我的配置。

此外,我在Traefik的文件提供程序提供的动态配置文件中指定了redirectScheme中间件和由内部PKI签名的证书。

HTH!

version: '3.7'

services:
  neo4j:
    image: neo4j:latest
    networks:
      - traefiknet
    volumes:
      - type: volume
        source: data
        target: /data
      - type: volume
        source: logs
        target: /logs
      - type: volume
        source: conf
        target: /conf
    environment:
      - NEO4J_AUTH=neo4j/somepassword
      - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
    deploy:
      replicas: 1
      restart_policy:
        condition: any
      placement:
        constraints:
          - node.hostname == node-02
      labels:
        - traefik.http.services.neo4j.loadbalancer.server.port=7474
        - traefik.http.routers.neo4j.rule=Host(`neo4j.dockerswarm.domain.com`)
        - traefik.http.routers.neo4j-secure.rule=Host(`neo4j.dockerswarm.domain.com`)
        - traefik.http.routers.neo4j.service=neo4j
        - traefik.http.routers.neo4j-secure.service=neo4j
        - traefik.http.routers.neo4j.middlewares=httpsredirection@file
        - traefik.http.routers.neo4j-secure.tls=true
        - traefik.http.routers.neo4j.entrypoints=web
        - traefik.http.routers.neo4j-secure.entrypoints=web-secure

        - traefik.http.services.neo4jdb.loadbalancer.server.port=7687
        - traefik.http.routers.neo4jdb.rule=Host(`neo4jdb.dockerswarm.domain.com`)
        - traefik.http.routers.neo4jdb-secure.rule=Host(`neo4jdb.dockerswarm.domain.com`)
        - traefik.http.routers.neo4jdb.service=neo4jdb
        - traefik.http.routers.neo4jdb-secure.service=neo4jdb
        - traefik.http.routers.neo4jdb.middlewares=httpsredirection@file
        - traefik.http.routers.neo4jdb-secure.tls=true
        - traefik.http.routers.neo4jdb.entrypoints=web
        - traefik.http.routers.neo4jdb-secure.entrypoints=web-secure

        - traefik.tcp.services.neo4jdb.loadbalancer.server.port=7687
        - traefik.tcp.routers.neo4jdb.rule=HostSNI(`neo4jdb.dockerswarm.domain.com`)
        - traefik.tcp.routers.neo4jdb.service=neo4jdb
        - traefik.tcp.routers.neo4jdb.tls=true

networks:
  traefiknet:
    external: true

volumes:
  data:
  logs:
  conf: