Обновление PostgreSQL 15

Успех. Теперь вы можете запустить сервер базы данных с помощью команды:

    pg_ctlcluster 13 main start

invoke-rc.d: не удалось определить текущий уровень выполнения
invoke-rc.d: policy-rc.d запретил выполнение команды start.
Настройка postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Обработка триггеров для libc-bin (2.36-9+deb12u9) ...
Обработка триггеров для postgresql-common (267.pgdg120+1) ...
Создание словарей PostgreSQL из установленных пакетов myspell/hunspell...
Удаление устаревших файлов словарей:
Остановка сервера базы данных PostgreSQL 13: main.
Остановка сервера базы данных PostgreSQL 15: main.
Выполнение проверок согласованности
-----------------------------
Проверка версий кластеров                                   ok

Исходный кластер был выключен некорректно.
Ошибка, выход
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES НЕ УДАЛОСЬ

Для получения помощи посетите страницу https://meta.discourse.org/t/postgresql-15-update/349515.

Тем временем вы можете запустить ./launcher start app для перезапуска вашего приложения.
-------------------------------------------------------------------------------------



ОШИБКА
--------------------
Pups::ExecError: 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 уже запущен, остановите контейнер ; exit 1
fi
 завершилась с ошибкой, код возврата #<Process::Status: pid 17 exit 1>
Место возникновения ошибки: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
Выполнение не удалось с параметрами {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres уже запущен, остановите контейнер ; exit 1\nfi\n"}
Загрузка не удалась с кодом выхода 1
** ЗАГРУЗКА НЕ УДАЛАСЬ ** Пожалуйста, прокрутите вверх и найдите более ранние сообщения об ошибках, их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.
cbebd339ee3bd1e246300784f7825042702c1b5032877bfe580cb7f635fb852b

Информация о диске:

========================================
Discourse 3.4.0.beta3
Версия Discourse на mydomian: Discourse 3.4.0.beta3
Версия Discourse на localhost: Discourse 3.4.0.beta3


==================== ИНФОРМАЦИЯ О ПАМЯТИ ====================
RAM (МБ): 2055

              total        used        free      shared  buff/cache   available
Mem:           1960        1463         100          43         396         255
Swap:          2047          66        1981

==================== ПРОВЕРКА СВОБОДНОГО МЕСТА НА ДИСКЕ ====================
---------- Свободное место на диске ОС ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        59G   45G   14G  77% /

---------- Свободное место на диске контейнера ----------
Filesystem      Size  Used Avail Use% Mounted on
overlay          59G   45G   14G  77% /
/dev/root        59G   45G   14G  77% /shared
/dev/root        59G   45G   14G  77% /var/log

==================== ИНФОРМАЦИЯ О ДИСКАХ ====================
Диск /dev/loop0: 110.24 МБ, 115593216 байт, 225768 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop2: 73.91 МБ, 77479936 байт, 151328 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop3: 103.102 МБ, 109043712 байт, 212976 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop4: 73.89 МБ, 77459456 байт, 151288 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop5: 55.68 МБ, 58363904 байт, 113992 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop6: 63.71 МБ, 66789376 байт, 130448 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop7: 63.10 МБ, 67080192 байт, 131016 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/xvda: 60 ГиБ, 64424509440 байт, 125829120 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x15e6b846

Устройство     Boot Start       End   Sectors Size Id Type
/dev/xvda1 *     2048 125829086 125827039  60G 83 Linux


Диск /dev/loop8: 26.33 МБ, 27602944 байт, 53912 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop9: 110.4 МБ, 115384320 байт, 225360 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop10: 55.37 МБ, 58052608 байт, 113384 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop11: 104.2 МБ, 109252608 байт, 213384 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/loop13: 25.76 МБ, 26992640 байт, 52720 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт

==================== КОНЕЦ ИНФОРМАЦИИ О ДИСКАХ ====================

Значит ли это, что мне следует сначала обновить Docker, если я столкнусь с этой проблемой при попытке пересобрать систему?

Сейчас я использую версию 3.4.0.beta3-dev(93983286b5)

Обновление: Я пересобрал систему снова, и на этот раз всё прошло успешно.

2 лайка

В первом посте есть конкретные инструкции на этот счёт.

Вам, вероятно, следует обновить Docker независимо от того, есть ли у вас какие-либо проблемы.

2 лайка

Для меня в итоге помогло обновление Docker.
Я последовал инструкции по ссылке https://stackoverflow.com/a/30794189, а затем выполнил:
sudo service docker start

Только после этого:

./launcher start app
./launcher stop app
./launcher rebuild app
3 лайка

У меня тоже возникают серьёзные проблемы с этим обновлением. Как и у @Vaping_Community, у меня PostgreSQL находится на отдельном смонтированном томе (/mnt/volume_tor1_01/shared/standalone).

Получаю следующую ошибку:

mv: не удалось переместить '/shared/postgres_data' в '/shared/postgres_data_old': Устройство или ресурс занят
mv: межсетеое перемещение не удалось: '/shared/postgres_data_new' в '/shared/postgres_data/postgres_data_new'; не удалось удалить целевой объект: Каталог не пуст

 [...]

Обновление завершено
----------------
Статистика оптимизатора не переносится pg_upgrade.
После запуска нового сервера рекомендуется выполнить:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Выполнение этого скрипта удалит файлы данных старого кластера:
    ./delete_old_cluster.sh
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES ЗАВЕРШЕНО

Старая база данных версии 13 хранится в /shared/postgres_data_old

Чтобы завершить обновление, снова выполните сборку с помощью:

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

Мое понимание таково, что решение заключается в ручном переименовании:
postgres_datapostgres_data_old
postgres_newpostgres_data

а затем выполнении ./launcher rebuild app. Это кажется достаточно простым, но при повторной сборке я всё ещё застревал в цикле и в итоге получаю следующие директории:

  • postgres_data_older
  • postgres_data_old (по-видимому, она превращается в postgres_data_older)
  • postgres_data
  • postgres_data_new

Кажется, что по какой-то причине система не распознаёт, что postgres_data уже обновлён, пытается сделать это снова, и это завершается ошибкой при попытке переместить директорию.

$ cat postgres_data/PG_VERSION 
15

Я также попробовал ручной подход, описанный в оригинальном посте, но безрезультатно. Пожалуйста, помогите!

полный лог
x86_64 arch detected.
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-23T11:41:32.477354 #1]  INFO -- : Reading from stdin
I, [2025-02-23T11:41:32.504068 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-02-23T11:41:32.508552 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-02-23T11:41:32.513290 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.517671 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.522244 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-02-23T11:41:32.523354 #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-23T11:41:32.523912 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.524756 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.525365 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.526239 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.526873 #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-23T11:41:32.527613 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.531734 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-02-23T11:41:32.532882 #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-23T11:41:32.534021 #1]  INFO -- : Replacing (?-mix:#?local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-02-23T11:41:32.534342 #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-23T11:41:32.534935 #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-23T11:41:32.535476 #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

initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
debconf: delaying package configuration, since apt-utils is not installed
mv: не удалось переместить '/shared/postgres_data' в '/shared/postgres_data_old': Устройство или ресурс занят
mv: межсетеое перемещение не удалось: '/shared/postgres_data_new' в '/shared/postgres_data/postgres_data_new'; не удалось удалить целевой объект: Каталог не пуст
I, [2025-02-23T11:42:52.303584 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59.0 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]
Get:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12.1 kB]
Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [283 kB]
Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8,792 kB]
Get:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13.5 kB]
Get:10 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [246 kB]
Get:11 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10.9 kB]
Get:12 https://dl.yarnpkg.com/debian stable/main all Packages [10.9 kB]
Get:13 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:14 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5,636 B]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10.2 MB in 2s (6,490 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libllvm19 postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  libllvm19 postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 4 newly installed, 0 to remove and 12 not upgraded.
Need to get 41.6 MB of archives.
After this operation, 184 MB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bookworm/main amd64 libllvm19 amd64 1:19.1.4-1~deb12u1 [25.9 MB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.20-1.pgdg120+1 [1,538 kB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.20-1.pgdg120+1 [13.9 MB]
Get:4 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 41.6 MB in 2s (18.8 MB/s)
Selecting previously unselected package libllvm19:amd64.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../libllvm19_1%3a19.1.4-1~deb12u1_amd64.deb ...
Unpacking libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
Selecting previously unselected package postgresql-client-13.
Preparing to unpack .../postgresql-client-13_13.20-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.20-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.20-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.20-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13-pgvector.
Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Setting up libllvm19:amd64 (1:19.1.4-1~deb12u1) ...
Setting up postgresql-client-13 (13.20-1.pgdg120+1) ...
Setting up postgresql-13 (13.20-1.pgdg120+1) ...
Creating new PostgreSQL cluster 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 13 main start

invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...
Processing triggers for postgresql-common (267.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 13 database server: main.
Stopping PostgreSQL 15 database server: main.
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for user-defined encoding conversions              ok
Checking for user-defined postfix operators                 ok
Checking for incompatible polymorphic functions             ok
Creating dump of global objects                             ok
Creating dump of database schemas                           ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.

Performing Upgrade
------------------
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
Deleting files from new pg_xact                             ok
Copying old pg_xact to new server                           ok
Setting oldest XID for new cluster                          ok
Setting next transaction ID and epoch for new cluster       ok
Deleting files from new pg_multixact/offsets                ok
Copying old pg_multixact/offsets to new server              ok
Deleting files from new pg_multixact/members                ok
Copying old pg_multixact/members to new server              ok
Setting next multixact ID and offset for new cluster        ok
Resetting WAL archives                                      ok
Setting frozenxid and minmxid counters in new cluster       ok
Restoring global objects in the new cluster                 ok
Restoring database schemas in the new cluster               ok
Copying user relation files                                 ok
Setting next OID for new cluster                            ok
Sync data directory to disk                                 ok
Creating script to delete old cluster                       ok
Checking for extension updates                              notice

Your installation contains extensions that should be updated
with the ALTER EXTENSION command.  The file
    update_extensions.sql
when executed by psql by the database superuser will update
these extensions.


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
-------------------------------------------------------------------------------------
1 лайк

Обновление на ARM (aarch64) с нестандартной локалью

Я только что потратил время на исправление сбоя при обновлении на одном сервере с двумя контейнерами.

  1. Его процессор — ARM.
  2. Discourse был настроен с локалью en_UK.UTF-8.

Пошагово я выяснил следующее:

  1. tianon/postgres-upgrade:13-to-15 не работает на ARM.
  2. Настройка локали хранится в файле share/${CONTAINER}/postgres_data/postgresql.conf.

Я начал с закомментирования части env: в контейнере данных, чтобы убедиться, что используются локали по умолчанию.

Таким образом, чтобы выбраться из хаоса обновления, я предпринял опасный шаг, предположив, что различия в сортировке между en_GB и en_US незначительны, и безжалостно обновил весь кластер до en_US:

UPDATE pg_database SET datctype='en_US.UTF-8', datcollate='en_US.UTF-8';

Я не уверен, что этот шаг необходим, YMMV. Оставляю это здесь для более сведущих людей, чтобы они высказались, и я категорически не рекомендую делать это для других языков!

Затем я заменил локаль в postgresql.conf:

sed -i -e 's/en_GB/en_US/g' shared/data/postgres_data/postgresql.conf
sudo -H -u discourse ./launcher rebuild data
...
ОБНОВЛЕНИЕ POSTGRES ЗАВЕРШЕНО

:tada:

Не думайте, что это было легко: я даже не упоминаю долгий путь изучения вариантов, особенно потому, что когда я вмешался, административный интерфейс был недоступен, а последнее резервное копирование было выполнено 6 дней назад. Мне пришлось повозиться, прежде чем я смог прийти к правильному — или, по крайней мере, рабочему — решению.

Надеюсь, это сэкономит кому-то время.

5 лайков

Вы всё ещё видите это в логах при каждой пересборке? Если да, то, возможно, вы смотрели (и, следовательно, вручную переименовали) не те директории здесь:

Если том контейнера /shared отображается на /mnt/volume_tor1_01/shared/standalone на хосте, то команда cat /mnt/volume_tor1_01/shared/standalone/postgres_data/PG_VERSION должна возвращать 13, а не 15.

Можете поделиться своим обезличенным файлом app.yml?

4 лайка

Я думаю, вы правильно определили проблему. Вот что у меня в app.yml:

## Docker-контейнер не имеет состояния; все данные хранятся в /shared
volumes:
  - volume:
      host: /mnt/volume_tor1_01/shared/standalone
      guest: /shared
  - volume:
      host: /mnt/volume_tor1_01/shared/standalone/log/var-log
      guest: /var/log
  - volume:
      host: /var/postgres_data_discourse
      guest: /shared/postgres_data

(на основе этого руководства Move Uploads and Backups to DigitalOcean Block Storage)

$ cat postgres_data/PG_VERSION 
15
$ cat /var/postgres_data_discourse/PG_VERSION 
13

Поэтому я считаю, что проблема действительно решается этим подходом PostgreSQL 15 update - #125 by Vaping_Community

Я думаю, что меня сбило с толку то, что на томе mnt было несколько папок postgres_data (потому что я перезапустил rebuild), и я не понял, что исходная папка на самом деле находится в /var/

Попробую это позже сегодня вечером

2 лайка

Гораздо проще развернуть новую виртуальную машину и восстановить там резервную копию. Таким образом, вы полностью пропускаете этап обновления PG и не сможете сломать старый сайт, пока новый не заработает.

8 лайков

Сработало :slight_smile:

2 лайка

Обратите внимание, что UID могут измениться!

/launcher enter app
x86_64 arch detected.
grep postgres /etc/passwd
postgres:x:101:104:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

Это меня только что подвело…

Да, у меня это сработало, но лучше использовать обновлённую инструкцию из первого сообщения:

Я не могу отредактировать свой пост, чтобы добавить примечание.

2 лайка

У меня тоже не получается.

more /var/discourse/shared/standalone/postgres_data_new/pg_upgrade_output.d/20250416T103311.340/log/pg_upgrade_server.log

-----------------------------------------------------------------
  pg_upgrade запущен в ср апр 16 10:33:11 2025
-----------------------------------------------------------------

команда: "/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250416T103311.340/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o 
"-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start >> "/shared/postgres_data_new/pg_upgrade_output.d/
20250416T103311.340/log/pg_upgrade_server.log" 2>&1
ожидание запуска сервера....2025-04-16 10:33:11.515 UTC [1887] LOG:  запуск PostgreSQL 13.20 (Debian 13.20-1.pgdg120+1) на x86_64-pc-linux-gnu, скомпилировано gcc (Debian 12
.2.0-14) 12.2.0, 64-разрядная
2025-04-16 10:33:11.517 UTC [1887] LOG:  прослушивание Unix-сокета "/var/lib/postgresql/.s.PGSQL.50432"
2025-04-16 10:33:11.525 UTC [1887] LOG:  не удалось открыть файл конфигурации "/etc/postgresql/13/main/pg_hba.conf": файл или каталог не найден
2025-04-16 10:33:11.525 UTC [1887] FATAL:  не удалось загрузить pg_hba.conf
2025-04-16 10:33:11.526 UTC [1887] LOG:  система баз данных остановлена

Похоже, что он не находит /etc/postgresql/13/main/pg_hba.conf, и это верно, так как его там нет. Однако он находится в нескольких местах:

/var/discourse/shared/standalone/postgres_data_older/pg_hba.conf
/var/discourse/shared/standalone/postgres_data_new/pg_hba.conf
/var/discourse/shared/standalone/postgres_data/pg_hba.conf
/var/lib/docker/overlay2/6514156241efd883dd59b27a0275ba1cc73a7365fb78c5782536a39ee2d6d641/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/8afed861b039e5a366dc9a5513cd7df5a958d86a41f05063ce5256fb9f8fdfec/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/fa8893e9f714439469d391635d8882b345e90705a886d74cf6fea8d5460df3f0/diff/etc/postgresql/15/main/pg_hba.conf
/var/lib/docker/overlay2/e4eec92eb7b181648ca2bc6744ac3af0935745b75b1abe89170fc4b82a8eca42/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/4cd3189b9d554b1c60891dc5d48cc670e5d7d847ec5a0f2dfa91ad7f66b3a211/diff/etc/postgresql/13/main/pg_hba.conf
/var/lib/docker/overlay2/0db2210fc76fce6f41912183f744517154f46af15a0b1a1e976999eabbd801d9/diff/etc/postgresql/15/main/pg_hba.conf
/var/postgres_data/postgres_data_new/pg_hba.conf
/var/postgres_data/pg_hba.conf

Есть какие-то подсказки?

Я попробовал вашу команду docker run… и получил:

Проверка версий кластера
Данные старого кластера и каталоги бинарных файлов относятся к разным основным версиям.

Какая у вас версия Docker? Какая версия вашей ОС? Я обнаружил, что часто проще перейти на новую виртуальную машину.

Версия Docker: 28.0.4
Версия Linux: 5.15.0-131-generic

Вы можете попробовать изменить шаблон postgres 13 в вашем файле app.yml.

Это находится внутри контейнера. Вы ищете вне контейнера.

Я сделал это просто для обновления Discourse, и процесс завершился успешно. Теперь у меня вот что:

templates:
  - "templates/postgres.13.template.yml"

Разве это не означает, что я не могу обновить Postgres?

Думаю, теперь вы можете вернуть обычный шаблон и попробовать снова. Я бы перешел на новую виртуальную машину, но вы можете попробовать ещё раз, если хотите.

Я вручную обновил Postgres, как описано в первом сообщении. Однако я не могу вернуть шаблон к postgres.template.yml, так как сборка не выполняется из-за той же проблемы:

2025-04-16 13:40:07.815 UTC [1888] LOG: не удалось открыть файл конфигурации “/etc/postgresql/13/main/pg_hba.conf”: Нет такого файла или каталога
2025-04-16 13:40:07.815 UTC [1888] FATAL: не удалось загрузить pg_hba.conf

Я останусь на версии 13, надеясь, что в будущем она не сломается.
Спасибо @pfaffman.

Попытка запуска обновления завершается неудачей, так как система не может найти файл, который, как я подтвердил, существует:

Конец лога + проверка файлов

-----------------------------
Проверка версий кластера                                   ok
 
*ошибка*
Обратитесь к последним строкам файла "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" для
выяснения вероятной причины сбоя.
 
Не удалось подключиться к серверу через сокет "/var/lib/postgresql/.s.PGSQL.50432": файл или каталог не найден
        Запущен ли сервер локально и принимает ли он подключения через этот сокет?
 
Не удалось подключиться к исходному постмастеру, запущенному командой:
"/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start
Сбой, выход
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES НЕ УДАЛОСЬ
 
Пожалуйста, посетите https://meta.discourse.org/t/postgresql-15-update/349515 для получения поддержки.
 
Тем временем вы можете запустить ./launcher start app для перезапуска вашего приложения
-------------------------------------------------------------------------------------
 
 
 
ОШИБКА
--------------------
Pups::ExecError: 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
 завершено с кодом возврата #<Process::Status: pid 17 exit 1>
Место сбоя: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
выполнение команды не удалось с параметрами {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
загрузка не удалась с кодом выхода 1
** СБОЙ ЗАГРУЗКИ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.
./discourse-doctor может помочь в диагностике проблемы.
afa058b1ff7d14d9469fe27bc39dc08562c4e249bdf7c7e153b4030a1bb0dbc2
root@amcforum:/var/discourse# ./launcher start app && ./launcher enter app
Обнаружена архитектура x86_64.
 
запуск существующего контейнера
+ /usr/bin/docker start app
app
Обнаружена архитектура x86_64.
root@amcforum-app:/var/www/discourse# cat /shared/postgres_data_new/pg_upgrade_output.d/0250605T024052.178/log/pg_upgrade_server.log 
-----------------------------------------------------------------
  pg_upgrade запущен в чт июн  5 02:40:52 2025
-----------------------------------------------------------------
 
команда: "/usr/lib/postgresql/13/bin/pg_ctl" -w -l "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" -D "/shared/postgres_data" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directories='/var/lib/postgresql'" start >> "/shared/postgres_data_new/pg_upgrade_output.d/20250605T024052.178/log/pg_upgrade_server.log" 2>&1
ожидание запуска сервера....2025-06-05 02:40:52.313 UTC [1886] LOG:  запуск PostgreSQL 13.21 (Debian 13.21-1.pgdg120+1) на x86_64-pc-linux-gnu, скомпилировано с помощью gcc (Debian 12.2.0-14) 12.2.0, 64-bit
2025-06-05 02:40:52.316 UTC [1886] LOG:  прослушивание Unix-сокета "/var/lib/postgresql/.s.PGSQL.50432"
2025-06-05 02:40:52.324 UTC [1886] LOG:  не удалось открыть файл конфигурации "/etc/postgresql/13/main/pg_hba.conf": файл или каталог не найден
2025-06-05 02:40:52.324 UTC [1886] FATAL:  не удалось загрузить pg_hba.conf
2025-06-05 02:40:52.327 UTC [1886] LOG:  система баз данных остановлена
 остановка ожидания
pg_ctl: не удалось запустить сервер
Изучите вывод лога.
 
 
root@amcforum-app:/var/www/discourse# ls -lah "/etc/postgresql/13/main/pg_hba.conf"
-rw-r----- 1 postgres postgres 4.8K 3 янв 13:02 /etc/postgresql/13/main/pg_hba.conf
root@amcforum-app:/var/www/discourse#
1 лайк