업그레이드가 처참하게 실패했습니다

수년간 여러 차례 업데이트를 해왔고 대부분 문제없이 진행되었습니다. 최근 discourse를 업데이트해야 한다는 메시지를 받았습니다. 처음에는 웹 업데이트를 시도했지만, 로그인 후 ./launcher app rebuild를 실행해야 한다고 표시되었습니다. 저는 그렇게 하였습니다.

아래에 표시된 실패 내용은 postgres 업그레이드와 관련이 있는 것으로 보입니다. 포럼을 검색해 보니 postgres 업그레이드에 대한 특별한 지침이 있는 것 같았지만, 이것이 이번 업데이트의 일부인 줄 몰라 따르지 않았습니다. 실패 후 해당 단계를 따르려고 했지만 그것도 실패했습니다.

실패한 업데이트의 출력 결과는 다음과 같습니다:

wordsmith@digitalwind-ubuntu-20:/var/discourse$ sudo ./launcher rebuild app
[sudo] password for wordsmith:
Sorry, try again.
[sudo] password for wordsmith:
Sorry, try again.
[sudo] password for wordsmith:
x86_64 arch detected.
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
remote: Enumerating objects: 765, done.
remote: Counting objects: 100% (299/299), done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 765 (delta 252), reused 244 (delta 226), pack-reused 466 (from 4)
Receiving objects: 100% (765/765), 292.42 KiB | 9.75 MiB/s, done.
Resolving deltas: 100% (430/430), completed with 44 local objects.
From https://github.com/discourse/discourse_docker
   ffa8264..efd6bc8  main                               -> origin/main
 * [new branch]      consolidate_layers                 -> origin/consolidate_layers
 * [new branch]      dev-nginx-conf                     -> origin/dev-nginx-conf
 * [new branch]      docker-compose-generate            -> origin/docker-compose-generate
 * [new branch]      gh-action-upload-to-release        -> origin/gh-action-upload-to-release
 * [new branch]      nginx-conf-updates                 -> origin/nginx-conf-updates
 * [new branch]      parameterize-config-filename       -> origin/parameterize-config-filename
 * [new branch]      pento/dev-test-pnpm-10             -> origin/pento/dev-test-pnpm-10
 * [new branch]      revert_only_shipping_en_us_locales -> origin/revert_only_shipping_en_us_locales
 * [new branch]      slim-image-3                       -> origin/slim-image-3
 * [new branch]      update-build-compile-steps         -> origin/update-build-compile-steps
 * [new branch]      update-launcher                    -> origin/update-launcher
 * [new branch]      update_tag                         -> origin/update_tag
Updating Launcher...
Updating ffa8264..efd6bc8
Fast-forward
 .github/workflows/build.yml                   | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
 .gitignore                                    |   2 +
 discourse-setup                               |  23 ++++++----
 image/README.md                               |  12 +----
 image/auto_build.rb                           |  103 +++++++++++++++++++++++++++++++++---------
 image/base/Dockerfile                         |  178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 image/base/install-imagemagick                |  26 +++++------
 image/base/install-jemalloc                   |   6 +--
 image/base/install-nginx                      |  13 +++---
 image/base/install-oxipng                     |  35 ++++++++-------
 image/base/install-redis                      |   4 +-
 image/base/install-ruby                       |  16 -------
 image/base/install-rust                       |   2 +-
 image/base/nginx_public_keys.key              | 374 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 image/base/release.Dockerfile                 |  16 -------
 image/base/slim.Dockerfile                    | 128 ----------------------------------------------------
 image/discourse_bench/Dockerfile              |  34 --------------
 image/discourse_bench/run_bench.sh            |  19 --------
 image/discourse_dev/Dockerfile                |  38 ++++++++++++++--
 image/discourse_dev/postgres_dev.template.yml |  41 +++--------------
 image/discourse_fast_switch/Dockerfile        |  23 ----------
 image/discourse_fast_switch/create_switch.rb  |  24 ----------
 image/discourse_test/Dockerfile               |  10 ++---
 image/discourse_test/install-chrome           |   2 +-
 image/monitor/Dockerfile                      |  13 ------
 image/monitor/src/monitor.rb                  |  98 ----------------------------------------
 launcher                                      |   6 +--
 scripts/launcher-completion.bash              |  44 ++++++++++++++++++
 templates/import/mbox.template.yml            |   2 +-
 templates/import/mssql-dep.template.yml       |   2 +-
 templates/import/mysql-dep.template.yml       |   2 +-
 templates/import/phpbb3.template.yml          |   2 +-
 templates/import/vanilla.template.yml         |  30 +++++++------
 templates/postgres.10.template.yml            |   3 +-
 templates/postgres.12.template.yml            |   3 +-
 templates/postgres.13.template.yml            | 175 +++++++++++++++++++++++++++--------------------------------------------
 templates/postgres.15.template.yml            |  62 ++++++++++++++------------
 templates/postgres.9.5.template.yml           |   3 +-
 templates/postgres.template.yml               | 105 ++++++++++++++++++++++++++-----------------
 templates/redis.template.yml                  |   6 ++-
 templates/web.china.template.yml              |   3 +-
 templates/web.socketed.template.yml           |   4 +-
 templates/web.ssl.template.yml                |  32 ++++++-------
 templates/web.template.yml                    |  23 +++++-----
 44 files changed, 1186 insertions(+), 818 deletions(-)
 create mode 100644 image/base/Dockerfile
 delete mode 100755 image/base/install-ruby
 create mode 100644 image/base/nginx_public_keys.key
 delete mode 100644 image/base/release.Dockerfile
 delete mode 100644 image/base/slim.Dockerfile
 delete mode 100644 image/discourse_bench/Dockerfile
 delete mode 100644 image/discourse_bench/run_bench.sh
 delete mode 100644 image/discourse_fast_switch/Dockerfile
 delete mode 100644 image/discourse_fast_switch/create_switch.rb
 delete mode 100644 image/monitor/Dockerfile
 delete mode 100644 image/monitor/src/monitor.rb
 create mode 100644 scripts/launcher-completion.bash
Launcher updated, restarting...
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.20250129-0720: Pulling from discourse/base
af302e5c37e9: Pull complete
ed49ab5c933d: Pull complete
7cb9e730d898: Pull complete
7c28a6b187b2: Pull complete
23222af7238f: Pull complete
59b87d9ed5c1: Pull complete
90d60b432298: Pull complete
d3b3135aa82b: Pull complete
94e7b594395d: Pull complete
cf15e2c89d00: Pull complete
2c0cccf9ec27: Pull complete
5d8ea2a8d564: Pull complete
020f04b42275: Pull complete
06e22604f387: Pull complete
8b0ecc579aad: Pull complete
4d577f7424c0: Pull complete
37ef4781925f: Pull complete
30d67d1af761: Pull complete
43eaf8c26af4: Pull complete
02f4cc50eabd: Pull complete
93896ee36e56: Pull complete
fadd5d615e0e: Pull complete
85f9459cb30e: Pull complete
eaddca2afacb: Pull complete
f54443d29a2d: Pull complete
ed6f0f133683: Pull complete
3d1894dc563f: Pull complete
51ca3f63c909: Pull complete
b87374db2274: Pull complete
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Downloaded newer image for discourse/base:2.0.20250129-0720
docker.io/discourse/base:2.0.20250129-0720
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.20250129-0720: Pulling from discourse/base
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Image is up to date for discourse/base:2.0.20250129-0720
docker.io/discourse/base:2.0.20250129-0720
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-02-06T00:07:56.208669 #1]  INFO -- : Reading from stdin
I, [2025-02-06T00:07:56.232158 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
I, [2025-02-06T00:07:56.237056 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2025-02-06T00:07:56.242252 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2025-02-06T00:07:56.246861 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown:
I, [2025-02-06T00:07:56.251666 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
I, [2025-02-06T00:07:56.253133 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.254477 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.255380 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.256084 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.256905 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.257717 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.258521 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.259186 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.265147 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-06T00:07:56.266734 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-06T00:07:56.267608 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-06T00:07:56.268347 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-06T00:07:56.268965 #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

failed to set locale!
[error] character map file `UTF-8' not found: No such file or directory
failed to set locale!
[error] default character map file `ANSI_X3.4-1968' not found: No such file or directory
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = "en_US.UTF-8",
	LC_ALL = "en_US.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
popen failure: Cannot allocate memory
initdb: error: program "postgres" is needed by initdb but was not found in the same directory as "/usr/lib/postgresql/15/bin/initdb"
I, [2025-02-06T00:07:59.495629 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15

I, [2025-02-06T00:07:59.496900 #1]  INFO -- : > HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main
I, [2025-02-06T00:07:59.500783 #1]  INFO -- : Terminating async processes
2025-02-06 00:07:59.629 UTC [51] FATAL:  database files are incompatible with server
2025-02-06 00:07:59.629 UTC [51] DETAIL:  The data directory was initialized by PostgreSQL version 13, which is not compatible with this version 15.10 (Debian 15.10-1.pgdg120+1).

도와주세요!!!

이번 업데이트에서 PostgreSQL 데이터베이스 버전이 업데이트됩니다.
제 설치는 비교적 최신 상태(6개월 전)이지만, 지난 며칠간 이 포럼을 지켜보면서 여전히 긴장하고 있었습니다. 업그레이드가 완벽하게 작동하지 않는다는 보고가 몇 건 있었는데, 대부분 오래된 데이터베이스나 마이그레이션된 데이터베이스에서 발생한 경우였습니다.

추가 힌트를 위해, 당신의 설치 이력을 알려줄 수 있을까요?

데이터베이스 업그레이드 및 문제 해결에 대한 추가 정보는 다음과 같습니다.

좋은 소식은, 제 업그레이드가 완벽하게 잘 진행되어 업그레이드가 정상적으로 작동한다는 것입니다.

행운을 빕니다!

시작하기 전에 백업을 이메일로 내게 보냈으면 좋았을 텐데! 그리고 리노드 백업이 제대로 작동하는지 테스트도 해봤어야 했는데… 방금 하나를 복원했는데, 내가 생각했던 내용이 들어있지 않아요.

자신의 app.yml 파일 내용을 공유해 주시겠어요? 게시하기 전에 민감한 정보는 마스킹 처리해 주세요. @Neptune

또한 Docker 버전을 확인해 주세요. 아래 토픽에서 Docker를 업데이트하여 해결된 유사한 문제를 참고할 수 있습니다.

Docker 버전 20.10.7, 빌드 f0df350

다음은 제 app.yml 파일입니다.

## 이것은 올인원, 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다.
##
## 이 파일을 수정한 후에는 반드시 다시 빌드해야 합니다.
## /var/discourse/launcher rebuild app
##
## 편집 시 *매우* 주의하세요!
## YAML 파일은 공백이나 정렬 오류에 *매우* 민감합니다!
## 필요할 경우 http://www.yamllint.com/ 에서 이 파일을 검증할 수 있습니다.
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
## Lets Encrypt(https)를 추가하려면 아래 두 줄의 주석을 해제하세요.
## - "templates/web.ssl.template.yml"
## - "templates/web.letsencrypt.ssl.template.yml"

## 이 컨테이너가 노출해야 하는 TCP/IP 포트는 무엇인가요?
## Apache나 nginx와 같은 다른 웹 서버와 포트를 공유하려면
## https://meta.discourse.org/t/17247 를 참조하세요.
## expose:
##   - "8080:80"   # http
##   - "8443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers는 총 메모리의 25%로 제한하세요.
  ## bootstrap이 감지된 RAM에 따라 자동으로 설정되거나, 직접 오버라이드할 수 있습니다.
  db_shared_buffers: "256MB"

  ## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다.
  #db_work_mem: "40MB"

  ## 이 컨테이너가 사용할 Git 리비전은 무엇인가요? (기본값: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 동시 웹 요청은 얼마나 지원되나요? 메모리와 CPU 코어 수에 따라 다릅니다.
  ## bootstrap이 감지된 CPU에 따라 자동으로 설정되거나, 직접 오버라이드할 수 있습니다.
  UNICORN_WORKERS: 4

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
  ## 필수 항목입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
  DISCOURSE_HOSTNAME: wordsmiths.digitalwind.net

  ## 컨테이너가 위에서 지정한 도메인 이름(-h 옵션)과 동일한 이름으로
  ## 시작되도록 하려면 주석을 해제하세요. (기본값 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록
  ## 예시 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'xxx@dev.null'

  ## TODO: 새 계정 검증 및 알림 전송에 사용되는 SMTP 메일 서버
  # SMTP 주소, 사용자 이름, 비밀번호는 필수입니다.
  # 경고: SMTP 비밀번호의 '#' 문자는 문제를 일으킬 수 있습니다!
  DISCOURSE_SMTP_ADDRESS: dev.null
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: xxx@dev.null
  DISCOURSE_SMTP_PASSWORD: "not-here"
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: nope
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)
  DISCOURSE_SMTP_DOMAIN: dev.null
  DISCOURSE_NOTIFICATION_EMAIL: xxx@dev.null

  ## Lets Encrypt 템플릿을 추가했다면 무료 SSL 인증서를 얻으려면 아래 주석을 해제하세요.
  LETSENCRYPT_ACCOUNT_EMAIL: xxx@dev.null

  ## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (pull로 설정됨)
## https://meta.discourse.org/t/14857 에서 자세한 내용을 확인하세요.
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## IP 주소 조회를 위한 maxmind 지리 위치 IP 주소 키
  ## https://meta.discourse.org/t/-/137387/23 에서 자세한 내용을 확인하세요.
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker 컨테이너는 상태가 없으며(stateless), 모든 데이터는 /shared에 저장됩니다.
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 플러그인은 여기에 배치합니다.
## https://meta.discourse.org/t/19157 에서 자세한 내용을 확인하세요.
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/wp-discourse.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git 
          - git clone https://github.com/discourse/discourse-calendar
          - git clone https://github.com/discourse/discourse-checklist
          - git clone https://github.com/discourse/discourse-reactions
          - git clone https://github.com/discourse/discourse-policy

## 빌드 후 실행할 모든 사용자 지정 명령
run:
  - exec: echo "Beginning of custom commands"
  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
  ## 첫 번째 가입 이메일을 받은 후, 해당 줄의 주석을 다시 활성화하세요. 한 번만 실행하면 됩니다.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

Docker를 업그레이드하고 다시 실행해 보았습니다:

wordsmith@digitalwind-ubuntu-20:/var/discourse/containers$ docker --version
Docker version 27.5.1, build 9f9e405
wordsmith@digitalwind-ubuntu-20:/var/discourse/containers$ cd ..
wordsmith@digitalwind-ubuntu-20:/var/discourse$ sudo ./launcher app rebuild
x86_64 아키텍처 감지됨.
ERROR: containers/rebuild.yml 파일이 존재하지 않거나 읽을 수 없습니다.

사용 가능한 설정 ( app )
wordsmith@digitalwind-ubuntu-20:/var/discourse$

콘솔에서 ./launcher rebuild app를 실행하여 업그레이드를 완료해야 합니다.

새로운 안정 버전이 출시되었습니다.

제가 위에서 한 게 바로 그거잖아요?

혹시 도와줄 수 있는 분 계신가요? 제 설치 환경이 여전히 멈춰 있고, 도무지 해결책이 떠오르지 않습니다.

저는 초보이지만 최대한 도와드리고 싶습니다. 이전 게시물에서 말씀하신 내용을 읽었습니다.

올바른 디렉토리에 계신가요?
위 내용은 가장 최근의 시도와 현재 오류 메시지인가요?

제안대로 컨테이너를 재시작하셨나요?

저라면 재시작한 후 백업을 만들고, 최신 OS가 설치된 새로운 VM으로 이전하겠습니다.

sudo ./launcher rebuild app가 맞을 것 같습니다.

GUI 업데이트는 데이터베이스를 업그레이드하지 않습니다. 달리 말해, 이번에는 추가 업데이트를 적용하기 위해 커맨드 라인으로 업그레이드해야 합니다.

그건 절대 일어나지 않을 거야.

내가 잘못 읽었거나 잘못 기억하고 있을 수도 있지만, 네가 사용하는 Docker와 OS가 더 이상 지원되지 않는다고 확신해. 그러니 모든 것을 업그레이드하는 걸 그냥 멈춰.

그냥 업그레이드만 하지 마. 얼마 전에는 6년 동안 한 번도 업그레이드하지 않은 사람을 도왔는데, 아직도 Ubuntu 14.04를 쓰고 있었어.

그럼에도 불구하고 업그레이드입니다. 데이터베이스 업그레이드 때문에 GUI로는 할 수 없어요 :man_shrugging:

완전히 동일할 것입니다. 여전히 Docker를 업그레이드해야 하며, 데이터베이스도 업그레이드해야 합니다. 제가 당신의 버전을 올바르게 기억하고 있다면, 현재 안정 버전이 사용 가능합니다.

이것은 좀 과장된 표현일 수 있습니다. 여기 계신 분들 중에는 그 문제를 해결할 수 있는 기술이 있는 분들이 많으니까요. 하지만 업그레이드할 때의 제1계명을 항상 기억하세요. 항상 백업을 만들어 두세요.

실제로 그렇게 하고 있습니다. App yml 파일에서 디스커스를 Stable Branch로 설정할 수 있습니다. 하지만 가끔 서버에 로그인하여 업그레이드를 수행해야 합니다.

호스팅 플랜을 유료로 사용하는 장점은 크래시에 대해 걱정할 필요가 없다는 것입니다. 호스팅 서비스 제공업체가 이를 관리해 주니까요.

자체 호스팅(Self-Hosted)에도 장점이 있지만, 문제가 발생했을 때 스스로 해결하지 못하면 문제를 수정해 줄 사람을 고용해야 할 수도 있습니다. 그래서 백업이 중요합니다. 특히 주요 업데이트 시에는 더욱 그렇습니다. VPS 제공업체도 서버 스냅샷을 만들어 두었다가, 예를 들어 명령줄을 통한 업데이트가 “대단히” 실패했을 때 이를 복원할 수 있는 옵션을 제공합니다.

지금까지 7년이 넘는 여정 동안 많은 새로운 것을 배웠습니다. 가장 최근에는 새 서버를 생성하고 Rsync를 사용하여 포럼을 완전히 업데이트된 최신 Ubuntu 서버로 이전했습니다. 이전 서버는 기억이 정확하지는 않지만 Ubuntu 20.x였습니다. 지금은 최신 버전인, 기억이 정확하지는 않지만 Ubuntu 24.x를 실행하고 있습니다. 이 과정을 배우고 완료하지 않았다면, 결국 “대단히” 실패한 업그레이드를 겪었을 것입니다.

왜 그렇게 생각하시나요?
베타는 "프로덕션 환경에서 사용할 준비가 되지 않았다"는 뜻이 아닙니다. 안정판은 변경 사항이 적어 새로운 버그가 발생할 가능성이 낮습니다. 하지만 이는 버그 수정과 새로운 기능이 적다는 것을 의미하기도 하며, 보안 관련 버그 수정만 백포트되므로 그렇습니다.

몇 년 동안 운이 좋았네요. 제이가 언급했듯이, 여러분의 Docker는 오래되었고 GUI 기반의 소프트 업데이트가 아닌 하드 업데이트가 필요합니다.

Discourse 개발진도 명시적으로, 때로는 커맨드 라인 업데이트를 수행해야 한다고 밝히고 있습니다. 제가 7년 넘게 사용해 온 초기 단계에서 웹 GUI가 실제로 커맨드 라인 업데이트가 필요하다고 알려준 적이 여러 번 있었습니다. 또한 때로는 OS 업그레이드를 수행하거나(새로운 서버를 만들어 OS를 새로고침한 뒤 Discourse를 이식하는 것) 해야 합니다.

셀프 호스팅의 단점 중 하나는, 셀프 호스터인 여러분이 백엔드를 유지 관리하고 필요할 때 문제를 해결하거나, Marketplace 채널에서 필요한 기술을 가진 사람을 고용해야 한다는 점입니다.