我在 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/