我正在尝试配置Traefik,以便可以通过域名访问服务,而不必设置其他端口。例如,两个MongoDB服务都在默认端口上,但位于不同的域example.localhost
和example2.localhost
中。仅此示例有效。我的意思是,其他情况也可能有效,但是我无法连接到它们,并且我不明白问题出在哪里。 Traefik可能甚至都不是问题。
我准备了一个repository,并附有一个有效的示例。您只需要使用mkcert生成自己的证书即可。 example.localhost
处的页面返回403 Forbidden
错误,但您不必担心,因为此配置的目的是表明SSL正常(挂锁,绿色状态)。因此,不要专注于403
。
仅与mongo
服务的SSL连接有效。我使用 Robo 3T 程序对其进行了测试。选择SSL连接后,可以在example.localhost
上提供主机并选择用于自签名(或自己)连接的证书。那是唯一以这种方式工作的东西。与redis
( Redis Desktop Manager )和pgsql
( PhpStorm , DBeaver , DbVisualizer < / em>)无效,无论我是否提供证书。我不将SSL转发给服务,仅连接到Traefik。我花了很长时间。我搜索了互联网。我还没有找到答案。有人解决了吗?
PS。我在Linux Mint上工作,因此我的配置应该可以在此环境下正常工作。我会要求Linux的解决方案。
如果您不想浏览repository,请附加最重要的文件:
docker-compose.yml
version: "3.7"
services:
traefik:
image: traefik:v2.0
ports:
- 80:80
- 443:443
- 8080:8080
- 6379:6379
- 5432:5432
- 27017:27017
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config.toml:/etc/traefik/traefik.config.toml:ro
- ./certs:/etc/certs:ro
command:
- --api.insecure
- --accesslog
- --log.level=INFO
- --entrypoints.http.address=:80
- --entrypoints.https.address=:443
- --entrypoints.traefik.address=:8080
- --entrypoints.mongo.address=:27017
- --entrypoints.postgres.address=:5432
- --entrypoints.redis.address=:6379
- --providers.file.filename=/etc/traefik/traefik.config.toml
- --providers.docker
- --providers.docker.exposedByDefault=false
- --providers.docker.useBindPortIP=false
apache:
image: php:7.2-apache
labels:
- traefik.enable=true
- traefik.http.routers.http-dev.entrypoints=http
- traefik.http.routers.http-dev.rule=Host(`example.localhost`)
- traefik.http.routers.https-dev.entrypoints=https
- traefik.http.routers.https-dev.rule=Host(`example.localhost`)
- traefik.http.routers.https-dev.tls=true
- traefik.http.services.dev.loadbalancer.server.port=80
pgsql:
image: postgres:10
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
labels:
- traefik.enable=true
- traefik.tcp.routers.pgsql.rule=HostSNI(`example.localhost`)
- traefik.tcp.routers.pgsql.tls=true
- traefik.tcp.routers.pgsql.service=pgsql
- traefik.tcp.routers.pgsql.entrypoints=postgres
- traefik.tcp.services.pgsql.loadbalancer.server.port=5432
mongo:
image: mongo:3
labels:
- traefik.enable=true
- traefik.tcp.routers.mongo.rule=HostSNI(`example.localhost`)
- traefik.tcp.routers.mongo.tls=true
- traefik.tcp.routers.mongo.service=mongo
- traefik.tcp.routers.mongo.entrypoints=mongo
- traefik.tcp.services.mongo.loadbalancer.server.port=27017
redis:
image: redis:3
labels:
- traefik.enable=true
- traefik.tcp.routers.redis.rule=HostSNI(`example.localhost`)
- traefik.tcp.routers.redis.tls=true
- traefik.tcp.routers.redis.service=redis
- traefik.tcp.routers.redis.entrypoints=redis
- traefik.tcp.services.redis.loadbalancer.server.port=6379
config.toml
[tls]
[[tls.certificates]]
certFile = "/etc/certs/example.localhost.pem"
keyFile = "/etc/certs/example.localhost-key.pem"
构建并运行
mkcert example.localhost # in ./certs/
docker-compose up -d
答案 0 :(得分:3)
至少对于PostgreSQL问题,似乎连接以明文形式启动,然后升级为TLS:
因此,如果代理不支持明文握手+升级到协议的TLS功能,则基本上不可能将 TLS终止与代理一起使用。