Помощь в развертывании старых версий Discourse

Здесь, вероятно, ошибка: я попытался вытянуть тег v3.6.0.beta2, но получил следующую ошибку:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  git fetch --tags --prune-tags --prune --force origin
  if [[ $(git symbolic-ref --short HEAD) == v3.6.0.beta2 ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout v3.6.0.beta2
  fi
' failed with return #<Process::Status: pid 146 exit 128>
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'
exec failed with the params {"cd" => "$home", "hook" => "code", "cmd" => ["sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  git fetch --tags --prune-tags --prune --force origin\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128
** 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.
adc8ef45e9ae880827c9294dbbf73dfe9ab413a050c83fe3f4722c2911876ce2

Параметр version поддерживает только ветки, а не теги!

Правильно будет так:

params:
  version: release/2025.11

Корень проблемы в том, что команда git symbolic-ref --short HEAD возвращает только имя ветки. Если нужно поддерживать теги или хеши, её следует заменить на:

git describe --exact-match --tags 2>/dev/null || git rev-parse --short HEAD

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

Что касается того, почему я пытался вытянуть именно release/2025.11: в текущей продакшн-среде используется версия, близкая к этой, и я планировал обновление. Однако я опасался возможных проблем, а процедура согласования не позволяет мне напрямую выполнять обновление на продакшене. Сначала необходимо протестировать процесс обновления в тестовой среде (release/2025.11 => release/2026.1) и убедиться, что всё работает корректно, и только после этого можно обновлять продакшен. Хотя это немного утомительно, это действительно наиболее правильный подход в рамках установленных процедур. Поэтому мне пришлось искать способ вытянуть конкретную ветку или тег.

Извините за многословие. К счастью, я нашёл вполне приемлемое решение. Спасибо всем.

Я продолжаю обновлять информацию о других последствиях этого исправления:

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

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

# Если вы ранее вносили изменения в локальную кодовую базу, сначала сохраните их
# git stash

# Обновите до последней версии
git pull

# Восстановите сохранённые изменения или заново отредактируйте соответствующие конфигурационные файлы
# git stash pop

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

Речь идёт о локальной кодовой базе по адресу: https://github.com/discourse/discourse_docker.git

То есть о стандартной кодовой базе после установки.

Наконец, подведём итог.

Наша задача: установить конкретную версию.

  1. Обновите локальную репозиторий https://github.com/discourse/discourse_docker.git
# Перейдите в корневую директорию проекта
cd /var/discourse
# Обновите до последней версии
git pull
  1. Укажите требуемую версию

Отредактируйте файл containers/app.yml и добавьте в конец следующую конфигурацию:

params:
  version: release/2026.1 # В качестве лучшего подхода следует указывать: esr
  1. Пересоберите контейнер
./launcher rebuild app

Если указано version: esr, дальнейшее чтение не требуется.

Сначала выполните git pull, чтобы убедиться, что локальная репозиторий актуальна. Затем укажите ветку для развёртывания и выполните пересборку. Эта инструкция применима в сценарии перехода с release/2026.1 на release/2026.7.

Если же ваша цель — просто обновить уже установленную версию release/2026.1, достаточно нажать кнопку «Обновить» в административной панели. Это применимо, когда для release/2026.1 доступны обновления (особенно исправления уязвимостей).

Думаю, настраивать конкретную версию, а не «флейвор», поток или тег (например, latest или stable), было бы крайне необычно. На самом деле я больше не уверен, какие теги являются стандартными, доступными и полезными в этой системе.

Вы смотрели на Configure a supported tracking branch to get Discourse software updates? Возможно, это поможет понять, какие теги полезны.

Да, для обычных пользователей достаточно использовать версию по умолчанию latest. Однако в моём случае приходится разбираться, как работать с конкретной версией. Я же не могу сказать boss: «О, к сожалению, Discourse пока не поддерживает выбор конкретной версии, мы можем обновиться только до последней».

Этот пост очень полезен, я внимательно его изучу. Спасибо.

Я не видел этого — спасибо. Похоже, нам следует использовать теперь ветку latest/release/esr. Я вижу, что в моём собственном (старом) файле app.yml значение по умолчанию выбирается благодаря тому, что оно закомментировано:

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

В настоящее время version не поддерживает теги. Для добавления этой поддержки необходимо изменить скрипт сборки. Изначально лучшим решением было бы:

params:
  version: esr

Однако сейчас приходится использовать:

params:
  version: release/2026.1

Интересно. Даже до внедрения новой стратегии версионирования beta уже довольно долгое время была тегом, а не веткой: Upcoming changes to the beta branch of Discourse

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

version: release/2026.1 должно работать корректно. Если вы хотите воспользоваться новыми периодами перекрывающейся поддержки версий, то это правильный способ. (но, разумеется, вы должны помнить о необходимости ручного обновления до того, как версия 2026.1 достигнет конца срока поддержки)

version: esr также должно работать. Система спроектирована для поддержки тегов. Это реализовано как git checkout $version.

Вы не должны вносить это изменение в web.template.yml. Вы должны внести его в ваш специфичный для сайта файл containers/app.yml

Что-то здесь не так. Я запускал v3.5.0 beta3 с yml, установленным на version: tests-passed.

Затем я заметил это изменение в версии, поэтому перед пересборкой изменил yml на version: esr и выполнил пересборку из CLI.

Теперь в Discourse я вижу:

Установлено
2026.3.0-latest.1

Кажется, что используется тег tests passed вместо тега esr. Я проверил, что в app.yml версия указана как esr, так почему же берётся последняя сборка?

Так что, по сути, больше нет способа получить последнюю стабильную сборку или версию ESR?

Можете поделиться соответствующими строками файла app.yml? Убедитесь, что version: точно отступом находится под секцией params:? И точно ли вы удалили символ комментария YAML # в начале строки?

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

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

Замечаете ли вы здесь что-то не так?

Я считаю, что version должен быть отступлен, так как он является частью params.

Да, изначально я настраивал это напрямую в containers/app.yml, но не знаю почему, это не сработало, и в отчаянии я напрямую изменил templates/web.template.yml. Я снова попробую внести изменения в containers/app.yml.

Кроме того, посмотрите, пожалуйста, почему конфигурация version: esr не работает. Это частный случай в моей среде или у всех так? У меня действительно плохое интернет-соединение.

Конфигурация:

params:
  version: v3.6.0.beta2

Ошибка:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  git fetch --tags --prune-tags --prune --force origin
  if [[ $(git symbolic-ref --short HEAD) == v3.6.0.beta2 ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout v3.6.0.beta2
  fi
' failed with return #<Process::Status: pid 146 exit 128>
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'
exec failed with the params {"cd" => "$home", "hook" => "code", "cmd" => ["sudo -H -E -u discourse git clean -f", "sudo -H -E -u discourse bash -c '\n  set -o errexit\n  git fetch --tags --prune-tags --prune --force origin\n  if [[ $(git symbolic-ref --short HEAD) == $version ]] ; then\n      git pull\n  else\n      git -c advice.detachedHead=false checkout $version\n  fi\n'", "sudo -H -E -u discourse git config user.discourse-version $version", "mkdir -p tmp", "chown discourse:www-data tmp", "mkdir -p tmp/pids", "mkdir -p tmp/sockets", "touch tmp/.gitkeep", "mkdir -p                    /shared/log/rails", "bash -c \"touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log\"", "bash -c \"ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log $home/log\"", "bash -c \"mkdir -p           /shared/{uploads,backups}\"", "bash -c \"ln    -s           /shared/{uploads,backups} $home/public\"", "bash -c \"mkdir -p           /shared/tmp/{backups,restores}\"", "bash -c \"ln    -s           /shared/tmp/{backups,restores} $home/tmp\"", "chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp", "[ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete"]}
bootstrap failed with exit code 128
** 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.
adc8ef45e9ae880827c9294dbbf73dfe9ab413a050c83fe3f4722c2911876ce2

Корень проблемы в том, что команда git symbolic-ref --short HEAD возвращает только имя ветки.