⚠ 이 컴퓨터의 443 포트가 호스트명 metabolism.logophilia.eu로 접근할 수 없는 것 같습니다 ----

피드백 주셔서 감사합니다, 시간을 내어 주셔서 정말 감사드립니다. 좀 아는 척하는 것처럼 보이지 않으려면:

[2/5] Preparing configuration 
✓ Ports 80 and 443 are free for use 

처음에는 "free for use"라고 실제로 표시됩니다. 하지만 Gemini의 도움(주로 docker 사용법 관련, ㅋㅋ) 덕분에 이제 제 인스턴스를 정상적으로 구동 중입니다. Virtualmin 사용자들을 위해 제 "런북"을 공유하고 싶습니다. 왜냐하면 "443 포트를 비우라"는 이 문제의 해결책이 아니기 때문입니다. 나머지 게시글 내용은 이 런북이 될 텐데, 다른 곳(예: 새로운 스레드)에 게시하는 것이 더 적절하다면 어디로 가야 하는지 알려주세요. 제 환경과 비슷한 구성을 가진 사람이 저 혼자만은 아닐 테고, 다른 분들에게도 유용할 수 있다고 생각합니다. 다시 한번 감사합니다!

그러면, 설치가 다음 명령어로 완료된 후

cd /var/discourse
./discourse-setup --skip-connection-test

(c/o @darkpixlz :purple_heart:)

… Webmin과 Virtualmin으로 관리되는 VPS에서 서브도메인을 사용하는 경우 다음 단계를 수행합니다.

확정적인 Virtualmin + Discourse 런북 *

  • (1) 잔여물 정리 (재시도하는 경우, 저처럼):

    rm -rf /var/discourse/shared/standalone/ssl/*

    rm -rf /var/discourse/shared/standalone/letsencrypt

    rm -rf /var/discourse/shared/standalone/state

  • (2) 템플릿 삭제:

    app.yml에서 templates/web.ssl.template.ymltemplates/web.letsencrypt.ssl.template.yml 줄을 완전히 삭제해야 합니다. 커스텀 런처 파서는 # 접두사가 있어도 이를 평가합니다.

  • (3) 이메일 설정 및 변수:

    DISCOURSE_SKIP_EMAIL_SETUP'1'에서 '0'으로 변경하세요. 그렇지 않으면 Discourse가 연결되어 DiscordID를 확인할 수 없기 때문입니다.

    백엔드가 보안 URL을 생성하도록 DISCOURSE_FORCE_HTTPS: true를 추가하세요.

    친근한 알림: DISCOURSE_SMTP_USER_NAME이 전체 이메일 주소(예: 'logophilia@logophilia.eu')가 아니라 원본 메일박스 계정 이름(예: 'logophilia')으로 설정되어 있는지 확인하고, 잠재적인 YAML 문자 파싱 버그를 우회하기 위해 자격 증명을 단일 따옴표(')로 감싸세요.

  • (4) Expose 블록 구성:

    app.ymlexpose: 블록에 HTTP 매핑이 포함되어 있는지 확인하세요. Virtualmin이 SSL 로직을 종료한 후 전달하기 때문에 443=>8443 매핑은 선택 사항/불필요합니다:

    expose:
      - 8080:80
    

    이제 재구축을 시작할 수 있습니다:

    cd /var/discourse
    ./launcher rebuild app
    
  • (5) 서브도메인 및 프록시 경로 설정:

    • Virtualmin에서 평소처럼 서브도메인을 생성하고 Let’s Encrypt SSL 인증서로 보호하세요(자동으로 수행되지만, 아무런 관련 없는 이유로 오류가 발생하지 않도록 확인하세요).
    • Proxy Paths(Virtualmin → 서브도메인 → Web Configuration → Proxy Paths)로 이동하여 /에서 http://localhost:8080/으로의 새 매핑을 생성하고, "serve locally"는 체크하지 않은 채 Proxy WebSocketYes로 전환하여 실시간 업데이트 및 알림 스트림을 허용하세요.
  • (6) CSRF 헤더 지시문:

    • Webmin ➔ Servers ➔ Apache Webserver ➔ [여기서 서브도메인 구성을 찾아 443 구성을 클릭] ➔ Edit Directives에서 CSRF 토큰 전달을 용이하게 하기 위해 다음 줄을 Virtualmin의 자체 Let’s Encrypt 프록시 블록(보통 “ProxyPass /.well-known !”) 위쪽에 배치하세요:
    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
    

    ProxyPreserveHost On: Discourse에 “localhost” 대신 실제 도메인 이름을 알려줍니다.
    RequestHeader set X-Forwarded-Proto "https": 사용자가 보안 연결을 사용한다는 것을 Discourse에 명시적으로 알려주며, 이는 DISCOURSE_FORCE_HTTPS: true 설정과 일치합니다.
    RequestHeader set X-Forwarded-For: 보안 로그가 작동하도록 방문자의 실제 IP 주소를 컨테이너로 전달합니다.

  • (7) 깨끗한 컨테이너 핸드셰이크:

    긴(미안하지만 … 사실입니다;-) 재구축 프로세스가 완료되는 동안, 잠재적으로 막힌 컨테이너 청사진이 docker rm -f app으로 지워졌는지 확인하여 ./launcher start app을 실행할 때 포트 8080에 바인딩된 완전히 새로운 인스턴스가 시작되도록 하세요. docker ps에서 “ports” 아래에 다음과 유사한 것이 표시되는지 확인하세요:

    # docker ps
    CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                                NAMES
    d21772a21e36   local_discourse/app   "/sbin/boot"   45 minutes ago   Up 45 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp, 0.0.0.0:8443->443/tcp, [::]:8443->443/tcp   app
    

    (보시다시피, 저는 app.yml에 443=>8443 지시문을 남겨두었는데, 어느 쪽으로든 작동합니다.)

  • (8) 모니터링 및 시작:

    데이터베이스 마이그레이션이 완료되고 워커가 요청을 처리하기 시작할 때까지 docker logs -f app으로 부팅 스트림을 테일링하세요. 기본적으로 “INFO” 줄이 연속으로 많이 출력됩니다.

  • (9) 마무리:

    브라우저에서 서브도메인을 로드하고 Register를 클릭한 후 시스템이 메일박스로 인증 이메일을 보내도록 하세요.

*) 반박될 때까지 :wink: