상현에 하루하루
All 개발자의 하루

traefik swarm 모드 설정

( 업데이트: )

1개의 머신으로 treafik을 구성해서 사용하다가 홈 네으트워크 인프라가 2개의 머신으로 변경되면서 swarm으로 docker를 관리하게 되었습니다. 기존의 설정으로 traefik 컨테이너는 정상적으로 작동하지 않았는데 swarm에서 traefik을 구성을 해보면서 얻은 경험을 정리해보았습니다.

traefik 정적 설정 파일 업데이트

공식 홈페이지에서는 위와 같이 설정파일을 변경하라했는데 위 처럼 작성하고 배포해도 404에러만 띄웠다.

swarm모드에서만 그렇고 취소하고 다시 로컬에서 docker-compose up -d하면 잘된다ㅎ 여러가지 살펴보면서 정상 작동되는 설정을 구성했다.

providers:
  docker:
    watch: true
    endpoint: unix:///var/run/docker.sock
    exposedbydefault: false
    swarmMode: true
    network: proxy-main
    swarmModeRefreshSeconds: 5

network가 traefik 컨테이너가 설정되는 네트워크로 맞춰야한다.

docker-compose.swarm.yaml

...
services:
	app:
		networks:
			- proxy-main
...
########################### NETWORKS
networks:
  proxy-main:
    driver: overlay
    name: proxy-main

네트워크는 위처럼 설정한다 swarm 모드에서는 driver가 overlay로 설정되어야 한다고 나와있다.

좀더 자세한 내용은 docker swarm 공식 문서에가면 잘 설명되어있다.

docker-compose.swarm.yaml

version: "3.8"

########################### SERVICES
services:
  # Traefik 2 - Reverse Proxy
  app:
    env_file:
      - ./.env
    image: traefik:v2.4
    restart: unless-stopped
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: host
      - target: 443
        published: 443
        protocol: tcp
        mode: host
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/rules:/rules
      - ./traefik/acme:/acme
      - ./traefik/traefik.yaml:/etc/traefik/traefik.yaml
    networks:
      - DB_net
      - DB_work
      - proxy-main
    deploy:
      placement:
        constraints:
          - node.hostname == ${HOSTNAME}
      labels:
        - traefik.enable=true
        ## HTTP Routers
        - traefik.http.routers.202106__traefik.rule=Host(`traefik.${DOMAINNAME}`)
        - traefik.http.routers.202106__traefik.entrypoints=websecure
        - traefik.http.routers.202106__traefik.tls.certresolver=leresolver
        ## Service
        - traefik.http.services.202106__traefik.loadbalancer.server.port=8080

  fauth:
    image: thomseddon/traefik-forward-auth:latest
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    environment:
      - PROVIDERS_GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID} # REDACTED
      - PROVIDERS_GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_ID} # REDACTED
      - SECRET=$O{AUTH_SECRET}
      - INSECURE_COOKIE=false
    deploy:
      placement:
        constraints:
          - node.hostname == ${HOSTNAME}
      labels:
        - traefik.enable=true
        - traefik.http.middlewares.fauth.forwardauth.address=http://fauth:4181
        - traefik.http.middlewares.fauth.forwardauth.authResponseHeaders=X-Forwarded-User
        - traefik.http.services.fauth.loadbalancer.server.port=4181\

########################### NETWORKS
networks:
  proxy-main:
    driver: overlay
    name: proxy-main
  DB_net:
    external: true
  DB_work:
    external: true

전체 docker-compose 파일 내용이다. 전체 소스 코드가 보고싶다면 GitHub – Hansanghyeon/synology-traefik at 2685f0a38913c991983f02c5321026083c945fc8

docker swarm에서 labels는 deploy안에 작성하면된다.

docker-compose를 swarm에 배포하는 방법은 swarm 스타트 포스팅을 참고하면 된다.