Проблемы с обновлением/пересборкой до Beta7

Привет,

Я пытаюсь обновить нашу DEV-инстансию до последней Beta 7, начиная с Beta 2.
Она работает на ветке по умолчанию tests-passed.

Моя проблема заключается в том, что пересборка контейнера завершается ошибкой подключения (предположительно) к GitHub:

I, [2025-07-28T12:35:19.480463 #1]  INFO -- : Заменяем # postgres на if [ -f /root/install_postgres ]; then
  /root/install_postgres
  rm /root/install_postgres
fi
sv start postgres || exit 1
 в /etc/service/unicorn/run
I, [2025-07-28T12:35:19.480838 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse git clean -f
I, [2025-07-28T12:35:19.511065 #1]  INFO -- : 
I, [2025-07-28T12:35:19.511112 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  if [ $(git rev-parse --is-shallow-repository) == "true" ]; then
      git remote set-branches --add origin main
      git remote set-branches origin tests-passed
      git fetch --depth 1 origin tests-passed
  else
      git fetch --tags --prune-tags --prune --force origin
  fi
'
error: RPC failed; curl 56 Recv failure: Connection reset by peer
error: 44 bytes of body are still expected
fatal: expected flush after ref listing
I, [2025-07-28T12:37:22.158398 #1]  INFO -- : 
I, [2025-07-28T12:37:22.158628 #1]  INFO -- : Завершение асинхронных процессов

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

Длинный вывод stdout
I, [2025-07-28T12:19:42.269421 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  if [ $(git rev-parse --is-shallow-repository) == "true" ]; then
      git remote set-branches --add origin main
      git remote set-branches origin tests-passed
      git fetch --depth 1 origin tests-passed
  else
      git fetch --tags --prune-tags --prune --force origin
  fi
'
From https://github.com/discourse/discourse
 - [deleted]             (none)     -> origin/dependabot/bundler/nokogiri-1.18.9
 - [deleted]             (none)     -> origin/dependabot/bundler/playwright-ruby-client-1.54.0
 - [deleted]             (none)     -> origin/dependabot/bundler/propshaft-1.2.0
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/babel-plugin-ember-template-compilation-3.0.0
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/glob-11.0.3
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/playwright-1.54.1
 - [deleted]             (none)     -> origin/dev/decorate-quote-collapsed-content-properly
 - [deleted]             (none)     -> origin/dev/extract-invite-guardian
 - [deleted]             (none)     -> origin/dev/mt/discourse-category-custom-fields
 - [deleted]             (none)     -> origin/dev/mt/discourse-group-users
 - [deleted]             (none)     -> origin/dev/mt/discourse-groups
 - [deleted]             (none)     -> origin/dev/mt/discourse-muted-users
 - [deleted]             (none)     -> origin/dev/mt/requires-set
 - [deleted]             (none)     -> origin/dev/no-more-widgets
 - [deleted]             (none)     -> origin/dev/use-themeable-site-settings-horizon
 - [deleted]             (none)     -> origin/enable-new-topic-btn-on-restricted-category
 - [deleted]             (none)     -> origin/feature-admin-filter-controls
 - [deleted]             (none)     -> origin/feature/enable-rich-editor-for-all
 - [deleted]             (none)     -> origin/filtermagic
 - [deleted]             (none)     -> origin/fix/mt/log-failed-downloads
 - [deleted]             (none)     -> origin/fix/translated-badge-title
 - [deleted]             (none)     -> origin/layout-container-dev
 - [deleted]             (none)     -> origin/loic-upgrade-rails-8.0
 - [deleted]             (none)     -> origin/media-convert-job
 - [deleted]             (none)     -> origin/merge-sso-destination-url-cookie-with-destination-url-cookie
 - [deleted]             (none)     -> origin/mt/set_store
 - [deleted]             (none)     -> origin/pento/dev-flag-reason-tests
 - [deleted]             (none)     -> origin/playwright-1.53
 - [deleted]             (none)     -> origin/refactor-color-palette
 - [deleted]             (none)     -> origin/remove-suspended-and-deleted-users-from-leaderboard
 - [deleted]             (none)     -> origin/rollup-theme-experiment
 - [deleted]             (none)     -> origin/ux-editor-toolbar-mobile-scroll
 - [deleted]             (none)     -> origin/ux/sidebar-show-messages-count
   43ddd4ef3..ea5b5b6c0  main                    -> origin/main
 * [new branch]          0-a-depr-html-safe      -> origin/0-a-depr-html-safe
 * [new branch]          0-a-tabs                -> origin/0-a-tabs
 * [new branch]          add-composer-mention-warnings -> origin/add-composer-mention-warnings
   187f13d67..8d4a86f25  add-plugin-outlet-wrapper-to-login-template -> origin/add-plugin-outlet-wrapper-to-login-template
 * [new branch]          ai_default_llm          -> origin/ai_default_llm
 * [new branch]          content-border-color    -> origin/content-border-color
 + 51077ac74...088f149a6 dependabot/bundler/excon-1.2.8 -> origin/dependabot/bundler/excon-1.2.8  (forced update)
 + 36699b311...e3f5c2d0d dependabot/bundler/jwt-3.1.2 -> origin/dependabot/bundler/jwt-3.1.2  (forced update)
 * [new branch]          dependabot/bundler/octokit-10.0.0 -> origin/dependabot/bundler/octokit-10.0.0
 * [new branch]          dependabot/bundler/stripe-15.3.0 -> origin/dependabot/bundler/stripe-15.3.0
 + def825f3f...b5a5f3924 dependabot/bundler/web-push-3.0.2 -> origin/dependabot/bundler/web-push-3.0.2  (forced update)
 * [new branch]          dependabot/bundler/zendesk_api-3.1.1 -> origin/dependabot/bundler/zendesk_api-3.1.1
 + f4d832ec8...5aa0145f3 dependabot/npm_and_yarn/embroider-0ad991d471 -> origin/dependabot/npm_and_yarn/embroider-0ad991d471  (forced update)
 * [new branch]          dependabot/npm_and_yarn/fortawesome/fontawesome-free-7.0.0 -> origin/dependabot/npm_and_yarn/fortawesome/fontawesome-free-7.0.0
 * [new branch]          dependabot/npm_and_yarn/jspreadsheet-ce-5.0.3 -> origin/dependabot/npm_and_yarn/jspreadsheet-ce-5.0.3
 * [new branch]          dependabot/npm_and_yarn/lint-fda1ac657e -> origin/dependabot/npm_and_yarn/lint-fda1ac657e
 + e46dc3798...d3420e3eb dependabot/npm_and_yarn/prosemirror-f8434604ae -> origin/dependabot/npm_and_yarn/prosemirror-f8434604ae  (forced update)
 * [new branch]          dependabot/npm_and_yarn/puppeteer-core-24.15.0 -> origin/dependabot/npm_and_yarn/puppeteer-core-24.15.0
 + 4bcbc028d...03b9759db dev-floatkit-autocomplete-d-editor -> origin/dev-floatkit-autocomplete-d-editor  (forced update)
 + ea5bba76a...03b9759db dev-floatkit-autocomplete-d-editor-qa -> origin/dev-floatkit-autocomplete-d-editor-qa  (forced update)
 * [new branch]          dev/decorate-cooked-state -> origin/dev/decorate-cooked-state
   56e6c9ae1..11c480f88  dev/no-more-widgets-smoke-test -> origin/dev/no-more-widgets-smoke-test
 * [new branch]          dev/post-keep-detail-state -> origin/dev/post-keep-detail-state
 * [new branch]          dev/prevent-rerenderings -> origin/dev/prevent-rerenderings
 * [new branch]          dev/remove-redundant-staff-check-6 -> origin/dev/remove-redundant-staff-check-6
   1f3bbee91..00dfb95b1  dev/try-fix-flakys-tss  -> origin/dev/try-fix-flakys-tss
 * [new branch]          dual-mode-palettes-wip  -> origin/dual-mode-palettes-wip
 * [new branch]          feature/color-mode-preference -> origin/feature/color-mode-preference
 * [new branch]          feature/type-upload-in-type-objects -> origin/feature/type-upload-in-type-objects
 * [new branch]          feature/use-current-user-tz-instead-of-guess-local-dates -> origin/feature/use-current-user-tz-instead-of-guess-local-dates
 * [new branch]          filter-tips-dmenu-martinwip -> origin/filter-tips-dmenu-martinwip
 * [new branch]          filter-updates          -> origin/filter-updates
 * [new branch]          fix-color-palette-dark  -> origin/fix-color-palette-dark
 * [new branch]          fix/missing-user-custom-preferences-outlet-class-in-connector -> origin/fix/missing-user-custom-preferences-outlet-class-in-connector
 * [new branch]          improve_no_database_error_patch -> origin/improve_no_database_error_patch
 * [new branch]          improve_pg_adapter_new_client_error -> origin/improve_pg_adapter_new_client_error
 * [new branch]          loic-pitchfork          -> origin/loic-pitchfork
 * [new branch]          messages-dropdown-d-menu -> origin/messages-dropdown-d-menu
 * [new branch]          my-pref-lang            -> origin/my-pref-lang
 * [new branch]          notification-panel-refactor -> origin/notification-panel-refactor
 * [new branch]          pinned-dmenu            -> origin/pinned-dmenu
 * [new branch]          rollup-plugin-experiment -> origin/rollup-plugin-experiment
 * [new branch]          rollup-theme-experiment-cross-theme-import -> origin/rollup-theme-experiment-cross-theme-import
 * [new branch]          samsaffron/codex/convert-filter-tips-to-use-dmenu -> origin/samsaffron/codex/convert-filter-tips-to-use-dmenu
   8cb90072e..710d9fd41  sandbox/design-1        -> origin/sandbox/design-1
   1f97cf422..aa2fb29fa  sandbox/dev-xp-1        -> origin/sandbox/dev-xp-1
   817a743cb..3428acddc  sandbox/member-xp-1     -> origin/sandbox/member-xp-1
 + d182efe6f...a0aba00c7 sandbox/member-xp-2     -> origin/sandbox/member-xp-2  (forced update)
 * [new branch]          source-identify-modulepreload -> origin/source-identify-modulepreload
 + 9aa6daa1f...c56258634 split-login-admin-settings -> origin/split-login-admin-settings  (forced update)
   a83bd0f67..41e1152f6  stable                  -> origin/stable
 + 293de3a75...e31549885 temp-user-creation-debug-logging -> origin/temp-user-creation-debug-logging  (forced update)
   43ddd4ef3..ea5b5b6c0  tests-passed            -> origin/tests-passed
 * [new branch]          theme-upload-cleanup    -> origin/theme-upload-cleanup
 * [new branch]          translations-from-crowdin-main -> origin/translations-from-crowdin-main
 + 9f8fd9214...c3562ed3a translations-from-crowdin-stable -> origin/translations-from-crowdin-stable  (forced update)
 + 4ffab7134...e211b4a55 unicode-mentions-in-composer-rte -> origin/unicode-mentions-in-composer-rte  (forced update)
 * [new branch]          ux-footer-button-squish -> origin/ux-footer-button-squish
 * [new branch]          ux-horizon-discotoc     -> origin/ux-horizon-discotoc
 * [new branch]          ux-unify-appearance-filters -> origin/ux-unify-appearance-filters
   b0c2d83ec..045aefecb  ux/horizon-mobile-composer -> origin/ux/horizon-mobile-composer
 * [new branch]          ux/sidebar-my-messages-enhancements -> origin/ux/sidebar-my-messages-enhancements
 + 28d11bbd0...6f7d9e816 variable-additions-2    -> origin/variable-additions-2  (forced update)
   39d2564ba..57dcfda6a  vite-squashed-rebased   -> origin/vite-squashed-rebased
I, [2025-07-28T12:19:43.174876 #1]  INFO -- : 
I, [2025-07-28T12:19:43.174943 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse bash -c '
  set -o errexit
  if [[ $(git symbolic-ref --short HEAD) == tests-passed ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout tests-passed
  fi
'
error: RPC failed; curl 56 Recv failure: Connection reset by peer
error: 5470 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
fatal: could not fetch bff89c0762e874ec88d553d89901dbda4fa89f20 from promisor remote
I, [2025-07-28T12:23:50.121438 #1]  INFO -- : 

Пока идет попытка получить данные с GitHub, в htop на хосте я не вижу абсолютно никакой активности.

Детали хоста: ВМ Proxmox под управлением Debian 11, 4 ядра, 12 ГБ памяти. Во время пересборки свободной памяти достаточно, так что проблема, скорее всего, не в памяти.
Сервер размещен в Германии, поэтому ничего не должно блокировать доступ к GitHub.
Я выяснил, что сообщения

fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

указывают на таймаут, например, когда соединение слишком медленное. Проверка скорости соединения показывает около 890 Мбит/с на загрузку и выгрузку. Хранилище полностью на NVMe, поэтому я не вижу причин для таймаута на этом этапе.

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

Почти забыл добавить: при переходе в панель администратора я вижу сообщение о том, что я не нахожусь на последней версии, но нажатие на Click here to update приводит к ошибке:

Server-Error
while loading /admin/docker/repos
Errorcode: 502 error

Там тоже видны ошибки таймаута:

activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:128:in `block in wait_poll' 
<internal:kernel>:187:in `loop'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:117:in `wait_poll' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:78:in `internal_poll' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:204:in `internal_poll' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:73:in `block in poll' 
/usr/local/lib/ruby/3.3.0/monitor.rb:201:in `synchronize'
/usr/local/lib/ruby/3.3.0/monitor.rb:201:in `mon_synchronize'
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:82:in `synchronize' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb:73:in `poll' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:868:in `acquire_connection' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:564:in `checkout' 
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:421:in `with_connection' 
activerecord-7.2.2.1/lib/active_record/connection_handling.rb:296:in `with_connection' 
activerecord-7.2.2.1/lib/active_record/transactions.rb:410:in `with_transaction_returning_status' 
activerecord-7.2.2.1/lib/active_record/transactions.rb:366:in `save!' 
activerecord-7.2.2.1/lib/active_record/suppressor.rb:56:in `save!' 
activerecord-7.2.2.1/lib/active_record/persistence.rb:55:in `create!' 
mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:128:in `process_queue' 
mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:77:in `worker_loop' 
mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads' 

и

excon-1.2.5/lib/excon/socket.rb:386:in `select_with_timeout' 
excon-1.2.5/lib/excon/socket.rb:258:in `rescue in read_nonblock' 
excon-1.2.5/lib/excon/socket.rb:228:in `read_nonblock' 
excon-1.2.5/lib/excon/socket.rb:89:in `block in readline' 
<internal:kernel>:187:in `loop'
excon-1.2.5/lib/excon/socket.rb:78:in `readline' 
excon-1.2.5/lib/excon/response.rb:73:in `block in parse' 
<internal:kernel>:187:in `loop'
excon-1.2.5/lib/excon/response.rb:72:in `parse' 
excon-1.2.5/lib/excon/middlewares/response_parser.rb:7:in `response_call' 
excon-1.2.5/lib/excon/connection.rb:472:in `response' 
excon-1.2.5/lib/excon/connection.rb:297:in `request' 
/var/www/discourse/lib/discourse_updates.rb:136:in `new_features_payload' 
/var/www/discourse/app/jobs/scheduled/check_new_features.rb:24:in `execute' 
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform' 
rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/app/jobs/base.rb:303:in `block in perform' 
/var/www/discourse/app/jobs/base.rb:299:in `each' 
/var/www/discourse/app/jobs/base.rb:299:in `perform' 
/var/www/discourse/app/jobs/base.rb:379:in `perform' 
mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:137:in `process_queue' 
mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:77:in `worker_loop' 
mini_scheduler-0.18.0/lib/mini_scheduler/manager.rb:63:in `block (2 levels) in ensure_worker_threads' 

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

Я также пробовал увеличить git http.postBuffer, теперь процесс зависает чуть дольше перед тем, как завершиться ошибкой.

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

Спасибо!

Много ли плагинов указано в вашем файле app.yml? Возможно, стоит закомментировать их все и проверить, работает ли всё. Если да, то можно постепенно раскомментировать их по одному.

Редактирование: обязательно сделайте безопасную копию файла yml заранее! И как всегда, создайте резервную копию и скачайте её перед началом обновления.

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

В данный момент активны только следующие:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-translator.git
          - git clone https://github.com/discourse/onebox.git

Я закомментировал их, но процесс всё равно завис на том же месте.

Кроме того, это всего лишь DEV-инстанс, так что не переживайте насчёт данных. Если всё пойдёт наперекосяк, я просто восстановлю дамп с продакшн-сервера, чтобы запустить систему снова. Но наша Production-система работает на той же версии, так что, полагаю, я столкнусь с теми же проблемами и там.

Похоже на проблему провайдера или, возможно, на проблему ядра. Но я не знаком с установкой для разработчиков.

Он размещен на Hetzner в Германии, в ядре также нет ничего особенного — это стандартный Debian 11 с ядром 5.10.237-1.

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

Ах, понятно. Если речь идет об обычном контейнере и возникают проблемы с подключением, то, думаю, это не проблема Discourse.

Ваше ядро очень старое. Я использую Ubuntu 24.04 с ядром 6.8.0-53.

Ядро было собрано в мае 2025 года и является актуальным для Debian 11, которая всё ещё полностью поддерживается. 2 месяца — это совсем не «очень давно».

Однако, чтобы исключить эту причину, я обновил систему до Debian 12 и самого последнего основного ядра 6.10 (опять же, это не старое, это самое актуальное ядро Debian 12 без использования dev/nightly/preview сборок), и проблема осталась точно такой же.

На хосте всё работает, проблем с подключением к GitHub или другим сайтам нет, даже полное обновление системы прошло за 5 минут без каких-либо сбоев. Единственное, что не работает на этой системе, — это Discourse, хотя до этого обновления он работал без проблем уже несколько лет.

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

Это очень странно. Молодец, что проверил ядро — были несовместимости версий ядра, но, очевидно, это не тот случай.

Вы можете получить командную строку внутри контейнера и, возможно, попробовать выполнить некоторые сетевые операции (wget или curl), но я не уверен, что это может доказать.

На данный момент у меня нет других идей, извините.

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

Поэтому такие изменения, как git config http.postBuffer 524288000, скорее всего, не повлияют на пересборку, если их внести на хост-системе.
То же самое касается настроек сжатия или ограничений памяти для Git.

Я проверю, смогу ли я настроить новую среду на похожем хосте, или же проблема повторится с той же версией.

Возможно, вы можете добавить спецификации команд в файл app.yml — см.

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

Она должна запускаться именно в момент начала (пере)сборки. Я ожидал, что эти хуки сработают после извлечения/сборки сайта в /var/www/discourse, но для меня этот процесс не завершается.

У меня больше нет идей, что делать…

Редактирование: Я попытался провести диагностику изнутри запущенного контейнера, и там тоже обнаружилась проблема. Попытка клонировать репозиторий discourse docker также завершается неудачей:

root@community-app:/tmp# git clone https://github.com/discourse/discourse_docker.git 
Cloning into 'discourse_docker'...
remote: Enumerating objects: 7235, done.
remote: Counting objects: 100% (234/234), done.
remote: Compressing objects: 100% (104/104), done.
error: RPC failed; curl 56 Recv failure: Connection reset by peer
error: 1355 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

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

Я немного проверю сетевые настройки Docker, возможно, там я найду причину проблемы.

Ох, наконец-то я разобрался. Проблема действительно была в Docker и хостовой сети, а не в Discourse.

Hetzner, если вы используете vSwitch с публичным подсетью, требует установки MTU на 1400 вместо 1500. Я менял это значение какое-то время назад, но, похоже, изменение где-то откатилось. Пришлось сделать это снова и перезапустить Docker с правильным MTU.

Теперь сайт обновлений внутри Discourse тоже работает.

Забавно, что всё остальное работало всё это время.