CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·MaClien ·일본산당 ·방탄소년당 ·자전거당 ·개발한당 ·소시당 ·이륜차당 ·안드로메당 ·나스당 ·걸그룹당 ·영화본당 ·골프당 ·가상화폐당 ·클다방 ·AI당 ·육아당 ·사과시계당 ·디아블로당 ·패스오브엑자일당 ·리눅서당 ·IoT당 ·젬워한당 ·노젓는당 ·창업한당 ·소셜게임한당 ·노키앙 ·축구당 ·윈폰이당 ·여행을떠난당 ·바다건너당 ·물고기당 ·라즈베리파이당 ·캠핑간당 ·패셔니앙 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·배드민턴당 ·야구당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·콘솔한당 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·갖고다닌당 ·이브한당 ·도시어부당 ·FM한당 ·맛있겠당 ·포뮬러당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·키보드당 ·꼬들한당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·MTG한당 ·소리당 ·적는당 ·방송한당 ·PC튜닝한당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·품앱이당 ·리듬탄당 ·달린당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·퐁당퐁당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

나스당

강좌 traefik 설정 3. 라우팅 추가하기 2

2020-07-28 12:47:21 175.♡.190.135
이치로


이제 traefik dashboard 말고 다른 서비스를 연결해주는 라우팅을 추가해보겠습니다. 서비스는 목적지에 따라 크게 2가지인데 도커에 있느냐 혹은 로컬에 있는 일반 서비스냐 입니다. 많이 쓰는 앱을 위주로 예제와 함께 적어보겠습니다.


도커에 올린 HTTP 서비스 연결하기

여기서 도커에 올린 서비스라 함은 docker-traefik과 같은 도커 데몬 아래에서 돌아가는 서비스를 말합니다. 여담으로 외부에 있는 docker도 같이 연결해주면 좋겠다 싶었는데 아직은 지원하지 않더군요.


guacamole

  guac:
    image: guacamole/guacamole
    container_name: guac
    restart: always
    logging:
      driver: json-file
    networks:
      - backend
    environment:
      MYSQL_DATABASE: guacamole_db
      MYSQL_USER: guacamole_user
      MYSQL_PASSWORD: ${GUAC_MYSQL_PASS}
      GUACD_HOSTNAME: guacd
      MYSQL_HOSTNAME: guac-mysql
    links:
      - guacd
      - guac-mysql
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=backend"
      # HTTP Routers
      - "traefik.http.routers.guac-rtr.entrypoints=https"
      - "traefik.http.routers.guac-rtr.rule=Host(`${TRF_DOMAIN}`) && PathPrefix(`/guacamole`)"
      - "traefik.http.routers.guac-rtr.tls=true"
      - "traefik.http.routers.guac-rtr.tls.certresolver=leresolver"
      # Middlewares
      - "traefik.http.routers.guac-rtr.middlewares=mid-secure-headers@file,mid-rate-limit@file"
      # HTTP Services
      - "traefik.http.routers.guac-rtr.service=guac-svc"
      - "traefik.http.services.guac-svc.loadbalancer.server.port=8080"

  guac-mysql:
    image: mysql:latest
    container_name: guac-mysql
    restart: always
    logging:
      driver: json-file
    networks:
      - backend
    volumes:
      - "${DOCKER_ROOT}/guacamole/mysql:/var/lib/mysql"
      - "${DOCKER_ROOT}/guacamole/scripts:/tmp/scripts"
    environment:
      MYSQL_ROOT_PASSWORD: ${GUAC_MYSQL_ROOT_PASS}

  guacd:
    image: guacamole/guacd
    container_name: guacd
    restart: always
    logging:
      driver: json-file
    networks:
      - backend
    volumes:
      - "${DOCKER_ROOT}/guacamole/D2Coding:/usr/share/fonts/truetype/D2Coding:ro"


제 docker-compose.yml에서 guacamole 관련 컨테이너 설정만 발췌했습니다. guacamole이 daemon과 db를 포함해서 3개의 컨테이너로 이루어진 서비스라 나머지는 참고만 하시고 제일 첫번째 guac 아래 labels를 보시면 됩니다.

    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=backend"
      # HTTP Routers
      - "traefik.http.routers.guac-rtr.entrypoints=https"
      - "traefik.http.routers.guac-rtr.rule=Host(`${TRF_DOMAIN}`) && PathPrefix(`/guacamole`)"
      - "traefik.http.routers.guac-rtr.tls=true"
      - "traefik.http.routers.guac-rtr.tls.certresolver=leresolver"
      # Middlewares
      - "traefik.http.routers.guac-rtr.middlewares=mid-secure-headers@file,mid-rate-limit@file"
      # HTTP Services
      - "traefik.http.routers.guac-rtr.service=guac-svc"
      - "traefik.http.services.guac-svc.loadbalancer.server.port=8080"


첫 두줄은 "traefik backend 네트워크에 있는 날 연결해라"라는 뜻이고, 다음으로 guac-rtr 이란 이름의 라우팅 룰을 정의해서 


1) entrypoint https로 들어오는 요청 중 호스트명이 ${TRF_DOMAIN}이고 path가 /guacamole인 것에 대해,

2) 인증서 입히고, 

3) basicAuth를 제외한 middlewares.toml에 있는 두 개의 미들웨어를 추가하고, 

4) guac-svc로 연결하라는 뜻입니다.


서브 도메인으로 쓰려면 "traefik.http.routers.guac-rtr.rule=Host(`guac.mydomain.com`)" 이런식으로 바꿔도 되겠지만, 서비스는 여전히 /guacamole에서 되고 있으므로 a) guac.mydomain.com/guacamole로 쓰거나 b) 서버 설정을 바꿔주거나 c) 미들웨어 AddPrefix 같은걸 추가해서 path 수정해주면 될겁니다.


최종 서비스 연결은 저런 식으로 서버의 포트만 지정해주면 됩니다. 포트가 8080인 이유는 guacamole 이미지가 8080포트를 기본으로 노출하고 있고 (이미지 만들때 지정가능) 같은 지정 네트워크에 소속되어 있는 컨테이너들끼리는 따로 포트 설정없이 접근할 수 있기 때문입니다.


transmission (webui only)

    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=backend"
      ## HTTP Routers
      - "traefik.http.routers.tr-rtr.entrypoints=https"
      - "traefik.http.routers.tr-rtr.rule=Host(`$TRF_DOMAIN`) && PathPrefix(`/transmission`)"
      - "traefik.http.routers.tr-rtr.tls=true"
      - "traefik.http.routers.tr-rtr.tls.certresolver=leresolver"
      ## Middlewares
      - "traefik.http.routers.tr-rtr.middlewares=mid-secure-headers@file,mid-rate-limit@file"
      ## HTTP Services
      - "traefik.http.routers.tr-rtr.service=tr-svc"
      - "traefik.http.services.tr-svc.loadbalancer.server.port=9091"


트랜스미션 webui, rpc를 연결하는 컨테이너 라벨 예시입니다. guacamole과 거의 같습니다.



로컬에서 동작하는 HTTP 서비스 연결하기

도커로 동작하지 않으니 더이상 라벨로 설정할 수가 없습니다. 이때는 file provider를 이용합니다. 미리 볼륨 매핑해둔 rules 폴더 아래에 traefik-conf.toml 파일을 만들고 설정을 하나씩 추가해 나가겠습니다.

touch /volume1/docker/traefik/rules/traefik-conf.toml


DSM

아래 내용을 traefik-conf.toml에 추가해 주세요.

[http.routers.dsm-rtr]
    rule = "Host(`dsm.mydomain.com`)"
    service = "dsm-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.dsm-rtr.tls]
    certResolver = "leresolver"
[http.services.dsm-svc.loadbalancer]
    [[http.services.dsm-svc.loadbalancer.servers]]
        url = "http://192.168.1.75:5000"

앞에 traefik만 붙지 않았지 도커 라벨에 쓰는 것과 대동소이합니다. 마지막에 url을 이용해서 DSM 내부 ip와 port를 적어줍니다.


docker-traefik을 up 할 필요 없이 파일만 저장하면 바로 변경사항을 인식하고 연결해줍니다.


포토스테이션

[http.routers.photo-station-rtr]
    rule = "Host(`dsm.mydomain.com`) && PathPrefix(`/photo`)"
    service = "photo-station-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.photo-station-rtr.tls]
    certResolver = "leresolver"
[http.services.photo-station-svc.loadbalancer]
    [[http.services.photo-station-svc.loadbalancer.servers]]
        url = "http://192.168.1.75:81"

전 80/443을 traefik에 할당하기 위해 https://www.clien.net/service/board/cm_nas/13753034CLIEN 기존에 80에서 동작하던 서비스를 81로 돌려서 저렇습니다.


WEBDAV

[http.routers.dav-rtr]
    rule = "Host(`dav.mydomain.com`)"
    service = "dav-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.dav-rtr.tls]
    certResolver = "leresolver"
[http.services.dav-svc.loadbalancer]
    [[http.services.dav-svc.loadbalancer.servers]]
        url = "http://192.168.1.75:5005"

webdav도 http 서비스라 동일하게 하시면 됩니다.


ESXi (webui)

[http.routers.esxi-rtr]
    rule = "Host(`esxi.mydomain.com`)"
    service = "esxi-svc"
    entryPoints = ["https"]
    middlewares = ["mid-secure-headers"]
[http.routers.esxi-rtr.tls]
    certResolver = "leresolver"
[http.services.esxi-svc.loadbalancer]
    [[http.services.esxi-svc.loadbalancer.servers]]
        url = "https://192.168.1.11:443"

docker-traefik을 올릴때 command 항목에서 "--serversTransport.insecureSkipVerify=true"가 필수입니다. 이상하게 rateLimit를 적용하면 로그인이 안되는군요.


Transmission/Flexget api/webui

[http.routers.tr-rtr]
    rule = "Host(`dsm.mydomain.com`) && PathPrefix(`/transmission`)"
    service = "tr-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.tr-rtr.tls]
    certResolver = "leresolver"
[http.routers.fg-rtr]
    rule = "Host(`dsm.mydomain`) && PathPrefix(`/flexget`)"
    service = "fg-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.fg-rtr.tls]
    certResolver = "leresolver"
[http.services.tr-svc.loadbalancer]
    [[http.services.tr-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:9091"
[http.services.fg-svc.loadbalancer]
    [[http.services.fg-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:3539"

거의 복붙입니다.


Portainer

[http.routers.portainer-rtr]
    rule = "Host(`dsm.mydomain.com`) && PathPrefix(`/portainer`)"
    service = "portainer-svc"
    entryPoints = ["https"]
    middlewares = ["portainer-stripprefix", "mid-rate-limit", "mid-secure-headers"]
[http.routers.portainer-rtr.tls]
    certResolver = "leresolver"
[http.services.portainer-svc.loadbalancer]
    [[http.services.portainer-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:9000"
[http.middlewares.portainer-stripprefix.stripPrefix]
    prefixes = ["/portainer"]

portainer는 패스없이 동작하기 때문에 stripPrefix 미들웨어로 날려줘야합니다.


Plex와 Tautulli

[http.routers.plex-rtr]
    rule = "Host(`plex.mydomain.com`)"
    service = "plex-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.plex-rtr.tls]
    certResolver = "leresolver"
[http.services.plex-svc.loadbalancer]
    [[http.services.plex-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:32400"


[http.routers.tt-rtr]
    rule = "Host(`plex.mydomain.com`) && PathPrefix(`/tt`)"
    service = "tt-svc"
    entryPoints = ["https"]
    middlewares = ["mid-rate-limit", "mid-secure-headers"]
[http.routers.tt-rtr.tls]
    certResolver = "leresolver"
[http.services.tt-svc.loadbalancer]
    [[http.services.tt-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:8181"

우분투 VM의 docker에서 돌고 있는 plex와 tautulli를 하나의 서브 도메인 아래에 묶었습니다. 저처럼 tautulli가 /tt 아래에서 돌게 하려면 tautulli 설정인 config.ini에서 http_root = /tt로 지정해줘야합니다.


SJVA와 Filebrowser

[http.routers.sjva-rtr]
    rule = "Host(`sjva.mydomain.com`)"
    service = "sjva-svc"
    entryPoints = ["https"]
[http.routers.sjva-rtr.tls]
    certResolver = "leresolver"
[http.services.sjva-svc.loadbalancer]
    [[http.services.sjva-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:9999"
# sjva-filebrowser
[http.routers.sjva-filebrowser-rtr]
    rule = "Host(`sjva.mydomain .com`) && PathPrefix(`/filebrowser`)"
    service = "sjva-filebrowser-svc"
    entryPoints = ["https"]
[http.routers.sjva-filebrowser-rtr.tls]
    certResolver = "leresolver"
[http.services.sjva-filebrowser-svc.loadbalancer]
    [[http.services.sjva-filebrowser-svc.loadbalancer.servers]]
        url = "http://192.168.1.99:9998"

마찬가지로 SJVA와 함께 딸려오는 filebrowser를 하나의 서브 도메인 아래에 묶었습니다. SJVA를 도커로 올릴때 환경변수(FB_BASEURL=/filebrowser)를 추가해주면 filebrowser가 서브패스에서 동작합니다.


docker-traefik이 같이 동작하는 도커 서비스 뿐만 아니라 우분투 VM의 도커 컨테이너, ESXi, DSM 서비스까지 모두 아우를 수 있습니다. 마찬가지로 오라클 클라우드에서 2개의 인스턴스를 동일한 가상클라우드네트워킹에 할당하고 하나의 인스턴스에 traefik을 올린 뒤 다른 인스턴스로 리버스 프록싱 해줄 수도 있습니다. (물론 포트 설정이 필요합니다.)


다음 글에서 마무리 하겠습니다.


이치로 님의 게시글 댓글
SIGNATURE
회원가입일 : 2004-08-24
쪽지는 바로바로 확인 못합니다.
 :)
서명 더 보기 서명 가리기
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [2]
올드보이
IP 218.♡.242.151
07-30 2020-07-30 14:10:29 / 수정일: 2020-07-30 14:11:00
·
안녕하세요 자세한 설정 공유 감사합니다. Plex 는 Synology 에서 Native 로 돌리고 있어서 말씀 하신 대로 rtr 만 걸어 놓고 사용하는데는 문제가 없는데 웹 접속시 401 unauthorized 가 뜨고 진입 하네요. 인증 관련 middleware 는 전부 빼놓은 상태 입니다. 혹시 이런 증상 없으신 가요? 사용엔 지장이 없는데 계속 신경이 쓰이네요 ㅎ Plex 관련 제 toml 입니다.
[http.routers]
[http.routers.plex-rtr]
entryPoints = ["https"]
rule = "Host(`plex.xxxx.me`)"
service = "plex-svc"
[http.routers.plex-rtr.tls]
certresolver = "dns-cloudflare"
[http.services]
[http.services.plex-svc]
[http.services.plex-svc.loadBalancer]
passHostHeader = true
[[http.services.plex-svc.loadBalancer.servers]]
url = "http://192.168.0.7:32400"
이치로
IP 175.♡.190.135
07-30 2020-07-30 16:03:14
·
올드보이님// 전 passhostheader 안쓰는데 혹시 이거 아닐지요?
/ViPm5
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.