HavenNo7
HavenNo7

Reputation: 107

Traefik 2.2 + Docker + Websocket (ws) not working

I'ved managed to get it Traefik working for http containers but when I switched to websocket, had no luck. Traefik is pretty easy. Let me share it's docker-compose file:

version: "3.3"
services:

  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
#      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entryPoints.ws.address=:81" #I ADDED THIS
      - "--accesslog"
    ports:
      - "80:80"
      - "81:81" #I ADDED THIS
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

To make it easier, I added and comment like #I ADDED THIS so you can see the changes I've made to make WS work.

Now on the actual project docker-compose I've added this labels:

version: '2.1'

services:
  test:
    restart: unless-stopped
    hostname: test
    build:
      context: .
      dockerfile: ./Dockerfile    
    expose:
      - 81
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.test.rule=Host(`test.com`)"
      - "traefik.http.routers.test.entrypoints=ws"
      - "traefik.http.services.test.loadBalancer.sticky.cookie=true"

And I'm trying to connect using Nodejs:

  var ws = new WebSocket('ws://test.com:81') 

Dont know what else to try. Thank you in advanced.

EDIT Saw in traefik log:

time="2020-08-23T16:07:28Z" level=debug msg="vulcand/oxy/roundrobin/rr: completed ServeHttp on request" Request="{\"Method\":\"GET\",\"URL\":{\"Scheme\":\"\",\"Opaque\":\"\",\"User\":null,\"Host\":\"\",\"Path\":\"/\",\"RawPath\":\"\",\"ForceQuery\":false,\"RawQuery\":\"\",\"Fragment\":\"\"},\"Proto\":\"HTTP/1.1\",\"ProtoMajor\":1,\"ProtoMinor\":1,\"Header\":{\"Connection\":[\"Upgrade\"],\"Sec-Websocket-Extensions\":[\"permessage-deflate; client_max_window_bits\"],\"Sec-Websocket-Key\":[\"jaXhUWe2lvrgxF0tOn3nWA==\"],\"Sec-Websocket-Version\":[\"13\"],\"Upgrade\":[\"websocket\"],\"X-Forwarded-Host\":[\"test.com:81\"],\"X-Forwarded-Port\":[\"81\"],\"X-Forwarded-Proto\":[\"ws\"],\"X-Forwarded-Server\":[\"58077bdceffd\"],\"X-Real-Ip\":[\"192.168.99.1\"]},\"ContentLength\":0,\"TransferEncoding\":null,\"Host\":\"test.com:81\",\"Form\":null,\"PostForm\":null,\"MultipartForm\":null,\"Trailer\":null,\"RemoteAddr\":\"192.168.99.1:56705\",\"RequestURI\":\"/\",\"TLS\":null}"
192.168.99.1 - - [23/Aug/2020:16:07:07 +0000] "GET / HTTP/1.1" 499 21 "-" "-" 56 "test@docker" "http://172.19.0.2:81" 21082ms

Looks right, but still no communication between client/server.

Upvotes: 0

Views: 6447

Answers (1)

dmaixner
dmaixner

Reputation: 874

I think you need to add service port to your test container:

- "traefik.http.services.test.loadbalancer.server.port=81"

edit:

for traefik to be able to discover your service, it needs to be on same network. so best solution seems to define external network for both services or use the one defined with your websocket service

Upvotes: 1

Related Questions