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

:warning: ВНИМАНИЕ! Если ваша база данных очень велика, вам потребуется много дополнительного дискового пространства (объем, равный двойному размеру базы данных), и при этом обновлении следует проявлять особую осторожность!

Мы только что внедрили изменения для обновления нашего Docker-образа до PostgreSQL 15. Любые администраторы сайтов, собирающие Discourse из командной строки, будут обновлены до PostgreSQL 15 с предыдущей версии PostgreSQL 13. Обратите внимание: если вы воздержались от обновления, когда выходило обновление PostgreSQL 13 еще в 2020 году, вы можете пропустить это обновление и сразу перейти к PostgreSQL 15.

Если вы ранее откладывали обновление, измените шаблон PostgreSQL в файле app.yml с templates/postgres.12.template.yml на templates/postgres.template.yml.

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

Обновление

Официальное руководство по установке (один контейнер)

При следующей пересборке в конце вы увидите следующее сообщение:

-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES ЗАВЕРШЕНО

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

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

./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 -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

Ручное обновление / среды с ограниченным пространством

:warning::warning::warning:
ВЫ ДОЛЖНЫ СОЗДАТЬ РЕЗЕРВНУЮ КОПИЮ POSTGRES_DATA ПЕРЕД ПОПЫТКОЙ ЭТОГО
:warning::warning::warning:

Если вы работаете в среде с ограниченным дисковым пространством и у вас нет возможности увеличить его, вы можете попробовать следующее:

./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, если это ваш случай)

По моим тестам, эта процедура требует менее 1x текущего размера вашей базы данных свободного места.

Если вы используете нестандартную локаль, вы можете попробовать заменить первую команду 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'

Откладывание обновления

Если вам нужно отложить обновление при следующей пересборке, вы можете изменить шаблон PostgreSQL в файле app.yml, заменив "templates/postgres.template.yml" на "templates/postgres.13.template.yml".

Это не рекомендуется, так как некоторые администраторы сайтов могут забыть вернуть изменения обратно.

Дополнительные задачи после обновления

Оптимизация статистики 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 -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, выполнить эти команды и снова отслеживать логи после завершения.

export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit

Если логи выглядят как выше, вы можете снова попробовать выполнить обновление, используя ./launcher rebuild app.

Значения lc_collate для базы данных “postgres” не совпадают

Эта ошибка возникает, если вы используете нестандартные локали для вашей базы данных. Было сообщено, что для успешного завершения процесса необходимы 3 переменные. Убедитесь, что в секции env: вашего файла app.yml есть 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.

28 лайков
Cannot rebuild app because UPGRADE OF POSTGRES FAILED
Site offline after rebuild (4th Feb 2025)
Launcher upgrade failing
Update “3.4.0.beta4” failed
Admin dashboard not working after docker update
Specifically for 3.4.0.beta4 -- what are the system requirements?
Discourse rebuild fails due to unclean shutdown
Move from standalone container to separate web and data containers
Not receiving notifications for some replies
Hundreds of megabytes of apparently duplicate locale .js files
Upgrade failed spectacularily
Quote Callouts
502 Bad Gateway after updating to latest version
Discourse rebuild fails due to unclean shutdown
Rebuild fails: Data directory /shared/postgres_data must not be owned by root
Site Offline Since Update - pg15 upgrade failed
Failing update
Backup Failed error
Failing update
Let's Encrypt SSL certificates not renewing
Failing update
Long runtime moving posts / timeout errors
Upgrade failed. Database stopped. (multisite install)
Make (temporary) use of Network Storage for Restores, PSQL Update,
Error updating from 3.3 to 3.5
Unable to rebuild app / upgrade to 3.4.0.beta4
Upgrade fail unsupported Docker Version
Endlessly running Postgres processes & bad performance after Reinstall/restore
Unable to upgrade to PostgreSQL 15/
PostgreSQL update fails from China
Postgres doesn't seem to be running when running Discourse locally using Docker
Postgres doesn't seem to be running when running Discourse locally using Docker
Unable to upgrade to PostgreSQL 15/
My install is 16,359 commits behind! Advice?
Admin functions
Discourse rebuild process hangs at PostgreSQL initialization with "trust" authentication warning
Discourse update error with Terser
Getting white screen on admin page after update
Upgrade fails (again :) )
Update failure
I broke my site while updating it
Major upgrade -- best practices?
An upgrade knocked my site offline; how long until it's restored?
Upgrade failed. Database stopped. (multisite install)
Can't log into Digital Ocean--And they aren't replying. Advice?
Trouble updating discourse after some time - UPGRADE OF POSTGRES FAILED
Site Offline Since Update - pg15 upgrade failed
Site offline after rebuild (4th Feb 2025)
Can publishing "from" the `#staff` category prevent emails being sent?
Cannot rebuild app,
Upgrade from postgres 13 to 15 failing - currently means forum is unavailable
Unable to upgrade Kore Community Instance
Site upgrade insisting on database upgrade after manual db upgrade
Update v3.4.0.beta3 +21 to v3.4.0.beta4 +37 fails, unable to create a directory
Discourse Randomly Does Not run or Rebuild
PostgreSQL update fails from China
Hundreds of megabytes of apparently duplicate locale .js files
Site not working after upgrade

Когда я захожу на https://community.ankihub.net/admin/update, я вижу следующее сообщение:

Вы используете старую версию образа Discourse
Обновления через веб-интерфейс отключены, пока вы не запустите последнюю версию образа. Для этого войдите на свой сервер по SSH и выполните:

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

После выполнения этих инструкций я получаю сообщение UPGRADE OF POSTGRES FAILED:

invoke-rc.d: не удалось определить текущий уровень запуска
invoke-rc.d: policy-rc.d запретил выполнение команды start.
Обработка триггеров для postgresql-common (267.pgdg120+1) ...
Создание словарей PostgreSQL из установленных пакетов myspell/hunspell...
Удаление устаревших файлов словарей:
Остановка сервера баз данных PostgreSQL 13: main.
Остановка сервера баз данных PostgreSQL 15: main.
Выполнение проверок согласованности
-----------------------------
Проверка версий кластеров                                   ok
Проверка пользователя базы данных как пользователя установки                  ok
Проверка параметров подключения к базе данных                       ok
Проверка подготовленных транзакций                          ok
Проверка пользовательских составных типов в таблицах пользователя  ok
Проверка типов данных reg* в таблицах пользователя                 ok
Проверка contrib/isn с несовпадением передачи bigint       ok
Проверка пользовательских преобразований кодировок              ok
Проверка пользовательских постфиксных операторов                 ok
Проверка несовместимых полиморфных функций             ok
Создание дампа глобальных объектов                             ok
Создание дампа схем баз данных
*failure*

Обратитесь к нескольким последним строкам файла "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" для
поиска вероятной причины сбоя.
Сбой, выход
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

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

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



FAILED
--------------------
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
 failed with return #<Process::Status: pid 18 exit 1>
Место сбоя: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"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"}
bootstrap failed with exit code 1

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

Вот логи из /shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log:

command: "/usr/lib/postgresql/15/bin/pg_dump" --host /var/lib/postgresql --port 50432 --username postgres --schema-only --quote-all-identifiers --binary-upgrade --format=custom  --file="/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/dump/pg_upgrade_dump_16384.custom" 'dbname=discourse' >> "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" 2>&1
pg_dump: error: query failed: ERROR:  could not access file "$libdir/vector": No such file or directory
pg_dump: detail: Query was: SELECT t.tableoid, t.oid, i.indrelid, t.relname AS indexname, pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, i.indkey, i.indisclustered, c.contype, c.conname, c.condeferrable, c.condeferred, c.tableoid AS contableoid, c.oid AS conoid, pg_catalog.pg_get_constraintdef(c.oid, false) AS condef, (SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, t.reloptions AS indreloptions, i.indisreplident, inh.inhparent AS parentidx, i.indnkeyatts AS indnkeyatts, i.indnatts AS indnatts, (SELECT pg_catalog.array_agg(attnum ORDER BY attnum)   FROM pg_catalog.pg_attribute   WHERE attrelid = i.indexrelid AND     attstattarget >= 0) AS indstatcols, (SELECT pg_catalog.array_agg(attstattarget ORDER BY attnum)   FROM pg_catalog.pg_attribute   WHERE attrelid = i.indexrelid AND     attstattarget >= 0) AS indstatvals, false AS indnullsnotdistinct FROM unnest('{16805,16813,16823,16835,16846,16858,16940,16948,16963,16973,16996,17006,17029,17061,17071,17085,17095,17101,17112,17136,17151,17159,17168,17266,17280,17321,17334,17345,17354,17368,17382,17398,17412,17420,17428,17519,17532,17543,17562,17570,17620,17687,17710,17724,17738,17754,17775,17788,17803,17824,17851,17864,17898,17917,17932,17944,17958,17980,17993,18006,18019,18030,18041,18055,18069,18092,18101,18134,18145,18166,18177,18214,18241,18263,18276,18298,18324,18338,18358,18368,18403,18426,18449,18458,18470,18496,18510,18525,18534,18543,18569,18596,18607,18625,18643,18655,18663,18676,18686,18698,18710,18719,18734,18742,18757,18768,18786,18798,18802,18806,18846,18864,18879,18891,18910,18920,18932,18946,18988,19003,19014,19039,19059,19073,19085,19097,19103,19116,19140,19192,19206,19227,19250,19266,19300,19309,19328,19343,19354,19367,19389,19402,19417,19430,19497,19521,19544,19559,19569,19597,19605,19637,19687,19703,19721,19742,19771,19807,19821,19830,19839,19862,19874,19890,19904,19917,19932,19942,19951,19960,19981,20005,20021,20044,20052,20061,20073,20082,20133,20146,20157,20178,20191,20203,20217,20231,20263,20276,20297,20309,20320,28805,28951,28964,28976,28986,28997,32824,32833,32843,32852,32862,32875,32887,32899,32910,32930,32967,35131,35141,38401,38413,38437,38445,38461,38482,38495,42870,46125,46138,130133,191445,191457,191471,191486,191497,191603,191637,243875,606663,606675,606693,606707,779182,779197,779213,779225,779237,779252,779265,968985,968993,969004,969017,969027,1004239,1004251,1004263,1004276,1004295,1091838,1091849,1091860,1336877,1336884,1336891,1566392,2169846,2169852,2169858,2169864,2169870,2169876,2169882,2169888,2169894,2169900,2169906,2169912,2169918,2169924,2169930,2169936,2169942,2169948,2169954,2169960,2169966,2169972,2169978,2169984}'::pg_catalog.oid[]) AS src(tbloid)
JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) JOIN pg_catalog.pg_class t2 ON (t2.oid = i.indrelid) LEFT JOIN pg_catalog.pg_constraint c ON (i.indrelid = c.conrelid AND i.indexrelid = c.conindid AND c.contype IN ('p','u','x')) LEFT JOIN pg_catalog.pg_inherits inh ON (inh.inhrelid = indexrelid) WHERE (i.indisvalid OR t2.relkind = 'p') AND i.indisready ORDER BY i.indrelid, indexname
/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log

Вот результат выполнения ./discourse-doctor:

Результат ./discourse-doctor
DISCOURSE DOCTOR Wed 29 Jan 2025 10:39:42 AM UTC
OS: Linux forum 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux


Найден containers/app.yml

==================== НАСТРОЙКИ YML ====================
DISCOURSE_HOSTNAME=community.ankihub.net
SMTP_ADDRESS=smtp.mailgun.org
DEVELOPER_EMAILS=REDACTED 
SMTP_PASSWORD=REDACTED 
SMTP_PORT=587
SMTP_USER_NAME=postmaster@mg.ankihub.net
LETSENCRYPT_ACCOUNT_EMAIL=REDACTED 

==================== ИНФОРМАЦИЯ DOCKER ====================
DOCKER VERSION: Docker version 27.2.1, build 9e34c9b

DOCKER PROCESSES (docker ps -a)

CONTAINER ID   IMAGE                           COMMAND        CREATED         STATUS          PORTS                                                                      NAMES
37e2430e1014   local_discourse/app             "/sbin/boot"   4 months ago    Up 33 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app
260f4c0ed417   local_discourse/mail-receiver   "/sbin/boot"   20 months ago   Up 4 months     0.0.0.0:25->25/tcp, :::25->25/tcp                                          mail-receiver


Контейнер Discourse app запущен


==================== ПЛАГИНЫ ====================
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-reactions.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-code-review.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-automation.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-ai.git
          - git clone https://github.com/discourse/discourse-jira.git

Необнаружено неофициальных плагинов.

См. официальный список на https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb.

========================================
Версия Discourse на community.ankihub.net: Discourse 3.4.0.beta2 
Версия Discourse на localhost: Discourse 3.4.0.beta2 


==================== ИНФОРМАЦИЯ О ПАМЯТИ ====================
OS: Linux
RAM (MB): 4127

              total        used        free      shared  buff/cache   available
Mem:           3936        1567         158         274        2209        1802
Swap:          2047          67        1980

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

---------- Свободное место на диске контейнера ----------
Filesystem      Size  Used Avail Use% Mounted on
overlay          78G   50G   28G  65% /
/dev/vda1        78G   50G   28G  65% /shared
/dev/vda1        78G   50G   28G  65% /var/log

==================== ИНФОРМАЦИЯ О ДИСКАХ ====================
Disk /dev/loop0: 55.68 MiB, 58363904 bytes, 113992 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop1: 91.85 MiB, 96292864 bytes, 188072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop2: 63.71 MiB, 66789376 bytes, 130448 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop3: 63.10 MiB, 67080192 bytes, 131016 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop4: 44.45 MiB, 46596096 bytes, 91008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop5: 91.9 MiB, 96346112 bytes, 188176 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/loop7: 44.3 MiB, 46448640 bytes, 90720 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/vda: 80 GiB, 85899345920 bytes, 167772160 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 2ED04D82-BA1D-4A75-86B9-9553B7EA5228

Device      Start       End   Sectors  Size Type
/dev/vda1  227328 167772126 167544799 79.9G Linux filesystem
/dev/vda14   2048     10239      8192    4M BIOS boot
/dev/vda15  10240    227327    217088  106M Microsoft basic data

Записи таблицы разделов не расположены в порядке на диске.


Disk /dev/loop8: 55.37 MiB, 58052608 bytes, 113384 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

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

==================== ТЕСТ ПОЧТЫ ====================
Для надежного теста получите адрес на http://www.mail-tester.com/
Тест почты пропущен.

==================== ГОТОВО! ====================

Надеюсь, кто-нибудь сможет указать мне правильное направление. Спасибо!

1 лайк

У меня такая же проблема, и я тоже ищу решение.

1 лайк

Как я могу проверить размер базы данных моего экземпляра?

2 лайка

Спасибо за отчеты — мы разбираемся с проблемой could not access file "$libdir/vector".

При стандартной установке, думаю, можно выполнить следующую команду:

du -sh /var/discourse/shared/standalone/postgres_data

Например, для моего тестового сайта результат будет таким:

# du -sh /var/discourse/shared/standalone/postgres_data
237M	/var/discourse/shared/standalone/postgres_data

(@mwaniki, пожалуйста, поправьте меня, если есть более лучший способ!)

4 лайка

Конечно, это вернет общий размер всех файлов данных PostgreSQL на диске (включая файлы WAL).

Если вас интересует только размер базы данных discourse, можно использовать функцию pg_database_size функция или мета-команду \list+ мета-команда.

docker exec -u postgres app psql -c "SELECT pg_size_pretty( pg_database_size('discourse') ) AS db_size;"

# или

docker exec -u postgres app psql -c "\list+ discourse"
6 лайков

Из любопытства, в чём преимущество использования одной из ваших форм vacuum analyze по сравнению с командой, предложенной PostgreSQL?

Просто ли в том, что генерировать эту статистику не нужно для чего-либо за пределами базы данных discourse? Если так, то будет ли analyze-in-stages преимуществом для очень больших инстансов, если использовать вместо этого:
/var/discourse/launcher run app "/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages"

Привет, @aas и @NKERIFAC_CLAUD_NBAPNON! :wave:

Мне не удалось воспроизвести ошибку при выполнении команды launcher rebuild для сайта, работающего на предыдущем базовом образе. Мои тесты завершились успешным обновлением, даже с установленным плагином discourse-ai.

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

Попробуйте выполнить те же шаги и сообщите нам о результатах.

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

Если это не поможет, пожалуйста, поделитесь дополнительными деталями о вашей среде. Особенно полезны будут следующие данные:

  • версия вашего текущего базового образа

    docker image inspect --format '{{ .Config.Image }}' local_discourse/app
    
  • установленные плагины Discourse

    cat containers/app.yml | \
    docker run --rm -i -a stdout -a stdin local_discourse/app \
    ruby -e "require 'yaml'; puts YAML.load(STDIN.readlines.join)['hooks']"
    
  • расширения PostgreSQL и их версии

    docker exec -u postgres app psql discourse -c "SELECT
      name,
      default_version,
      installed_version
    FROM
      pg_catalog.pg_available_extensions
    WHERE
      installed_version IS NOT NULL;"
    
3 лайка

Я заметил тревожную строку в postgres.template.yml:

Текущая логика приводит к немедленному завершению скрипта, если файл /shared/postgres_run/.s.PGSQL.5432 существует, независимо от того, запущен ли PostgreSQL. Это пропускает весь последующий код в /root/install_postgres, включая скрипт обновления. Я считаю, что первый exit 0 следует удалить.

1 лайк

Обновление не удалось и у меня. Ошибка, которую я вижу, похоже, указывает на проблему с локалью (что немного странно, так как локаль системы всегда была de_DE.UTF-8).

root@Ubuntu-2204-jammy-amd64-base /var/discourse # ./launcher rebuild app
x86_64 arch detected.
...
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
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (de_DE.UTF-8)
I, [2025-01-29T21:35:58.711630 #1]  INFO -- : Reading from stdin
I, [2025-01-29T21:35:58.721321 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
I, [2025-01-29T21:35:58.726551 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2025-01-29T21:35:58.732322 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.737436 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.742651 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.742825 #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-01-29T21:35:58.743394 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.743708 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744003 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744441 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744734 #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-01-29T21:35:58.745027 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.747582 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.748035 #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-01-29T21:35:58.748263 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748463 #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-01-29T21:35:58.748657 #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-01-29T21:35:58.748844 #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

/bin/bash: warning: setlocale: LC_ALL: cannot change locale (de_DE.UTF-8)
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
I, [2025-01-29T21:37:25.430685 #1]  INFO -- : Generating locales (this might take a while)...
  de_DE.UTF-8... done
  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 "de_DE.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "german".

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 https://dl.yarnpkg.com/debian stable InRelease [17,1 kB]
Get:5 http://deb.debian.org/debian-security bookworm-security InRelease [48,0 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 [280 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 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10,9 kB]
Get:11 https://dl.yarnpkg.com/debian stable/main all Packages [10,9 kB]
Get:12 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [243 kB]
Get:13 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5.274 B]
Get:14 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10,2 MB in 2s (6.159 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 17,3 MB of archives.
After this operation, 56,7 MB of additional disk space will be used.
Get:1 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.18-1.pgdg120+1 [1.523 kB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.18-1.pgdg120+1 [15,4 MB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 17,3 MB in 1s (32,1 MB/s)
Selecting previously unselected package postgresql-client-13.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../postgresql-client-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.18-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 postgresql-client-13 (13.18-1.pgdg120+1) ...
Setting up postgresql-13 (13.18-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 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

lc_collate values for database "template1" do not match:  old "en_US.UTF-8", new "de_DE.UTF-8"
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-15-update/349515 for support.

You can run ./launcher start app to restart your app in the meanwhile
-------------------------------------------------------------------------------------



FAILED
--------------------
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
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"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"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
80933ad1f9a6809c85383c9d512c34340988ab7791b3ff57a6a563fd42fc413f
1 лайк

Привет, @mwaniki! Обновление, которое вы отправили, у меня сработало отлично. Большое спасибо.

2 лайка

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

docker exec -it -u postgres app bash
env
psql -c 'SELECT
  datname,
  datcollate,
  datctype
FROM
  pg_database;'

Действительно. Спасибо, что обратили на это внимание! Я обновил процедуру в первом посте. :+1:

Рады это слышать! Спасибо за подтверждение.

4 лайка

4 сообщения были перенесены в новую тему: Проблемы с конфигурацией встраиваний Discourse AI

Ох, было бы здорово, если бы скрипт обновления содержал ссылку на это и запрос подтверждения Y/N. Теперь я обновился и не уверен, нужно ли мне восстанавливать мой сайт из-за этого изменения.

Редактирование: похоже, всё завершилось успешно :tada:

Мне удалось обновить один форум (на этом сервере их четыре), но при попытке обновить следующий возникла ошибка:

Caused by:
PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: Connection refused (PG::ConnectionBad)

Мне пришлось выполнить ./launcher start app, чтобы снова запустить приложение.

Кажется, я помню, что была проблема, описанная здесь: PostgreSQL 12 update. Тогда я, вероятно, выполнял ./launcher stop app для остальных приложений перед попыткой обновления, но на этот раз этот способ не сработал. (Посты в той теме были автоматически удалены. Не мог бы модератор проверить, действительно ли я делал именно это?)

Есть ли у кого-нибудь другие идеи?

1 лайк

Я попросил команду discourse-ai подключиться к обсуждению.

Да, это именно то, что вы написали. Мне нужно будет протестировать в похожей конфигурации и вернуться к вам с результатами.

3 лайка

Спасибо, Мваники, мне удалось это исправить — мне просто нужно было запустить приложение и выполнить sudo service postgresql stop перед обновлением rebuilds.

Спасибо за всю вашу помощь :heart:

1 лайк

Окружение, похоже, имеет ожидаемую локаль (вывод команды env ниже, настройки электронной почты скрыты):

LEFTHOOK=0
HOSTNAME=Ubuntu-2204-jammy-amd64-base-app
LANGUAGE=de_DE.UTF-8
UNICORN_WORKERS=8
DISCOURSE_HOSTNAME=[..]
RUBY_GC_HEAP_INIT_SLOTS=400000
DISCOURSE_SMTP_USER_NAME=[...]
DOCKER_HOST_IP=172.17.0.1
DISCOURSE_SMTP_ADDRESS=[...]
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5
RUBY_VERSION=3.3.6
PWD=/
DISCOURSE_DB_SOCKET=/var/run/postgresql
DISCOURSE_DEVELOPER_EMAILS=[...]
HOME=/var/lib/postgresql
LANG=de_DE.UTF-8
DISCOURSE_SMTP_PORT=587
RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000
DEBIAN_RELEASE=bookworm
DISCOURSE_SMTP_PASSWORD=[...]
DISCOURSE_NOTIFICATION_EMAIL=[...]
PG_MAJOR=13
DISCOURSE_DB_HOST=
TERM=xterm
RUBY_ALLOCATOR=/usr/lib/libjemalloc.so
SHLVL=1
DISCOURSE_DB_PORT=
DISCOURSE_SMTP_DOMAIN=[...]
UNICORN_SIDEKIQS=1
LC_ALL=de_DE.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RAILS_ENV=production
_=/usr/bin/env

Однако вывод запроса к Postgres указывает на локаль США:

  datname  | datcollate  |  datctype
-----------+-------------+-------------
 postgres  | en_US.UTF-8 | en_US.UTF-8
 template1 | en_US.UTF-8 | en_US.UTF-8
 template0 | en_US.UTF-8 | en_US.UTF-8
 discourse | en_US.UTF-8 | en_US.UTF-8
(4 строки)
1 лайк

Когда вы создали этот экземпляр Discourse?

На данный момент нам удаётся воспроизвести проблему только в случае, когда база данных создаётся в одной локали, а затем выполняется миграция с использованием другой локали. Нам бы хотелось узнать, когда был создан экземпляр, чтобы проверить, не было ли в то время каких-либо багов, связанных с локалью.

2 лайка

Насколько мне удалось отследить, первоначальная установка произошла 7 февраля 2024 года (думаю, сервер был введен в эксплуатацию на пару дней раньше, но ОС — Ubuntu 22.04, которая, как и Discourse, постоянно обновлялась).

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

1 лайк