마이그레이션 스크립트 실행 후 리셋이 필요한가요?

이전 스크립트를 사용하여 Vanilla 3 포럼을 자체 호스팅 Discourse로 이전하고 있습니다.

이전 스크립트는 잘 작동합니다:
RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text

유일한 문제는 내보내기를 한 후에는 다시 가져오기를 할 수 없다는 점입니다. 가져오기 스크립트는 두 번째 실행 시 정상적으로 실행되지만, 가져오기 파일에 적용한 데이터 변경사항이 반영되지 않습니다. 또한, 가져오기 프로세스가 두 번째 실행 시 약 50배 더 빠르게 실행되어 실제로 아무것도 가져오지 않는 것으로 의심됩니다.

질문: 첫 번째 실행 후 /var/www/discourse/script/import_scripts/에 있는 가져오기 스크립트를 다시 실행할 수 있는 방법이 있나요?

특히, 가져오기 파일 형식의 버그를 수정하면서 게시글 및 토론에 대한 업데이트만 적용하기 위해 다시 가져오기를 수행할 수 있기를 바랍니다.

현재까지 찾은 유일한 해결책은 Discourse 설치 전체를 삭제하고 처음부터 다시 시작하는 것이었는데, 매번 거의 1시간이 걸립니다.

어떤 팁이 있을까요?

vanilla.rb의 관련 코드는 다음과 같습니다:

  def import_posts
    puts "", "importing posts..."

    create_posts(@comments) do |comment|
      next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id])

      {
        id: "comment#" + comment[:comment_id],
        user_id:
          user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID,
        topic_id: t[:topic_id],
        raw: clean_up(comment[:body]),
        created_at: parse_date(comment[:date_inserted]),
      }
    end
  end

저는 프로그래머이지만 Ruby 프로그래머는 아닙니다. 다시 가져오기를 수행할 때 게시글의 내용을 강제로 교체하도록 이 코드를 수정할 수 있는 방법이 있을까요?

그럭저럭 괜찮은 우회 방법을 하나 찾았습니다. Vanilla에서 가져온 가져오기 파일을 정리하는 파서를 개선하면서, 특정 게시물에서 발생하는 오류에 집중하는 경향이 있기 때문입니다.

파서를 개선하는 과정에서 디버거로 파서를 중단할 수 있습니다(참고로 저는 Xojo를 사용 중입니다). 그러면 Raw Text를 가져올 수 있습니다.

그다음, 라이브 Discourse 포럼에서 새 게시물을 추가하고 해당 텍스트를 붙여넣어 어떻게 보이는지 확인할 수 있습니다.

이렇게 하면 약 1시간 정도 걸리던 테스트/디버그/변경 사이클을 몇 초 만에 수행할 수 있습니다.

제 새로운 계획은 다음과 같습니다. 파서로 정리한 결과에 만족하게 되면, Discourse를 삭제하고 처음부터 다시 설치하겠습니다.

이것은 의도적으로 그렇게 작동합니다. 아이디어는 가끔 데이터를 가져온 다음, 새로운 덤프로 다시 실행하면 새 데이터만 가져오기 때문에 매우 빠르게 실행된다는 것입니다.

처음부터 다시 시작하려면 데이터베이스를 삭제하고 생성한 후 마이그레이션을 수행해야 합니다.

사용자가 많다면, 사용자 가져오기가 완료된 후 스크립트를 중지하고 그때 백업을 만든 다음, 수정을 시도하기 전에 해당 백업을 복원할 수 있습니다.

완전히 이해가 됩니다. 설명해 주셔서 감사합니다. "강제 덮어쓰기(force overwrite)"를 설정할 수 있는 플래그가 있으면 좋겠지만, 코드를 조금 살펴봤는데 눈에 띄는 것이 없었습니다.

그렇게 할 쉬운 방법이 있을까요? 제가 찾은 유일한 해결책은 다음과 같은 명령어인데, 기본적으로 새로운 도커(docker) 설치와 거의 같습니다:

# 경고: 이 명령어들은 Discourse 포럼 전체를 삭제합니다
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app

약 10분 정도 걸리지만, 그 후 초기 설정을 다시 거쳐야 해서 귀찮습니다.

정말 멋진 아이디어입니다! 유저/토픽/포스트/댓글을 다시 가져오는 것은 꽤 빠르기 때문에, 그리고 이 포럼은 대중에게 공개되어 있지 않으므로, 가져오기 스크립트를 실행하기 전에 새 설치 후 바로 백업을 만들어두는 것도 가능합니다.

sv stop unicorn
rake db:drop db:create db:migrate

데이터베이스를 삭제하려면 환경 변수를 설정해야 합니다. 설정해야 할 변수가 무엇인지 알려줍니다.