피드백 주셔서 감사합니다, 시간을 내어 주셔서 정말 감사드립니다. 좀 아는 척하는 것처럼 보이지 않으려면:
[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
)
… Webmin과 Virtualmin으로 관리되는 VPS에서 서브도메인을 사용하는 경우 다음 단계를 수행합니다.
확정적인 Virtualmin + Discourse 런북 *
-
(1) 잔여물 정리 (재시도하는 경우, 저처럼):
rm -rf /var/discourse/shared/standalone/ssl/*rm -rf /var/discourse/shared/standalone/letsencryptrm -rf /var/discourse/shared/standalone/state -
(2) 템플릿 삭제:
app.yml에서templates/web.ssl.template.yml과templates/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.yml의expose:블록에 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 WebSocket을 Yes로 전환하여 실시간 업데이트 및 알림 스트림을 허용하세요.
-
(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}sProxyPreserveHost 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를 클릭한 후 시스템이 메일박스로 인증 이메일을 보내도록 하세요.
*) 반박될 때까지 ![]()