Проблемы при обновлении старой версии 2.8.5

Как оказалось, мы не обновляли Discourse уже очень давно. У нас сейчас версия v2.8.5. Недавно я обнаружил, что Discourse уже давно перешагнул версию 3.
Я хотел бы обновиться до актуальной версии, но пока мне достаточно обновиться до последней версии 2.8.x — 2.8.14.
И вот тут возникает огромная проблема. При пересборке Discourse обновляет базовый образ, и я получаю эту ошибку:

FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 300 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"before-server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"discourse\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
---
HINT: The plugin 'discourse-openid-connect' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-openid-connect' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-data-explorer' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-data-explorer' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-staff-notes' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-staff-notes' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-assign' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-assign' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-solved' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-solved' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
---
HINT: The plugin 'discourse-cakeday' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-cakeday' from your containers/app.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---
** 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.

С плагинами всё понятно — их нужно закомментировать в app.yaml. Но это не помогает: ошибки плагинов исчезают, а ошибка:

The "discourse" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version

остаётся.

И я ничего не могу с этим поделать. Есть ли способ обновить мой форум до версии 2.8.14?

Если нет, то как в будущем можно обновиться с версии 2.8.5 до версии 3.x.x? Ситуация усложняется тем, что я использую внешнюю базу данных PostgreSQL. Насколько я понимаю, из-за функций ИИ в новом Discourse требуется векторная база данных PgVector. Нужно ли мне как-то мигрировать? Есть ли руководство о том, как сделать это правильно и безболезненно?

Я был бы очень признателен за вашу помощь!

Попробуйте обновить Docker, это поможет?

─# docker version
Клиент: Docker Engine - Community
 Версия:           28.1.1
 Версия API:       1.49
 Версия Go:        go1.23.8
 Коммит Git:        4eba377
 Скомпилирован:             Fri Apr 18 09:52:18 2025
 ОС/Архитектура:           linux/amd64
 Контекст:           default

Сервер: Docker Engine - Community
 Движок:
  Версия:          28.1.1
  Версия API:      1.49 (минимальная версия 1.24)
  Версия Go:       go1.23.8
  Коммит Git:       01f442b
  Скомпилирован:            Fri Apr 18 09:52:18 2025
  ОС/Архитектура:          linux/amd64
  Экспериментальный:     false
 containerd:
  Версия:          1.7.27
  Коммит Git:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Версия:          1.2.5
  Коммит Git:        v1.2.5-0-g59923ef
 docker-init:
  Версия:          0.19.0
  Коммит Git:        de40ad0
└─# lsb_release -a
Модули LSB недоступны.
Идентификатор дистрибутива:	Ubuntu
Описание:	Ubuntu 20.04.6 LTS
Релиз:	20.04
Кодовое имя:	focal

Я удалил все плагины из app.yaml. Это не помогло:

FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 156 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"before-server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"discourse\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
** 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.

Ошибка: не найдена Nginx-точка подключения “before-server”. Эта версия discourse_docker несовместима с выбранной версией Discourse.

Попробуйте проверить совместимость версий или обновить discourse_docker до версии, поддерживающей текущую конфигурацию.

Пожалуйста, отправьте файл app.yml без паролей.

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

Не могли бы вы предоставить предыдущий контекст из логов? Возможно, фактическая ошибка произошла там.

This is full log:

└─# ./launcher rebuild app
x86_64 arch detected.
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20251003-1437: Pulling from discourse/base
Digest: sha256:0db7c9b4598e2a1806658391669d791fd779aa4301fdfbed6a7f322bf64e66ab
Status: Image is up to date for discourse/base:2.0.20251003-1437
docker.io/discourse/base:2.0.20251003-1437
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-11-20T12:57:18.105575 #1]  INFO -- : Reading from stdin
I, [2025-11-20T12:57:18.116863 #1]  INFO -- : File > /etc/service/redis/run  chmod: +x  chown:
I, [2025-11-20T12:57:18.120584 #1]  INFO -- : File > /etc/service/redis/log/run  chmod: +x  chown:
I, [2025-11-20T12:57:18.124261 #1]  INFO -- : File > /etc/runit/3.d/10-redis  chmod: +x  chown:
I, [2025-11-20T12:57:18.124872 #1]  INFO -- : Replacing daemonize yes with  in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.126958 #1]  INFO -- : Replacing (?-mix:^pidfile.*$) with  in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.127984 #1]  INFO -- : > install -d -m 0755 -o redis -g redis /shared/redis_data
I, [2025-11-20T12:57:18.131369 #1]  INFO -- :
I, [2025-11-20T12:57:18.131807 #1]  INFO -- : Replacing (?-mix:^logfile.*$) with logfile "" in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.132422 #1]  INFO -- : Replacing (?-mix:^bind .*$) with  in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.134285 #1]  INFO -- : Replacing (?-mix:^dir .*$) with dir /shared/redis_data in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.135071 #1]  INFO -- : Replacing (?-mix:^protected-mode yes) with protected-mode no in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.135730 #1]  INFO -- : Replacing # io-threads 4 with io-threads $redis_io_threads in /etc/redis/redis.conf
I, [2025-11-20T12:57:18.136429 #1]  INFO -- : > echo redis installed
I, [2025-11-20T12:57:18.138350 #1]  INFO -- : redis installed

I, [2025-11-20T12:57:18.138598 #1]  INFO -- : > cat /etc/redis/redis.conf | grep logfile
I, [2025-11-20T12:57:18.142582 #1]  INFO -- : logfile ""

I, [2025-11-20T12:57:18.142916 #1]  INFO -- : > exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf
I, [2025-11-20T12:57:18.144125 #1]  INFO -- : > sleep 10
18:C 20 Nov 2025 12:57:18.156 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
18:C 20 Nov 2025 12:57:18.156 # Redis version=7.0.15, bits=64, commit=00000000, modified=0, pid=18, just started
18:C 20 Nov 2025 12:57:18.156 # Configuration loaded
18:M 20 Nov 2025 12:57:18.157 * monotonic clock: POSIX clock_gettime
18:M 20 Nov 2025 12:57:18.158 * Running mode=standalone, port=6379.
18:M 20 Nov 2025 12:57:18.158 # Server initialized
18:M 20 Nov 2025 12:57:18.158 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
18:M 20 Nov 2025 12:57:18.158 * Loading RDB produced by version 7.0.15
18:M 20 Nov 2025 12:57:18.158 * RDB age 2960 seconds
18:M 20 Nov 2025 12:57:18.158 * RDB memory usage when created 6.02 Mb
18:M 20 Nov 2025 12:57:18.179 * Done loading RDB, keys loaded: 4596, keys expired: 9.
18:M 20 Nov 2025 12:57:18.179 * DB loaded from disk: 0.021 seconds
18:M 20 Nov 2025 12:57:18.179 * Ready to accept connections
I, [2025-11-20T12:57:28.146418 #1]  INFO -- :
I, [2025-11-20T12:57:28.147252 #1]  INFO -- : > thpoff echo "thpoff is installed!"
I, [2025-11-20T12:57:28.151019 #1]  INFO -- : thpoff is installed!

I, [2025-11-20T12:57:28.151452 #1]  INFO -- : > /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
I, [2025-11-20T12:57:28.258766 #1]  INFO -- :
I, [2025-11-20T12:57:28.258920 #1]  INFO -- : > /usr/local/bin/ruby -e 'if ENV["DISCOURSE_HOSTNAME"] == "discourse.example.com"; puts "Aborting! Domain is not configured!"; exit 1; end'
I, [2025-11-20T12:57:28.359414 #1]  INFO -- :
I, [2025-11-20T12:57:28.359546 #1]  INFO -- : > /usr/local/bin/ruby -e 'if (ENV["DISCOURSE_CDN_URL"] || "")[0..1] == "//"; puts "Aborting! CDN must have a protocol specified. Once fixed you should rebake your posts now to correct all posts."; exit 1; end'
I, [2025-11-20T12:57:28.465003 #1]  INFO -- :
I, [2025-11-20T12:57:28.465230 #1]  INFO -- : > rm -f /etc/cron.d/anacron
I, [2025-11-20T12:57:28.467452 #1]  INFO -- :
I, [2025-11-20T12:57:28.470130 #1]  INFO -- : File > /etc/cron.d/anacron  chmod:   chown:
I, [2025-11-20T12:57:28.474084 #1]  INFO -- : File > /etc/runit/1.d/copy-env  chmod: +x  chown:
I, [2025-11-20T12:57:28.478139 #1]  INFO -- : File > /etc/service/unicorn/run  chmod: +x  chown:
I, [2025-11-20T12:57:28.482090 #1]  INFO -- : File > /etc/service/nginx/run  chmod: +x  chown:
I, [2025-11-20T12:57:28.486062 #1]  INFO -- : File > /etc/runit/3.d/01-nginx  chmod: +x  chown:
I, [2025-11-20T12:57:28.489878 #1]  INFO -- : File > /etc/runit/3.d/02-unicorn  chmod: +x  chown:
I, [2025-11-20T12:57:28.497775 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse git clean -f
I, [2025-11-20T12:57:28.718382 #1]  INFO -- :
I, [2025-11-20T12:57:28.718551 #1]  INFO -- : > 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) == v2.8.5 ]] ; then
      git pull
  else
      git -c advice.detachedHead=false checkout v2.8.5
  fi
'
From https://github.com/discourse/discourse
 - [deleted]             (none)     -> origin/0-a-cakeday
 - [deleted]             (none)     -> origin/0-a-rubocop
 - [deleted]             (none)     -> origin/0-a-unused-services
 - [deleted]             (none)     -> origin/1-anon-nav
 - [deleted]             (none)     -> origin/add-auto-track-docs
 - [deleted]             (none)     -> origin/add-postoutletargs
 - [deleted]             (none)     -> origin/ai-summary-serializer
 - [deleted]             (none)     -> origin/ai-translation-configuration-update
 - [deleted]             (none)     -> origin/d-otp
 - [deleted]             (none)     -> origin/default-locale-temporarily-close-flag
 - [deleted]             (none)     -> origin/dependabot/bundler/rubocop-discourse-3.13.0
 - [deleted]             (none)     -> origin/dependabot/bundler/rubyzip-3.1.1
 - [deleted]             (none)     -> origin/dependabot/bundler/sass-a19c11c4e9
 - [deleted]             (none)     -> origin/dependabot/bundler/stripe-16.0.0
 - [deleted]             (none)     -> origin/dependabot/github_actions/actions/setup-node-5
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/ember-cli-6.7.0
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/embroider-f83e75fa89
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/faker-js/faker-10.0.0
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/glimmer/component-2.0.0
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/lint-ed9b700cc1
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/memfs-4.48.1
 - [deleted]             (none)     -> origin/dependabot/npm_and_yarn/webpack-5.102.0
 - [deleted]             (none)     -> origin/dev-merge-login-css
 - [deleted]             (none)     -> origin/dev/migrate-from-advanced-search-to-welcome-banner
 - [deleted]             (none)     -> origin/dev/no-more-array-clear
 - [deleted]             (none)     -> origin/dev/no-more-array-deprecations-post-stream
 - [deleted]             (none)     -> origin/dev/no-more-array-get-set
 - [deleted]             (none)     -> origin/dev/no-more-array-square-brackets-property
 - [deleted]             (none)     -> origin/exact-url-match-in-sidebar
 - [deleted]             (none)     -> origin/experimental-chat-search
 - [deleted]             (none)     -> origin/feat-add-ical-format-response-to-post-events-index
 - [deleted]             (none)     -> origin/feature/bump-wiki-docs-topics-op-edit
 - [deleted]             (none)     -> origin/feature/edit-theme-owned-palettes
 - [deleted]             (none)     -> origin/feature/split-categories-and-groups-for-moderators-setting
 - [deleted]             (none)     -> origin/feature/upcoming-changes-v1
 - [deleted]             (none)     -> origin/fix/deleted-user-email
 - [deleted]             (none)     -> origin/fix_debounce_in_d_multi_select
 - [deleted]             (none)     -> origin/fix_multiple_data_uploads
 - [deleted]             (none)     -> origin/headless-chrome
 - [deleted]             (none)     -> origin/issue/handle-worker-load-timeout-failure
 - [deleted]             (none)     -> origin/likes-dmenu
 - [deleted]             (none)     -> origin/llm-credit-allocation
 - [deleted]             (none)     -> origin/log_http_accept_language_header
 - [deleted]             (none)     -> origin/loic-pitchfork
 - [deleted]             (none)     -> origin/mt/only-skip-option
 - [deleted]             (none)     -> origin/mt/site_settings
 - [deleted]             (none)     -> origin/onebox-in-localized-posts
 - [deleted]             (none)     -> origin/pento/dev-calculate-flakyness
 - [deleted]             (none)     -> origin/photoswipe-lightbox
 - [deleted]             (none)     -> origin/remove-category-badge-recursive
 - [deleted]             (none)     -> origin/remove-footermessage-legacy-text
 - [deleted]             (none)     -> origin/simplify-add-remove-pm-user-group
 - [deleted]             (none)     -> origin/split-login-admin-settings
 - [deleted]             (none)     -> origin/system-email-fallback
 - [deleted]             (none)     -> origin/toggle_editor_when_unsupported
 - [deleted]             (none)     -> origin/topic-voting-ux
 - [deleted]             (none)     -> origin/type-package
 - [deleted]             (none)     -> origin/unicode-grant-admin
 - [deleted]             (none)     -> origin/update_pgvector_080
   5d239c560..51c218e3c  main                    -> origin/main
 * [new branch]          0-a-browser-testem      -> origin/0-a-browser-testem
 * [new branch]          0-a-card-border         -> origin/0-a-card-border
 * [new branch]          0-a-deps-categ          -> origin/0-a-deps-categ
 * [new branch]          0-a-floating-ui         -> origin/0-a-floating-ui
 * [new branch]          0-a-path                -> origin/0-a-path
   94faf7901..a58678538  a11y-post-heading-scrolling -> origin/a11y-post-heading-scrolling
 * [new branch]          adplugin-add-implement-impressions -> origin/adplugin-add-implement-impressions
 * [new branch]          ai-prototype/cascade-sheets -> origin/ai-prototype/cascade-sheets
 * [new branch]          ai-prototype/reaction-last -> origin/ai-prototype/reaction-last
 * [new branch]          anthropic-caching       -> origin/anthropic-caching
 + 5c183e735...ffaa66cd8 async_ember_helpers_patch -> origin/async_ember_helpers_patch  (forced update)
 * [new branch]          better-email-subject-lines -> origin/better-email-subject-lines
 * [new branch]          block-network-system    -> origin/block-network-system
 * [new branch]          blocks-system           -> origin/blocks-system
 * [new branch]          br/upload               -> origin/br/upload
 * [new branch]          browse-latest-topics-in-new-new-sub-tabs -> origin/browse-latest-topics-in-new-new-sub-tabs
 * [new branch]          btn-mixin-border-radius -> origin/btn-mixin-border-radius
 * [new branch]          cal-fix                 -> origin/cal-fix
 * [new branch]          calendar-fix            -> origin/calendar-fix
 * [new branch]          capybara_browser_checkts_control -> origin/capybara_browser_checkts_control
 * [new branch]          capybara_browser_checkts_experiment -> origin/capybara_browser_checkts_experiment
 * [new branch]          chat-banner-content     -> origin/chat-banner-content
 * [new branch]          composer-ios-hack       -> origin/composer-ios-hack
 * [new branch]          configure_pg_statement_timeout_for_unicorn_processes -> origin/configure_pg_statement_timeout_for_unicorn_processes
 * [new branch]          couple-sm-tweaks        -> origin/couple-sm-tweaks
 * [new branch]          custom_field            -> origin/custom_field
 * [new branch]          d-button-signature      -> origin/d-button-signature
 * [new branch]          d-menu-close-animation  -> origin/d-menu-close-animation
 * [new branch]          d-otp-followups         -> origin/d-otp-followups
 * [new branch]          dependabot/bundler/crack-1.0.1 -> origin/dependabot/bundler/crack-1.0.1
 * [new branch]          dependabot/bundler/excon-1.3.1 -> origin/dependabot/bundler/excon-1.3.1
 * [new branch]          dependabot/bundler/mail-2.9.0 -> origin/dependabot/bundler/mail-2.9.0
 * [new branch]          dependabot/bundler/rubyzip-3.2.2 -> origin/dependabot/bundler/rubyzip-3.2.2
 * [new branch]          dependabot/bundler/sass-95568ee139 -> origin/dependabot/bundler/sass-95568ee139
 * [new branch]          dependabot/bundler/stripe-18.0.0 -> origin/dependabot/bundler/stripe-18.0.0
 * [new branch]          dependabot/bundler/webmock-3.26.1 -> origin/dependabot/bundler/webmock-3.26.1
 * [new branch]          dependabot/bundler/zendesk_api-4.0.0.pre.1 -> origin/dependabot/bundler/zendesk_api-4.0.0.pre.1
 * [new branch]          dependabot/github_actions/actions/setup-node-6 -> origin/dependabot/github_actions/actions/setup-node-6
 * [new branch]          dependabot/npm_and_yarn/chart.js-4.5.1 -> origin/dependabot/npm_and_yarn/chart.js-4.5.1
 * [new branch]          dependabot/npm_and_yarn/embroider-b89ca3ee63 -> origin/dependabot/npm_and_yarn/embroider-b89ca3ee63
 * [new branch]          dependabot/npm_and_yarn/esbuild-0.27.0 -> origin/dependabot/npm_and_yarn/esbuild-0.27.0
 + c3027deb3...27fb7bbf0 dependabot/npm_and_yarn/fortawesome/fontawesome-free-7.1.0 -> origin/dependabot/npm_and_yarn/fortawesome/fontawesome-free-7.1.0  (forced update)
 * [new branch]          dependabot/npm_and_yarn/glob-13.0.0 -> origin/dependabot/npm_and_yarn/glob-13.0.0
 + 6b0686c06...c917fbfa3 dependabot/npm_and_yarn/jsuites-5.13.4 -> origin/dependabot/npm_and_yarn/jsuites-5.13.4  (forced update)
 * [new branch]          dependabot/npm_and_yarn/memfs-4.51.0 -> origin/dependabot/npm_and_yarn/memfs-4.51.0
 * [new branch]          dependabot/npm_and_yarn/morphlex-1.0.4 -> origin/dependabot/npm_and_yarn/morphlex-1.0.4
 * [new branch]          dependabot/npm_and_yarn/types-546d678181 -> origin/dependabot/npm_and_yarn/types-546d678181
 + 39ab10317...9a5504f09 dependabot/npm_and_yarn/uppy-573db43783 -> origin/dependabot/npm_and_yarn/uppy-573db43783  (forced update)
 * [new branch]          dev-add-autocomplete-results-signature-type -> origin/dev-add-autocomplete-results-signature-type
 * [new branch]          dev-allow-right-left-placements-for-autocomplete-menu -> origin/dev-allow-right-left-placements-for-autocomplete-menu
 * [new branch]          dev-azure-json-object   -> origin/dev-azure-json-object
 * [new branch]          dev-refactor-d-autocomplete -> origin/dev-refactor-d-autocomplete
 * [new branch]          dev-replace-hashtag-autocomplete-templates-with-components -> origin/dev-replace-hashtag-autocomplete-templates-with-components
   9d33c2629..6d7e3ce9f  dev/add-no-category-composer-site-setting -> origin/dev/add-no-category-composer-site-setting
 * [new branch]          dev/deprecate-nil-in-site-settings -> origin/dev/deprecate-nil-in-site-settings
 * [new branch]          dev/git-ignore-mise-local-conf -> origin/dev/git-ignore-mise-local-conf
 * [new branch]          dev/messagebus-response-headers -> origin/dev/messagebus-response-headers
 * [new branch]          dev/mt/discourse-category-moderation-groups -> origin/dev/mt/discourse-category-moderation-groups
 * [new branch]          dev/no-more-array-ember-methods -> origin/dev/no-more-array-ember-methods
 * [new branch]          dev/no-more-array-pushObject -> origin/dev/no-more-array-pushObject
 * [new branch]          dev/problem-check-cleanups-part-2 -> origin/dev/problem-check-cleanups-part-2
 + 6e00e4b6d...8898de768 dev/purge-widgets       -> origin/dev/purge-widgets  (forced update)
 * [new branch]          dev/remove-widgets-code -> origin/dev/remove-widgets-code
 + 50c30c39f...0d2c402dc dev/user-actions-reviewable-logging -> origin/dev/user-actions-reviewable-logging  (forced update)
 * [new branch]          disable-autofocus-otp-ios -> origin/disable-autofocus-otp-ios
 * [new branch]          discourse-id-error-logging -> origin/discourse-id-error-logging
 * [new branch]          discourse-id-update-support -> origin/discourse-id-update-support
 * [new branch]          dont_joins_categories_unnecessarily -> origin/dont_joins_categories_unnecessarily
 * [new branch]          dont_override_category_model -> origin/dont_override_category_model
 * [new branch]          easy-link-to-own-profile-from-user-card -> origin/easy-link-to-own-profile-from-user-card
 * [new branch]          ember_settled_check     -> origin/ember_settled_check
 + 64e725e17...030f51cfe ember_settled_experimental -> origin/ember_settled_experimental  (forced update)
 * [new branch]          feature/add-uploads-to-type-objects -> origin/feature/add-uploads-to-type-objects
 + c84648556...6fd7acf52 feature/assuming-iam-role-s3-pt2 -> origin/feature/assuming-iam-role-s3-pt2  (forced update)
   d3ae413fd..560d9e5f4  feature/chat-channel-sidebar-menu -> origin/feature/chat-channel-sidebar-menu
 * [new branch]          feature/copy-as-markdown -> origin/feature/copy-as-markdown
 * [new branch]          feature/github-mute-category-linkback -> origin/feature/github-mute-category-linkback
 * [new branch]          feature/requisite-site-settings -> origin/feature/requisite-site-settings
 * [new branch]          feature/upcoming-change-group-simplify -> origin/feature/upcoming-change-group-simplify
 * [new branch]          filter-uploads          -> origin/filter-uploads
 * [new branch]          fix-credit-allocation-resets -> origin/fix-credit-allocation-resets
 * [new branch]          fix-credit-error-popups -> origin/fix-credit-error-popups
 * [new branch]          fix-emoji-autocomplete-trigger-even-after-whitespace-in-term -> origin/fix-emoji-autocomplete-trigger-even-after-whitespace-in-term
 * [new branch]          fix-selector            -> origin/fix-selector
 * [new branch]          fix-translation-missing-in-email-templates -> origin/fix-translation-missing-in-email-templates
 * [new branch]          fix/ai-llm-status-check -> origin/fix/ai-llm-status-check
 * [new branch]          fix/calendar-missing-starts-at -> origin/fix/calendar-missing-starts-at
 * [new branch]          fix/deleted-posts-list-rendering -> origin/fix/deleted-posts-list-rendering
 * [new branch]          fix/notify-chat-user-non-channel-member -> origin/fix/notify-chat-user-non-channel-member
 + 9e18befeb...2f019fb59 form-kit-2-0            -> origin/form-kit-2-0  (forced update)
 + 01dabbed3...2d3a082cd horizon_as_default_for_new_sites -> origin/horizon_as_default_for_new_sites  (forced update)
 * [new branch]          image_grid_on_rte       -> origin/image_grid_on_rte
 * [new branch]          issue/draft-save-no-change -> origin/issue/draft-save-no-change
 * [new branch]          issue/fix-placeholder-rte-non-image-upload -> origin/issue/fix-placeholder-rte-non-image-upload
 * [new branch]          issue/quote-isolating   -> origin/issue/quote-isolating
 * [new branch]          jordan-feature          -> origin/jordan-feature
 + 40d18be01...99c6a3d14 keep-img-tag-implementation-for-excerpt-parser -> origin/keep-img-tag-implementation-for-excerpt-parser  (forced update)
   04ed87792..51c218e3c  latest                  -> origin/latest
 * [new branch]          likes-dmenu-mylikes     -> origin/likes-dmenu-mylikes
 * [new branch]          limit-post-voting       -> origin/limit-post-voting
 * [new branch]          linkbacks               -> origin/linkbacks
 * [new branch]          loc-title-edit          -> origin/loc-title-edit
 * [new branch]          localized-pg-headline   -> origin/localized-pg-headline
 * [new branch]          localized-search-data   -> origin/localized-search-data
 * [new branch]          log-max-sql-duration    -> origin/log-max-sql-duration
 + bd7c66753...b6a1847be loic-server-modifiers-types -> origin/loic-server-modifiers-types  (forced update)
 * [new branch]          loic/pagy               -> origin/loic/pagy
 * [new branch]          martin-brennan-patch-1  -> origin/martin-brennan-patch-1
 + e6bdecf7f...6f0670964 member-xp-1             -> origin/member-xp-1  (forced update)
 * [new branch]          modal-animation         -> origin/modal-animation
 + 483d30315...c1aa1fc97 mt/user_options         -> origin/mt/user_options  (forced update)
 * [new branch]          multipart-upload-fix    -> origin/multipart-upload-fix
   b38084846..3abbe3301  nat1-merge-branch       -> origin/nat1-merge-branch
 * [new branch]          no-silent-failure-invalid-regex-watched-words -> origin/no-silent-failure-invalid-regex-watched-words
 * [new branch]          one-step-wizard         -> origin/one-step-wizard
 * [new branch]          outlet-suspension-silenced -> origin/outlet-suspension-silenced
   3e69277e2..94af89fcf  peek-mode-v2            -> origin/peek-mode-v2
 * [new branch]          prevent-model-fails     -> origin/prevent-model-fails
 * [new branch]          problem-check-credit    -> origin/problem-check-credit
 * [new branch]          prototype-avatars       -> origin/prototype-avatars
 * [new branch]          qunit-binding           -> origin/qunit-binding
 * [new branch]          quote-button            -> origin/quote-button
 * [new branch]          quote-lightbox          -> origin/quote-lightbox
   99695c6c0..e9fb01e59  refactor-subgrid        -> origin/refactor-subgrid
 * [new branch]          release-infrastructure  -> origin/release-infrastructure
 * [new branch]          repo-refactor           -> origin/repo-refactor
 * [new branch]          revert                  -> origin/revert
 + 8a8148488...503758d99 rollup-plugin-experiment -> origin/rollup-plugin-experiment  (forced update)
 * [new branch]          rspec-color             -> origin/rspec-color
 + e8ccaeb1c...a3eccc73d sandbox/ai-team         -> origin/sandbox/ai-team  (forced update)
 + 1ef463255...007db3bd1 sandbox/dev-xp-1        -> origin/sandbox/dev-xp-1  (forced update)
   a925474ed..86f5bb772  sandbox/dev-xp-2        -> origin/sandbox/dev-xp-2
 + 3e69277e2...46a3d9ca5 sandbox/member-xp-1     -> origin/sandbox/member-xp-1  (forced update)
 + 1effbe0cc...915e24a0a sandbox/member-xp-2     -> origin/sandbox/member-xp-2  (forced update)
 + 170018e94...03b301782 sandbox/member-xp-3     -> origin/sandbox/member-xp-3  (forced update)
 + bfb813d85...883862176 sandbox/member-xp-4     -> origin/sandbox/member-xp-4  (forced update)
 + 4c42dfdae...ce93f2ec6 sandbox/staff-xp-1      -> origin/sandbox/staff-xp-1  (forced update)
 * [new branch]          screened-ip             -> origin/screened-ip
 * [new branch]          scripted_llm_tests      -> origin/scripted_llm_tests
 * [new branch]          search-localized        -> origin/search-localized
 * [new branch]          shared-edits            -> origin/shared-edits
 * [new branch]          show-topic-loading      -> origin/show-topic-loading
   beaacf9e0..47399adbd  stable                  -> origin/stable
 * [new branch]          test-runner-exp         -> origin/test-runner-exp
   04ed87792..51c218e3c  tests-passed            -> origin/tests-passed
 * [new branch]          tobiaseigen-patch-5     -> origin/tobiaseigen-patch-5
 * [new branch]          translation-retry-quota-rewrite -> origin/translation-retry-quota-rewrite
 * [new branch]          translations-from-crowdin-main -> origin/translations-from-crowdin-main
 * [new branch]          translations-from-crowdin-stable -> origin/translations-from-crowdin-stable
 * [new branch]          upgrade_rubocop_discourse -> origin/upgrade_rubocop_discourse
 * [new branch]          use-transcoded          -> origin/use-transcoded
 * [new branch]          use_pm_on_to_markdown   -> origin/use_pm_on_to_markdown
 * [new branch]          ux-ai-bot-sidebar-link  -> origin/ux-ai-bot-sidebar-link
 * [new branch]          ux-claimable-reivew-filter -> origin/ux-claimable-reivew-filter
 * [new branch]          ux-composer-mode-placeholder -> origin/ux-composer-mode-placeholder
 * [new branch]          ux-policy-button-width  -> origin/ux-policy-button-width
 * [new branch]          ux-sign-up-button-position -> origin/ux-sign-up-button-position
 * [new branch]          version-bump/main       -> origin/version-bump/main
 * [new branch]          version_bump/stable     -> origin/version_bump/stable
   c5bca775f..8d7db37c2  vite-squashed-rebased   -> origin/vite-squashed-rebased
 * [new branch]          white_space_paragraph_parsing -> origin/white_space_paragraph_parsing
 * [new branch]          x-amz-tagging           -> origin/x-amz-tagging
 t [tag update]          beta                    -> beta
 t [tag update]          latest-release          -> latest-release
 * [new tag]             v3.5.2                  -> v3.5.2
 * [new tag]             v3.6.0.beta2            -> v3.6.0.beta2
HEAD is now at 61cf79192 Version bump to v2.8.5 (#17187)
I, [2025-11-20T12:58:10.975801 #1]  INFO -- :
I, [2025-11-20T12:58:10.976348 #1]  INFO -- : > cd /var/www/discourse && sudo -H -E -u discourse git config user.discourse-version v2.8.5
I, [2025-11-20T12:58:10.990092 #1]  INFO -- :
I, [2025-11-20T12:58:10.990310 #1]  INFO -- : > cd /var/www/discourse && mkdir -p tmp
I, [2025-11-20T12:58:10.993582 #1]  INFO -- :
I, [2025-11-20T12:58:10.993719 #1]  INFO -- : > cd /var/www/discourse && chown discourse:www-data tmp
I, [2025-11-20T12:58:10.996441 #1]  INFO -- :
I, [2025-11-20T12:58:10.996632 #1]  INFO -- : > cd /var/www/discourse && mkdir -p tmp/pids
I, [2025-11-20T12:58:10.999355 #1]  INFO -- :
I, [2025-11-20T12:58:10.999470 #1]  INFO -- : > cd /var/www/discourse && mkdir -p tmp/sockets
I, [2025-11-20T12:58:11.002136 #1]  INFO -- :
I, [2025-11-20T12:58:11.002293 #1]  INFO -- : > cd /var/www/discourse && touch tmp/.gitkeep
I, [2025-11-20T12:58:11.004947 #1]  INFO -- :
I, [2025-11-20T12:58:11.005072 #1]  INFO -- : > cd /var/www/discourse && mkdir -p                    /shared/log/rails
I, [2025-11-20T12:58:11.007844 #1]  INFO -- :
I, [2025-11-20T12:58:11.007985 #1]  INFO -- : > cd /var/www/discourse && bash -c "touch -a           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log"
I, [2025-11-20T12:58:11.012438 #1]  INFO -- :
I, [2025-11-20T12:58:11.012548 #1]  INFO -- : > cd /var/www/discourse && bash -c "ln    -s           /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log"
I, [2025-11-20T12:58:11.016830 #1]  INFO -- :
I, [2025-11-20T12:58:11.016924 #1]  INFO -- : > cd /var/www/discourse && bash -c "mkdir -p           /shared/{uploads,backups}"
I, [2025-11-20T12:58:11.021076 #1]  INFO -- :
I, [2025-11-20T12:58:11.021204 #1]  INFO -- : > cd /var/www/discourse && bash -c "ln    -s           /shared/{uploads,backups} /var/www/discourse/public"
I, [2025-11-20T12:58:11.025467 #1]  INFO -- :
I, [2025-11-20T12:58:11.025569 #1]  INFO -- : > cd /var/www/discourse && bash -c "mkdir -p           /shared/tmp/{backups,restores}"
I, [2025-11-20T12:58:11.029778 #1]  INFO -- :
I, [2025-11-20T12:58:11.029884 #1]  INFO -- : > cd /var/www/discourse && bash -c "ln    -s           /shared/tmp/{backups,restores} /var/www/discourse/tmp"
I, [2025-11-20T12:58:11.034102 #1]  INFO -- :
I, [2025-11-20T12:58:11.034224 #1]  INFO -- : > cd /var/www/discourse && chown -R discourse:www-data /shared/log/rails /shared/uploads /shared/backups /shared/tmp
I, [2025-11-20T12:58:11.069336 #1]  INFO -- :
I, [2025-11-20T12:58:11.069510 #1]  INFO -- : > cd /var/www/discourse && [ ! -d public/plugins ] || find public/plugins/ -maxdepth 1 -xtype l -delete
I, [2025-11-20T12:58:11.071978 #1]  INFO -- :
I, [2025-11-20T12:58:11.072492 #1]  INFO -- : Replacing # redis with sv start redis || exit 1 in /etc/service/unicorn/run
I, [2025-11-20T12:58:11.073877 #1]  INFO -- : > cp /var/www/discourse/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf
I, [2025-11-20T12:58:11.076755 #1]  INFO -- :
I, [2025-11-20T12:58:11.077000 #1]  INFO -- : > rm /etc/nginx/sites-enabled/default
I, [2025-11-20T12:58:11.079147 #1]  INFO -- :
I, [2025-11-20T12:58:11.079295 #1]  INFO -- : > mkdir -p /var/nginx/cache
I, [2025-11-20T12:58:11.081261 #1]  INFO -- :
I, [2025-11-20T12:58:11.081491 #1]  INFO -- : > grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )
The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.
I, [2025-11-20T12:58:11.085029 #1]  INFO -- :
I, [2025-11-20T12:58:11.086820 #1]  INFO -- : Terminating async processes
I, [2025-11-20T12:58:11.086912 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 18
18:signal-handler (1763643491) Received SIGTERM scheduling shutdown...
18:M 20 Nov 2025 12:58:11.133 # User requested shutdown...
18:M 20 Nov 2025 12:58:11.133 * Saving the final RDB snapshot before exiting.
18:M 20 Nov 2025 12:58:11.178 * DB saved on disk
18:M 20 Nov 2025 12:58:11.178 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 156 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"before-server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"discourse\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
** 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.
66c43294171cf7dc0616baf53fdaf32130c9e09951dddbe01312c565deeb85db

Скорее всего, ваша операционная система также устарела. Самый простой и безопасный способ — перенести всё на новую виртуальную машину с актуальной ОС и Docker.

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

app.yml (4.9 КБ)

Ubuntu 20.04 всё ещё отлично работает и содержит все последние пакеты.
Docker Engine 28.1.1 также достаточно актуален.

И зачем мигрировать на другую виртуальную машину, если можно обновить эту на месте?

https://ubuntu.com/blog/ubuntu-20-04-lts-end-of-life-standard-support-is-coming-to-an-end-heres-how-to-prepare

Смотрите мой цитат выше из логов.

Потому что обновление PostgreSQL может быть проблематичным, а установка на новую виртуальную машину гарантирует, что вы не получите неработающий форум.

Но подождите. Есть ли у вас в файле app.yml эта строка?

version: v2.8.10 ## ИЗМЕНЕНО С stable (v2.8.5) НА v2.8.10 ДЛЯ ОБНОВЛЕНИЯ

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

Кроме того, Discourse больше не работает без HTTPS, поэтому вам нужно раскомментировать шаблоны ssl и letsencrypt. Также изменились некоторые другие настройки. Я рекомендую выполнить полную переустановку с помощью discourse-setup, чтобы получить актуальный файл app.yml.

PostgreSQL устанавливается отдельно в Docker, и его обновление не составляет проблем.

Это абсолютно необходимо? Я пока не хочу переходить на версию 3.x.x — все функции ИИ в ней требуют миграции с PostgreSQL на PgVector. ИИ нам на форуме особо не нужен, а я совсем не знаком с PgVector, поэтому не знаю, как выполнять такую миграцию. Поэтому пока я предпочитаю остаться на последней версии 2.8.x — 2.8.14, если это возможно.
Если это невозможно, то, конечно, мне придётся выполнить миграцию. В своём первом сообщении я спрашивал, есть ли руководство по такой миграции?

Но я не хочу использовать HTTPS и letsencrypt от Discourse. Мой форум находится за Nginx, который настроен в соответствии с нашими правилами периметра. Я хочу сохранить эту конфигурацию.

Огромное спасибо за вашу помощь! Жду ваших комментариев.

Я указал на несколько таких руководств. Боюсь, ни одно из них не подходит для вашей конфигурации. Вам придётся обновить PostgreSQL и установить pgvector.

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

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

Самая последняя версия — Discourse 3.6.0.beta3-latest. Хотя ничего невозможного нет, если вы хотите остаться на версии 2.8.x, то, возможно, вам лучше ничего не делать. Эта версия не поддерживается и имеет серьёзные проблемы с безопасностью.

Вы используете неподдерживаемую версию. Удалите блок версии из файла app.yml, чтобы обновиться до текущей версии.

@nahimov, вам удалось обновить ваш старый, уже не поддерживаемый сайт? Я бы посоветовал вам последовать этому совету:

@pfaffman @Falco @tobiaseigen Привет!

Хорошо, хорошо )) Я обновился с версии 2.8.5 до 3.5.2. Мне даже удалось без проблем выполнить миграцию на pg_vector. ))

Но когда я открыл обновлённый форум, я растерялся. Вот как выглядел старый форум на версии 2.8.5 — там было верхнее меню и кнопки «Войти» / «Выйти»:

А вот как выглядит обновлённый форум — там только боковое меню, без кнопок «Войти» / «Выйти»:

И хотя я смог войти на форум через URL /login, выйти у меня не получилось…

Подскажите, пожалуйста, как вернуть верхнее меню и кнопки «Войти» / «Выйти»? Я не смог найти их в настройках.

Рады, что вы разобрались, как обновить свой сайт!

Чтобы выйти из аккаунта, выберите свой аватар в правом верхнем углу, а затем нажмите на последний пункт в нижней части меню справа. Это изменение было введено уже несколько лет назад!

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

Извините, я больше так не буду.

Да. Но я не вижу меню в правом верхнем углу. Судя по моим скриншотам, оно есть в старой версии форума, но отсутствует в обновлённой. Я не сделал скриншот всей старой версии форума. Вот исправленный скриншот.

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

На этом скриншоте вы не вошли в систему Discourse.

Это старая версия — 2.8.5.

В новой версии я не вижу этого меню. Можно ли заменить его нашим пользовательским верхним баннером?