넥클 리버스프록시 traefik으로 드디어 성공했어요!
넥스트클라우드 때문에 며칠을 고생한지 모르겠습니다.
처음에 넥클 설치하고 나서 -> 어 업로드가 느리다? 해서 aio도 설치해 보고 각종 설정을 해봐도, 애드가드를 꺼봐도, 클플 프록시를 꺼도 계속 느려서 -> 그럼 넥클은 원래 느린가?가 되서 pydio나 own을 설치해 보기 시작했습니다.
그런데 own도..! 느립니다. 업로드 속도가 안나와요.
그럼 도메인을 타고 올 때 느리구나! 해서 외부 ip로 접속하니 정상 속도가 나옵니다 -> 그럼 npm plus 쪽 문제인가 해서, 각종 설정을 붙여보곤 했는데...그래도 안되요 ㅠㅜㅜㅜ
그러던 중 NavyStack님이 traefik을 소개해 주셨고 이렇게 된 거, 도전해보자가 되었습니다.
그런데... 저는 한번도 도커 compose를 해 본 경험이 없습니다. 애초에 unraid의 커뮤니티 앱에 심히 의존중이었습니다. 어떻게 해야 할지 막막했는데 NavyStack님의 깃허브와, 블로그를 통해
기본적인 뼈대는 완성할 수 있었고, 그래도 작동되지 않는 부분은 NavyStack님이 재현까지 해 주시면서 도와주셔서
compose도 하고,
이렇게 대시보드까지 확인할 수 있었습니다.
그 이후로, 본격적으로 넥클 리버스프록시에 도전을 시도했습니다. gui 환경이 있어 리버스프록시 설정이 쉬운 npmplus와 달리 traefik은 gui는 오직 대시보드만 있기 때문에 솔직히 좀 많이 난감했었습니다.
그리고 NavyStack님은 .yml에 바로 설정을 작성했었지만, 저는 unraid 커뮤니티앱을 사용하고 있었기에, 별도 컨테이너 앱을 연결을 해야 했었고, .yml에 작성시 에러가 생겼기 때문에 어떻게 해야 할지 고민이었습니다(제가 제대로 못한 것 일수도 있겠지만).
그렇게 찾다보니 알게된게, compose시 만들어 두었던 dynamic.toml 파일이었습니다.
Traefik에서 dynamic.toml과 traefik.toml 파일은 각각 동적 구성(dynamic configuration)과 정적 구성(static configuration)을 담당합니다.
- 동적 구성(dynamic configuration): dynamic.toml 파일은 시스템이 요청을 어떻게 처리할지 정의하는 모든 것을 포함합니다. 이 구성은 변경될 수 있으며, 요청 중단이나 연결 손실 없이 원활하게 핫 리로드됩니다. Traefik은 프로바이더(예: 오케스트레이터, 서비스 레지스트리, 일반 구성 파일 등)로부터 동적 구성을 가져옵니다. HTTPS 인증서도 동적 구성에 속하며, Traefik 인스턴스를 재시작하지 않고 추가/업데이트/제거할 수 있습니다.
- 정적 구성(static configuration): traefik.toml 파일은 프로바이더에 대한 연결을 설정하고, Traefik이 수신할 엔트리포인트를 정의하는 등의 요소를 포함합니다1. 이러한 요소들은 자주 변경되지 않습니다. 정적 구성은 Traefik이 시작할 때 /etc/traefik/, $XDG_CONFIG_HOME/, $HOME/.config/, 작업 디렉토리 등에서 traefik.yml (또는 traefik.yaml 또는 traefik.toml) 파일을 찾아 로드합니다.
따라서, dynamic.toml은 시스템이 요청을 어떻게 처리할지를, traefik.toml은 Traefik이 어떻게 작동할지를 각각 정의합니다. 이 두 파일은 Traefik의 핵심 구성 요소로, 서로 다른 역할을 수행합니다.
이 dynamic에서 특정 도메인의을 어느 ip로 연결할지(?) 처리가 가능했습니다. 그래서 NavyStack님의 깃허브 내용과 제가 찾아본 내용을 토대로
[http]
[http.middlewares] #미들웨어 종류
[http.middlewares.security-headers.headers] #보안미들웨어
browserXssFilter = true # 브라우저의 내장 XSS(크로스 사이트 스크립팅) 필터를 활성화
contentTypeNosniff = true #브라우저가 응답의 MIME 유형을 추측하지 못하게 하여, MIME 유형 변조 공격을 방지
forceSTSHeader = true # HTTP Strict Transport Security(HSTS)를 구성
stsPreload = true # HTTP Strict Transport Security(HSTS)를 구성
stsSeconds = 31536000 # HTTP Strict Transport Security(HSTS)를 구성
stsincludesubdomains = false # HTTP Strict Transport Security(HSTS)를 구성
isdevelopment = false #개발 모드를 비활성화
[http.middlewares.security-nextcloud.headers] #넥스트클라우드 커스텀. referrerPolicy 추가.
browserXssFilter = true
contentTypeNosniff = true
forceSTSHeader = true
stsPreload = true
stsSeconds = 31536000
stsincludesubdomains = false
isdevelopment = false
referrerPolicy = "no-referrer" #브라우저는 Referer 헤더를 전혀 보내지 않음, __Host-Prefix 용
[http.middlewares.websocket.headers.customRequestHeaders] #웹소켓 요청에 대한 사용자 정의 헤더를 설정
X-Forwarded-Proto = "https, wss" #이 헤드를 헤더를 "https, wss"로 설정, 프록시된 요청이 HTTPS/WSS(WebSocket Secure)로 이루어짐으로 나타냄냄
[http.middlewares.www-to-Root.redirectRegex] #정규 표현식을 사용하여 요청을 다른 위치로 리다이렉트
regex = "^https?://www\\.(.+)" #“www” 서브도메인에서 루트 도메인으로의 리다이렉트를 설정
replacement = "https://${1}"
permanent = true
[http.middlewares.normal-compress.compress] #압축미들웨어(기본)
minResponseBodyBytes = 1024
[http.middlewares.large-compress.compress] # 압축미들웨어(라지, 넥클같은 고용량 클라우드 용?)
minResponseBodyBytes = 8192
[http.middlewares.ratelimit-normal.ratelimit] # rate limiting을 설정
average = 100 #특정 시간 동안 허용되는 평균 요청 수를 지정, 이 설정은 초당 100
burst = 50 #일시적인 요청의 폭증을 처리하기 위한 버퍼를 지정
[http.middlewares.ratelimit-large.ratelimit] # 대용량 파일, 동시 여러 미디어 스트리밍 등.
average = 1000
burst = 500
[http.middlewares.retry.retry] #재시도(retry) 미들웨어, 서비스 일시 불능 or 응답X 때 요청을 자동 재시도
attempts = 3 #3회 재시도도
[http.routers] #Traefik에서 HTTP 요청을 처리하는 라우터를 정의
[http.routers.nextcloud] #넥스트클라우드 이름의 라우터 정의
rule = "Host(`도메인`)" # 라우터가 어떤 요청을 처리할지를 결정하는 규칙을 정의, ''안의 도메인으로 들어오는 모든 요청 처리
service = "nextcloud-aio" # 라우터가 요청을 전달할 서비스를 지정
entrypoints = ["websecure"] #라우터가 수신할 네트워크 진입점을 지정
middlewares = ["security-nextcloud", "large-compress", "ratelimit-large", "retry"] #사용할 미들웨어
[http.routers.nextcloud.tls] # 라우터가 TLS(Transport Layer Security)를 사용하여 요청을 처리하도록 설정
certresolver = "cloudflare" # TLS 인증서를 해석하는데 사용할 CertResolver를 지정
domains = [ { main = "*.도메인" } ] #인증서를 발급받을 도메인을 지정
[http.services] #Traefik에서 사용할 서비스를 정의, 서비스는 라우터로부터 요청을 받아 처리
[http.services.nextcloud-aio.loadBalancer] #로드 밸런서 서비스를 정의, 로드 밸런서는 여러 서버 간에 요청을 분산
[[http.services.nextcloud-aio.loadBalancer.servers]] #서비스가 요청을 전달할 서버의 URL을 지정
url = "http://아이피"
[tls.options] # Traefik에서 사용할 TLS 옵션을 정의
[tls.options.default]
minVersion = "VersionTLS12"
[tls.options.mintls13]
minVersion = "VersionTLS13"
이렇게 만들었습니다. traefik은 여러 미들웨어를 만들고, 그 미들웨어 조합으로 다양한 설정을 할 수 있는데요.
Traefik에서 미들웨어는 두 가지 다른 컴포넌트 사이에 위치한 소프트웨어 조각으로, 요청을 수정하거나 헤더를 변경하고, 리다이렉션을 담당하며, 인증을 추가하는 등의 역할을 합니다.
저렇게 여러 미들웨어로 각 사이트 별 특성에 맞게 조합을 할 수 있다는 점이 재미있고, 좋았습니다. 다만 아직 traefik은 압축에서 gzip만 사용가능하더라고요. Brotli는 아직 베타인 v3 버전에서만 지원해서 나름 v3가 벌써 기대되기도 합니다.
저 traefik은 생각보다 미들웨어나 기타 등등 찾아보고 찾아보는 맛이 있어서, 나중에 공홈에서 한 번 싹 둘러봐야겠습니다.
그렇게... 넥스트클라우드 리버스 프록시를 완성하고 다시 넥클 aio를 설치했습니다.
npm 때에는 어떻게 해도
- "X-XSS-Protection" HTTP 헤더가 "1; mode=block"을(를) 포함하고 있지 않습니다. 잠재적인 정보 유출 및 보안 위협이 될 수 있으므로 설정을 변경하는 것을 추천합니다.
이 에러 해결이 되지 않았었는데 이제 깔끔합니다!!!!
그리고 미들웨어에서 referrerPolicy - 'no-referrer'를 추가함으로서 넥클 보안검사에서도 A+를 받을 수 있었습니다.
그리고 대망의 업로드 확인 시간.
그런데 여전히 업로드 속도가 나오지 않아 순간 엄청 당황했었습니다 ㅋㅋㅋㅋㅋㅋㅋ
그러다 에이 설마..하고 애드가드를 껐더니.. 잘 됩니다!!! 저는 애드가드를 브라우저 확장이 아니라, 윈도우 앱으로 설치해서 사용중에 있거든요? 그래서인지 몰라도 브라우저 예외처리를 해도 속도 차이가 은근 있네요. 넥클 사용할 때에는 애드가드를 꺼야 할 듯...?
저희집 인터넷환경에서 구드랑 비교해보면, 4.37기가 짜리 단일 압축파일을 업로드시
구글 드라이브 : 약 25MB/s
넥스트클라우드(청크 사이즈 100MB, 클라우드플레어 프록시 환경) : 약 5.5MB/s
넥스트클라우드(청크 사이즈 500MB, 클라우드플레어 DNS only) : 약 30MB/s
로 매우 무난한 업로드 속도를 보여줬습니다. 청크 사이즈를 0으로 조절하면 업로드가 아예 되지 않아, 500으로 확정 지었고, 업로드 완료 후, 마무리 작업에서(아마 청크로 업로드 한 거, 모으는?) 30초 가량 소모를 했으니, 실제 업로드 속도는 더 빠른 것으로 보입니다.
정말 감격의 속도가 ㅠㅠㅠㅠㅠㅠ
반기가라 거의 회선 속도 다 뽑아먹네요.
프록시를 끄고 싶지 않은데... 속도 차이가 너무 나서 끄고 사용해야 하겠네요ㅋㅋㅋ
이렇게 업로드 속도로 고생했던 넥스트클라우드 설치를 마무리 지을 수 있었습니다. 다시 한번, 큰 도움을 주신 NavyStack님께 감사인사드립니다.
:) 뿌듯뿌듯 합니다.
혹시 넥스트 클라우드에서 헤더 가지구 뭐라하면
https://navystack.com/nextcloud를-위한-traefik-설정-세팅/
요거 해보세요 :)
yml은 이스케이핑이 필요한 경우가 있어서
가급적 저는 toml 사용합니다 :)
docker-compose.yml 도 소리소문 없이 이스케이핑 처리를 바꿔서... ㅠㅠ
가끔 깃허브 돌아다니가다 보면 안되는 docker-compose.yml이 전부 이런경우입니다.
지금은 다행이도 헤더 가지고 뭐라하지는 않네요.
이스케이핑이 자주 바뀌나 보군요 ㄷㄷㄷ
덕분에 traefik에 도전했고, 무척 만족스럽습니다 ㅎㅎ
cmt alert