Не удалось собрать контейнер импорта phpBB на новом Discourse

Я установил совершенно новый Discourse. Всё работает. Я могу создать начальную учётную запись, получать электронную почту, входить в систему и т. д.

Мне нужно импортировать форум phpBB3. Я планирую использовать утилиту импорта для заполнения своего Discourse историческими данными, поэтому следовал инструкциям по адресу Migrate a phpBB3 forum to Discourse

Я выполнил команду копирования:

cp containers/app.yml containers/import.yml

и отредактировал файл, добавив строку с шаблоном. Мой сайт использует LetsEncrypt для TLS-сертификата, поэтому строки шаблонов SSL и LetsEncrypt раскомментированы — это немного отличается от примера, показанного в инструкциях. В любом случае, я пробовал и с закомментированными, и с раскомментированными строками, так что, думаю, они не являются причиной проблемы.

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

94:M 23 Jul 2024 20:14:40.761 * Сохранение финального снимка RDB перед выходом.
94:M 23 Jul 2024 20:14:40.855 * База данных сохранена на диск
94:M 23 Jul 2024 20:14:40.857 # Redis готов к выходу, пока...
2024-07-23 20:14:41.235 UTC [32] LOG: система баз данных остановлена


ОШИБКА
--------------------
Errno::ENOENT: Нет такого файла или каталога @ rb_sysopen - /etc/service/unicorn/run
Место ошибки: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
Замена не удалась с параметрами {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
Загрузка не удалась с кодом выхода 1
** НЕ УДАЛОСЬ ЗАГРУЗИТЬСЯ ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть больше одной.
./discourse-doctor может помочь диагностировать проблему.
6f1a0b5cd0cfc8ed542938b7439aeff0a21a0135c58617fa5a05e68fd6fcc70d

Я не уверен, как решить эту проблему. Я устанавливал несколько раз в разных местах. Из того, что я прочитал, этот шаг пересборки (который не является самим импортом данных) должен просто выполниться. Возможно, это проблема с последней версией Discourse? Несколько месяцев назад я успешно выполнил импорт от начала до конца в качестве теста.

Да.

Вам нужно поделиться или лучше понять вывод.

Чтобы создать общую точку отсчета, я переустановил свой VPS (Ubuntu 22.04), выполнил apt update && apt upgrade, а затем приступил к стандартному процессу установки Discourse.

Если эта информация имеет значение, то во время первого запуска ./discourse-setup я допустил ошибку при вводе данных, поэтому нажал Control-C и запустил ./discourse-setup повторно. При повторном запуске ./discourse-setup загружается новый образ discourse/base, как показано ниже…

root@discourse:/var/discourse# ./discourse-setup 
Файл конфигурации containers/app.yml уже существует!

. . . перенастройка . . .


Сохранение старого файла как app.yml.2024-07-29-151604.bak
Остановка существующего контейнера через 5 секунд или нажмите Control-C для отмены.
Обнаружена архитектура x86_64.

ПРЕДУПРЕЖДЕНИЕ: Мы собираемся начать загрузку базового образа Discourse
Этот процесс может занять от нескольких минут до часа в зависимости от скорости вашей сети

Пожалуйста, будьте терпеливы

2.0.20240708-0023: Получение из discourse/base
76956b537f14: Получено полностью 
c5ffad89ad3c: Получено полностью 
71c31a50a587: Получено полностью 
c1a1234dcb61: Получено полностью 
9980a27afc32: Получено полностью 
4f4fb700ef54: Получено полностью 
304b565c70c9: Получено полностью 
8ad811162d08: Получено полностью 
2c324dce526d: Получено полностью 
52d141c2b1c8: Получено полностью 
4c08fdcd145a: Получено полностью 
1b6035ac25c0: Получено полностью 
9208d0f90623: Получено полностью 
513dccf6f63f: Получено полностью 
e0b141854963: Получено полностью 
4476d7dd9441: Получено полностью 
0fad77941078: Получено полностью 
46c34476ea19: Получено полностью 
ff0b86516349: Получено полностью 
c33170d09c8b: Получено полностью 
ed4a793ffe51: Получено полностью 
3a7b2554e089: Получено полностью 
3ad8a6408839: Получено полностью 
e7c58bcc7f57: Получено полностью 
59b2407fe431: Получено полностью 
315160f4d4f8: Получено полностью 
ad328ba96976: Получено полностью 
825dca2e642e: Получено полностью 
9fbd8c908047: Получено полностью 
b1d30330e969: Получено полностью 
8c76c65bb8e8: Получено полностью 
9279965667b5: Получено полностью 
a0ae3eb4d088: Получено полностью 
819fb509ef8b: Получено полностью 
c962935d47d4: Получено полностью 
63b444b5bd1e: Получено полностью 
7efa1c09faf6: Получено полностью 
46c4327ce462: Получено полностью 
b095ebe7bdf6: Получено полностью 
3aa16a533cab: Получено полностью 
41419e4f1948: Получено полностью 
589837814d9a: Получено полностью 
bd025ad1b844: Получено полностью 
24762ff7528f: Получено полностью 
fe364253c657: Получено полностью 
Digest: sha256:025e9c1f6848c4726544c6ae873d710c62f547b72afb7f537aaa44eb5377cb5c
Status: Скачан новый образ для discourse/base:2.0.20240708-0023
docker.io/discourse/base:2.0.20240708-0023
app не был запущен !
./discourse-doctor может помочь диагностировать проблему.

Обнаружено 3 ГБ памяти и 2 физических ядра CPU
установка db_shared_buffers = 768МБ
установка UNICORN_WORKERS = 4
параметры памяти containers/app.yml обновлены.

Установка Discourse продолжилась и завершилась успешно. Я смог создать начальную учетную запись и войти в систему.

I, [2024-07-29T15:42:21.624379 #1]  INFO -- : Замена location @discourse { на location @discourse {
add_header Strict-Transport-Security 'max-age=31536000'; # запомнить сертификат на год и автоматически подключаться к HTTPS для этого домена в /etc/nginx/conf.d/discourse.conf
I, [2024-07-29T15:42:21.627858 #1]  INFO -- : > echo "Начало пользовательских команд"
I, [2024-07-29T15:42:21.634022 #1]  INFO -- : Начало пользовательских команд

I, [2024-07-29T15:42:21.637436 #1]  INFO -- : > echo "Конец пользовательских команд"
I, [2024-07-29T15:42:21.642766 #1]  INFO -- : Конец пользовательских команд

I, [2024-07-29T15:42:21.648034 #1]  INFO -- : Завершение асинхронных процессов
I, [2024-07-29T15:42:21.649479 #1]  INFO -- : Отправка INT для HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 57
2024-07-29 15:42:21.651 UTC [57] LOG:  получен запрос быстрого завершения
I, [2024-07-29T15:42:21.652067 #1]  INFO -- : Отправка TERM для exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 120
120:signal-handler (1722267741) Получен SIGTERM, планирование завершения...
2024-07-29 15:42:21.658 UTC [57] LOG:  прерывание любых активных транзакций
120:M 29 Jul 2024 15:42:21.667 # Пользователь запросил завершение...
120:M 29 Jul 2024 15:42:21.668 * Сохранение финального снимка RDB перед выходом.
2024-07-29 15:42:21.682 UTC [57] LOG:  фоновый рабочий "запускатель логической репликации" (PID 72) завершился с кодом выхода 1
120:M 29 Jul 2024 15:42:21.682 * БД сохранена на диск
120:M 29 Jul 2024 15:42:21.683 # Redis теперь готов к выходу, пока...
2024-07-29 15:42:21.685 UTC [67] LOG:  завершение работы
2024-07-29 15:42:21.806 UTC [57] LOG:  система баз данных завершена
sha256:6a6d6a8ea3559ad031a84fd48a164686e9440d7e857cb39619c2baba84a4b966
2b8eddd7b72415507d10cc404c40459c19c7ad3e025cb7bb69bcddb3c98b0197

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_FORCE_HTTPS=true -e LC_ALL=en_US.UTF-8 -e LANGUAGE=en_US.UTF-8 -e DISCOURSE_HOSTNAME=discourse3.greenbullfrog.com -e DISCOURSE_DEVELOPER_EMAILS=discourse-admin@greenbullfrog.com -e DISCOURSE_SMTP_ADDRESS=box.greenbullfrog.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=discourse@greenbullfrog.com -e DISCOURSE_SMTP_PASSWORD=lAtDyjbyqztzhrG -e DISCOURSE_SMTP_DOMAIN=discourse3.greenbullfrog.com -e DISCOURSE_NOTIFICATION_EMAIL=noreply@discourse3.greenbullfrog.com -e LETSENCRYPT_ACCOUNT_EMAIL=letsencrypt@greenbullfrog.com -h discourse-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:f9:8c:dd:3d:63 local_discourse/app /sbin/boot
a78541042858ed6a4dd739bb7c8243a50a4064f595fdf968c22c8b63afb68979
root@discourse:/var/discourse# 

Далее я начал процесс, описанный по адресу Migrate a phpBB3 forum to Discourse .

Вот начало моего файла import.yml…

root@discourse:/var/discourse# head -23 containers/import.yml 
## это шаблон контейнера Discourse Docker all-in-one, standalone
##
## После внесения изменений в этот файл вы ДОЛЖНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
## посетите http://www.yamllint.com/, чтобы проверить этот файл при необходимости

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Раскомментируйте следующую строку, чтобы включить слушатель IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/import/phpbb3.template.yml"

## какие TCP/IP порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
root@discourse:/var/discourse# 

Проблема возникает при выполнении команды /var/discourse/launcher rebuild import. Из-за большого объема невозможно опубликовать лог этой команды. Однако вы можете загрузить его по следующей ссылке NextCloud…

https://box.greenbullfrog.com/cloud/index.php/s/tAFNPJqBaJ3qA6r

@gerhard, это всё ещё может быть в твоей зоне ответственности.

Я думаю, что проблема в том, что шаблон phpbb3 удаляет /etc/service/unicorn, а затем веб-шаблон пытается изменить этот файл.

Самый простой вариант — удалить эти строки из web.template.yml:

  - replace:
      tag: precompile
      filename: /etc/service/unicorn/run
      from: PRECOMPILE_ON_BOOT=1
      to: "PRECOMPILE_ON_BOOT=0"

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

git checkout templates/web.template.yml

прежде чем запускать повторную сборку.

Спасибо за эти инструкции, @pfaffman.

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

Я разместил данные phpBB3 в правильных местах для локального импорта и выполнил команду для начала процесса. Импорт сейчас идет, но для его завершения потребуется некоторое время. Я отвечу завтра с результатами.

Импорт успешно завершён, и, похоже, большая часть данных была перенесена. У некоторых учётных записей пользователей phpBB, по-видимому, есть адреса электронной почты, которые вызывают проблемы в Discourse. Думаю, дело может быть в лишнем пробеле в конце. Я попробую исправить это перед повторным запуском всей процедуры.

Спасибо за помощь. Я предполагаю, что будет выпущено исправление для утилиты импорта, которая в противном случае не сможет работать с текущей версией Discourse. Я подозреваю, что многие люди не обладают необходимыми техническими навыками, чтобы разобраться в проблеме, и просто сдадутся при столкновении с ошибкой. Это приведёт к уменьшению числа сообществ Discourse и потере исторических обсуждений из-за заброшенных или удалённых сайтов на phpBB.