302가 발생하고, 자동으로 https로 리다이렉트된 후 끊어집니다…
Traefik 대시보드는 모두 정상이라고 표시합니다.
docker-compose.yml은 다음과 같습니다
version: "3.7"
services:
traefik-reverse-proxy:
# 공식 v2.0 Traefik 도커 이미지
image: traefik:latest #traefik:v2.0
container_name: "traefik"
command:
# Traefik이 도커를 경청하도록 지시
- --providers.docker # (기본값: true)
# api/대시보드 활성화 / (도커 API와 통신하기 위해 도커 엔드포인트 설정)
- --api=true # (기본값: false)
# 대시보드 활성화.
- --api.dashboard # (기본값: true)
# 웹 UI 활성화 / Traefik은 기본적으로 API 요청을 위해 포트 8080에서 경청합니다. / traefik이라는 이름의 entryPoint에서 API를 직접 활성화합니다. (기본값: false) --> 포트 '8080'v= entryPoint 'traefik', --api를 재정의합니다
- --api.insecure=true # (기본값: false)
# 디버깅 및 프로파일링을 위한 추가 엔드포인트 활성화.
- --api.debug=true # (기본값: false)
# 로그의 디버그 수준 설정
- --log.level=DEBUG
# 액세스 로그 기록
- --accesslog=true
# 컨테이너 내부의 저장 위치 정의, 로그 파일은 컨테이너 내부에 기록됩니다. 호스트에서 사용할 수 있도록 하려면 볼륨 섹션을 참조하여 마운트해야 합니다.
- --log.filePath=/var/traefik-container/logs/traefik-log.log
- --accesslog.filepath=/var/traefik-container/logs/traefik-access.log
# 기본 포트 80 엔트리포인트 이름을 "web"으로 재정의
- --entrypoints.web.address=:80
# 포트 443에 대한 엔트리포인트 이름 선언
- --entrypoints.websecure.address=:443
#--providers.docker.endpoint=unix:///var/run/docker.sock
# Let's Encrypt
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true
- --certificatesresolvers.mytlschallenge.acme.email=my@email.com
- --certificatesresolvers.mytlschallenge.acme.storage=/var/traefik-container/letsencrypt/acme.json
ports:
# HTTP 포트
- "80:80"
# HTTPS 포트
- "443:443"
# 웹 UI (--api.insecure=true로 활성화됨)
- "8080:8080"
volumes: # 구문 --> 호스트-위치:컨테이너-내-경로
# Traefik이 도커 이벤트를 경청할 수 있도록
- /var/run/docker.sock:/var/run/docker.sock
- /var/traefik/log:/var/traefik-container/logs
- /var/traefik/letsencrypt:/var/traefik-container/letsencrypt
labels:
- "traefik.enable=true"
- "traefik.docker.network=bridge_proxy_traefikv2"
- "traefik.http.routers.traefikv2.rule=Host(`traefik.mydomain.community`)"
- "traefik.http.routers.traefikv2.entrypoints=web"
- "traefik.http.services.traefikv2.loadBalancer.server.port=80"
networks:
- traefik
#- default
#OS 정보와 HTTP 요청을 출력에 표시하는 작은 Go 웹 서버
# whoami:
# image: "containous/whoami"
# container_name: "whoami"
# labels:
# - "traefik.enable=true"
# - "traefik.docker.network=bridge_proxy_traefikv2"
# - "traefik.http.routers.whoami.rule=Host(`mydomain.community`)"
# - "traefik.http.routers.whoami.entrypoints=web"
# - "traefik.http.services.whoami.loadBalancer.server.port=80"
# networks:
# - traefik
# #- default
whoami_sub:
image: "containous/whoami"
container_name: "whoami_sub"
labels:
- "traefik.enable=true"
- "traefik.name=whoami_sub"
- "traefik.docker.network=bridge_proxy_traefikv2"
- "traefik.http.routers.whoami_sub.rule=Host(`whoami.mydomain.community`)"
- "traefik.http.routers.whoami_sub.entrypoints=web"
#- "traefik.http.services.whoami_sub.loadBalancer.server.port=80"
networks:
- traefik
- default
networks:
traefik:
external:
name: bridge_proxy_traefikv2
discourse app.yml은 다음과 같습니다
## 이는 올인원, 스탠드얼론 Discourse 도커 컨테이너 템플릿입니다
##
## 이 파일에 변경 사항을 적용한 후에는 반드시 재빌드해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 *매우* 주의하세요!
## YAML 파일은 공백 또는 정렬 오류에 대해 매우 민감합니다!
## 필요시 이 파일을 검증하려면 http://www.yamllint.com/ 을 방문하세요
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Let's Encrypt(https)를 추가하려면 다음 두 줄의 주석을 해제하세요
- "templates/web.ssl.template.yml"
- "templates/web.letsencrypt.ssl.template.yml"
## 이 컨테이너는 어떤 TCP/IP 포트를 노출해야 합니까?
## Apache나 nginx 같은 다른 웹 서버와 Discourse가 포트를 공유하려면
## 자세한 내용은 https://meta.discourse.org/t/17247 을 참조하세요
expose:
# - "80:80" # http
# - "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## db_shared_buffers를 총 메모리의 최대 25%로 설정합니다.
## 감지된 RAM에 따라 bootstrap이 자동으로 설정하거나, 직접 재정의할 수 있습니다.
db_shared_buffers: "128MB"
## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다.
#db_work_mem: "40MB"
## 이 컨테이너는 어떤 Git 리비전을 사용해야 합니까? (기본값: tests-passed)
#version: tests-passed
labels:
app_name: discourse
traefik.enable: true
traefik.docker.network: bridge_proxy_traefikv2
traefik.http.services.forum.loadbalancer.server.port: 80
traefik.http.routers.forum.rule: Host(`forum.mydomain.community`)
traefik.http.routers.forum.entrypoints: websecure
traefik.http.routers.forum.tls: true
traefik.http.routers.forum.tls.certresolver: mytlschallenge
docker_args:
- "--network=bridge_proxy_traefikv2"
# - "-l traefik.enable=true"
# - "-l traefik.http.routers.forum.rule=Host(`fairbnb.community`)"
# - "-l traefik.http.routers.forum.entrypoints=websecure"
# - "-l traefik.http.routers.forum.tls=true"
# - "-l traefik.http.routers.forum.tls.certresolver=mytlschallenge"
# - "-l traefik.http.services.forum.loadbalancer.server.port=80"
# - "-l traefik.docker.network=web"
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 동시 웹 요청은 몇 개까지 지원됩니까? 메모리와 CPU 코어 수에 따라 다릅니다.
## 감지된 CPU에 따라 bootstrap이 자동으로 설정하거나, 직접 재정의할 수 있습니다.
UNICORN_WORKERS: 2
## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
## 필수. Discourse는 IP 주소만으로는 작동하지 않습니다.
DISCOURSE_HOSTNAME: forum.fairbnb.community
## 컨테이너가 위에서 지정된 동일한 호스트 이름(-h 옵션)으로 시작되도록 하려면
## 아래 주석을 해제하세요 (기본값 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 초기 가입 시 관리자 및 개발자로 지정될 쉼표로 구분된 이메일 목록
## 예시 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'discourse@myemail.com'
## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
# SMTP 주소, 사용자 이름 및 비밀번호는 필수입니다.
# 경고: SMTP 비밀번호의 '#' 문자는 문제를 일으킬 수 있습니다!
DISCOURSE_SMTP_ADDRESS: smtp.zoho.eu
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: discourse@myemail.com
DISCOURSE_SMTP_PASSWORD: "tempPassword"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (선택 사항, 기본값 true)
## Let's Encrypt 템플릿을 추가했다면, 무료 SSL 인증서를 받으려면 아래 주석을 해제하세요
LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (검색하도록 구성됨)
## 자세한 내용은 https://meta.discourse.org/t/14857 을 참조하세요
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## 도커 컨테이너는 상태가 없으며, 모든 데이터는 /shared에 저장됩니다.
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## 플러그인은 여기에 배치합니다.
## 자세한 내용은 https://meta.discourse.org/t/19157 을 참조하세요.
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## 빌드 후 실행할 모든 사용자 지정 명령
run:
- exec: echo "Beginning of custom commands"
## 첫 번째 가입에 대한 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
## 첫 번째 가입 이메일을 받은 후, 해당 줄의 주석을 다시 활성화하세요. 한 번만 실행하면 됩니다.
- exec: rails r "SiteSetting.notification_email='discourse@zoho.fairbnb.community'"
- exec: echo "End of custom commands"
직접 태그를 달아 죄송합니다. 하지만 Traefik 뒤에 Discourse를 실행 중인 문서화된 사용자는 여러분인 것 같아서요.
Traefik이 모든 것을 처리해 줄 것이라는 약속에도 불구하고, 설정이 그렇게 간단하지 않은 것 같습니다.
지금까지 저는 성공하지 못했습니다:
문서에도 해당 템플릿 섹션을 추가하는 것을 제안합니다. 저는 app.yml을 얻기 위해 처음에 standalone으로 설치했기 때문에 제 설치 환경에서 해당 부분이 주석 처리되어 있지 않다는 것을 알게 되었습니다. 처음에 제가 주석 처리를 잊어버린 것입니다. 다른 사람들이 같은 문제에 빠지지 않도록 방지할 수 있을 것입니다.
네, Redirecting... 도 참고하세요. 처음에는 https를 바로 시작했고 인증서 생성에도 성공했지만, 거기까지였습니다. 이제 그때 이후로 쌓은 지식과 맞추어야 합니다.
즉, 포럼에 접속하기 위해 https를 사용하시는 거죠?
Traefik과 Discourse 설정을 공유해 주시겠습니까? 더 많이 공유해 주실수록 주말에 제게 더 쉬울 것입니다.
v1에서 v2로 전환하는 가이드는 Redirecting... 에 나와 있지만, 주말에 여기서 설명을 시도해 보겠습니다.
Traefik 대시보드의 서비스 탭에서 discourse@docker 와 discourse_secure@docker 를 볼 수 있는 것으로 보아 일부는 작동하는 것 같습니다.
그러나 라우터 탭에는 discourse 관련 항목이 없습니다.
app.yml 파일에 적용한 변경 사항은 다음과 같습니다. 주로 위에 링크된 포스트를 기반으로 작성했으며, 하단의 docker 인자에 공개 포트(exposed port)를 추가했는데, 이렇게 하면 위에서 언급한 서비스들이 열렸습니다. 도움을 주시면 감사하겠습니다!
Traefik docker-compose
version: "3.3"
services:
################################################
#### Traefik Proxy Setup #####
###############################################
traefik:
image: traefik:v2.0
restart: always
container_name: traefik
ports:
- "80:80" # <== http
- "8080:8080" # <== :8080은 대시보드가 실행되는 포트입니다
- "443:443" # <== https
command:
#### Traefik를 구성하고 작동 방식을 알려주는 CLI 명령어입니다 ####
- --api.insecure=true # <== 보안이 취약한 api 활성화, 프로덕션 환경에서는 권장되지 않음
- --api.dashboard=true # <== 서비스, 미들웨어, 라우터 등을 확인하기 위한 대시보드 활성화
- --api.debug=true # <== 디버깅 및 프로파일링을 위한 추가 엔드포인트 활성화
## 로그 설정 (옵션: ERROR, DEBUG, PANIC, FATAL, WARN, INFO) - https://docs.traefik.io/observability/logs/ ##
- --log.level=DEBUG # <== traefik 로그 수준 설정
## 프로바이더 설정 - https://docs.traefik.io/providers/docker/#provider-configuration ##
- --providers.docker=true # <== traefik의 프로바이더로 docker 활성화
- --providers.docker.exposedbydefault=false # <== 모든 컨테이너를 traefik에 노출하지 말고, 활성화된 것만 노출
- --providers.file.filename=/dynamic.yaml # <== 동적 구성 파일 참조
- --providers.docker.network=web # <== web이라는 이름의 docker 네트워크에서 작동
## 엔트리포인트 설정 - https://docs.traefik.io/routing/entrypoints/#configuration ##
- --entrypoints.web.address=:80 # <== web이라는 이름의 :80 포트 엔트리포인트 정의
- --entrypoints.web-secured.address=:443 # <== web-secured라는 이름의 :443 포트 https 엔트리포인트 정의
## 인증서 설정 (Let's Encrypt) - https://docs.traefik.io/https/acme/#configuration-examples ##
- --certificatesresolvers.mytlschallenge.acme.tlschallenge=true # <== ACME 인증서 생성 및 갱신을 위해 TLS-ALPN-01 활성화
- --certificatesresolvers.mytlschallenge.acme.email=private@private.com # <== 인증서용 이메일 설정
- --certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json # <== 인증서 정보를 저장할 acme 파일 정의
volumes:
- ./letsencrypt:/letsencrypt # <== 인증서(TLS) 볼륨
- /var/run/docker.sock:/var/run/docker.sock # <== docker 관리 볼륨
- ./dynamic.yaml:/dynamic.yaml # <== 동적 구성 파일 볼륨, **참조: 27행
networks:
- web # <== traefik을 web 네트워크에 배치하여 이 네트워크의 컨테이너에 접근 가능하도록 함
labels:
#### 라벨은 이 컨테이너에 대한 traefik 프록시의 동작과 규칙을 정의합니다 ####
- "traefik.enable=true" # <== 대시보드 확인 및 서브도메인 할당을 위해 traefik 자체에 traefik 활성화
- "traefik.http.routers.api.rule=Host(`monitor.private.com`)" # <== 대시보드용 도메인 설정
- "traefik.http.routers.api.service=api@internal" # <== api를 서비스로 활성화하여 접근 가능하게 함
networks:
web:
external: true
backend:
external: false
volumes:
db_data: {}
wordpress:
external: true
db:
external: true
Discourse app.yml
## 이것은 올인원, 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다
##
## 이 파일에 변경 사항을 적용한 후에는 반드시 다시 빌드해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 매우 주의하세요!
## YAML 파일은 공백이나 정렬 오류에 매우 민감합니다!
## 필요 시 http://www.yamllint.com/ 에서 이 파일을 검증하세요
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요
#- "templates/web.ssl.template.yml"
# "templates/web.letsencrypt.ssl.template.yml"
## 이 컨테이너가 어떤 TCP/IP 포트를 노출해야 합니까?
## Discourse를 Apache나 nginx 같은 다른 웹서버와 포트 공유하려면
## https://meta.discourse.org/t/17247 를 참조하세요
expose:
#- "80:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## db_shared_buffers를 총 메모리의 최대 25%로 설정하세요.
## bootstrap이 감지된 RAM 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
db_shared_buffers: "128MB"
## 정렬 성능을 개선할 수 있지만, 연결당 메모리 사용량이 증가합니다
#db_work_mem: "40MB"
## 이 컨테이너가 어떤 Git 리비전을 사용해야 합니까? (기본값: tests-passed)
#version: tests-passed
env:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 동시 웹 요청을 얼마나 많이 지원할 수 있습니까? 메모리와 CPU 코어 수에 따라 다릅니다.
## bootstrap이 감지된 CPU 기반으로 자동으로 설정하거나, 직접 오버라이드할 수 있습니다
UNICORN_WORKERS: 2
## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
## 필수입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
DISCOURSE_HOSTNAME: forum.private.com
## 컨테이너가 위에서 지정한 동일한 호스트 이름(-h 옵션)으로 시작되도록 하려면 주석을 해제하세요 (기본값 "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록
## 예시 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'private@private.com'
## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
# SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
# 경고: SMTP 비밀번호에 '#' 문자가 있으면 문제가 발생할 수 있습니다!
DISCOURSE_SMTP_ADDRESS: in-v3.mailjet.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: redacted
DISCOURSE_SMTP_PASSWORD: "redacted"
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (선택 사항, 기본값 true)
## Lets Encrypt 템플릿을 추가했다면 무료 SSL 인증서를 얻기 위해 아래 주석을 해제하세요
LETSENCRYPT_ACCOUNT_EMAIL: private@private.com
## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (검색하도록 구성됨)
## https://meta.discourse.org/t/14857 를 참조하세요
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## Docker 컨테이너는 상태가 없으며, 모든 데이터는 /shared에 저장됩니다
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## 플러그인은 여기에 추가합니다
## https://meta.discourse.org/t/19157 를 참조하세요
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## 빌드 후 실행할 사용자 정의 명령어
run:
- exec: echo "Beginning of custom commands"
## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
## 첫 가입 이메일을 받은 후, 다시 주석 처리하세요. 한 번만 실행하면 됩니다.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "End of custom commands"
labels:
app_name: discourse
#----Traefik 라벨------------------------
traefik.enable: true
traefik.docker.network: web
#---HTTP 라우터 섹션-------------------
traefik.http.routers.discourse.rule: Host(`forum.private.com`)
#--HTTP 섹션--------------------------
traefik.http.routers.discourse.entrypoints: web
traefik.http.routers.discourse.middlewares: discourse_redirect2https
traefik.http.services.discourse.loadbalancer.server.port: 80
#---HTTPS 라우터 섹션
traefik.http.routers.discourse_secure.rule: Host(`forum.private.com`)
#--HTTPS 섹션
traefik.http.routers.discourse_secure.entrypoints: web-secured
traefik.http.services.discourse_secure.loadbalancer.server.port: 80
#--TLS 섹션
traefik.http.routers.discourse_secure.tls.certresolver: tlsChallenge_letsencrypt
#---미들웨어 섹션: http를 https로 리다이렉트
traefik.http.middlewares.discourse_redirect2https.redirectscheme.scheme: https
docker_args:
- "--network=web"
- "--expose=80"