Застрял и потерялся при обновлении форума, проблемы с миграцией PG

Привет, пишу сюда, так как перепробовал всё и застрял на этапе обновления.

  • Я обновлял форум после нескольких месяцев простоя. Как обычно, сделал резервную копию и скачал её.
  • Оказалось, что в процессе этого обновления требуется миграция с PostgreSQL 13 на 15.
    Всё шло без проблем, пока обновление не прервалось из-за нехватки места на диске.
  • Зашел на свой Droplet от DigitalOcean, остановил его, расширил диск и снова запустил.
  • Выполнил несколько стандартных команд для освобождения места на диске (удаление старых логов, ./launcher cleanup и т.д.).

Затем я запустил пересборку, но уперся в первую проблему:

root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
WARNING: Docker version 20.10.1 deprecated, recommend upgrade to 24.0.7 or newer.
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
Launcher is up-to-date
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-06-11T08:57:06.040908 #1]  INFO -- : Reading from stdin
I, [2025-06-11T08:57:06.055466 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
I, [2025-06-11T08:57:06.059785 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2025-06-11T08:57:06.064063 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2025-06-11T08:57:06.068330 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown:
I, [2025-06-11T08:57:06.072788 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
I, [2025-06-11T08:57:06.073111 #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-06-11T08:57:06.074045 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-06-11T08:57:06.074682 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-06-11T08:57:06.075269 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-06-11T08:57:06.080274 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-06-11T08:57:06.081190 #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-06-11T08:57:06.081687 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-06-11T08:57:06.082397 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-06-11T08:57:06.083025 #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-06-11T08:57:06.083657 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-06-11T08:57:06.083968 #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-06-11T08:57:06.084391 #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-06-11T08:57:06.084877 #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-06-11T08:57:07.265267 #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-06-11T08:57:07.265539 #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-06-11T08:57:07.267705 #1]  INFO -- : Terminating async processes
2025-06-11 08:57:07.283 UTC [50] FATAL:  database files are incompatible with server
2025-06-11 08:57:07.283 UTC [50] DETAIL:  The data directory was initialized by PostgreSQL version 13, which is not compatible with this version 15.12 (Debian 15.12-1.pgdg120+1).

Поискав в Google и немного пообщавшись с ChatGPT, чтобы разобраться в логах, я решил вернуться к PostgreSQL 13 и сосредоточиться на восстановлении форума, отредактировав шаблон в YAML-файле, чтобы принудительно использовать «templates/postgres.13.template.yml».

И тут я уперся во вторую проблему:


root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
WARNING: Docker version 20.10.1 deprecated, recommend upgrade to 24.0.7 or newer.
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
Launcher is up-to-date
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-06-11T09:07:40.418731 #1]  INFO -- : Reading from stdin
I, [2025-06-11T09:07:40.428644 #1]  INFO -- : > DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
E: Problem executing scripts DPkg::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Sub-process returned an error code
I, [2025-06-11T09:07:41.892381 #1]  INFO -- : Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  libcommon-sense-perl libio-pty-perl libipc-run-perl libjson-perl
  libjson-xs-perl libllvm19 libtypes-serialiser-perl libz3-4
  postgresql-client-common postgresql-common postgresql-common-dev ssl-cert
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  postgresql-15* postgresql-15-pgvector* postgresql-client-15*
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
After this operation, 60.9 MB disk space will be freed.
(Reading database ... 33951 files and directories currently installed.)
Removing postgresql-15-pgvector (0.8.0-1.pgdg120+1) ...
Removing postgresql-15 (15.12-1.pgdg120+1) ...
invoke-rc.d: could not determine current runlevel
update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/15/man/man1/psql.1.gz because link group psql.1.gz is broken
Removing postgresql-client-15 (15.12-1.pgdg120+1) ...
Processing triggers for postgresql-common (274.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
(Reading database ... 31913 files and directories currently installed.)
Purging configuration files for postgresql-15 (15.12-1.pgdg120+1) ...
Dropping cluster main...



FAILED
--------------------
Pups::ExecError: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector failed with return #<Process::Status: pid 7 exit 100>
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 "DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector"
bootstrap failed with exit code 100
** 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.
59b3543b15880ef0391688f71c9cb827ef791dbc37f1e4f896d9d7a31841c83b

Теперь я застрял и не знаю, как действовать дальше. Любые рекомендации будут очень кстати, это огромный форум, и у меня есть всего несколько часов, чтобы снова запустить его, иначе меня уволят :frowning:

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

Хэш коммита до обновления был v3.3.0.beta6 +294. Я пытаюсь пересобрать его через YML, но при запуске сборки всё ещё появляется следующее сообщение:

root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
WARNING: Docker version 20.10.1 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.20250226-0128: Pulling from discourse/base
af302e5c37e9: Pull complete
ed49ab5c933d: Pull complete
4d13d450f300: Pull complete
a67afd5cca97: Pull complete
d22a5b6769a6: Pull complete
83c133b53b22: Pull complete
fec147508f0c: Pull complete
21850d8b3ba1: Pull complete
02e250b6bcc4: Pull complete
71ba5ea7da00: Pull complete
ddcfbf6d2647: Pull complete
9c3e54d34536: Pull complete
29ce98d2d62d: Pull complete
4c9694455fd5: Pull complete
58a8ebcc6563: Pull complete
9c8966f1f999: Pull complete
b3dde96c4217: Pull complete
f934de9e2e8d: Pull complete
834e25f513a1: Pull complete
85d3cf606a95: Pull complete
94331a6982ee: Pull complete
14936beb0e9f: Pull complete
3ef05b122d47: Pull complete
6c2dff13a1e7: Pull complete
7682543ad38b: Pull complete
f16f8d5c5a04: Pull complete
06d7037d56ef: Pull complete
bc6c17ae1969: Pull complete
d19f089ead0e: Pull complete
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Downloaded newer image for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
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
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-06-11T09:54:52.350929 #1]  INFO -- : Reading from stdin
I, [2025-06-11T09:54:52.357807 #1]  INFO -- : > DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
E: Problem executing scripts DPkg::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Sub-process returned an error code
I, [2025-06-11T09:54:53.837808 #1]  INFO -- : Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  libcommon-sense-perl libio-pty-perl libipc-run-perl libjson-perl
  libjson-xs-perl libllvm19 libtypes-serialiser-perl libz3-4
  postgresql-client-common postgresql-common postgresql-common-dev ssl-cert
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  postgresql-15* postgresql-15-pgvector* postgresql-client-15*
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
After this operation, 60.9 MB disk space will be freed.
(Reading database ... 33951 files and directories currently installed.)
Removing postgresql-15-pgvector (0.8.0-1.pgdg120+1) ...
Removing postgresql-15 (15.12-1.pgdg120+1) ...
invoke-rc.d: could not determine current runlevel
update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/15/man/man1/psql.1.gz because link group psql.1.gz is broken
Removing postgresql-client-15 (15.12-1.pgdg120+1) ...
Processing triggers for postgresql-common (274.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
(Reading database ... 31913 files and directories currently installed.)
Purging configuration files for postgresql-15 (15.12-1.pgdg120+1) ...
Dropping cluster main...



FAILED
--------------------
Pups::ExecError: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector failed with return #<Process::Status: pid 7 exit 100>
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 "DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector"
bootstrap failed with exit code 100
** 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.
a609309cf458b146e5650d21103bf084e9bf66843e46e627827f50b6f8c03376

Если вы сделали резервную копию, как и обещали, проще всего создать новый Droplet, следуя инструкции Перенос сайта Discourse на другой VPS с помощью rsync (но не копируя файлы базы данных), а затем восстановить вашу резервную копию.

Привет!

Привет, Джей! Большое спасибо за ответ. Я только что начал это делать, дроплет сейчас настраивается.

Вопрос: я скачал файл резервной копии до начала обновления, это файл: forumname-2025-06-11-060249-v20240807024301.tar.gz (4,6 ГБ в сжатом виде) Версия форума v3.3.0.beta6 +294 с PG13.

Я планировал инициализировать новый дроплет, принудительно указав эту версию в app.yml, например:

## это шаблон контейнера Docker Discourse "всё в одном", автономный
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /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"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум в 25% от общего объема памяти.
  ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, или вы можете переопределить
  db_shared_buffers: "1024MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  version: v3.3.0.beta6

А затем, когда новый форум будет запущен и работать, импортировать резервную копию оттуда.

Имеет ли это смысл? Или я упускаю какой-то важный параметр или шаг?

Всё.

См. также Восстановление резервной копии из командной строки

Спасибо еще раз, Джей, за ответ. Я очень ценю ваше время, которое вы уделили, помогая мне справиться с этим кошмаром.

Я пытаюсь сделать это именно так (принудительно указывая версию в YML), но, похоже, discourse_docker пока недоволен этим изменением:

FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 2788 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 {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"before-server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"discourse\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
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.
d511b0ec31ac912c99c682611c35bbb446dde1488e1762aa07ccd24690c63164



2/2


Перед обновлением я сделал скриншот текущей версии на всякий случай. Есть ли способ принудительно установить discourse_docker на совместимую старую версию?

Я уже искал в Google и здесь, на meta, но пока ничего не нашел о том, как это сделать.

Не делайте этого.

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

Понял, сейчас попробую.

Однако, быстрый вопрос: если резервная копия создана из старой версии Discourse, которая использовала PG13, возникнут ли у меня проблемы при импорте этой резервной копии в последнюю версию Discourse с PG15?

Извини, @pfaffman, я написал предыдущее сообщение, думая, что проблема решена, но потом всё обернулось неожиданным образом.

После долгого процесса импорта я увидел, что форум снова в сети: все посты и прочее отображаются.

В терминале лог был следующим:

[...]

-- execute("DELETE FROM site_settings WHERE name='warn_reviving_old_topic_age'")
   -> 0.0002s
== 20250609115711 RemoveComposerTipsSiteSettings: migrated (0.0012s) ==========

Переподключение к базе данных...
Перезагрузка настроек сайта...
Отключение исходящей почты для пользователей, не являющихся сотрудниками...
Отключение режима только для чтения...
Очистка кэша категорий...
Перезагрузка переводов...
Переназначение загрузок...
Восстановление загрузок, это может занять некоторое время...
Миграция загрузок в S3 для 'default'...
Загрузка файлов в S3...
 - Список локальных файлов
 => 5 файлов
 - Список файлов в S3
............................................................................................................................................................................ => 171490 файлов
 - Синхронизация файлов с S3
.....
Обновление URL в базе данных...

Я наблюдал за этим некоторое время и думал, что проблема лишь в моём подключении терминала. Однако через несколько минут процесс снова завершился с ошибкой:

490 файлов
 - Синхронизация файлов с S3
.....
Обновление URL в базе данных...
Удаление старых оптимизированных изображений...
Пометка всех постов, содержащих лайтбоксы, для пересборки...
76198 постов помечены для пересборки
ИСКЛЮЧЕНИЕ: 903 поста не переназначены на новый URL загрузки S3. Миграция S3 не удалась для базы данных 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:354:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
script/discourse:191:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/command.rb:28:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor.rb:538:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/base.rb:584:in `start'
script/discourse:345:in `<top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Попытка отката...
Откат...
Очистка временных данных...
Удаление функций из схемы discourse_functions...
Удаление временной директории '/var/www/discourse/tmp/restores/default/2025-06-11-121115'...
Возобновление работы Sidekiq...
Пометка восстановления как завершённого...
Уведомление 'system' об окончании восстановления...
Готово!
[FAILED]
Восстановление завершено.

Внезапно форум, который был «восстановлен» и отображался в сети, потерял все посты: остались лишь пара тем.

Поскольку в логе указано: «76198 постов помечены для пересборки», я подумал, что сейчас они просто должны быть пересобраны, поэтому зашёл в Sidekiq, но там ничего не ожидало обработки :frowning:

Обновление:

Зашел в консоль Rails, и, apparently, всего 10 постов, а не все те, что должны были быть импортированы :thinking:

/var/www/discourse# rails c
Загрузка производственной среды (Rails 7.2.2.1)
discourse(prod)> Post.count
=> 10
discourse(prod)> Post.where(“baked_version IS NULL”).count
=> 0

Вздох. Вы используете то же имя хоста? (Возможно, да?)

Вот в чём ваша проблема сейчас.

Вы настроили S3 в базе данных или в файле yml? Думаю, в базе данных. Проще всего было бы восстановить только базу данных, но это сложно объяснить (извлечь SQL-файл и переименовать его так же, как tar.gz-файл).

Вы можете попробовать следующее:

discourse restore --pause <backup_filename>

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

См. Issues with restoring backup to discourse - #16 by gerhard

Другой вариант — установить DISCOURSE_USE_S3 в false в вашем файле app.yml. Возможно, потребуется также изменить другие настройки S3, например, те, которые указывают на использование загрузок S3 и/или бакетов S3.

Да, но теперь, когда вы об этом упомянули.

  • Форуму уже 10 лет.
  • Я настраивал S3 какое-то время, но затем удалил его, поэтому посты с изображениями из S3 довольно старые.

Есть ли способ их идентифицировать и игнорировать/удалять, чтобы импорт прошел без проблем?

Еще один шаг — установить DISCOURSE_USE_S3 в false в вашем app.yml. Возможно, вам также потребуется настроить другие параметры S3, такие как те, что касаются использования загрузок через S3 и/или бакетов S3.

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

Если вам действительно всё равно, вы можете использовать метод паузы: когда процесс приостановится, откройте другой терминал, перейдите в Rails и выполните что-то вроде:

bad=Upload.where("url like '%the-s3-url%'")
bad.destroy_all

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

Вы должны были сказать мне с самого начала! Я бы с радостью заплатил изначально! Хе-хе.

Теперь всё работает.

После того как я перепробовал кучу всего, я в итоге сделал кое-что контринтуитивное, но это сработало:

  • Правильно настроил S3 на новом экземпляре (через панель администратора).
  • Запустил импорт с флагом –pause thing, но на втором шаге просто остановил процесс. Я ожидал, что форум перестанет работать или возникнут проблемы с изображениями, но он работает, и старые изображения загружаются без проблем.

Я всё ещё тестирую вещи, возможно, позже что-то сломается, но пока, после 12 часов отладки, я считаю это победой.

Это не совсем верно. См. Настройка провайдера объектного хранилища, совместимого с S3, для загрузки файлов. Вам нужны все эти настройки в ваших файлах yml.