두 가지 프로토콜을 사용하는 Markdown JS

버전: 2.7.0.beta1
설치: discourse-docker

안녕하세요,

더 나은 설명 방법을 모르겠지만, 저희 디스커스 설치 환경에서 markdown-it JS 번들이 제대로 작동하지 않습니다. 어떻게 해서인지 JavaScript URL( CDN을 통해 제공되고 S3 버킷에 저장됨)에 추가적인 프로토콜 "https"가 붙어 있는 상태입니다.

스크린샷을 첨부했습니다.
image

다른 모든 리소스는 정상적으로 작동합니다.

이것만 그런 상태이고, 이로 인해 미리보기 기능이 작동하지 않습니다 :frowning:

시간 내어 확인해 주셔서 감사합니다. 기대하겠습니다 :slight_smile:

정상적으로 작동하는 다른 리소스의 스크린샷:

여기에 app.yml 파일을 공유해 주시겠어요?

네, 물론이죠.

## Ansible에 의해 관리됨. 서버에서 변경하지 마세요
## 이것은 올인원, 스탠드얼론 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 포트를 노출해야 합니까?
## 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: '16GB'

  ## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
  #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: 8

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
  ## 필수 항목입니다. Discourse는 맨 IP 주소로는 작동하지 않습니다.
  DISCOURSE_HOSTNAME: 'community-dev.stackit.cloud'

  ## 컨테이너가 위에서 지정한 것과 동일한 호스트 이름(-h 옵션)으로 시작되도록 하려면 주석을 해제하세요 (기본값 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록
  ## 예시 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'xxx'

  ## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
  # SMTP 주소, 사용자 이름 및 비밀번호는 필수입니다
  # 경고: SMTP 비밀번호에 '#' 문자가 있으면 문제가 발생할 수 있습니다!
  DISCOURSE_SMTP_ADDRESS: '1.2.3.4'
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: 'xx@xx.de'
  DISCOURSE_SMTP_PASSWORD: 'xxx'
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

  ## Lets Encrypt 템플릿을 추가했다면 무료 SSL 인증서를 얻으려면 아래 주석을 해제하세요
  #LETSENCRYPT_ACCOUNT_EMAIL: info@ediri.de

  ## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (pull하도록 구성됨)
  ## 자세한 내용은 https://meta.discourse.org/t/14857 를 참조하세요
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  #DISCOURSE_CDN_URL: community-cdn.change.me

  ## IP 주소 조회를 위한 maxmind 지오로케이션 IP 주소 키
  ## 자세한 내용은 https://meta.discourse.org/t/-/137387/23 를 참조하세요
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

  DISCOURSE_DB_POOL: 16
  DISCOURSE_DB_USERNAME: 'discourse'
  DISCOURSE_DB_PASSWORD: 'yyy'
  DISCOURSE_DB_HOST: 1.2.3.4
  DISCOURSE_DB_NAME: 'discourse'
  DISCOURSE_DB_PORT: 5432

  DISCOURSE_REDIS_HOST: 'y.de'
  DISCOURSE_REDIS_PASSWORD: 'xxx'
  DISCOURSE_REDIS_PORT: 49456

  DISCOURSE_MESSAGE_BUS_REDIS_ENABLED: true
  DISCOURSE_MESSAGE_BUS_REDIS_HOST: 'y.de'
  DISCOURSE_MESSAGE_BUS_REDIS_PORT: 49456
  DISCOURSE_MESSAGE_BUS_REDIS_PASSWORD: 'xxx'

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: whatever
  DISCOURSE_S3_ENDPOINT: https://assets.xxx
  DISCOURSE_S3_ACCESS_KEY_ID: 'discourse-dev'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'xxx'
  DISCOURSE_S3_CDN_URL: https://discourse-dev.assets.xxx
  DISCOURSE_S3_BUCKET: 'discourse-dev'
  DISCOURSE_S3_BACKUP_BUCKET: 'discourse-dev/backups'
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_INSTALL_CORS_RULE: false

## Docker 컨테이너는 상태(stateless)를 가지며, 모든 데이터는 /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
      - git clone https://github.com/discourse/discourse-cakeday.git
      - git clone https://github.com/discourse/discourse-oauth2-basic.git
      #- git clone https://github.com/discourse/discourse-bbcode.git

  after_assets_precompile:
- exec:
    cd: $home
    cmd:
      - sudo -E -u discourse bundle exec rake s3:upload_assets

## 빌드 후 실행할 모든 커스텀 명령
run:
  - exec: echo "Beginning of custom commands"
  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
  ## 첫 번째 가입 이메일을 받은 후, 해당 줄의 주석을 다시 활성화하세요. 한 번만 실행하면 됩니다.
  - exec: rails r "SiteSetting.notification_email='xxx@xxx.de'"
  - exec: echo "End of custom commands"

리버스 프록시 뒤에 실행 중인가요? 설정에서 force_https를 활성화했나요?

네, force_https는 설정되어 있습니다. 그리고 내장된 nginx를 제외하고는 리버스 프록시가 없습니다.

이상한 점은 다른 JS 파일들은 CDN URL로 정상적으로 작동하는데, markdown-it만 그런다는 것입니다.

ruby를 잘 알지 못해서 코드에서 어디를 봐야 할지 모르겠네요. :slight_smile: :grinning:

해결 방법을 알려드리기 위해 추가로 필요한 정보가 있을까요? 혹시 코드를 확인해 봐야 할까요?

안녕하세요, 이 문제를 해결하는 방법에 대해 아이디어가 있는 분 계신가요?

설정에서 이상한 점이 있습니다.

S3 CDN 설정을 사용 중인데, 버킷과 동일한 URL을 사용하고 있나요?

data-s3-cdn="https://discourse-dev.assets.schwarz" 
data-s3-base-url="//discourse-dev.assets.schwarz"

Meta와 비교해 보면:

data-s3-cdn="https://d11a6trkgmumsb.cloudfront.net" 
data-s3-base-url="//assets-meta-cdck-prod-meta.s3.dualstack.us-west-1.amazonaws.com"

동적 스크립트를 로드하는 코드는 S3_BASE_URL을 S3_CDN으로 대체하려고 합니다:

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse-common/addon/lib/get-url.js#L35-L37

네, 두 URL이 모두 동일합니다. Minio를 S3 호환 객체 저장소로 사용하기 때문입니다.

@Falco, 맞았습니다. 두 URL을 분리하니 문제가 해결되었습니다 :slight_smile:

도와주셔서 감사합니다 :slight_smile: