구버전 Discourse 배포 관련 도움 요청

여기에는 오류가 있는 것 같습니다. v3.6.0.beta2 태그를 통해 가져오기를 시도했는데, 다음과 같은 오류가 발생했습니다:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  git fetch --tags --prune-tags --prune --force origin
  if [[ $(git symbolic-ref --short HEAD) == v3.6.0.beta2 ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout v3.6.0.beta2
  fi
' failed with return #<Process::Status: pid 146 exit 128>
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'
exec failed with the params {"cd" => "$home", "hook" => "code", "cmd" => ["sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  git fetch --tags --prune-tags --prune --force origin\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
adc8ef45e9ae880827c9294dbbf73dfe9ab413a050c83fe3f4722c2911876ce2

version은(는) 브랜치만 지원하며, 태그는 지원하지 않습니다!

올바른 사용법은 다음과 같습니다:

params:
  version: release/2025.11

근본 원인은 git symbolic-ref --short HEAD 명령어가 브랜치 이름만 반환할 수 있기 때문입니다. 태그나 해시를 지원하려면 아래 명령어로 변경해야 합니다.

git describe --exact-match --tags 2>/dev/null || git rev-parse --short HEAD

하지만 이렇게 변경하는 것은 권장하지 않습니다. 과도한 커스텀은 잠재적인 기술 부채를 초래할 수 있기 때문입니다. 공식적인 수정이 이루어지지 않는 한 유지하는 것이 좋습니다.

왜 release/2025.11을(를) 가져오려고 했느냐 하면, 현재 프로덕션 환경이 이 버전과 매우 유사하기 때문입니다. 업그레이드를 시도하려 했지만 문제가 발생할까 봐 우려스러웠습니다. 또한, 승인 프로세스상 프로덕션 환경에서 직접 업그레이드를 수행할 수 없으며, 반드시 테스트 환경에서 업그레이드 과정(release/2025.11 => release/2026.1)을 검증하여 문제가 없음을 확인한 후에야 프로덕션 환경에서 작업을 수행할 수 있습니다. 다소 번거롭지만, 프로세스상 올바른 최선의 선택입니다. 그래서 저는 특정 브랜치나 태그를 가져오는 방법을 여기서 찾아야 했습니다.

이렇게 길게 설명드린 점 죄송합니다. 다행히도, 현재로서는 허용할 만한 해결책을 찾았습니다. 감사합니다.

이 수정으로 인한 다른 영향에 대해 계속 업데이트합니다:

특정 브랜치를 설치하는 것은 구현했지만, 해당 브랜치에서 업그레이드 검증에 실패했습니다. 업데이트 페이지에서 최신 업데이트를 감지하지 못해 페이지에서 업데이트를 수행할 수 없기 때문입니다.

이전 주제를 이어가며, 이제 새로운 문제가 발견되었습니다. 로컬 코드베이스가 오래된 경우 프론트엔드 컴파일 실패나 기타 오류가 발생할 수 있습니다. 따라서 모든 수정을 시작하기 전에 로컬 코드베이스를 최신 버전으로 업데이트해야 합니다.

# 이전에 로컬 코드베이스를 수정했다면 먼저 스테이시(stash)하세요
# git stash

# 최신 버전으로 업데이트
git pull

# 스테이시된 코드를 다시 적용하거나 해당 설정 파일을 다시 편집하세요
# git stash pop

로컬 코드베이스를 최신 버전으로 업데이트한 후에야 이전 단계에서 지정한 분기의 빌드를 성공적으로 완료할 수 있습니다.

여기서 말하는 로컬 코드베이스는 https://github.com/discourse/discourse_docker.git입니다.

즉, 표준 설치 후의 코드베이스를 의미합니다.

마지막으로 요약하겠습니다.

우리의 요구 사항은 다음과 같습니다: 특정 버전 설치

  1. 로컬 코드 저장소 https://github.com/discourse/discourse_docker.git 업데이트
# 프로젝트 루트 디렉터리로 이동
cd /var/discourse
# 최신 버전으로 업데이트
git pull
  1. 지정할 버전 수정

containers/app.yml 파일을 수정하여 마지막에 아래 설정을 추가합니다:

params:
  version: release/2026.1 # 모범 사례는 esr로 작성하는 것입니다
  1. 재빌드
./launcher rebuild app

version: esr인 경우, 그 이후의 내용은 확인하지 않아도 됩니다.

먼저 git pull을 실행하여 로컬 코드 저장소가 최신 상태인지 확인하십시오. 그런 다음 배포할 분기를 지정하고, 마지막으로 재빌드합니다. 이 설명은 release/2026.1에서 release/2026.7로 업그레이드하려는 시나리오에 적용됩니다.

이미 설치된 release/2026.1을 업그레이드하려는 것이라면, 관리 화면에서 업그레이드 버튼을 클릭하면 됩니다. 이는 release/2026.1에 업데이트(특히 취약점 수정)가 있는 시나리오에 적용됩니다.

latest나 stable과 같은 flavour/stream/tag 대신 특정 버전을 구성하는 것은 매우 비정상적이라고 생각합니다. 사실 이 시스템에서 어떤 태그들이 정상적이고, 사용 가능하며, 유용한지 더 이상 확신이 서지 않습니다.

Switching between Discourse release channels / versions 를 확인해 보셨나요? 어떤 태그가 유용한지 이해하는 데 도움이 될 수 있습니다.

네, 일반 사용자는 기본적으로 latest 태그를 사용하는 것으로 충분합니다. 하지만 제 상황에서는 특정 버전을 사용하는 방법을 조사할 수밖에 없습니다. boss에게 “아, 죄송합니다. Discourse는 현재 특정 버전으로 체크아웃하는 것을 지원하지 않아서 최신 버전으로만 업데이트할 수 있습니다”라고 할 수는 없으니까요.

이 게시물이 정말 유용합니다. 자세히 살펴보겠습니다. 감사합니다.

그것을 보지 못했습니다. 감사합니다. 이제 latest/release/esr를 사용해야 할 것 같습니다. 제 (구버전) app.yml 파일에서 주석 처리되어 있어 기본값이 적용되는 것을 확인했습니다:

  ## 이 컨테이너에 사용할 Git 리비전? (기본값: tests-passed)
  #version: tests-passed

version은 현재 태그를 지원하지 않습니다. 태그를 지원하려면 빌드 스크립트를 수정해야 합니다. 원래의 모범 사례는 다음과 같았지만:

params:
  version: esr

현재는 어쩔 수 없이 다음과 같이 수정해야 합니다.

params:
  version: release/2026.1

흥미롭네요. 새로운 버전 관리 전략이 도입되기 전에도 beta는 꽤 오랫동안 브랜치가 아닌 태그로 사용되었습니다: Upcoming changes to the beta branch of Discourse

저입니다. 저도 많이 혼란스럽습니다. 하지만 현재 빌드 코드에서는 실제로 태그를 사용할 수 없습니다. 본래는 그렇게 되어서는 안 됩니다.

version: release/2026.1는 문제없이 작동할 것입니다. 버전의 새로운 중복 지원 기간(overlapping support periods)을 활용하고 싶다면, 이것이 올바른 방법입니다. (물론 2026.1이 수명 종료(end-of-life)에 도달하기 전에 수동으로 업데이트해야 한다는 점을 잊지 마십시오.)

version: esr도 작동할 것입니다. 시스템은 태그를 지원하도록 설계되어 있습니다. 이는 git checkout $version으로 구현되어 있습니다.

web.template.yml에서 이 변경 사항을 수행해서는 안 됩니다. 사이트별 containers/app.yml에서 변경 사항을 수행해야 합니다.

여기 뭔가 이상합니다. 저는 yml에 version: tests-passed로 설정된 v3.5.0 beta3를 실행 중이었습니다.

그런데 버전 지정 방식이 변경되었다는 것을 알아차렸고, 다시 빌드하기 전에 yml을 version: esr으로 변경한 뒤 CLI에서 재빌드를 수행했습니다.

현재 discourse에서는 다음과 같이 표시됩니다.

설치됨
2026.3.0-latest.1

이는 esr 태그 대신 tests passed 태그를 사용하는 것으로 보입니다. app.yml에서 버전이 esr으로 표시되는 것을 확인했는데, 왜 최신 빌드를 가져오는 것일까요?

즉, 더 이상 최신 안정판/ESR 빌드를 받을 방법이 없다는 뜻인가요?

app.yml 파일의 관련 줄을 공유해 주시겠습니까? version:이 확실히 params: 섹션 아래에 들여쓰기되어 있나요? 그리고 해당 줄 앞의 # YAML 주석 기호를 확실히 제거하셨나요?

참고로, ESR로 돌아가고 싶으시다면 이전 백업을 복원하시거나 7월의 다음 ESR 릴리스를 기다리셔야 합니다. discourse 설치의 다운그레이드는 지원되지 않습니다 :cry:

아니, 다운그레이드를 할 수 없다는 점은 알고 있습니다. 들여쓰기를 보여주는 스크린샷을 첨부합니다.

여기서 이상한 점을 발견할 수 있나요?

version은 params의 일부이므로 들여쓰기되어야 한다고 생각합니다.

네, 처음에는 containers/app.yml 파일에 직접 설정했지만, 왜 적용되지 않는지 몰라서 어쩔 수 없이 templates/web.template.yml 파일을 직접 수정했습니다. 다시 containers/app.yml 파일에서 수정을 시도해 보겠습니다.

그리고 version: esr 설정이 왜 적용되지 않는지 확인해 주실 수 있을까요? 제 환경에서만 발생하는 문제인지, 아니면 다른 사용자들도 같은 현상을 겪고 있는지 궁금합니다. 제 네트워크 환경이 실제로 좋지 않기 때문입니다.

설정은 다음과 같습니다:

params:
  version: v3.6.0.beta2

에러 메시지는 다음과 같습니다:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  git fetch --tags --prune-tags --prune --force origin
  if [[ $(git symbolic-ref --short HEAD) == v3.6.0.beta2 ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout v3.6.0.beta2
  fi
' failed with return #<Process::Status: pid 146 exit 128>
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'
exec failed with the params {"cd" => "$home", "hook" => "code", "cmd" => ["sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  git fetch --tags --prune-tags --prune --force origin\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
adc8ef45e9ae880827c9294dbbf73dfe9ab413a050c83fe3f4722c2911876ce2

근본 원인은 git symbolic-ref --short HEAD 명령이 브랜치 이름만 반환할 수 있기 때문입니다.