런처 재빌드 시 git 손상

UI를 통해 docker_manager를 업그레이드한 후(정상적으로 진행된 것처럼 보였음에도), Admin 대시보드는 포럼의 나머지 부분이 정상 작동하는 것처럼 보였음에도 불구하고 빈 페이지만 표시되었습니다.

이를 해결하기 위해 다음 명령을 실행했습니다:

./launcher rebuild app

그러나 해당 과정 중 다음과 같은 오류가 발생했습니다:

I, [2025-07-14T08:54:06.062789 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  if [ $(git rev-parse --is-shallow-repository) == "true" ]; then
      git remote set-branches --add origin main
      git remote set-branches origin tests-passed
      git fetch --depth 1 origin tests-passed
  else
      git fetch --tags --prune-tags --prune --force origin
  fi
'
error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index
error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index
error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index
error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index

… 그리고 error: packfile 메시지가 중단될 때까지 계속 출력됩니다.

모습을 보아 git 저장소가 손상된 것으로 보입니다. 그런데 어떤 git 저장소일까요?
/var/www/discourse 폴더조차 존재하지 않으므로, 이는 컨테이너 볼륨 내부에 있는 것 같습니다.

좀 막막합니다. 도움 주셔서 감사합니다!

그게 무슨 뜻인가요?

보통은 _UI_를 통해 docker_manager를 업데이트합니다.

아! 내 실수였어요. API가 아니라 UI라고 하고 싶었어요. 바로 수정할게요.

앱 컨테이너를 시작하고 진입하여 문제를 해결해 보았습니다:

./launcher start app
./launcher enter app

그 다음 discourse 사용자로 git 명령을 호출할 때 오류가 발생하는지 확인했습니다:

cd /var/www/discourse
sudo -H -E -u discourse bash -c 'git fetch --tags --prune-tags --prune --force origin'

그 결과 다음과 같은 오류가 발생했습니다:

error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index
error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index
error: packfile .git/objects/pack/pack-581fe47ace192793da04d01989a4d1a7f0e6103c.pack does not match index
etc..

discourse를 이름 변경하고 새 클론을 만들어서 해결해 보았습니다:

cd /var/www
mv discourse discourse-old
git clone https://github.com/discourse/discourse.git
chown -R discourse:discourse discourse

클론을 완료한 후 git fetch를 다시 실행했는데 오류가 없었습니다!

cd /var/www/discourse
sudo -H -E -u discourse bash -c 'git fetch --tags --prune-tags --prune --force origin'

하지만 컨테이너 셸을 나간 후 ./launcher rebuild app으로 다시 빌드를 시도했을 때 동일한 오류가 발생했습니다.

./launcher rebuild app./launcher enter app이 진입하는 컨테이너와 다른 컨테이너를 사용하나요?

네, git에는 두 가지 수준이 있습니다. 하나는 외부에 있고(클론된 모든 플러그인은 포함되지 않음)요.

에러가 실제로 컨테이너 내부에서 발생하는 것 같습니다… 정말 이상하네요!

드디어 해결했습니다!
손상된 _git_와 이전 docker 업그레이드의 결과가 복합적으로 작용한 것 같습니다. 모든 docker 컨테이너와 이미지를 정리(prune)하여 문제를 해결했습니다:

cd /opt/discourse
./launcher stop app
docker container prune
docker image prune -a
./launcher rebuild app

그 결과 다음과 같은 메시지가 출력되었습니다:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE

Old 13 database is stored at /shared/postgres_data_old

To complete the upgrade, rebuild again using:

./launcher rebuild app
-------------------------------------------------------------------------------------

다시 rebuild를 실행하자 완전히 정상 작동하기 시작했습니다:

./launcher rebuild app