Content Security Policy: 페이지 설정이 리소스 로딩을 차단했습니다("script-src")

안녕하세요, Docker를 통해 Discourse를 설정했지만, 제목에 언급된 오류만 표시됩니다.

어떤 설치 방법을 사용하셨으며, 핵심 설치 과정 외에 무엇을 설정하셨나요?

이미지를 개별적으로 설정하고 docker-compose를 통해 설정한 적이 있습니다! 하지만 여전히 오류가 발생합니다!

무엇을 다르게 설정했어야 했을까요?

죄송하지만 현재 정보만으로는 조언을 드리기 어렵습니다. 표준 설치 가이드를 따르셨나요?

환경 구성에 대한 세부 사항, Discourse를 정확히 어떻게 설치했는지, 그리고 추가로 수행한 작업 등이 있다면 알려주시면 다른 분들의 도움이 될 수 있을 것입니다. :+1:

docker-compose를 사용했다면 표준 설치가 아닙니다. 아마 bitnami(여기서는 지원되지 않음)를 사용했을 수도 있습니다. 관리자/설정 화면에 접근할 수 있다면, 설정에서 "content security"를 검색하여 해당 도메인을 추가해 볼 수 있습니다.

왜 포트 80과 443에 강제 적용되는 것인가요?

@pfaffman

이걸 변경할 수 있을까요?

잘 모르겠습니다. 표준 설치 환경이 아닌 것이 분명하고, 어떻게 설치했는지에 대한 설명도 없으시네요.

포트 80과 443에서 무엇이 무엇에 의해 강제되고 있는지 알 수 없습니다.

좋은 도움을 원하신다면 표준 설치를 사용하셔야 합니다. 어떤 도움이든 받으시려면 설치 방법에 대해 더 자세히 말씀해 주셔야 합니다.

음, 저는 표준 설치를 사용하는데, 이 방식이 포트 80과 443을 강제합니다.

그러면 docker-compose를 사용하지 않으셨다는 건가요?

네, 표준 설치 방식은 포트 80과 443이 필요하며 https와 force_https를 활성화합니다. 표준 설치를 수행하셨다면 설명하신 문제가 발생하지 않아야 합니다.

설치를 위해 discourse-setup을 실행하셨나요?

문제는 제가 Discourse를 다른 포트에서 실행하고 싶고, Apache2에 역 프록시(reverse proxy)를 통해 포함시키고 싶다는 것입니다…

설치 방법을 알려주시면 다른 분들이 도움을 드릴 수 있을 것입니다. 기존 Apache 사이트가 있는 서버에 Discourse를 설정하는 방법을 원하시는 것일 수 있습니다: 기존 Apache 사이트가 있는 서버에 Discourse 설정하기.

이미 말했잖아요! 표준 설치에 대한 거라고요!!!

물론 가능합니다. 예를 들어 app.yml에서 - "83:80"을 노출하거나, 리버스 프록시가 백엔드로 트래픽을 전송하는 데 사용하는 포트가 무엇이든 그렇게 설정하면 됩니다. 또는 웹소켓을 사용할 수도 있습니다.

표준 설치가 아닌 리버스 프록시를 사용하려는 것이죠.

설정했는데도 사이트가 접근되지 않습니다

그렇다면 설정이 잘못되어 있습니다. 문제가 무엇인지는 거의 추측할 수 없습니다. CSP를 사용하지 마세요. 그것이 첫 번째 조치여야 합니다. 그런데 Apache2와 Discourse가 모두 같은 서버에 있나요? Apache2의 설정이 올바른가요? 등등.

다시 말하지만 — 표준 설치를 사용하지 않고 있습니다.

표준 설치를 사용할 수 없습니다! 미안하지만, 그거 뭐가 그렇게 이해하기 어렵다는 건지요? 저는 이미 Apache2를 실행 중인데, Discourse가 다른 포트를 사용하는 것이 충분히 유연하지 않다고 판단한다는 이유만으로 Apache2를 종료해야 한다는 점을 이해할 수 없습니다.

이것이 전체 문제의 핵심입니다.

Apache2 설정:

<VirtualHost *:80>
    ServerName <domain>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    RewriteEngine on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName <domain>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine On
    SSLCertificateFile    /etc/letsencrypt/live/<domain>/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/<domain>/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/<domain>/fullchain.pem

    ProxyPass / http://127.0.0.1:90/
    ProxyPassReverse / http://127.0.0.1:90/
</VirtualHost>

app.yml:

expose:
  - "90:80"   # http
  - "100:443" # https

아마도, 표준 설치 환경에서만 팀으로부터 지원을 받을 수 있다는 점을 이해하는 것보다 그렇게 어렵지는 않을 겁니다. 그래서 저희 중 누군가, 즉 일반 멤버들이 여러분을 도울 수 있기를 희망해야 하는 것이죠.

그리고 여러분이 아무것도 알려주지 않기 때문에, 이 작업은 좀 더 까다로울 수 있습니다. 여러분의 설정이 올바른지, 아니면 app.yml에서 올바른 포트로 연결했는지 우리는 추측할 수 없습니다. 여러분의 환경에 대해 우리는 아무것도 모릅니다.

물론 유연합니다. Docker 환경이 아니라면, Discourse 앞에 리버스 프록시를 사용하는 것은 매우 간단한 일입니다. 두 서버가 동일한 서버에 있다면, 올바른 포트를 노출하거나 웹소켓을 사용하면 됩니다.

그렇게 해보셨나요? 저는 모르겠고, 제 카드가 알려주지도 않더군요 :wink:

그리고 다시 한번 말씀드리지만, CSP가 문제가 된다면, 어떤 것이 충돌하고 있는지 파악할 때까지 사용하지 않는 것이 좋습니다.