CDN 변경 후 투표 내부의 URL 업데이트

포럼에 다음과 같은 투표(poll)를 생성했습니다:

[poll name=freestyle type=multiple results=always min=1 max=14 public=true chartType=bar]
* **#1** ![DSC_2281.jpg|332x500, 33%](upload://ujMDcnd4syevNGdEN2O1qUTeWeK)
* **#2** ![IMG_3248.jpg|690x459, 33%](upload://tsecEjlruXEpg3faidWmENBupM4)
[/poll]

CDN에서 CDN 미사용으로 전환했으며, URL이 cdn.unicyclist.com에서 unicyclist.com으로 변경되었습니다.

그러나 게시글 미리보기에는 이미지가 정상적으로 표시되는데도 불구하고, 여기의 이미지 URL은 여전히 깨져 있습니다:

게시글을 다시 베이킹(Rebake)하고 rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]'을 실행해 보았지만 해결되지 않았습니다.

ask.discourse.org에서는 다음과 같이 조언합니다:

아마도 일어나고 있는 일

투표 옵션은 게시글 원본(raw)에만 있는 것이 아닙니다. 사이트 스키마에서 투표는 또한 렌더링된 옵션 HTML을 다음 위치에 저장합니다:

  • polls
  • poll_options.html

따라서 게시글 미리보기는 정상적으로 보일 수 있지만, 투표 렌더러는 여전히旧的 CDN 호스트명을 포함하는 오래된 HTML을 사용 중일 수 있습니다.

관련 문서:

중요한 경고

먼저 전체 백업을 취하십시오.

또한, 투표가 있는 경우 투표를 "그냥 편집"하는 것을 피하십시오. 투표 편집은 일반적으로 표을 초기화하기 때문입니다:

더 안전한 접근법: 먼저 깨진 투표 하나를 검사하기

컨테이너에서:

cd /var/discourse
./launcher enter app
rails c

그런 다음 해당 게시글의 투표를 찾습니다:

poll = Poll.find_by(post_id: POST_ID, name: "freestyle")
PollOption.where(poll_id: poll.id).pluck(:id, :html)

그 HTML에서 cdn.unicyclist.com을 본다면, 이것이 확인되는 것입니다.

그 투표 하나를 수정하기

poll = Poll.find_by(post_id: POST_ID, name: "freestyle")

PollOption.where(poll_id: poll.id).find_each do |opt|
  new_html = opt.html.gsub("cdn.unicyclist.com", "unicyclist.com")
  opt.update_columns(html: new_html, updated_at: Time.zone.now)
end

그런 다음 해당 게시글도 다시 베이킹(Rebake)합니다:

Post.find(POST_ID).rebake!

작동한다면, 모든 투표 옵션을 일괄 수정하기

PollOption.find_each do |opt|
  next unless opt.html&.include?("cdn.unicyclist.com")
  opt.update_columns(
    html: opt.html.gsub("cdn.unicyclist.com", "unicyclist.com"),
    updated_at: Time.zone.now
  )
end

posts:remap이 도움이 되지 않은 이유

그 rake 작업은 게시글 내용을 위한 것이기 때문입니다. 반면, 깨진 이미지 참조는 아마도 투표 옵션 HTML 캐시에 남아 있을 것입니다:

권장 사항

  1. 하나의 깨진 투표에서 테스트하기
  2. 이미지가 로드되는지 확인하기
  3. 그때만 일괄 수정 실행하기

원하시면 POST_ID만 교체하면 되는 복사-붙여넣기 스크립트를 작성해 드릴 수 있습니다. 먼저 단일 투표에서 안전하게 실행해 보세요.

이것은 괜찮아 보이나요? 물론 먼저 백업을 하겠지만, 포럼을 복원해야 하는 상황을 피하고 싶습니다.

모든 투표 결과를 유지해야 합니다 :slight_smile:

보너스 질문: Discourse가 이러한 경우를 기본적으로 처리해야 하나요?

방금 이 게시글을 읽었는데, 아직 해결하지 않으셨다면 내장된 discourse remap 기능으로 이 문제를 해결할 수 있을 것 같습니다.

rake 태스크와 달리 discourse remapDbHelper.remap을 사용하며, 이는 PostgreSQL 데이터베이스의 모든 테이블에 있는 모든 텍스트 컬럼에 대해 전역 정규식 검색 및 치환을 실행합니다. poll_options.html 안에 갇혀 있는 베이킹된 CDN URL(그리고 rake 태스크가 건너뛰는 기타 테이블들)도 성공적으로 찾아서 업데이트해야 합니다.

cd /var/discourse
./launcher enter app
# 안전을 위한 백업 생성
discourse backup
# 전역 리맵 실행 (모든 변형을 포착하기 위해 프로토콜 없이 도메인만 사용)
discourse remap 'cdn.unicyclist.com' 'unicyclist.com'
# redis 캐시 삭제 (discourse가 베이킹된 HTML을 크게 캐시하므로 매우 중요)
rake cache:clear

저도 여기서 비슷한 작업을 수행했습니다 (다만 반대 방향으로 진행했습니다): Chat thumbnails bypass s3_cdn_url & use raw S3 bucket URLs - #8 by Lilly