[Megoldva] Docker-compose - Traefk - postresql - tobb domain azonos cimen

Fórumok

Sziasztok, 

Kis segitseget szeretnek kerni az alabbi setuppal kapcsolatban.

- Adott a termek. Java alkalmazas <-> Postrgresql kapcsolattal. docker-compose-ban 2 kontener. Semmi extra.

- Adott a teszt gep. Ezen van melle egy  Traefik v2.8 egy masik compose-ban.

- A virtualis "proxy" networkre kapcsolodik az app. 

A teszt gepen parhuzamosan fut a dev, qa, staging kornyezet. Ebben az esetben mar 4 compose fut. 3 termek es 1 traefik.

A termek kontenereken van treafik label amiken keresztul ra tudnak nezi a fejlesztok a webes feluletre. Ez a konfig 

traefik.enable: 'true'
traefik.http.routers.termek{{termek_env}}.rule: Host(`{{termek_host_name}}`)
traefik.http.routers.termek-{{termek_env}}.entrypoints: websecure
traefik.http.routers.termek-{{termek_env}}.tls: 'true'
traefik.http.routers.termek-{{termek_env}}.service: termek-{{termek_env}}
traefik.http.services.termek-{{termek_env}}.loadbalancer.server.port: "80"
traefik.docker.network: 'proxy'

Viszont most kitalaltak a fejleszoink hogy szeretnenek kivulrol is az adatbazisokhoz kapcsolodni.

A terv az hogy van 3 kulonobozo domain a tesztgepre iranyitva tehat
termek_host_name_dev
termek_host_name_qa
termek_host_name_staging
es attol fuggoen hogy melyikre kapcsolodnanak az 5432 porton, azt a postgresql-t erjek el

MEgprobaltam hasonlo modon kivitelezni mint ahogyan azt a https kapcsolattal tettem.
 

Uj Entrypoint a Traefik konfigban: 

postgres-db:
   address: :5432


Hozzaadtam az uj portot a Traefik compose-hoz

image: traefik:v2.8
ports:
   - "80:80"
   - "443:443"
   - "5432:5432"

Probaltam az albbi labelekkel

traefik.enable: 'true'
traefik.docker.network: "proxy"
traefik.tcp.routers.dev-db.rule: HostSNI(`myhost-name`)
traefik.tcp.routers.dev-db.entrypoints: postgres-db
traefik.tcp.routers.dev-db.service: dev-db
traefik.tcp.routers.dev-db.tls: "true"
traefik.tcp.services.dev-db.loadbalancer.server.port: "5432"

Namost ez igy nem mukodik. Nem erem el a postgres-t csak ha kiveszem a tls-t es a HostSNI(`*`) ra atallitom.
Igy viszont csak egy db-t erek el mert nem tudok routolni domain nev alapjan.
Azt nem szeretnem hogy a dev 5432 a qa 5433 a staging pedig 5434 porton uljon. 
Azt probalom elerni hogy domain alapjan tudjak routolni de valahogy nagyon nem akarja.


A postgresql-ben beallitottam az ssl tanusitvanyt es hasznalja is szepen.

psql (14.8 (Ubuntu 14.8-0ubuntu0.22.04.1), server 14.7 (Debian 14.7-1.pgdg110+1)) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help.

Probaltam mar direktben a Traefik-nel is probelkoni de nem sok sikerrel
https://community.traefik.io/t/forward-http-s-to-postgresql-container-in-docker-swarm-compose-possible/18938/11

Otlet esetleg

Update:

Traefik v3.0.0-beta2 kepes mar ilyenre.
sima psql cli is tartalmazza az SNI-t szoval siman mukodik minden. CSak egy napba tel mire ratlaltam az image-ra :D

Hozzászólások

Hát, a HTTP protokollon kívül elég kevés protokoll tartalmaz FQDN neveket az azonosításhoz... A PostgreSQL szerintem pont nem ismer ilyent, ott IP cím és portszám van, slussz. Ergo azonos IP címen, azonos porton nem lesz elérhető több PostgreSQL példány az FQDN-től függően. Az 5243-re érkező csomagokban nincs FQDN, ami alapján szortírozni lehetne.

Ezt sima router oldali port átirányítással tudod megoldani, de akkor a külső címen különböző portok fognak az egyes belső DB példányokhoz tartozni.

Viszont én semmi módon nem tennék ki DB szerver portot publikus IP címre... Nem is értem a mai világban, mikor mindent is feltörnek és titkosítanak, és mindenki vesz le mindent a publikus elérhetőségekről, hogyan jut ez az eszükbe.
VPN-ezzenek be, és szépen "belső" hálózati címeken érjék el a DB példányokat.

Minden belso halozaton van/lesz. Semmi sem elerheto kivulrol. Ezek teszt rendszerek csak van vmi szamomra black box developer dolog amiert hozza akarnak ferni kivulrol is

Szoval nem nagyon van semmi opciom ugy tunik arra, hogy tobb domian nevet hostoljak ugyanarrol a geprol es a megcimzett compose-nak dobjam tovabb a forgalmat.

Nem vagyok otthon a PostgreSQL protokollban ennyire sojnos hogy tudjam en is avalaszt 100%-ra

Az adatbázis szerver forgalmát nem tudod HTTP proxy-val kezelni, hiszen az nem HTTP protokollt használ. A megoldás az, hogy más-más portokra publikálod ki az adott PostgreSQL instance-et (ha egy IP-n kell lenniük).

Postgres forgalmat nem lehet host alapon routolni, az csak http protokollon mukodik.

Mas-mas portra kell kiraknod a postgreseket.

ha pl navicatot hasznalnak, annak van http(+php)tunnelje. csak a tunnel lassa mindharom kornyezetet (network). vagy akkor 3x kell kulon-kulon kiajanlani a tunnelt. 

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Ha psql ssl kapcsolat jó, akkor be lehet lőni egy nginx stream nonterminated ssl proxyt a portra, ami header preload + az sni alapján szét tudja dobni a megfelelő szerverhez a kapcsolatot.