Traefik'i , alan adları aracılığıyla hizmetlere erişebileceğim ve farklı bağlantı noktaları ayarlamak zorunda kalmayacak şekilde yapılandırmaya çalışıyorum . Örneğin, hem varsayılan bağlantı noktasında, ancak farklı etki alanlarında iki MongoDB hizmeti example.localhost
ve example2.localhost
. Sadece bu örnek işe yarar. Yani, diğer vakalar muhtemelen işe yarıyor, ancak onlara bağlanamıyorum ve sorunun ne olduğunu anlamıyorum. Bu muhtemelen Traefik ile ilgili bir sorun bile değil.
İşe yarayan bir örnekle bir depo hazırladım . Sadece mkcert ile kendi sertifikanızı oluşturmanız gerekir . Adresindeki sayfa hatayı example.localhost
döndürür 403 Forbidden
ancak endişelenmemelisiniz, çünkü bu yapılandırmanın amacı SSL'nin çalıştığını göstermek (asma kilit, yeşil durum). Yani odaklanmayın 403
.
Yalnızca mongo
hizmetin SSL bağlantısı çalışır. Robo 3T programıyla test ettim . SSL bağlantısını seçtikten sonra, ana bilgisayarı açıp example.localhost
kendinden imzalı (veya kendi) bir bağlantı için sertifikayı seçtikten sonra çalışır. Ve bu şekilde çalışan tek şey bu. Yapılan bağlantılar redis
( Redis Masaüstü Yöneticisi ) ve pgsql
( PhpStorm , DBeaver , DbVisualizer ) bakılmaksızın ben sertifikaları temin edip etmediğinden değil, iş yapmak. SSL'yi hizmetlere yönlendirmiyorum, sadece Traefik'e bağlanıyorum. Üzerinde uzun saatler geçirdim. İnterneti aradım. Henüz cevabı bulamadım. Bunu çözen var mı?
PS. Linux Mint üzerinde çalışıyorum, bu yüzden yapılandırmamın bu ortamda sorunsuz çalışması gerekiyor. Linux için çözümler isteyecektim.
Depoya göz atmak istemiyorsanız , en önemli dosyaları ekliyorum:
liman işçisi-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"
İnşa Et ve Çalıştır
mkcert example.localhost # in ./certs/
docker-compose up -d
Adım adım hazırlayın
- Yükleme mkcert (ayrıca çalıştırmak
mkcert -install
CA için) - Kodumu klonla
- Gelen
certs
klasör vadedemkcert example.localhost
- Kapsayıcıyı şu şekilde başlat:
docker-compose up -d
- Https: //example.localhost/ sayfasını açın ve güvenli bağlantı olup olmadığını kontrol edin
- Adres Eğer http: //example.localhost/ erişilemiyor eklemek
127.0.0.1 example.localhost
için/etc/hosts
certs:
- Halka açık:
./certs/example.localhost.pem
- Özel:
./certs/example.localhost-key.pem
- CA:
~/.local/share/mkcert/rootCA.pem
Test MongoDB
- Robo 3T'yi yükleyin
- Yeni bağlantı oluştur:
- Adres:
example.localhost
- SSL protokolünü kullan
- CA Sertifikası:
rootCA.pem
(veya Kendinden İmzalı Sertifika)
- Adres:
- Test aracı:
Test Redis
- RedisDesktopManager'ı yükleyin
- Yeni bağlantı oluştur:
- Adres:
example.localhost
- SSL
- Genel anahtar:
example.localhost.pem
- Özel anahtar:
example.localhost-key.pem
- Yetki:
rootCA.pem
- Adres:
- Test aracı:
Şimdiye kadar:
- Postgres'e IP üzerinden bağlanabilir (Traefik'ten bilgi)
jdbc:postgresql://172.21.0.4:5432/postgres?sslmode=disable
jdbc:postgresql://172.21.0.4:5432/postgres?sslfactory=org.postgresql.ssl.NonValidatingFactory
Telet yapmayı deneyin (IP, her bağlantı biriminin yeniden başlatılmasını değiştirir):
> telnet 172.27.0.5 5432
Trying 172.27.0.5...
Connected to 172.27.0.5.
Escape character is '^]'.
^]
Connection closed by foreign host.
> telnet example.localhost 5432
Trying ::1...
Connected to example.localhost.
Escape character is '^]'.
^]
HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=utf-8
Connection: close
400 Bad RequestConnection closed by foreign host.
Postgres'e doğrudan bağlanırsam veriler güzeldir. Traefik ile bağlanırsam, bağlantıyı kapatırken Kötü İstek var. Bunun ne anlama geldiği ve bir şey ifade etmesi gerekip gerekmediği hakkında hiçbir fikrim yok.
Connections to redis (Redis Desktop Manager) ... do not work
, ancak ekran görüntüsü gösteriyor Successful connection
-? Neden düşük seviyede test yapmıyorsunuz curl, openssl, telnet, ...
? Neden netstat
bu uygulama portlarının 127.0.0.1
arayüzde traefik için gerçekten bağlı olup olmadığını test etmiyorsunuz ?
I can't connect to them
-> nasıl test ettiniz ve hata neydi?