Search code examples
docker-composedocker-swarmtraefik

Unable to see services with traefik


I'm a beginner and Im a bit confused about how traefik works...

I want to use the app freqtrade (trading bot) as a docker service and replicate it with different type of configuration, if you have 5min you can go check this guy I want to do the same thing...

But I don't understant why I can't see my app running with traefik :

What I did :

Configure my domain to my server like that :

server config

And on this machine I create a docker swarm and the treafik service with this tutorial and then, my docker compose file look like that :

```
version: '3.3'

services:
  traefik:
    # Use the latest v2.2.x Traefik image available
    image: traefik:v2.2
    ports:
      # Listen on port 80, default for HTTP, necessary to redirect to HTTPS
      - 80:80
      # Listen on port 443, default for HTTPS
      - 443:443
    networks:
      - traefik-public

    deploy:
      placement:
        constraints:
          # Make the traefik service run only on the node with this label
          # as the node with it has the volume for the certificates
          - node.labels.traefik-public.traefik-public-certificates == true
      labels:
        # Enable Traefik for this service, to make it available in the public network
        - traefik.enable=true
        # Use the traefik-public network (declared below)
        - traefik.docker.network=traefik-public
        # Use the custom label "traefik.constraint-label=traefik-public"
        # This public Traefik will only use services with this label
        # That way you can add other internal Traefik instances per stack if needed
        - traefik.constraint-label=traefik-public
        # admin-auth middleware with HTTP Basic auth
        # Using the environment variables USERNAME and HASHED_PASSWORD
        - traefik.http.middlewares.admin-auth.basicauth.users=${USERNAME?Variable not set}:${HASHED_PASSWORD?Variable not set}
        # https-redirect middleware to redirect HTTP to HTTPS
        # It can be re-used by other stacks in other Docker Compose files
        - traefik.http.middlewares.https-redirect.redirectscheme.scheme=https
        - traefik.http.middlewares.https-redirect.redirectscheme.permanent=true
        # traefik-http set up only to use the middleware to redirect to https
        # Uses the environment variable DOMAIN
        - traefik.http.routers.traefik-public-http.rule=Host(`${DOMAIN?Variable not set}`)
        - traefik.http.routers.traefik-public-http.entrypoints=http
        - traefik.http.routers.traefik-public-http.middlewares=https-redirect
        # traefik-https the actual router using HTTPS
        # Uses the environment variable DOMAIN
        - traefik.http.routers.traefik-public-https.rule=Host(`${DOMAIN?Variable not set}`)
        - traefik.http.routers.traefik-public-https.entrypoints=https
        - traefik.http.routers.traefik-public-https.tls=true
        # Use the special Traefik service api@internal with the web UI/Dashboard
        - traefik.http.routers.traefik-public-https.service=api@internal
        # Use the "le" (Let's Encrypt) resolver created below
        - traefik.http.routers.traefik-public-https.tls.certresolver=le
        # Enable HTTP Basic auth, using the middleware created above
        - traefik.http.routers.traefik-public-https.middlewares=admin-auth
        # Define the port inside of the Docker service to use
        - traefik.http.services.traefik-public.loadbalancer.server.port=8080
    volumes:
      # Add Docker as a mounted volume, so that Traefik can read the labels of other services
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Mount the volume to store the certificates
      - traefik-public-certificates:/certificates
    command:
      # Enable Docker in Traefik, so that it reads labels from Docker services
      - --providers.docker
      # Add a constraint to only use services with the label "traefik.constraint-label=traefik-public"
      - --providers.docker.constraints=Label(`traefik.constraint-label`, `traefik-public`)
      # Do not expose all Docker services, only the ones explicitly exposed
      - --providers.docker.exposedbydefault=false
      # Enable Docker Swarm mode
      - --providers.docker.swarmmode
      # Create an entrypoint "http" listening on port 80
      - --entrypoints.http.address=:80
      # Create an entrypoint "https" listening on port 443
      - --entrypoints.https.address=:443
      # Create the certificate resolver "le" for Let's Encrypt, uses the environment variable EMAIL
      - --certificatesresolvers.le.acme.email=${EMAIL?Variable not set}
      # Store the Let's Encrypt certificates in the mounted volume
      - --certificatesresolvers.le.acme.storage=/certificates/acme.json
      # Use the TLS Challenge for Let's Encrypt
      - --certificatesresolvers.le.acme.tlschallenge=true
      # Enable the access log, with HTTP requests
      - --accesslog
      # Enable the Traefik log, for configurations and errors
      - --log
      # Enable the Dashboard and API
      - --api

volumes:
  # Create a volume to store the certificates, there is a constraint to make sure
  # Traefik is always deployed to the same Docker node with the same volume containing
  # the HTTPS certificates
  traefik-public-certificates:

networks:
  traefik-public:
    driver: overlay
    attachable: true
```

And deploy it :

docker stack deploy -c traefik.yml traefik
  • After that traefik works fine. Why I can't see the port 8080 in my entrypoint ? is it important for others services ?

Entrypoint traefik

I try to disable the firewall in configuration of the server and also do ufw allow 8080 but nothing change...

  • I create my a application like I create traefik service with this docker-compose file :
---
version: '3'

networks:
  traefik_traefik-public:
    external: true


services:
  freqtrade:
    image: freqtradeorg/freqtrade:stable
    # image: freqtradeorg/freqtrade:develop
    # Use plotting image
    # image: freqtradeorg/freqtrade:develop_plot
    # Build step - only needed when additional dependencies are needed
    # build:
    #   context: .
    #   dockerfile: "./docker/Dockerfile.custom"
    restart: unless-stopped
    container_name: freqtrade
    volumes:
      - "./user_data:/freqtrade/user_data"
    # Expose api on port 8080 (localhost only)
    # Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation
    # before enabling this.

    networks:
      - traefik_traefik-public
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: on-failure
        delay: 5s
    command: >
      trade
      --logfile /freqtrade/user_data/logs/freqtrade.log
      --db-url sqlite:////freqtrade/user_data/tradesv3.sqlite
      --config /freqtrade/user_data/config.json
      --strategy SampleStrategy
    labels:
      - traefik.http.routers.bot001.tls=true'
      - traefik.http.routers.bot001.rule=Host(`bot001.bots.lordgoliath.com`)'
      - traefik.http.services.bot001.loadbalancer.server.port=8080'

and this is a part of the configuation file of the bot (to access to the UI)

"api_server": {
        "enabled": true,
        "enable_openapi": true,
        "listen_ip_address": "0.0.0.0",
        "listen_port": 8080,
        "verbosity": "info",
        "jwt_secret_key": "somethingrandom",
        "CORS_origins": ["https://bots.lordgoliath.com"],
        "username": "api",
        "password": "api"
    },

then :

docker stack deploy -c docker-compose.yml freqtrade 

So I have that :

goliath@localhost:~/freqtrade_test/user_data$ docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE                           PORTS
nkvpjjztjibg   freqtrade_freqtrade   replicated   1/1        freqtradeorg/freqtrade:stable
6qryu28ute9i   traefik_traefik       replicated   1/1        traefik:v2.2                    *:80->80/tcp, *:443->443/tcp

I see the bot running with the command docker service logs freqtrade_freqtrade but when I try to go on my domain to see it have only the Traefik dashboard and can't see anything else running.

traefik http traefik https

how I can see my app freqtrade running ? how can I access to the bot UI via my domain ?

Thanks !

Sorry for my bad English I hope this is clear enough to understand my problem

UPDATE

docker service inspect --pretty freqtrade_freqtrade


ID:             o6bpaso69i9n6etybtj09xsqi
Name:           ft1_freqtrade
Labels:
 com.docker.stack.image=freqtradeorg/freqtrade:stable
 com.docker.stack.namespace=ft1
Service Mode:   Replicated
 Replicas:      1
Placement:
 Constraints:   [node.role == manager]
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         freqtradeorg/freqtrade:stable@sha256:3b2f2acb5b9cfedaa7b07cf56af01d1a750bce4c3054bdbaf40ac27935c984eb
 Args:          trade --logfile /freqtrade/user_data/logs/freqtrade.log --db-url sqlite:////freqtrade/user_data/tradesv3.sqlite --config /freqtrade/user_data/config.json --strategy SampleStrategy
Mounts:
 Target:        /freqtrade/user_data
  Source:       /home/goliath/freqtrade_test/user_data
  ReadOnly:     false
  Type:         bind
Resources:
Networks: traefik_traefik-public
Endpoint Mode:  vip

UPDATE NEW docker-compose.yml

    ---
    version: '3'
    
    networks:
      traefik_traefik-public:
        external: true
services:
       freqtrade:
    image: freqtradeorg/freqtrade:stable
    # image: freqtradeorg/freqtrade:develop
    # Use plotting image
    # image: freqtradeorg/freqtrade:develop_plot
    # Build step - only needed when additional dependencies are needed
    # build:
    #   context: .
    #   dockerfile: "./docker/Dockerfile.custom"
    restart: unless-stopped
    container_name: freqtrade
    volumes:
      - "./user_data:/freqtrade/user_data"
    # Expose api on port 8080 (localhost only)
    # Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation
    # before enabling this.

    networks:
      - traefik_traefik-public
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: on-failure
        delay: 5s
      labels:
      - 'traefik.enabled=true'
      - 'traefik.http.routers.bot001.tls=true'
      - 'traefik.http.routers.bot001.rule=Host(`bot001.bots.lordgoliath.com`)'
      - 'traefik.http.services.bot001.loadbalancer.server.port=8080'
    command: >
      trade
      --logfile /freqtrade/user_data/logs/freqtrade.log
      --db-url sqlite:////freqtrade/user_data/tradesv3.sqlite
      --config /freqtrade/user_data/config.json
      --strategy SampleStrategy

UPDATE docker network ls

goliath@localhost:~/freqtrade_test$ docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
003e00401b5d   bridge                   bridge    local
9f3d9a222928   docker_gwbridge          bridge    local
09a33afad0c9   host                     host      local
r4u268yenm5u   ingress                  overlay   swarm
bed40e4a5c62   none                     null      local
qo9w45gitke5   traefik_traefik-public   overlay   swarm

Solution

  • This is the minimal config you need to integrate in order to see the traefik dashboard on localhost:8080

    version: "3.9"
    
    services:
      traefik:
        image: traefik:latest
        command: |
          --api.insecure=true
        ports:
          - 8080:8080
    

    Then, your minimal configuration to get traefik to route example.com to itself:

    version: "3.9"
    
    networks:
      public:
        attachable: true
        name: traefik
    
    services:
      traefik:
        image: traefik:latest
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock:ro
        command: |
          --api.insecure=true
          --providers.docker.exposedbydefault=false
          --providers.docker.swarmmode
          --providers.docker.network=traefik
        ports:
          - 80:80
        networks:
        - public
        deploy:
          labels:
            traefik.enable: "true"
            traefik.http.routers.traefik.rule: Host(`example.com`)
            traefik.http.services.traefik.loadbalancer.server.port: 8080
    

    Now, minimal https support - using Traefik self signed certs to start with. Note that we configure tls on the https entrypoint, which means traefik implicitly creates http and https variants for each router.

    version: "3.9"
    
    networks:
      public:
        attachable: true
        name: traefik
    
    services:
      traefik:
        image: traefik:latest
        volumes:
        - /var/run/docker.sock:/var/run/docker.sock:ro
        command: |
          --api.insecure=true
          --providers.docker.exposedbydefault=false
          --providers.docker.swarmmode
          --providers.docker.network=traefik
          --entrypoints.http.address=:80
          --entrypoints.https.address=:443
          --entrypoints.https.http.tls=true
        deploy:
          placement:
            constraints:
            - node.role == manager
        ports:
    #      - 8080:8080
          - 80:80
          - 443:443
        networks:
        - public
        deploy:
          labels:
            traefik.enable: "true"
            traefik.http.routers.traefik.rule: Host(`example.com`)
            traefik.http.services.traefik.loadbalancer.server.port: 8080
    

    At this point, gluing in your le config should be simple.


    Your freqtrade stack compose would need to be this. If this is a single node swarm, just omit the placement constraints, but when the swarm is large enough to have workers, then tasks that don't need to be on managers should explicitly be kept on workers.

    Traefik needs to talk to the swarm api over the docker socket, which is on manager nodes only, which is why it must be node.role==manager.

    version: "3.9"
        
    networks:
      traefik:
        external: true
    
    services:
      freqtrade:
        image: freqtradeorg/freqtrade:stable
        command: ...
        volumes: ...
        networks:
        - traefik
        deploy:
          placement:
            constraints:
            - node.role == worker
          restart_policy:
            max_attempts: 5
          labels:
            traefik.enabled: "true"
            traefik.http.routers.bot001.rule: Host(`bot001.bots.lordgoliath.com`)
            traefik.http.services.bot001.loadbalancer.server.port: 8080