'How to make redirection from specific port to domain name in traefik

I am trying to redirect from the specific port of the service to the domain name in traefik.

This is my config in yml file (swarm mode). Here I am trying to automatically redirect from https://portainer.com:8443 to https://portainer.com

I opened the port 8443 for traefik as well.

But when I am trying to do the redirection using: https://portainer.com/example to https://portainer.com it is working fine. How to make that work with ports?


version: '3.8'

services:
  reverse-proxy:
    image: traefik:latest
    ports:
      - 80:80
      - 443:443
      - 8443:8443
    env_file:
      - ./.env
    deploy:
      placement:
        constraints: [node.role == manager]
      update_config:
        failure_action: rollback
      labels:
        # Enable traefik for the specific service
        - "traefik.enable=true"
        # global redirect to https
        - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
        - "traefik.http.routers.http-catchall.entrypoints=http"
        - "traefik.http.routers.http-catchall.middlewares=https-redirect"
        - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
        - "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
        # Make the Traefik use this domain in HTTPS
        - "traefik.http.routers.traefik-https.rule=Host(`traefik.com`)"
        # Allow the connections to the traefik api for the dashboard support
        - "traefik.http.routers.traefik-https.service=api@internal"
        - "traefik.http.services.traefik-svc.loadbalancer.server.port=9999"
        # Use the Let's encrypt resolver
        - "traefik.http.routers.traefik-https.tls=true"
        - "traefik.http.routers.traefik-https.tls.certresolver=le"
        # Use the traefik_net network that is declared below
        - "traefik.docker.network=traefik_net"
        # Use the auth for traefik dashboard
        - "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_AUTH_USER_PASSWORD}"
        - "traefik.http.routers.traefik-https.middlewares=traefik-auth"
      
        
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik-public-certificates:/certificates
    command:
      - --providers.docker
      - --providers.docker.swarmMode=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443
      - [email protected]
      - --certificatesresolvers.le.acme.storage=/certificates/acme.json
      - --certificatesresolvers.le.acme.httpchallenge=true
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=http
      - --accesslog
      - --log
      - --api
    networks:
      - traefik_net

  agent:
    image: portainer/agent:latest
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
    env_file:
      - ./.env
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [ node.platform.os == linux ]

  portainer:
    image: portainer/portainer-ce:latest
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    volumes:
      - portainer_data:/data
    networks:
      - traefik_net
      - agent_network
    env_file:
      - ./.env
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [ node.role == manager ]
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.portainer.service=portainer"
        - "traefik.http.routers.portainer.rule=Host(`portainer.com`)"
        - "traefik.http.routers.portainer.entrypoints=https"
        - "traefik.http.services.portainer.loadbalancer.server.port=9000"
        - "traefik.http.routers.portainer.tls=true"
        - "traefik.http.routers.portainer.tls.certresolver=le"
        - "traefik.docker.network=traefik_net"
      
        - "traefik.http.middlewares.portainer-redirect.redirectregex.regex=^https?://portainer.com:8443"
        - "traefik.http.middlewares.portainer-redirect.redirectregex.replacement=https://portainer.com"
        - "traefik.http.middlewares.portainer-redirect.redirectregex.permanent=true"
        - "traefik.http.routers.portainer.middlewares=portainer-redirect"



Solution 1:[1]

Just need to add one more entrypoint and it will work:

version: '3.8'

services:
  reverse-proxy:
    image: traefik:latest
    ports:
      - 80:80
      - 443:443
      - 8443:8443
    env_file:
      - ./.env
    deploy:
      placement:
        constraints: [node.role == manager]
      update_config:
        failure_action: rollback
      labels:
        # Enable traefik for the specific service
        - "traefik.enable=true"
        # global redirect to https
        - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
        - "traefik.http.routers.http-catchall.entrypoints=http"
        - "traefik.http.routers.http-catchall.middlewares=https-redirect"
        - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
        - "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
        # Make the Traefik use this domain in HTTPS
        - "traefik.http.routers.traefik-https.rule=Host(`traefik.com`)"
        # Allow the connections to the traefik api for the dashboard support
        - "traefik.http.routers.traefik-https.service=api@internal"
        - "traefik.http.services.traefik-svc.loadbalancer.server.port=9999"
        # Use the Let's encrypt resolver
        - "traefik.http.routers.traefik-https.tls=true"
        - "traefik.http.routers.traefik-https.tls.certresolver=le"
        # Use the traefik_net network that is declared below
        - "traefik.docker.network=traefik_net"
        # Use the auth for traefik dashboard
        - "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_AUTH_USER_PASSWORD}"
        - "traefik.http.routers.traefik-https.middlewares=traefik-auth"
      
        
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - traefik-public-certificates:/certificates
    command:
      - --providers.docker
      - --providers.docker.swarmMode=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443
      - --entrypoints.https-new.address=:8443
      - [email protected]
      - --certificatesresolvers.le.acme.storage=/certificates/acme.json
      - --certificatesresolvers.le.acme.httpchallenge=true
      - --certificatesresolvers.le.acme.httpchallenge.entrypoint=http
      - --accesslog
      - --log
      - --api
    networks:
      - traefik_net

  agent:
    image: portainer/agent:latest
    environment:
      # REQUIRED: Should be equal to the service name prefixed by "tasks." when
      # deployed inside an overlay network
      AGENT_CLUSTER_ADDR: tasks.agent
      # AGENT_PORT: 9001
      # LOG_LEVEL: debug
    env_file:
      - ./.env
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [ node.platform.os == linux ]

  portainer:
    image: portainer/portainer-ce:latest
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    volumes:
      - portainer_data:/data
    networks:
      - traefik_net
      - agent_network
    env_file:
      - ./.env
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [ node.role == manager ]
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.portainer.service=portainer"
        - "traefik.http.routers.portainer.rule=Host(`portainer.com`)"
        - "traefik.http.routers.portainer.entrypoints=https,https-new"
        - "traefik.http.services.portainer.loadbalancer.server.port=9000"
        - "traefik.http.routers.portainer.tls=true"
        - "traefik.http.routers.portainer.tls.certresolver=le"
        - "traefik.docker.network=traefik_net"
      
        - "traefik.http.middlewares.portainer-redirect.redirectregex.regex=^https?://portainer.com:8443"
        - "traefik.http.middlewares.portainer-redirect.redirectregex.replacement=https://portainer.com"
        - "traefik.http.middlewares.portainer-redirect.redirectregex.permanent=true"
        - "traefik.http.routers.portainer.middlewares=portainer-redirect"

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 shapale