Bad Gateway with Traefik and Docker Compose

Viewed 567

I'm trying to deploy a React + FastApi + Postgres application on docker compose with Traefik as the reverse proxy. I'm running into issues with Bad Gateway errors. Running my FastAPI locally runs it on port 8888 and exposes the path /docs to view the api documentation. I'd like to eventually have the application running on example.local with the docs available on example.local/api/docs. My docker-compose.yaml is as follows (loosely based on this one):

version: '3.8'

services:
  proxy:
    image: traefik:v2.4
    networks:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - '80:80'
      - '8080:8080'
      - '443:443'
    command:
      - --providers.docker
      - --api.insecure=true
      - --providers.docker.exposedbydefault=false
      - --providers.docker.network=web
      - --entrypoints.web.address=:80
    labels:
      - traefik.enable=true
      - traefik.http.routers.example-proxy-http.rule=Host(`example.local`)
      - traefik.http.routers.example-proxy-http.entrypoints=web
      - traefik.http.services.example-proxy.loadbalancer.server.port=80

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    command: python app/main.py
    volumes:
      - ./backend/app:/app
    env_file:
      - .env
    networks:
      - web
      - backend
    labels:
      - traefik.enable=true
      - traefik.http.routers.example-backend-http.rule=PathPrefix(`api/docs`)
      - traefik.http.routers.example-backend-http.entrypoints=web
      - traefik.http.services.example-backend.loadbalancer.server.port=8888

networks:
  web:
    external: true
  backend:
    external: false

I've added 127.0.0.1 example.local to my /etc/hosts file.

From reading around it seems like Bad Gateway errors tend to occur from traefik and related services not being on the same network, or traefik routing traffic to the wrong port on the service container. However if I set ports: - '8888:8888' in my backend service I can access the docs from localhost:8888/docs so I'm pretty sure 8888 is the correct port for the backend loadbalancer. From what I can see traefik and the backend service are on the same network too and I've set it as the default traefik network with --providers.docker.network=web. Interestingly if I visit localhost/api/docs in my browser I'm served up a page from FastAPI. So it could be an issue with my traefik http router labels? I'm quite new to traefik and proxies so would appreciate any help or guidance, thanks!

UPDATE

If I specify the host for the backend by adding

- traefik.http.routers.infilmation-backend-http.rule=Host(`example.local`) && PathPrefix(`/docs`)

to the backend service labels, then visiting example.local/docs does serve up page from FastApi. So I guess my question would be what is the best way of setting up a host for this application? Is there a way I can specify a default host for all services then any PathPrefix rules would be in relation to that host?

0 Answers
Related