Cannot route services to the host provided

Hello,

I'm new to traefik, and I can't figure why my configuration do not work as expected.
Here is the context :

  • 2 front-end app, builded and copy/pasted into a nginx folder using Dockerfile
  • 1 rest api, compiled and running with node using Dockerfile
  • 1 postgres database and pgadmin
  • 1 mongo database and mongo-express.

All of this is setup in a docker-compose.

Frontend Dockerfile:

FROM node:lts-alpine as build

WORKDIR /app/frontend-app1 -- frontend-app2 for the other
COPY package*.json ./
RUN npm install
COPY . ./
RUN npm run build

FROM nginx:alpine
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/frontend-app1/build /usr/share/nginx/html/frontend-app1

EXPOSE 3001 -- 3002 from frontend-app2

CMD ["nginx", "-g", "daemon off;"]

API Dockerfile:

FROM node:14-alpine 

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install 

COPY . .

RUN npm run build

ARG NODE_ENV=qual
ENV NODE_ENV=${NODE_ENV}

EXPOSE 3000
CMD ["node", "dist/main"]

Docker-compose:

version: "3.8"

networks:
  backend-network:
  traefik-network:
    name: traefik-network
    external: true

services:
  mongo:
    container_name: wow_mongo
    image: mongo
    restart: always
    ports:
      - 27017:27017
    networks:
      - backend-network
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: xxx
      MONGO_INITDB_DATABASE: xxx
      MONGO_INITDB_USERNAME: xxx
      MONGO_INITDB_PASSWORD: xxx
    volumes:
      - ./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh

  mongo-express:
    container_name: wow_mongo_express
    image: mongo-express
    depends_on:
      - mongo
    restart: always
    ports:
      - 8081:8081
    networks:
      - traefik-network
      - backend-network
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: xxx
      ME_CONFIG_MONGODB_ADMINPASSWORD: xxx
      ME_CONFIG_MONGODB_URL: mongodb://xxx:xxx@mongo:27017/
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mongo-express.rule=Host(`me-qual.xxx.com`)"
      - "traefik.http.routers.mongo-express.entrypoints=web"

  postgres:
    container_name: wow_postgres
    image: postgres
    restart: always
    ports:
      - 5432:5432
    networks:
      - backend-network
    environment:
      POSTGRES_PASSWORD: xxx
      POSTGRES_USER: xxx
      POSTGRES_DB: xxx

  pgadmin:
    container_name: wow_pgadmin
    image: dpage/pgadmin4
    depends_on:
      - postgres
    restart: always
    networks:
      - traefik-network
      - backend-network
    ports:
      - 5050:80
    environment:
      PGADMIN_DEFAULT_EMAIL: xxx
      PGADMIN_DEFAULT_PASSWORD: xxx
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.pgadmin.rule=Host(`pgadmin-qual.xxx.com`)"
      - "traefik.http.routers.pgadmin.entrypoints=web"
      - "traefik.docker.network=traefik-network"

  traefik:
    container_name: wow_traefik
    image: traefik:v2.6
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - $PWD/traefik-conf/traefik.yml:/etc/traefik/traefik.yml
      - $PWD/traefik-conf/acme.json:/letsencrypt/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`traefik.xxx.com`)"
      - "traefik.http.routers.api.service=api@internal"
      - "traefik.http.routers.api.entrypoints=web"
      - "traefik.http.routers.api.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=xxx:xxx"
      # - "traefik.http.routers.traefik.tls.certresolver=letsencrypt"
      # - "traefik.http.middlewares.strip-www.redirectregex.regex=^https?://(www\\.)(.+)"
      # - "traefik.http.middlewares.strip-www.redirectregex.replacement=https://$${2}"
      # - "traefik.http.middlewares.strip-www.redirectregex.permanent=true"

  api:
    container_name: wow_api
    depends_on:
      - postgres
      - mongo
    restart: unless-stopped
    image: wow_api:1.0.0
    build:
      context: ../wow-api
      dockerfile: Dockerfile
    ports:
      - 3000:3000
    networks:
      - traefik-network
      - backend-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wow-api.rule=Host(`api-qual.xxx.com`)"
      - "traefik.http.routers.wow-api.entryPoints=web"

  admin:
    container_name: wow_admin
    # depends_on:
    #   - api
    restart: always
    image: wow_admin:1.0.0
    build:
      context: ../wow-admin
      dockerfile: Dockerfile
    ports:
      - 3002:80
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wow-admin.rule=Host(`admin-qual.xxx.com`, `www.admin-qual.xxx.com`)"
      - "traefik.http.routers.wow-admin.entrypoints=web"
      # - "traefik.http.routers.blog.middlewares=strip-www"
      # - "traefik.http.routers.blog.tls=true"
      # - "traefik.http.routers.blog.tls.certresolver=letsencrypt"

  consultant:
    container_name: wow_consultant
    # depends_on:
    #   - api
    restart: always
    image: wow_consultant:1.0.0
    build:
      context: ../wow-consultant
      dockerfile: Dockerfile
    ports:
      - 3001:80
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wow-consultant.rule=Host(`consultant-qual.xxx.com`, `www.admin-qual.xxx.com`)"
      - "traefik.http.routers.wow-consultant.entrypoints=web"

And my traefik config is simple since I can't manage to make it work in without tls.

global:
  sendAnonymousUsage: false

log:
  level: "INFO"
  format: "common"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: true
    swarmMode: false
    watch: true
    network: traefik-network

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
    # http:
    #   redirections:
    #     entryPoint:
    #       to: "websecure"
    #       scheme: "https"
    # permanent: true

  websecure:
    address: ":443"
    # http:
    #   tls:
    #     certResolver: "letsencrypt"
# certificatesResolvers:
#   letsencrypt:
#     acme:
#       email: "xxx"
#       storage: "/letsencrypt/acme.json"
#       tlsChallenge: {}

I figure out to make traefik.my_domain.com to work and to log using basic auth.
I can also navigate throught my differents services using localhost:<PORT_BINDED>
But as soon as I want to reach, for example, a front end app, I get a Gateway timeout and can't manage to make it work if I don't specify the port.

For example, accessing to the frontend app which is related to the consultant service:
consulltant-qual.xxx.com result in a gateway timeout, but if I ask consulltant-qual.xxx.com:3001, I can access to my app.

Any help would be grateful,

Thanks :slight_smile:

Have you tried not exposing the ports but using a service and a loadbalancer from traefik?

So in your docker-compose you'd change consultant part to the following:

  consultant:
    container_name: wow_consultant
    # depends_on:
    #   - api
    restart: always
    image: wow_consultant:1.0.0
    build:
      context: ../wow-consultant
      dockerfile: Dockerfile
    networks:
      - traefik-network
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik-network"
      - "traefik.http.routers.wow-consultant.rule=Host(`consultant-qual.xxx.com`, `www.admin-qual.xxx.com`)"
      - "traefik.http.routers.wow-consultant.entrypoints=web"
      - "traefik.http.routers.wow-consultant.service=consultant"
      - "traefik.http.services.consultant.loadbalancer.server.port=3001"