사이트가 충돌했어요 – 선택지는 무엇인가요?

현재 2.5.0.beta4 버전을 설치해 두고 있습니다.
업그레이드를 진행하려 했으나 과정에서 문제가 발생하여 이제 사이트가 더 이상 로드되지 않습니다.
모든 파일과 데이터베이스(DB) 등은 보유하고 있습니다. Ubuntu 16에서 Docker를 통해 설치한 상태였습니다.
이 문제를 해결하기 위한 옵션은 무엇일까요?
쉘(shell) 관련해서는 전혀 무지하므로 누군가에게 대신 처리해 달라고 해야겠지만, 막연한 추측을 하지 않고 구체적으로 무엇을 확인하고 진행해야 하는지 알고 싶습니다.
도움 주시면 감사하겠습니다.

추가로 몇 가지 세부 정보를 알려 주실 수 있나요? 컨테이너가 로딩되고 있나요(docker ps)? 문제를 파악하는 데 도움이 될 수 있는 오류 메시지나 로그가 있나요? 직접 호스팅(self-hosting)을 하고 계신가요, 아니면 제3자 호스팅 서비스를 이용 중인가요?

마이크, 답장해 주셔서 감사합니다. 제가 받은 내용은 다음과 같습니다.

./discourse-docto를 실행하면 다음 오류가 표시됩니다:

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=2 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e 
RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e 
RUBY_GC_HEAP_INIT_SLOTS=400000 -e 
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e 
DISCOURSE_DB_SOCKET=/var/run/postgresql -e 
DISCOURSE_DB_HOST= -e 
DISCOURSE_DB_PORT= -e 
LETSENCRYPT_DIR=/shared/letsencrypt -e 
DISCOURSE_FORCE_HTTPS=true -e 
DISCOURSE_HOSTNAME=discuss.domain -e 
DISCOURSE_DEVELOPER_EMAILS=info@domain -e 
DISCOURSE_SMTP_ADDRESS=mail3.domain -e 
DISCOURSE_SMTP_PORT=587 -e 
DISCOURSE_SMTP_USER_NAME=xxx@domain -e 
DISCOURSE_SMTP_PASSWORD=xxx -e 
LETSENCRYPT_ACCOUNT_EMAIL=info@domain -h 
Ubuntu-1804-bionic-64-minimal-app -e 
DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:8d:5a:f6:a3:11 local_discourse/app /sbin/boot

로컬에서 'local_discourse/app:latest' 이미지를 찾을 수 없습니다
docker: 데몬으로부터 오류 응답: local_discourse/app에 대한 pull 접근이 거부되었습니다. 저장소가 존재하지 않거나 'docker login'이 필요할 수 있습니다: denied: 요청한 리소스에 대한 접근이 거부되었습니다.
'docker run --help'를 참조하세요.
컨테이너 재시작에 실패했습니다.

/launcher rebuild app을 실행할 때도 동일한 오류가 발생합니다.
docker는 최신 버전입니다.

또한 doctor 로그에서 이 오류도 확인됩니다:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && find /var/www/discourse ! -user discourse -exec chown discourse {} \+ 실행이 실패했으며 반환 값은 #<Process::Status: pid 1929 exit 1>입니다.
실패 위치: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
실행 파라미터 {"cd"=>"$home", "hook"=>"web", "cmd"=>["gem install bundler --conservative -v $(awk '/BUNDLED WITH/ { getline; gsub(/ /,\"\"); print $0 }' Gemfile.lock)", "find $home ! -user discourse -exec chown discourse {} \\+"]}와 함께 실행이 실패했습니다
bootstrap이 종료 코드 1과 함께 실패했습니다
** BOOTSTRAP 실패 ** 이전의 오류 메시지가 더 있을 수 있으므로 위로 스크롤하여 확인하십시오.
./discourse-doctor가 문제를 진단하는 데 도움이 될 수 있습니다.
f4d0b782e3d1c3deccb5e3d6c186a08ebbaaea22ed37d19a2ff07b7688c83926
 

어떤 업그레이드를 진행 중이셨나요? app.yml 파일에 오타가 있는지 확인한 후 전체 재빌드를 다시 실행해 보세요.

Docker 버전이 너무 오래되었고, 이는 Ubuntu 버전이 너무 오래되었기 때문입니다.
백업이 있나요? Ubuntu 22에서 새 VPS를 시작하고 백업을 복원하면 됩니다.

백업은 없고, 마지막으로 정상 작동했을 때의 VPS 스냅샷만 있는데, 복원 후에도 로딩이 되지 않습니다.

Docker version 23.0.3, build 3e7cbfd

app.yml은 문제없으며, https://www.yamllint.com에서 검증했습니다.

에ラー는 launcher의 이 줄과 관련이 있습니다:

cidbootstrap=cids/"$config"_bootstrap.cid
local_discourse=local_discourse
image="discourse/base:2.0.20230409-0052"
docker_path=`which docker.io 2> /dev/null || which docker`
git_path=`which git`
local_discourse=local_discourse

이런 상황에서 데이터를 가져오거나 백업할 수 있는 방법이 있을까요?

데이터베이스 파일에 접근할 수 있어야 합니다. 제 프로덕션 서버에서는 /var/discourse/shared/standalone/postgres_data 위치에 있으며, 사용자의 서버에서는 유사한 위치에 있을 수 있습니다.

계속 진행하기 전에, 특히 ‘discourse’ 디렉터리 아래에 있는 모든 디렉터리를 포함하여 시스템 전체를 다른 서버로 FULL 백업하는 것을 권장합니다.

(충분히) 최신 상태의 백업이 없는 경우, 더 최신 버전의 ubuntu(그리고 따라서 docker)를 사용하여 새 서버를 생성한 다음, discourse 트리 아래에 있는 모든 디렉터리와 모든 postgres 파일을 새 서버로 복사하는 것을 권장합니다. (저는 아직 discourse 서버에서 이렇게 해본 적은 없지만, 20년간 postgres 데이터베이스를 관리해 왔으며 데이터베이스 파일이 온전하면 재현/재구축에 도움이 됩니다.)

이 시스템이 마지막으로 업데이트된 지 오래되었나요? 이 질문에 대한 답이 '예’라면, 기존 파일을 새 서버로 복사하는 것이 실제로는 올바른 방식이 아니기 때문에 discourse 디렉터리 아래에 있는 기존 파일을 새 서버로 복사하려는 시도에 복잡성이 발생할 수 있습니다. discourse 백업에는 postgresql 데이터베이스 파일 외에도 훨씬 많은 내용이 포함되어 있기 때문입니다. (이것이 제가 작은 업그레이드조차 하기 전에 백업을 시도하는 이유입니다. 물론 항상 그렇게 하지는 못합니다.)

사용자의 최신 discourse 백업은 아마도 다음과 유사한 디렉터리에 있을 것입니다:
/var/discourse/shared/standalone/backups/default

마이크님, 답변해 주셔서 감사합니다. 정말 감사드립니다.
업그레이드가 실패했고, 어느 시점부터 SSL이 자동 갱신되지 않게 되어 이런 상황을 맞게 되었습니다.
이 방법을 시도해 보려는데, 앱을 다시 구축하려고 하니 공간이 부족하다는 오류가 발생합니다.不知道为什么 Discourse가 15GB를 사용하고 있습니다.
다시 구축하는 것 외에, start 명령어처럼 Discourse를 시작할 수 있는 방법이 있을까요?
다시 한번 감사합니다.

여러 개의 컨테이너 이미지가 남아 있을 가능성이 높습니다.

‘docker images’ 명령을 실행하면 목록이 표시됩니다. 예를 들어 제 프로덕션 시스템에서는 3.5GB 크기의 이미지가 7개씩 나열되어 꽤 많은 공간을 차지하고 있으며, 샌드박스 시스템에서는 20개 이상의 이미지가 표시되었습니다. 공간을 확보하기 위해 일부 이미지를 삭제하거나, 다른 서버에 공간이 있다면 그쪽으로 복사할 수 있습니다.

‘docker ps’ 명령이 실행 중인 컨테이너를 표시하지 않는다고 가정합니다.

사이트가 실행되는지 확인하기 위해 이전 컨테이너를 시작해 보셨나요? 그런 다음 백업을 수행할 수 있습니다.

Launcher가 이 작업을 수행하는 데 사용될 수 있을 것 같습니다. 이 도구는 주로 docker 명령을 위한 프론트엔드를 제공하는 역할을 하지만, Discourse를 실행하는 데 필요한 기타 작업도 수행할 수 있습니다.

마이크, 재미있게도 안에 컨테이너가 하나밖에 없어요. 로그 등을 지워서 공간을 확보해 봤지만, 별다른 성과는 없었어요. 제가 찾지 못하는 다른 문제가 있는 것 같아요. 파일과 DB를 복사해서 나중에 버전으로 옮기는 수동 방법을 시도해 보려고, 다른 지시사항들을 따라볼게요.

docker run을 실행하면 다음이 표시됩니다:

docker run discourse
Unable to find image 'discourse:latest' locally
docker: Error response from daemon: pull access denied for discourse, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.

런처를 실행하면 어떤 일이 발생하나요?

./launcher start app
다음과 같은 결과를 반환합니다:

.....truncated
로컬에서 'local_discourse/app:latest' 이미지를 찾을 수 없습니다
/usr/bin/docker: 데몬에서 오류 응답:
pull access denied for local_discourse/app, 
repository does not exist or may require 'docker login': denied:
 requested access to the resource is denied.

‘docker images’ 명령을 실행하면 무엇을 얻을 수 있나요?

단 하나뿐입니다:
discourse/base 2.0.20230409-0052 08afe7103ce8

오래된 이미지를 가지고 실험을 해 보면, 현재 보고 계신 오류 메시지를 어느 정도 재현할 수 있습니다. 하지만 아직까지 해당 이미지를 강제로 로드하는 방법을 찾지 못했습니다.

지금은 더 이상 제안할 만한 방법이 없습니다.

마이클, 안녕하세요. 이전에 해결책으로 표시된 당신의 답변 덕분에 문제가 어느 정도 해결되었습니다. 모든 파일을 새로운 VPS로 복사하고 몇 가지 변경 사항을 가한 후 정상적으로 작동했습니다. 도움 주신 모든 분께 감사드립니다.

수정 방법을 찾았다니 다행이네요. 도움이 되었길 바랍니다. 정기적으로 백업을 꼭 해 두세요. :slight_smile: