홈에서 Traefik의 장점이 무엇일까요?
요즘 그 유명한(이라기엔 좀 지난?) Traefik을 설치했습니다.
라즈베리파이에 npm 던져두고 했는데 딱히 장점이 안느껴집니다.
npm은 리버스 프록시 설정 하나 바꾼다고 끊기지 않습니다.
반면 traefik은 docker-compose를 수정하다보니 컨테이너가 삭제되고 다시 실행됩니다.
당연히 연결이 끊기지요.
확실히 orchestration이 구성된 docker에서는 쓸모가 있어보이긴 하는데..
백엔드가 하나 뿐인 홈서버에서는 npm보다 나아보이는게 없어보입니다.
제가 traefik에 대해 모르고 있기 때문에 이런 괘씸한 발언을 할 수 있는 것 같습니다.
무지한 저에게 traefik의 장점을 설파해주실수 있으십니까?
저도 Trafik을 잠시 고민했다가.. 쿠버네티스나 도커스웜이나.. 다안써서 NPM을 그대로 유지중입니다.
NPM최고...!
일단 저도 궁금해서 설치는 해보았는데, 장점이 안보인다면 npm으로 돌아갈 계획중입니다....
돌아가기 전 마지막으로 질문을 드려보았습니다.ㅎㅎ
npm 최고..!
traefik도 yaml 설정 파일 기반으로 운용하면 컨테이너를 재시작할 필요성은 없지만 사실 이득이 있느냐 묻는다면 잘 모르겠네요.
label도 yaml로 대체 가능하려나요?
제가 알기로는 시작시 실행되는 command는 가능하지만 label은 불가능한 것으로 아는데..
문제는 label을 바꿔도 docker가 삭제되고 생성된 후에 실행된다는 것입니다.ㅠㅠ
traefik 설정을 읽어오는 방법이 여러가지가 있는데(provider라고 부름) 도커 컨테이너 혹은 도커 스웜 서비스의 label로부터 불러오는 방법(docker provider)도 있지만, 독립된 traefik 동적 설정 파일들(yaml or toml 포맷)로부터 설정을 읽어오는 방법(file provider) 또한 존재합니다. 이외에 다른 방식도 있고, 여러 방식을 섞을 수도 있어요.
다른 provider에서 정의한 서비스 및 미들웨어는 {서비스/미들웨어 이름}@{provider 이름} 식으로 지정해서 설정해줄 수 있다고 본 것 같네요.
영문이긴 하지만 공식 문서는 여기에 -> https://doc.traefik.io/traefik/providers/file/
아, 참고로 docker compose의 yaml 설정 파일이랑 traefik file provider의 yaml 설정 파일은 서로 별 상관 없어요. 그냥 포맷/확장자만 같은 겁니다.
설정파일은 별도로 관리하면서 돌리면 되니까 매번 다시 올려줄 필요는 없고
저도 비전문가 입장에서 조금 사용해본 소감으로는
traefik이 좀더 세밀한 설정이 가능했습니다.
예를 들어 특정 집단에 대해서 헤더를 일괄 변경하게 해준다거나
특정 영역에 대해서는 2차인증 하도록 돌려준다거나...
label도 설정 파일로 관리가 가능한가요?
저 세팅할때는
/트레픽/
docker-compose.yml
/data/
acme.json
config.yml
traefik.yml
이런식으로 나눠서 관리했구요
도커 컴포즈에 들어가는 라벨같은 경우는
포테이너 컴포즈 파일에 네트워크 별도로 잡아줬고, 라벨에서는 도커로 올라오는거 라우팅 잡기 위해
아래처럼 넣어줬습니다.
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.entrypoints=http"
- "traefik.http.routers.portainer.rule=Host(`portainer.local.ㅇㅇㅇ.com`)"
- "traefik.http.middlewares.portainer-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.portainer.middlewares=portainer-https-redirect"
- "traefik.http.routers.portainer-secure.entrypoints=https"
- "traefik.http.routers.portainer-secure.rule=Host(`portainer.local.ㅇㅇㅇ.com`)"
- "traefik.http.routers.portainer-secure.tls=true"
- "traefik.http.routers.portainer-secure.service=portainer"
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
- "traefik.docker.network=proxy"
트레픽 도커 컴포즈에 라벨은
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`traefik-dashboard.local.ㅇㅇㅇ.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=USER:BASIC_AUTH_PASSWORD"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik-dashboard.local`)"
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=cloudflare"
- "traefik.http.routers.traefik-secure.tls.domains[0].main=local.ㅇㅇㅇ.com"
- "traefik.http.routers.traefik-secure.tls.domains[0].sans=*.local.ㅇㅇㅇ.com"
- "traefik.http.routers.traefik-secure.service=api@internal"
이렇게 넣었구요
트레픽 대시보드 페이지 라우팅 룰하고
dns인증으로 인증서 받는 부분, 암호 입력 관련 세팅정도만 잡아주고 나머지는 다 config.yml에서 설정해 주는데
routers에서 프록시 걸어주는 조건 (어떤 도메인으로 들어올때 프록시 할 것인지) 지정해주고
services에서는 어디로 프록싱할 것인지 (로컬 ip 주소와 포트 등)
middlewares에서는 헤더에 특정 값 넣어주거나, 화이트리스트 잡아주거나 하는 등
리버스 프록시 관련된 옵션 모두 다 주고 저장해서 실시간 반영되도록 해 두었습니다.
http:
routers:
proxmox:
entryPoints:
- "https"
rule: "Host(`proxmox.local.ㅇㅇㅇ.com`)"
middlewares:
- default-headers
- https-redirectscheme
tls: {}
service: proxmox
pihole:
entryPoints:
- "https"
rule: "Host(`pihole.local.ㅇㅇㅇ.com`)"
middlewares:
- default-headers
- addprefix-pihole
- https-redirectscheme
tls: {}
service: pihole
#endregion
#region services
services:
proxmox:
loadBalancer:
servers:
- url: "https://192.168.0.100:8006"
passHostHeader: true
pihole:
loadBalancer:
servers:
- url: "http://192.168.0.101:80"
passHostHeader: true
#endregion
middlewares:
addprefix-pihole:
addPrefix:
prefix: "/admin"
https-redirectscheme:
redirectScheme:
scheme: https
permanent: true
default-headers:
headers:
frameDeny: true
sslRedirect: true
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsPreload: true
stsSeconds: 15552000
customFrameOptionsValue: SAMEORIGIN
customRequestHeaders:
X-Forwarded-Proto: https
default-whitelist:
ipWhiteList:
sourceRange:
- "10.0.0.0/8"
- "192.168.0.0/16"
- "172.16.0.0/12"
secured:
chain:
middlewares:
- default-whitelist
- default-headers
결론적으로는 도커 라벨에서는
트레픽에서는 트레픽 대시보드 관련 라벨, 인증서 acme 챌린지 관련 라벨만 넣어두고
리버스 프록시 관련 세팅값은 모두 config.yml로 빼는 방법입니다.
저 설정할때는 유튜버 중에서 Techno Tim 영상 참조했었구요
https://docs.technotim.live/posts/traefik-portainer-ssl/
여기 가이드 있으니 한번 확인해보세요-
리버스 프록시 관련을 yml로 빼낼수가 있군요..
오오..
역시 제가 잘못 알고 있던게 맞나보네요.
감사합니다.
댓글 참조해서 조금 있다가 시도해보겠습니다!!
cmt alert