3.3 버전으로 업데이트가 실패합니다

UI를 사용하여 업그레이드를 시도했는데, 다음에 설명된 것과 같이 실패했습니다:

그래서 백업에서 드롭렛을 복원한 후 수동으로 업그레이드를 시도했습니다.

cd /var/discourse
git pull
./launcher rebuild app

이 명령을 실행하면 다음과 같은 출력이 나타납니다:

WARNING: Docker version 20.10.7 deprecated, recommend upgrade to 24.0.7 or newer.
x86_64 arch detected.

WARNING: We are about to start downloading the Discourse base image
This process may take anywhere between a few minutes to an hour, depending on your network speed

Please be patient

2.0.20240825-0027: Pulling from discourse/base
e4fff0779e6d: Pulling fs layer 
04dda0e597e7: Pulling fs layer 
0b0ac7902d91: Pulling fs layer 
1ea0327cd622: Waiting 
459f11cf96b2: Waiting 
cd49b55154ee: Waiting 
4f4fb700ef54: Pull complete 
890a63bee26b: Pull complete 
1d239a1092e9: Pull complete 
7439767d748f: Pull complete 
19e63282f9d1: Pull complete 
6da4866029f1: Pull complete 
3274548c87f4: Pull complete 
fb2589b81eef: Pull complete 
da453ab7ba03: Pull complete 
260969aca4e8: Pull complete 
0c7927423a10: Pull complete 
cfdfd8bdc03e: Pull complete 
f837c184a2c0: Pull complete 
d14903daf553: Pull complete 
01422fc4dc02: Pull complete 
e918b15c8f19: Pull complete 
3202b43401af: Pull complete 
3fa0a48e923e: Pull complete 
2f1f96b416a1: Pull complete 
b5376d8069b5: Pull complete 
259e102648be: Pull complete 
807236570b2a: Pull complete 
e98845c05b05: Pull complete 
578a5e3e249f: Pull complete 
6b0bf88c86e8: Pull complete 
9551a14ee15e: Pull complete 
8bbcc4c7a11d: Pull complete 
5aff35532071: Pull complete 
f73f45300530: Pull complete 
42888ce727c0: Pull complete 
e8467a663928: Pull complete 
d2fb91f4643c: Pull complete 
88fc9778a448: Pull complete 
2a19d28a5a17: Pull complete 
6a2d56837370: Pull complete 
933885f686e0: Pull complete 
aecf6df6a6bb: Pull complete 
33fcdcfe61e2: Pull complete 
12726a4d34c8: Pull complete 
Digest: sha256:6de68cb49198b5281f79ed9401b3fe818c854d220dcf0238549fe2f2adb19146
Status: Downloaded newer image for discourse/base:2.0.20240825-0027
docker.io/discourse/base:2.0.20240825-0027
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20240825-0027: Pulling from discourse/base
Digest: sha256:6de68cb49198b5281f79ed9401b3fe818c854d220dcf0238549fe2f2adb19146
Status: Image is up to date for discourse/base:2.0.20240825-0027
docker.io/discourse/base:2.0.20240825-0027
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2024-10-15T06:14:37.390458 #1]  INFO -- : Reading from stdin
I, [2024-10-15T06:14:37.395803 #1]  INFO -- : > echo cron is now included in base image, remove from templates
I, [2024-10-15T06:14:37.398391 #1]  INFO -- : cron is now included in base image, remove from templates

I, [2024-10-15T06:14:37.408024 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2024-10-15T06:14:37.412237 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2024-10-15T06:14:37.416506 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2024-10-15T06:14:37.420758 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2024-10-15T06:14:37.424824 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2024-10-15T06:14:37.425837 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/13/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.426590 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.427073 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.427713 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.428194 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.428633 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.429175 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.429569 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.430001 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.430562 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/13/main/pg_hba.conf
I, [2024-10-15T06:14:37.430964 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/13/main/pg_hba.conf
I, [2024-10-15T06:14:37.431353 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/13/main/pg_hba.conf
I, [2024-10-15T06:14:37.431673 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

I, [2024-10-15T06:14:37.974529 #1]  INFO -- : Generating locales (this might take a while)...
Generation complete.

I, [2024-10-15T06:14:37.975013 #1]  INFO -- : > HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main
I, [2024-10-15T06:14:37.976577 #1]  INFO -- : Terminating async processes
2024-10-15 06:14:38.136 UTC [36] LOG:  starting PostgreSQL 13.16 (Debian 13.16-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
2024-10-15 06:14:38.138 UTC [36] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2024-10-15 06:14:38.139 UTC [36] LOG:  listening on IPv6 address "::", port 5432
2024-10-15 06:14:38.143 UTC [36] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2024-10-15 06:14:38.154 UTC [37] LOG:  database system was shut down at 2024-10-15 06:14:28 UTC
2024-10-15 06:14:38.176 UTC [36] LOG:  database system is ready to accept connections

이 지점에서 업그레이드가 중단되고 더 이상 아무 일도 일어나지 않으며, 서버가 오프라인 상태(웹 연결이 전혀 없음)가 됩니다.

다음으로 무엇을 시도해야 할까요?

UI 업그레이드는 사이트 실행과 재빌드를 동시에 수행하기 때문에 더 많은 메모리가 필요할 것이라고 생각합니다.

충분히 대응할 수 있도록 스왑 공간이 충분한지 확인하세요. 최소한 RAM 용량 이상이어야 합니다.

즉, 4GB 서버의 경우 4GB의 스왑 공간을 확보해 두세요.

참고로, 여기 있는 git pull은 불필요합니다. 빌드 스크립트가 이 작업을 대신 수행해 줍니다.

제 서버는 4GB의 RAM과 4GB의 스왑을 보유하고 있습니다. 재빌드 과정이 database system is ready to accept connections에서 멈추고 완료되지 않으며, 포럼은 계속 다운된 상태입니다. 다시 드롭렛 백업으로 복원하여 정상 작동하는 3.2 버전 포럼으로 되돌릴 수는 있지만, 이 문제를 해결하는 것이 더 나을 것입니다.

# free
              total        used        free      shared  buff/cache   available
Mem:           3919         286        1443          20        2189        3360
Swap:          4095           2        4093
Total:         8015         288        5537

이런 상황에서는 보통 재부팅을 합니다(위험은 본인이 감수해야 하죠). 아직까지 이 방법으로 해결되지 않은 적은 없었습니다. 적어도 사이트는 다시 올라오니까요.

OS가 적절히 최신 상태의 LTS 버전인지, 그리고 docker 경고 메시지는 주의 깊게 살펴볼 가치가 있는지 확인해 보세요.

재빌드 중 htop으로 메모리를 모니터링해 두면 좋겠네요.

스왑이 많이 사용되고 있는 것 같습니다. :+1:

내 OS는 Ubuntu 20.04.6 LTS입니다.

아, 네. 재부팅을 했더니 포럼이 다시 올라왔습니다.

아, 하지만 여전히 설치된 버전이 3.2.4라고 나와 있고 최신 버전은 3.3.2이므로 업데이트가 안 된 상태네요.

그래서 제가 지금 어떤 상태인지 잘 모르겠습니다. 다시 업데이트를 시도해 보겠습니다.

네, 역시 같은 곳에서 멈춥니다. 더 새로운 버전의 Docker를 사용하려면 Ubuntu의 주요 버전을 업데이트해야 할 것 같은데, 제가 할 수는 있겠지만 지금 당장은 그렇게 할 계획은 없었습니다.

확실히 하기 위해 OS와 Docker를 업데이트하는 것을 권장합니다.

빌드 스크립트에서 여러 지점에서 상당한 지연이 발생할 수 있습니다. 얼마나 걸릴까요?

15~20분 뒤에 돌아왔을 때 그 지점에서 멈춰 있었습니다. 그 이후로는 특별히 오래 기다린 적이 없습니다. 무언가를 처리 중일 수도 있지만, 그 증거는 없습니다. CPU 사용량도 눈에 띄게 높지 않습니다.

지금 두 가지 선택지가 있습니다:

  • OS와 Docker를 제자리에서 업그레이드한 후 재시도
  • 새로운 Droplet 생성

후자가 더 빠를 수 있습니다.

글쎄, 현재 스냅샷이 있으니까 이 시점에서 Ubuntu 업그레이드를 해도 문제없을 것 같아. 나중에 원복할 수도 있으니까.

아, 거절하는 이유는 다음과 같습니다.

죄송합니다. 이 저장소 드라이버는 더 새로운 릴리스의 커널에서는 지원되지 않습니다.

aufs 저장소 드라이버를 위한 커널 지원을 제공하는 Ubuntu 릴리스는 더 이상 없을 것입니다.

aufs 저장소 드라이버를 사용하는 컨테이너가 없는지 확인한 후, /var/lib/docker/aufs 디렉토리를 삭제하고 다시 시도해 주세요.

하아. 쉬운 일이 하나도 없군, 아니?

새로운 Droplet. :).

(새 서버에 스왑이 아직 생성되지 않았다면 스왑을 다시 생성하는 것을 잊지 마세요)

자, 그 전체 업그레이드 과정은 한마디로 말도 안 되는 대실패로 기록될 것 같습니다.

저는 드롭릿을 이전 상태(Ubuntu 20.04.6 LTS와 Discord 3.2.4)로 되돌리고, 3.3에 대해선 모른 척하며 다른 날 다시 시도해 보겠습니다.

도움을 주시려 해 주셔서 감사합니다.

보너스 기능 - 드롭레스트를 복원할 때, 어떤 이유인지 모르겠지만 로그아웃됩니다. 그리고 사이트가 읽기 전용 모드일 때 관리자 계정으로 로그인조차 할 수 없습니다!

갑자기 깨달은 건데, (Change the Docker storage backend)에 설명된 대로 Docker를 overlay2로 전환할 수 없습니다. 그렇게 해야만 Ubuntu를 업데이트할 수 있을 것 같은데, overlay로 전환하려면 ./launcher rebuild app 명령을 실행해야 하고 이 명령은 실패합니다(overlay2로 전환하는 것만으로 문제가 해결될 가능성은 있지만, 그렇게 될 것 같지는 않아요). 그래서 새로운 드롭렛으로 마이그레이션하는 것이 유일한 합리적인 해결책인 것 같습니다. 하지만 그러면 DNS 변경이 필요할 텐데, 일반적으로 DNS 변경은 꽤 시간이 걸리죠. 끔찍하네요.

컨테이너를 다시 시작할 수 있습니다.

  docker start app

아래 명령어로 문제를 해결할 수도 있습니다.

 apt install docker-ce docker-ce-cli

오버레이 관련 문제는 확실하지 않습니다. 이전에 구버전 Ubuntu에서 OS 업그레이드를 해본 적이 있으신가요?

Digital Ocean을 사용 중이라면, 기존 서버를 가리키는 정적 IP를 생성하고 DNS를 해당 IP로 설정할 수 있습니다. 그런 다음 새 서버로 이전할 때 IP를 새 서버로 재지정하면 DNS 지연 문제가 발생하지 않습니다.

네, 컨테이너가 다시 시작되었지만 업그레이드는 수행되지 않았습니다.

업그레이드 과정에서 database system is ready to accept connections 이후에 어떤 일이 일어나는지는 모르겠지만, 거기까지 진행되고 더 이상 진행되지 않습니다(다음 단계가 매우 오래 걸리는 경우가 아니라면).

네, Ubuntu는 이전에 업데이트되었습니다. 따라서 Docker는 항상 aufs를 사용하고 있습니다.

업그레이드 없이 재빌드하는 것이 가능한가요? 만약 그렇게 된다면, 현재 Docker를 aufs에서 overlay2로 전환할 수 있을 것이고, 그러면 Ubuntu를 22로 업그레이드할 수 있게 되어 다른 문제들도 해결될 수 있습니다. 하지만 현재 업그레이드가 그 지점에서 멈추는 이유를 모르기 때문에, 이것이 해결책이 될 수 있을지는 그저 희망 사항에 불과합니다.

아니요, 설정된 브랜치의 최신 커밋으로 업그레이드됩니다.

새 서버로 마이그레이션하는 데 최대 30분밖에 걸리지 않을 수 있다는 점을 기억하세요.

네, 그 방향으로 진행해야 할 것 같습니다. 좀 감상적으로 들릴 수 있겠지만, 포럼을 업그레이드하기 위해 디스코urs(Discourse)를 실행하는 것 외에도 다른 몇 가지 서비스도 실행 중인 새 서버를 처음부터 세팅하는 일은 정말로 원치 않았습니다.

아, 뭐, 자신의 서버를 직접 운영하는 사람이라면 누구나 겪는 일이죠.

네, 어떤 이유로든 거기에 멈춰 있는 것 같습니다. 이유는 모르겠지만, Docker 업그레이드를 수행한 결과 몇몇 사이트에서는 도움이 된 것 같습니다.

위에서 언급했듯이 Docker를 업그레이드해 보셨나요?

다른 곳에서 검색을 시도한다면 오버레이를 수정할 수도 있을 것입니다. 그래서 저는 OS 업그레이드를 신뢰하지 않습니다.

아직 시도하지 않았지만, 다음으로 그 방법을 시도해 보겠습니다. 또 다른 유지보수 시간을 예약해야 하는데, 제 프로세스는 항상 드롭렛을 종료한 후 스냅샷을 찍는 것입니다. 이 작업은 상당한 시간이 걸리며 다운타임 중 가장 큰 부분을 차지하지만, 프로세스를 매우 쉽게 되돌릴 수 있도록 보장해 주며, 몇 번이나 유용하게 작용했습니다.

따라서 화요일에 또 다른 유지보수 창을 예약한 후 도커 업데이트를 시도할 것입니다(그리고 그것이 작동하면 오버레이로 전환하는 것도 시도해 볼 것입니다). 만약 실패하면, 그 다음 주에 새 서버를 시험해 보는 것으로 넘어가겠습니다(아니면, 어차피 테스트 드롭렛에 새 서버를 설정할 수 있으므로 병렬로 진행할 수도 있습니다).

감사합니다.