Discourse 업그레이드 중 정적 사이트 내보내기를 서빙

현재 저는 두 개의 Discourse 포럼을 운영하고 있으며, 각각 자체 Scaleway 인스턴스에 호스팅되어 있습니다. 업데이트는 다음과 같이 수행하고 있습니다:

# Update Discourse Docker Setup
cd /var/discourse
git pull origin master

# Rebuild Discourse
/var/discourse/launcher rebuild app

이 과정은 매번 포럼을 약 5~15분 동안 중단시킵니다.

두 사이트 중 하나는 Cloudflare 프록시 뒤에 있어 오프라인 캐시를 제공하므로 문제가 없습니다. 하지만 다른 하나는 Cloudflare를 사용하지 않습니다.

Discourse가 익명 사용자를 위한 공개 스레드만 정적 사이트로 내보내고, 상호작용 버튼은 비활성화한 채 상단에 "이 웹사이트는 업그레이드 중이므로 읽기 전용 모드입니다."라는 배너를 표시할 수 있는지 궁금합니다. 그런 다음 포럼이 업그레이드되는 동안 해당 정적 사이트를 제공하고, 포럼이 다시 온라인으로 전환되면 정적 캐시를 삭제하는 방식입니다.

1개의 좋아요

DNS가 Cloudflare에 의해 관리되는 경우(프록시를 사용하지 않더라도) 일반적으로 몇 초 내에 업데이트됩니다. 업데이트가 진행되는 동안에는 도메인을 다른 서버(예: 모든 경로가 index.html 파일로 연결되는 Netlify/Vercel/Firebase/Surge 등의 유지보수 페이지)로 임시로 지정할 수 있습니다.

아직 시도해 보지는 않았지만, Cloudflare Worker(“서버리스” 함수)에서 resolveOverride를 사용하여 다른 백엔드를 임시로 서빙하는 것이 가능할 수 있습니다.

1개의 좋아요

네, DNS 변경이든, 동일한 포트에서 무언가를 서빙하는 임시 docker nginx 컨테이너를 부팅하든, 쉬운 부분은 그겁니다.

지금은 가장 어려운 부분이 상호작용을 비활성화하고 배너를 추가한 정적 내보내기입니다. 주제, 게시글, 카테고리, 인덱스 페이지를 존중해야 하며(검색은 꺼져 있어도 됩니다). 그런 다음 이 대체 과정을 업그레이드 프로세스에 통합하는 건 비교적 쉽습니다.

포럼에서 정적 내보내기를 검색해 봤는데, 실제로 그런 기능이 있는 것 같지는 않습니다. 이전 프로젝트에서 Discourse API 클라이언트를 만들었기 때문에, 설계를 에뮬레이션하지 않는 코드를 작성할 수 있을 것 같습니다.

이 목적을 위해 정적 내보내기를 서빙하는 또 다른 요인은 정적 페이지가 브라우저나 검색 엔진에 의해 캐시되지 않도록 하는 것입니다.


How do I export the complete forum as static html pages? - #3 by wangerin 이 충분할지 궁금합니다. 하지만 여전히 상호작용 요소 비활성화와 배너 주입이 필요해 보입니다.

두 개의 컨테이너를 설치하는 경우 다운타임은 1분 미만입니다. 로드 밸런서를 사용하기로 한다면 이를 0으로 만들 수도 있습니다. 이는 귀하가 설명하는 것보다 더 쉬운 방법입니다.

3개의 좋아요

네, 그렇게 생각해요. 추천하는 두 컨테이너 옵션에 대해 안내해 주실 수 있나요?

(Move from standalone container to separate web and data containers), 하지만 드래그하여 다른 항목을 검색해야 할 수도 있습니다.

또한 SKIP_POST_DEPLOYMENT_MIGRATIONS=1에 대해서도 알아보세요. 간략히 설명하자면, 기존 데이터베이스가 손상되지 않도록 베드 컨테이너를 다시 빌드할 때 이 값을 설정하고, 새 컨테이너가 실행되면 이 값을 제거한 상태에서 다시 마이그레이션을 수행합니다.

2개의 좋아요