주의! 데이터베이스가 매우 큰 경우, 상당한 추가 디스크 공간(데이터베이스 크기의 2배)이 필요하며 이 업그레이드를 수행할 때 매우 주의해야 합니다!
Docker 이미지를 PostgreSQL 15로 업그레이드하기 위한 변경 사항이 적용되었습니다. 커맨드 라인에서 Discourse를 다시 빌드하는 사이트 관리자는 이전의 PostgreSQL 13에서 PostgreSQL 15로 업그레이드됩니다. 참고로, 2020년에 PostgreSQL 13 업데이트가 실시되었을 때 업그레이드를 보류했다면, 해당 업그레이드를 건너뛰고 바로 PostgreSQL 15로 이동할 수 있습니다.
이전에 업그레이드를 보류했다면, app.yml의 PostgreSQL 템플릿을 templates/postgres.12.template.yml에서 templates/postgres.template.yml로 변경해야 합니다.
어떤 업그레이드든 마찬가지이지만, 작업을 수행하기 전에 백업을 만드는 것이 강력히 권장됩니다.
업데이트
공식 설치 가이드 (단일 컨테이너)
다음 재빌드 시 끝에 다음과 같은 메시지가 표시됩니다:
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES COMPLETE
Old 13 database is stored at /shared/postgres_data_old
To complete the upgrade, rebuild again using:
./launcher rebuild app
-------------------------------------------------------------------------------------
이는 업그레이드가 정상적으로 완료되었음을 의미합니다! 사이트를 다시 실행 상태로 만들려면 새로운 재빌드를 실행하기만 하면 됩니다.
데이터 컨테이너 설치
discourse_docker 저장소에 포함된 샘플을 기반으로 한 전용 데이터 컨테이너가 있는 설정을 사용하는 경우, PostgreSQL을 안전하고 깨끗하게 종료하는 것이 중요합니다.
요즘에는 수 분 동안 실행되는 쿼리를 사용하는 백그라운드 작업이 있으므로, 웹 컨테이너를 종료하면 데이터 컨테이너가 안전하게 종료되는 데 도움이 됩니다.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
데이터 컨테이너에 대한 첫 번째 재빌드를 실행하기 전에, PostgreSQL 로그를 tail하여 올바르게 종료되었는지 확인할 수 있습니다.
tail -f shared/standalone/log/var-log/postgres/current을 실행하면, 깨끗하게 종료된 경우 다음과 같은 로그가 표시됩니다:
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
수동 업데이트 / 공간이 제한된 환경
이 작업을 시도하기 전에 반드시 POSTGRES_DATA를 백업해야 합니다
공간이 제한되어 더 많은 공간을 확보할 수 없는 환경이라면 다음을 시도해 볼 수 있습니다:
./launcher stop app #(또는 해당 환경에 따라 web_only와 data 둘 다)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
--entrypoint=/bin/bash \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade"
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
docker run --rm -v /var/discourse/shared/standalone:/shared local_discourse/app \
chown -R postgres:postgres /shared/postgres_data #(또는 local_discourse/data)
./launcher rebuild app #(또는 해당 환경에 따라 먼저 data, 그 다음 web_only)
테스트 결과 이 절차는 현재 데이터베이스 크기의 1배 미만의 여유 공간이 필요합니다.
기본 로케일이 아닌 것을 사용하는 경우, 첫 번째 docker 명령을 다음과 같이 교체하여 시도해 볼 수 있습니다:
# 'en_US.UTF-8'을 사용자 로케일로 변경
docker run --rm \
--entrypoint=/bin/bash \
-e LANG='en_US.UTF-8' \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade'
업데이트 보류
다음 재빌드 시 업데이트를 보류해야 하는 경우, app.yml 파일에서 "templates/postgres.template.yml"을 "templates/postgres.13.template.yml"로 변경하여 PostgreSQL 템플릿을 교체할 수 있습니다.
이것은 권장되지 않습니다. 일부 사이트 관리자가 나중에 변경 사항을 되돌리는 것을 잊어버리기 때문입니다.
업데이트 후 선택적 작업
PostgreSQL 통계 최적화
업데이트 후, 새 PostgreSQL에는 테이블 통계가 없습니다. 다음을 사용하여 생성할 수 있습니다:
docker exec -u postgres app \
/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages
오래된 데이터 정리
표준 설치의 경우, 다음 명령을 사용하여 PG13 형식의 오래된 데이터를 삭제할 수 있습니다:
cd /var/discourse
./launcher cleanup
별도의 데이터 컨테이너가 있는 경우, 백업 사본을 다음과 같이 제거해야 합니다:
rm -fr /var/discourse/shared/data/postgres_data_old/
FAQ
소스 클러스터가 깨끗하게 종료되지 않았습니다
위와 같은 메시지와 함께 업그레이드 실패가 발생하면, 더 나은 상태로 복원하기 위해 더 간단한 접근 방식을 시도해 볼 수 있습니다.
./launcher start app를 사용하여旧的 컨테이너를 다시 시작합니다. 다시 시작될 때까지 몇 분 정도 기다립니다.
이제 ./launcher stop app를 사용하여 다시 종료합니다. 그런 다음 로그를 tail하여 깨끗하게 종료되었는지 확인합니다:
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
로그에 데이터베이스가 종료되었음을 나타내지 않는 경우,旧的 컨테이너를 다시 시작하고 ./launcher enter app로 진입하여 이 명령들을 실행한 후 완료되면 다시 로그를 tail합니다.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
로그가 위와 같으면 이제 ./launcher rebuild app를 사용하여 다시 업그레이드를 시도할 수 있습니다.
데이터베이스 "postgres"의 lc_collate 값이 일치하지 않습니다
이 오류는 데이터베이스에 기본 로케이가 아닌 것을 사용하는 경우 발생합니다. 성공하려면 3개의 변수가 필요하다고 보고되었습니다. app.yml 파일의 env: 섹션에 다음 3줄이 있는지 확인하십시오:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
en_US.UTF-8을 사용자 로케일로 변경합니다.
모든 재빌드 시 업그레이드가 다시 실행됨 (업그레이드 루프)
이것이 발생하면 업그레이드 로그에 다음이 포함됩니다.
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty
이는 이전 업그레이드에서 남은 파일이 여전히 존재한다는 것을 의미합니다. 계속하기 전에 이를 다른 곳으로 이동하십시오.
업그레이드 완료 제안 스크립트 - 무언가 해야 하나요?
업그레이드가 완료되면 pg_upgrade 메시지 출력에서 다음을 볼 수 있습니다:
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
이 메시지는 안전하게 무시할 수 있습니다.
PostgreSQL 13 업데이트를 건너뛴 경우, 이제 어떻게 해야 하나요?
이 가이드 상단의 표준 지침을 따르면 문제없이 현재 버전에서 15로 업그레이드됩니다.
공간이 제한된 지침을 따르는 경우, 버전 번호를 적절히 조정하십시오.
인덱스를 다시 빌드하면 상당한 디스크 공간 절약이 가능합니다. 업그레이드 후 PostgreSQL 13 업데이트의 단계를 따르십시오.