Сборка не удалась из-за несоответствия версии Ruby

После нескольких дней использования
./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only без проблем
я столкнулся с ошибками при попытке использовать rails console для установки SiteSetting.can_permanently_delete = true
через ./launcher enter web_only, а затем rails c

Вопрос: Отличается ли доступ к rails console в режиме раздельных контейнеров?

После неудачных попыток успешного пересборки и запуска я откатил сервер на несколько дней назад до внедрения функций ИИ. Безрезультатно!
Метод запуска завершается ошибкой:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3' failed with return #<Process::Status: pid 465 exit 18>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"bundle_exec", "cmd"=>["su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'", "su discourse -c 'bundle clean'", "su discourse -c 'find /var/www/discourse/vendor/bundle -name cache -not -path \"*/gems/*\" -type d -exec rm -rf {} +'", "su discourse -c 'find /var/www/discourse/vendor/bundle -name tmp -type d -exec rm -rf {} +'"]}
bootstrap failed with exit code 18
** 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.
aee0f5c110bf8ce78f05c138a78712b4a0116fe6662c998b2f29800715036091

./launcher rebuild web_only также выдаёт ошибку:

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web_only (06b7b1f7f6b476adac20a11a55de776d7350e837407a6c7a6ba582c917f6dd73): Bind for 0.0.0.0:80

После обновления Docker Manager из админ-панели я получаю:

You are running an old version of the Discourse image
Updates via the web UI are disabled until you run the latest image. To do so log in to your server using SSH and run:

  cd /var/discourse
  ./launcher rebuild app

Вопрос: Есть ли у вас какие-то идеи, что происходит?

Вот ошибка, которая вызывает сбой сборки:

[2026-02-17T16:51:13.376629 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Your Ruby version is 3.3.8, but your Gemfile specified ~> 3.4

Вам нужно прокрутить страницу вверх, чтобы найти ошибку.

3 лайка

Да, я это делал, но ничего полезного так и не увидел.
Вот последний файл.
exitcode18.txt (43,5 КБ)

Вот ошибка:

[2026-02-17T16:51:13.376629 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Ваша версия Ruby — 3.3.8, но в файле Gemfile указано ~> 3.4

Не зафиксирован ли ваш Docker-образ Discourse на старой версии? Или это может быть ошибкой, но маловероятно, что такая ошибка прошла бы тестирование сборки.

Спасибо, Джей. Я видел это, но странные сообщения не так уж редки при успешных сборках.

Нет, следовал оригинальному посту, как указано.

@pfaffman Спасибо за перенос!

1 лайк

Можете получить /var/discourse? Пересборка должна быть выполнена с использованием базового образа 2.0.20260209-1300.

1 лайк

Спасибо, что подключились, @supermathie

Используется версия 2.0.20260209-1300
после чистой команды ./launcher rebuild web_only

Status: Downloaded newer image for discourse/base:2.0.20260209-1300
docker.io/discourse/base:2.0.20260209-1300
Ensuring launcher is up to date
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 web_only
web_only
2.0.20260209-1300: Pulling from discourse/base
Digest: sha256:50d2dae489a9c9916c3d50d880f7f1282fcbe179339b60a8947ab135c1f1f9bf
Status: Image is up to date for discourse/base:2.0.20260209-1300
docker.io/discourse/base:2.0.20260209-1300

конец сборки

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint web_only (9e391a36bdc1a80a6b993a466ffdba25337ce70f1fe74f2b5d8aaca75585322b): Bind for 0.0.0.0:80 failed: port is already allocated

failed to set up container networking.txt (74.3 KB)

Редактирование
Я думаю, что первопричина возникла при переходе на две контейнеры.

на вашем сервере порт 80 уже занят другим процессом, и его необходимо остановить

Но вы говорили, что всё работало, и вы уже делали несколько пересборок.

На сервере работает только Discourse.

Да, я делал и делаю :grinning_face:

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

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1310/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      1316/docker-proxy

Проверил два других экземпляра, запускающих отдельные контейнеры… сообщение, на которое указал @pfaffman

Тот же результат с командой ./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only

Already up to date
╭ Warning ─────────────────────────────────────────────────────────────────────╮
│                                                                              │
│   Игнорируемые скрипты сборки: @swc/core@1.15.7, core-js@2.6.12, core-js@3.47.0,   │
│   esbuild@0.25.12, esbuild@0.27.1, lefthook@2.1.0.                           │
│   Запустите "pnpm approve-builds", чтобы выбрать зависимости, которым разрешено │
│   выполнять скрипты.                                                            │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯
I, [2026-02-17T21:07:23.811289 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --jobs $(($(nproc) - 1)) --retry 3'
Ваша версия Ruby — 3.3.8, но в вашем файле Gemfile указано ~> 3.4

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

Если вам нужно обновить data, то сначала нужно остановить только web, затем пересобрать data, а затем web_only. Я обновил исходный пост.

Если вы получаете ошибки конфликта портов, то, скорее всего, это потому, что при перезапуске Docker сначала запустил старый контейнер приложения, и именно он захватывает порт. Вы можете проверить это с помощью команды:

docker ps

и посмотреть, запущен ли app. Вы надеетесь, что он запущен, так как это объяснит проблему с портом.

Вам, вероятно, нужно выполнить:

 docker stop app; docker rm app
3 лайка

Tallyho! Спасибо, @pfaffman

root@discuss:~# docker ps
CONTAINER ID   IMAGE                  COMMAND        CREATED       STATUS       PORTS                                                                          NAMES
f6dbb52ff74c   local_discourse/data   "/sbin/boot"   10 days ago   Up 3 hours                                                                                  data
674e5e3fe5d8   local_discourse/app    "/sbin/boot"   10 days ago   Up 3 hours   0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp   app

Выполнение
docker stop app; docker rm app
затем
./launcher bootstrap web_only && ./launcher destroy web_only && ./launcher start web_only
теперь работает отлично

Меня очень интересует «удержание» (hold) для app и то, почему предыдущие пересборки проходили без проблем. Очень странно.

Вам просто повезло, или, что более вероятно, Docker не перезапускался, и это произошло по какой-то причине (обновление или перезагрузка машины).

Ошибка версии Ruby для меня остаётся загадкой.

1 лайк

Загадки могут быть веселыми или…

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

1 лайк

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.