docker - 在反向代理后面运行 Neo4J (web) 并连接到 "bolt://localhost:7687"

标签 docker https neo4j reverse-proxy traefik

我在 Traefik 后面的 Docker 中运行 Neo4J。 Web 界面 (7474) 通过 https 公开,按预期工作。

通过网络界面,我尝试连接到 Bolt://localhost:7687,我希望它能够工作,毕竟它在同一个容器中运行。相反,我收到消息:

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

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

当尝试连接到容器本身中的 localhost:7687 时,它按预期工作; Cypher shell 也是如此。

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

浏览器似乎也无关 - FF、Chrome 和 Safari 会重现所描述的问题。

最佳答案

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

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

呵呵!

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:

关于docker - 在反向代理后面运行 Neo4J (web) 并连接到 "bolt://localhost:7687",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54224081/

相关文章:

docker - 使用cname而不是nameserver的IP地址运行docker容器dns标志

docker - Docker批量投资主机到机器

bash - 具有for循环的单行bash函数

sql-server - 使用host.docker.internal从docker连接到本地计算机(host)中的SQL Server

rest - 如何在Grails应用程序REST中将http转换为https?基本上实现HTTP Strinct传输安全性

graph - Neo4j Graph DB - 伦敦地铁规划师 - 找不到路径

wordpress - 重新设计的网站 : From HTTPS to HTTP

asp.net-mvc - 混合 http/https 站点

node.js - 为什么 Node-Neo4j 无法正确设置数据?

java - neo4j 中的随机后序遍历