안녕하세요,
저는 Proxmox VE(가상 환경)의 Ubuntu 22.04.4 서버에서 첫 Discourse 설치를 방금 마쳤습니다.
설정은 오류 없이 잘 진행되었지만, 설치를 마친 후 포럼 사이트가 열리지 않으며 서비스가 접근할 수 없다는 메시지가 표시됩니다.
네트워크에서 확인했을 때 포트가 닫혀 있는 것으로 보입니다:
PS C:\Users\mwojt> nmap 192.168.131.211
Nmap scan report for 192.168.131.211
PORT STATE SERVICE
22/tcp open ssh
80/tcp closed http
443/tcp closed https
하지만 Ubuntu 머신 내부에서 localhost에 대해 동일한 명령을 실행하면 포트가 열려 있는 것으로 표시됩니다:
root@ubuntu-discourse:~# nmap localhost
Nmap scan report for localhost (127.0.0.1)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
그러나 같은 Ubuntu VM에서 IP 주소를 대상으로 확인을 실행하면 다음과 같은 결과가 나옵니다:
root@ubuntu-discourse:~# nmap 192.168.131.211
Nmap scan report for ubuntu-discourse (192.168.131.211)
PORT STATE SERVICE
22/tcp open ssh
80/tcp filtered http
443/tcp filtered https
즉, 포트가 필터링된 상태로 표시됩니다.
방화벽에서는 포트가 열려 있습니다:
root@ubuntu-discourse:~# ufw status
Status: active
To Action From
-- ------ ----
80 ALLOW Anywhere
443 ALLOW Anywhere
22 ALLOW Anywhere
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
22 (v6) ALLOW Anywhere (v6)
Ubuntu에서 Discourse를 설치한 것 외에, Debian에는 Talkyard를 설치했습니다. (Talkyard는 Discourse와 약간 유사한 포럼 엔진입니다) 이 역시 Docker로 설치했으며, 아주 잘 작동하고 있습니다. 그래서 Discourse도 Debian에 설치해 보려고 합니다.
제 Debian의 Netstat -rn 출력 결과는 다음과 같습니다:
root@debian-12:~# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.131.1 0.0.0.0 UG 0 0 0 ens18
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
172.26.0.0 0.0.0.0 255.255.255.128 U 0 0 0 br-886bebfa13ae
192.168.130.0 0.0.0.0 255.255.254.0 U 0 0 0 ens18
Discourse는 도메인을 통해 접근할 때만 제대로 작동하는 것 같습니다. 브라우저와 도메인을 사용하여 사이트를 접근할 수 있는 설정이 있으신가요? 완전히 로컬 LAN 내에서만 작업하고 계시다면 hosts 파일을 통해 그렇게 할 수 있을지 모르겠습니다. 서버와 클라이언트(그리고 아마도 docker도)가 모두 이름 조회(name lookup)를 수행할 수 있어야 한다고 생각합니다.
음, 원인을 찾았어요… 도커 로그를 확인해 보니 Let’s Encrypt 인증서를 가져오는 데 실패해서 nginx 서버가 아예 시작되지 않는다는 걸 알게 됐습니다 (첨부된 로그 참조) docker_logs_not_working.txt (10.0 KB)
이제 어떻게 고칠지 알아봐야 합니다. 사실 저는 자체 SSL 인증서가 있는 리버스 프록시를 사용하고 있어서 SSL이 전혀 필요하지 않습니다. 그래서 포트 80을 통해 Discourse와 쉽게 통신할 수 있습니다. 다만 Discourse 서버가 이를 허용할지는 잘 모르겠습니다.
제 DNS는 Cloudflare에서 호스팅되고 있으므로, 해당 API 키를 제공할 수 있기 때문에 LetsEncrypt 인증서를 쉽게 발급받을 수 있습니다. Discourse에서 ACME를 구성하여 인증서 프로비저닝이 원활하게 작동하도록 설정할 수 있을까요? 매뉴얼에서 관련 내용을 찾지 못했는데, 아마 제가 제대로 검색하지 못한 것 같습니다.
다음과 같은 작업을 수행해야 합니다:
SSH 세션에서 다음 명령을 실행하여 컨테이너 ID 또는 이름을 찾으세요:
docker ps
다음 명령을 사용하여 Docker 컨테이너의 셸에 액세스하세요.
docker exec -it [container_id or name] bash
Cloudflare API 키와 이메일을 환경 변수로 내보냅니다. 이렇게 하면 ‘acme.sh’ 스크립트가 DNS 챌린지에 필요한 DNS 레코드를 생성하고 삭제하기 위해 Cloudflare API와 인증할 수 있습니다. 저는 Cloudflare 계정의 실제 이메일 주소와 전역 API 키를 사용했습니다.
인증서가 성공적으로 생성되면 스크립트가 복사된 디렉터리를 표시합니다. 제 경우 다음과 같았습니다:
Your cert is in: /root/.acme.sh/sprawy.info.pl_ecc/sprawy.info.pl.cer
Your cert key is in: /root/.acme.sh/sprawy.info.pl_ecc/sprawy.info.pl.key
The intermediate CA cert is in: /root/.acme.sh/sprawy.info.pl_ecc/ca.cer
And the full chain certs is there: /root/.acme.sh/sprawy.info.pl_ecc/fullchain.cer
discourse.conf 파일을 편집하여 인증서 경로를 업데이트하세요:
nano /etc/nginx/conf.d/discourse.conf
기존의 ssl_certificate 및 ssl_certificate_key 줄은 다음과 같이 교체해야 합니다: