Multiple TCP services with same IP host and different domain

Hi all.

I have multiple docker containers on my VM that all expose the same ports. Each docker container exposes 50+ TCP ports. My task is to be able to place a separate docker container on each subdomain, an example is below.

docker container 1 [prod]:

svc1.domain.com:5027
svc1.domain.com:5028
svc1.domain.com:5029
...
svc1.domain.com:5060

docker container 2 [stage]:

svc1-stage.domain.com:5027
svc1-stage.domain.com:5028
svc1-stage.domain.com:5029
...
svc1-stage.domain.com:5060

docker container 3 [dev]:

svc1-dev.domain.com:5027
svc1-dev.domain.com:5028
svc1-dev.domain.com:5029
...
svc1-dev.domain.com:5060

How can I do this with traefik? I saw a similar question on this link, but it didn't work for me.

I tried to implement this using docker provider and file provider, but it didn't work.

Traefik version: 2.7.0-rc2
Providers: Docker, File

traefik docker-compose.yml

version: "3.9"

volumes:
  letsencrypt:

networks:
  project_stage_network:
    external: true
  project_prod_network:
    external: true

services:
  traefik:
    image: "traefik:v2.7"
    container_name: "traefik"
    restart: always
    ports:
      - 80:80
      - 443:443
    networks:
      - project_stage_network
      - project_prod_network
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yml:/etc/traefik/traefik.yml
      - ./dynamic_conf.yml:/etc/traefik/dynamic_conf.yml
      - letsencrypt:/letsencrypt
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`${TRAEFIK_FQDN}`)"
      - "traefik.http.routers.traefik.entrypoints=websecure"
      - "traefik.http.routers.traefik.tls.certresolver=myresolver"
      - "traefik.http.routers.traefik.service=api@internal"
      - "traefik.http.services.traefik.loadbalancer.server.port=8080"
      - "traefik.http.middlewares.traefik-compress.compress=true"
      - "traefik.http.middlewares.auth.basicauth.users=${TRAEFIK_AUTH}"
      - "traefik.http.routers.traefik.middlewares=traefik-compress,auth"

traefik.yaml

api:
  insecure: true
  dashboard: true

log:
  level: info
  format: json

providers:
  docker:
    exposedByDefault: false
  file:
    filename: /etc/traefik/dynamic_conf.yml
    watch: true

entrypoints:
  svc1_port1:
    address: :5027
  svc1_port2:
    address: :5028
  svc1_port3:
    address: :5029
  svc1_port4:
    address: :5030
  #...

certificatesresolvers:
  myresolver:
    acme:
      email: admin@project.com
      storage: "/letsencrypt/acme.json"
      httpchallenge:
        entrypoint: web

dynamic_conf.yml

tcp:
  routers:
    project:
      rule: HostSNI(`svc1.domain.com`)
      entryPoints:
        - svc1_port1
        - svc1_port2
        - svc1_port3
        - svc1_port4
        # ...
      service: project_svc1
  services:
    project_svc1:
      weighted:
        services:
          - name: project_svc1_stage
            weight: 1
    project_svc1_stage:
      loadBalancer:
        servers:
          - address: "some-service:5027"
          - address: "some-service:5028"
          - address: "some-service:5029"
          - address: "some-service:5030"
          # ...

project docker-compose.yml

version: "3.9"

networks:
  network:
  db_network:
    external: true

services:
  some-service:
    image: private.svc.registry:latest
    container_name: project_svc_old_${ENV}
    restart: always
    networks:
      - network
      - db_network
    environment:
      - NODE_ENV=production
      - APP_HOST=0.0.0.0
    ports:
      - 5027
      - 5028
      - 5029
      - 5030
      # ...
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=project_${ENV}_network"

      - "traefik.tcp.routers.project_svc_old_${ENV}.rule=HostSNI(`svc1.domain.com`)"
      #- "traefik.tcp.routers.project_svc_old_${ENV}.tls.certresolver=myresolver"

      - "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port1"
      - "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
      - "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5027"

      - "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port2"
      - "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
      - "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5028"

      - "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port3"
      - "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
      - "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5029"

      - "traefik.tcp.routers.project_svc_old_${ENV}.entrypoints=svc1_port4"
      - "traefik.tcp.routers.project_svc_old_${ENV}.service=project_svc_old_${ENV}"
      - "traefik.tcp.services.project_svc_old_${ENV}.loadbalancer.server.port=5030"

      # ...

Thanks.