Контейнеры-образцы, прошедшие бета-тестирование, не запускаются

Прежде чем мы начнем это путешествие, обратите внимание: хотя об этой ошибке уже упоминалось на этом форуме дважды (один раз и второй раз), решение «пересобрать контейнер данных» не сработало. Я работаю с полностью пустыми данными, удаляя все контейнеры, тома и папки хранения между попытками.

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


У меня возникли проблемы с запуском пустых контейнеров для последних веток tests-passed и beta. Ветка Stable работает как ожидалось. Ошибка возникает как в режиме standalone, так и в режиме web-only (после запуска data, разумеется).

Чтобы исключить ошибки конфигурации, я выполнил следующие шаги:

  • Скопировал файл samples/standalone.yml в папку containers/.
  • Изменил в файле только следующее:
    • Заменен адрес SMTP на какое-то тестовое значение.
    • Заменен адрес Discourse на какое-то тестовое значение.
    • Изменено расположение общих данных.
    • Удален порт 443 и изменено сопоставление порта 80. Вот результат standalone.yml.
    • Запустил ./launcher rebuild standalone. Вот полные логи rebuilding_standalone.txt.

И я получаю следующую ошибку:

RubyZip 3.0 в пути!
**********************

Публичный API некоторых классов RubyZip был модернизирован для использования именованных
параметров для необязательных аргументов. Пожалуйста, проверьте использование следующих классов:
  * `Zip::File`
  * `Zip::Entry`
  * `Zip::InputStream`
  * `Zip::OutputStream`

Пожалуйста, убедитесь, что ваши Gemfile и .gemspecs достаточно ограничительны,
чтобы избежать неожиданных сбоев при выпуске версии 3.0 (например, ~> 2.3.0).
Подробности на https://github.com/rubyzip/rubyzip. В Changelog также
перечислены другие улучшения и исправления ошибок, реализованные с момента
выпуска версии 2.3.0.

I, [2022-07-24T01:58:05.415957 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake plugin:pull_compatible_all'
bundler: failed to load command: rake (/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake)
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:308:in `check_for_activated_spec!': Вы уже активировали uri 0.10.0, но ваш Gemfile требует uri 0.11.0. Поскольку uri является стандартным gem, вы можете либо удалить зависимость от него, либо попробовать обновиться до более новой версии bundler, которая поддерживает uri как стандартный gem. (Gem::LoadError)
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:25:in `block in setup'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/spec_set.rb:140:in `each'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/spec_set.rb:140:in `each'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:24:in `map'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:24:in `setup'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler.rb:162:in `setup'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/setup.rb:20:in `block in <top (required)>'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/ui/shell.rb:136:in `with_level'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/ui/shell.rb:88:in `silence'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/setup.rb:20:in `<top (required)>'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli/exec.rb:56:in `require_relative'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli/exec.rb:56:in `kernel_load'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli/exec.rb:23:in `run'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli.rb:483:in `exec'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli.rb:31:in `dispatch'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli.rb:25:in `start'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/exe/bundle:48:in `block in <top (required)>'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/exe/bundle:36:in `<top (required)>'
	from /usr/local/bin/bundle:23:in `load'
	from /usr/local/bin/bundle:23:in `<main>'
I, [2022-07-24T01:58:05.702191 #1]  INFO -- : 
I, [2022-07-24T01:58:05.702665 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
bundler: failed to load command: rake (/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/rake)
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:308:in `check_for_activated_spec!': Вы уже активировали uri 0.10.0, но ваш Gemfile требует uri 0.11.0. Поскольку uri является стандартным gem, вы можете либо удалить зависимость от него, либо попробовать обновиться до более новой версии bundler, которая поддерживает uri как стандартный gem. (Gem::LoadError)
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:25:in `block in setup'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/spec_set.rb:140:in `each'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/spec_set.rb:140:in `each'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:24:in `map'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/runtime.rb:24:in `setup'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler.rb:162:in `setup'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/setup.rb:20:in `block in <top (required)>'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/ui/shell.rb:136:in `with_level'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/ui/shell.rb:88:in `silence'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/setup.rb:20:in `<top (required)>'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli/exec.rb:56:in `require_relative'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli/exec.rb:56:in `kernel_load'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli/exec.rb:23:in `run'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli.rb:483:in `exec'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli.rb:31:in `dispatch'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/cli.rb:25:in `start'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/exe/bundle:48:in `block in <top (required)>'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
	from /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.3.18/exe/bundle:36:in `<top (required)>'
	from /usr/local/bin/bundle:23:in `load'
	from /usr/local/bin/bundle:23:in `<main>'
I, [2022-07-24T01:58:05.953429 #1]  INFO -- : 

Я также попробовал подход с двумя контейнерами: data и web_only. У web_only та же проблема.

Между каждой попыткой я останавливаю и удаляю все контейнеры, а также удаляю все папки с данными.

Ветка Stable работает нормально. Я не думаю, что это ожидаемое поведение.


Для контекста: сейчас я оказался в довольно тяжёлой ситуации.

Мне нужно срочно перенести установку Discourse с текущего сервера на новый, так как текущий сервер будет отключён через несколько дней.

Текущий сервер работает на версии 2.9.0.beta7. Я могу запустить новый сервер на версии 2.8.6, но не могу восстановить резервную копию с текущего сервера на новый, поскольку это понижение версии. Кроме того, я не могу запустить новый пустой сервер на версии 2.9.0.beta7, так как это приводит к ошибке, описанной выше.

Папка с данными на текущем сервере слишком велика: у меня недостаточно места на диске, чтобы сжать её и скопировать куда-либо. Даже если бы это удалось, я предполагаю, что использование данных из более новой бета-версии на старой версии приведёт к проблемам. Я также пытался «понизить» версию текущего сервера, на всякий случай, но, как я знаю, это не поддерживается, и в любом случае не сработало.

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

Я не хочу откатываться к старой версии. Однако я не могу запустить новый сервер на 2.9.0.beta7 из-за ошибки, которую я указал в этом сообщении. Запустить новый сервер удаётся только на версии 2.8.6. Я пробовал несколько разных конфигураций на основе примеров и собственных файлов, но ни beta, ни tests-passed не запускаются. Не уверен, что эта информация недостаточно ясно изложена в первом сообщении, файле контейнеров или лог-файлах.

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

На данный момент старый сервер работает на версии 2.9.0.beta7. Поэтому мне либо нужен новый сервер, способный запуститься на последней версии (что пока не работает), либо способ перенести данные на новый сервер версии 2.8.6, которая единственная у меня запускается.

Извините, теперь понимаю. Значит, нужно сосредоточиться на этой ошибке?

В идеале — да. Получение нового сервера с последней версией было бы для меня самым простым и лёгким решением.

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

Кроме того, если это поможет, вот информация о Docker на сервере:

# docker info
Client:
 Context:    default
 Debug Mode: false

Server:
 Containers: 2
  Running: 0
  Paused: 0
  Stopped: 2
 Images: 5
 Server Version: 20.10.12
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: nvidia runc io.containerd.runc.v2 io.containerd.runtime.v1.linux
 Default Runtime: runc
 Init Binary: docker-init
 containerd version:
 runc version:
 init version:
 Security Options:
  apparmor
  seccomp
   Profile: default
  cgroupns
 Kernel Version: 5.15.0-41-generic
 Operating System: Ubuntu 22.04 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 5.797GiB
 Name: maji
 ID: OIRP:TYAE:HIPS:SIF3:NZRF:22QI:GO5A:64A4:OP2O:ALVA:PPLN:4TOH
 Docker Root Dir: /data/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

Я запускаю launcher от имени root. Ранее я запускал различные контейнеры Docker на машинах с такой же конфигурацией, и у меня не возникало никаких проблем.

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

/opt/discourse# ls -la
total 140
drwxr-xr-x 14 root root  4096 Jul 24 01:26 .
drwxr-xr-x  7 root root  4096 Jul 15 07:23 ..
drwxr-xr-x  8 root root  4096 Jul 24 02:30 .git
drwxr-xr-x  3 root root  4096 Jul 15 07:23 .github
-rw-r--r--  1 root root   309 Jul 15 07:23 .gitignore
-rw-r--r--  1 root root  1099 Jul 15 07:23 LICENSE
-rw-r--r--  1 root root  8285 Jul 15 07:23 README.md
drwxr-xr-x  2 root root  4096 Jul 15 07:23 bin
drwxr-xr-x  2 root root  4096 Jul 24 02:34 cids
drwxr-xr-x  2 root root  4096 Jul 24 02:30 containers
-rwxr-xr-x  1 root root 11956 Jul 15 07:23 discourse-doctor
-rwxr-xr-x  1 root root 27053 Jul 15 07:23 discourse-setup
drwxr-xr-x  8 root root  4096 Jul 15 07:23 image
-rwxr-xr-x  1 root root 22547 Jul 15 07:23 launcher
drwxr-xr-x  2 root root  4096 Jul 24 01:39 samples
drwxr-xr-x  2 root root  4096 Jul 15 07:23 scripts
drwxr-xr-x  2 root root  4096 Jul 15 07:23 shared
drwxr-xr-x  3 root root  4096 Jul 15 07:23 templates
drwxr-xr-x  2 root root  4096 Jul 15 07:23 tests
/opt/discourse# ls -la containers/
total 16
drwxr-xr-x  2 root root 4096 Jul 24 02:30 .
drwxr-xr-x 14 root root 4096 Jul 24 01:26 ..
-rw-r--r--  1 root root    0 Jul 15 07:23 .gitkeep
-rw-r--r--  1 root root 1258 Jul 24 02:08 data.yml
-rw-r--r--  1 root root 3542 Jul 24 02:30 web.yml
/opt/discourse# cd /data/discourse/
/data/discourse# ls -la
total 16
drwxr-xr-x 4 root root 4096 Jul 24 02:06 .
drwxr-xr-x 5 root root 4096 Jul 23 11:58 ..
drwxr-xr-x 6 root root 4096 Jul 24 02:09 data
drwxr-xr-x 7 root root 4096 Jul 24 02:34 web

Попробуйте скопировать следующие строки ниже строки с bundle install (примерно строка 160)

  - exec:
      cd: $home
      cmd:
        - su discourse -c 'gem update uri'

Я попытался добавить это в блок run ниже exec: echo "Beginning of custom commands", но, похоже, это было слишком поздно.

Поэтому я добавил это в hooks: -> after_code:

Вот что получилось:

I, [2022-07-24T12:13:24.641982 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'gem update uri'
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/local/lib/ruby/gems/2.7.0 directory.
I, [2022-07-24T12:13:29.392041 #1]  INFO -- : Updating installed gems
Updating uri

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'gem update uri' failed with return #<Process::Status: pid 132 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "cmd"=>["su discourse -c 'gem update uri'"]}

Я удалил su discourse на всякий случай. Это, кажется, помогло продвинуться дальше, но я столкнулся с другой ошибкой:

I, [2022-07-24T12:21:17.497935 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile'
sh: 1: yarn: not found
I, [2022-07-24T12:21:19.397390 #1]  INFO -- :


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' failed with return #<Process::Status: pid 5373 exit 127>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'

Я подумал, что тогда нужно вручную установить yarn? Я удалил все плагины, включая docker_manager, на всякий случай. Система всё равно требовала yarn, поэтому я решил его установить:

I, [2022-07-24T12:37:42.295754 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake plugin:pull_compatible_all'
WARNING: Plugins were activated before running `rake plugin:pull_compatible_all`
  You should prefix this command with LOAD_PLUGINS=0
I, [2022-07-24T12:37:44.807237 #1]  INFO -- :
I, [2022-07-24T12:37:44.807548 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
I, [2022-07-24T12:37:48.578845 #1]  INFO -- :
I, [2022-07-24T12:37:48.579098 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile'
error Command "ember" not found.
I, [2022-07-24T12:37:50.795001 #1]  INFO -- : yarn run v1.22.19
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.



FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' failed with return #<Process::Status: pid 5409 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}

Теперь система жалуется на ember. Даже после попытки установить его вручную.

Вот как сейчас выглядит мой after_code:

hooks:
  after_code:
    - exec:
        cd: $home
        cmd:
          - gem update uri
          - npm install -g yarn
          - npm install -g ember
        #- exec:
        # cd: $home/plugins
        #cmd:
            #- git clone https://github.com/discourse/docker_manager.git

Не уверен, что это правильный путь.

Хорошая новость в том, что эта команда, похоже, сейчас выполняется.

Я заметил отсутствие LOAD_PLUGINS раньше, но не упомянул об этом. Вы убрали его? В оригинальном шаблоне он есть. Если вы изменили шаблон, не помешает проверить, не было ли ещё чего-то, что вы изменили. Или, возможно, у вас старая версия. Вы сделали git pull перед тем, как пересобрать приложение?

Я не трогал это. Я не могу найти его ни в файле web_only.yml, ни в файле standalone.yml. Я его не добавлял, но это, полагаю, просто предупреждение?

Ошибка, с которой я столкнулся, связана с ember, а не с плагинами.


Честно говоря, я делал git pull бесчисленное множество раз, но всё было стабильно, и новые коммиты не подтягивались.

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

Я знаю это, но отсутствие LOAD_PLUGINS=0 было для меня признаком того, что вы используете старую версию репозитория.

Было бы неплохо, если бы в начале лаунчера была строка лога, указывающая на то, что я запускаю ветку legacy. Это сэкономило бы много усилий.

Я не знаю, подразумевается ли в лаунчере автоматическое переключение ветки git, но в моём случае этого точно не произошло.