Ошибка обновления Discourse с v3.0.6 до v3.1.1: undefined method `register_bookmarkable' для Bookmark:Class

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

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

Возможно, вам стоит рассмотреть возможность перехода от Bitnami к стандартной установке. Ваши проблемы не вызваны «ошибками в миграции базы данных», они специфичны для Bitnami.

Уже есть стандартный способ установки Kubernetes?

Разрешает ли Kubernetes ручную установку? Если да, то вы можете выполнить стандартную установку таким способом. (Я никогда не пробовал, поэтому не знаю, как работает Kubernetes)

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

Я рассматривал этот вариант, но стараюсь избегать изменений в настройках чарта по умолчанию, чтобы оставаться «на основном пути». Тем не менее, я попытался обновить только сервер Discourse до версии 3.2.0, переопределив тег образа в Deployment, сохранив при этом существующую базу данных, чтобы проверить, завершится ли миграция успешно; она всё равно не удалась.

Я пытался вручную удалить и восстановить базу данных через kubectl exec в контейнер postgres, используя файл дампа SQL, сгенерированный самим Discourse, но это завершается ошибкой, связанной с таблицей sidebar_sections. В последний раз я создал новую виртуальную машину и следовал методу стандартной установки для установки Discourse версии 3.3.0. При попытке восстановить резервную копию возникла та же ошибка.

Мой вывод заключается в том, что, хотя архив резервной копии для продакшена был создан самим Discourse, структура базы данных моего продакшен-экземпляра версии 3.0.6 каким-то образом отличается от ожидаемой Discourse, что вызывает ошибки при миграциях. Если это так, я пессимистично оцениваю свои варианты. Единственная идея, которая у меня есть на данный момент, — начать вручную редактировать файл дампа SQL в архиве резервной копии, удаляя таблицы, вызывающие ошибки DuplicateTable на этапе миграции базы данных в процессе восстановления.

Если вы хотите использовать графики Helm от Bitnami, вам необходимо воспользоваться их поддержкой.

Надеюсь, это поможет кому-то не тратить столько же времени, сколько я потратил в этой ситуации. Ниже описан процесс, который позволил мне обновиться с Discourse v3.0.6 до v3.2.0 при использовании Helm-чарта Bitnami (с версии v11 до v12). Хотя, судя по комментариям выше, дополнительные предупреждения излишни, проблема вызвана ошибкой в Helm-чарте Bitnami и их кастомных образах; на официальные релизы Discourse это не влияет.

Ниже приведены инструкции по выполнению обновления. «Продакшн-сайт» — это релиз Helm-чарта сайта Discourse, который обновляется, а «миграционный сайт» — временный релиз чарта, развёрнутый параллельно в пространстве имён discourse-dev.

Продакшн-сайт

  1. Переведите продакшн-форум в режим только для чтения в панели администратора резервных копий /admin/backups.
  2. Создайте резервную копию через панель администратора резервных копий. Загрузите архив резервной копии локально.

Миграционный сайт

  1. Установите свежий экземпляр чарта Bitnami v12.6.2 (Discourse v3.2.0). Установите количество реплик развёртывания сервера Discourse в ноль.

    $ kubectl scale -n discourse-dev deployment discourse --replicas 0
    deployment.apps/discourse scaled
    
  2. Создайте SQL-файл db_init.sql:

    cat > /tmp/db_init.sql << EOF
    DROP DATABASE bitnami_application;
    CREATE DATABASE bitnami_application;
    GRANT ALL PRIVILEGES ON DATABASE bitnami_application TO bn_discourse;
    CREATE EXTENSION hstore;
    CREATE EXTENSION pg_trgm;
    ALTER database bitnami_application owner to bn_discourse ;
    EOF
    
  3. Скопируйте файл в под базы данных и выполните его:

    $ kubectl cp -n discourse-dev db_init.sql discourse-dev-postgresql-0:/tmp/
    
    $ kubectl exec -n discourse-dev -it discourse-dev-postgresql-0 -- bash -c \
        'PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres \
         < /tmp/db_init.sql'
    DROP DATABASE
    CREATE DATABASE
    GRANT
    ERROR:  extension "hstore" already exists
    ERROR:  extension "pg_trgm" already exists
    ALTER DATABASE
    
  4. Распакуйте архив резервной копии, скопируйте SQL-дамп в под базы данных и примените его:

    $ ls
    discourse-2024-03-04-143102-v20230119094939.tar.gz
    $ tar xvf discourse-2024-03-04-143102-v20230119094939.tar.gz 
    $ gunzip dump.sql.gz 
    $ kubectl cp -n discourse-dev dump.sql discourse-dev-postgresql-0:/tmp/
    $ kubectl exec -n discourse-dev -it discourse-dev-postgresql-0 -- bash -c \
        'PGPASSWORD=$POSTGRES_PASSWORD psql -U bn_discourse \
         --dbname bitnami_application \
         < /tmp/dump.sql'
    
  5. Запустите под Discourse.

    $ kubectl scale -n discourse-dev deployment discourse --replicas 1
    deployment.apps/discourse scaled
    
  6. Следите за логами и удаляйте таблицы, препятствующие обновлению:

    $ kubectl logs --prefix -f -n discourse-dev -c discourse -l app.kubernetes.io/name=discourse
    $ kubectl logs --prefix -f -n discourse-dev -l app.kubernetes.io/name=postgresql
    
  7. Наблюдайте за сбоями миграций БД и вручную удаляйте соответствующие таблицы, пока миграции не пройдут успешно:

    $ kubectl exec -n discourse-dev -it discourse-dev-postgresql-0 -- bash -c \
        'PGPASSWORD=$POSTGRES_PASSWORD psql -U bn_discourse --dbname bitnami_application -c "\
        DROP TABLE sidebar_sections; \
        DROP TABLE sidebar_urls; \
        DROP TABLE chat_threads; \
        DROP TABLE form_templates; \
        DROP TABLE category_settings; \
        DROP TABLE category_form_templates; \
        DROP TABLE theme_svg_sprites; \
        DROP TABLE user_chat_thread_memberships; \
        DROP TABLE summary_sections; \
        "'
    
  8. Восстановите резервную копию папки uploads:

    $ PODNAME=$(kubectl get pod -n discourse-dev -l app.kubernetes.io/name=discourse --output=jsonpath={.items..metadata.name} | cut -f1 -d' ')
    $ kubectl cp -n discourse-dev -c discourse uploads $PODNAME:/bitnami/discourse/public/
    $ kubectl exec -n discourse-dev -c discourse $PODNAME -- bash -c 'chown -R 999:0 /bitnami/discourse/public/uploads/'
    
  9. По какой-то причине плагины не загрузились и не установились автоматически. Сделайте это вручную и проверьте работоспособность плагинов.

    root@discourse-54c6d6fb7c-z9285:/bitnami/discourse/plugins$ git clone https://github.com/discourse/discourse-oauth2-basic
    root@discourse-54c6d6fb7c-z9285:/bitnami/discourse/plugins$ git clone https://github.com/discourse/discourse-math
    root@discourse-54c6d6fb7c-z9285:/bitnami/discourse/plugins$ chown -R 999:0 discourse-oauth2-basic discourse-math
    
  10. Создайте резервную копию вновь восстановленного сайта через панель администратора резервных копий.

Продакшн-сайт

  1. Удалите исходное развёртывание и очистите PV/PVC.
  2. Установите свежий экземпляр чарта Bitnami v12.6.2 (Discourse v3.2.0).
  3. Войдите, используя ссылку на вход по электронной почте: https://$BASE_URL/u/admin-login.
  4. Загрузите и восстановите архив резервной копии через панель администратора резервных копий.