[Сайт недоступен :(] Сбой обновления/перестройки — проблема с миграцией БД?

Сегодня при обновлении до текущей версии Discourse процесс пересборки завершается неудачей, и я точно не знаю, что является причиной. Установка отставала на несколько итераций (по-моему, версия 2.8x). Обновление образа Docker прошло успешно. Когда я приступил к обновлению Discourse, меня попросили выполнить ручную загрузку и пересборку (в большинстве случаев меня об этом просят), однако пересборка оказалась неудачной.

Ниже приведены результаты поиска по слову “error” с помощью утилиты discourse-doctor. Извините за скриншоты, но веб-клиент VNC, которым я пользуюсь, по-видимому, не поддерживает копирование и вставку.

image

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

Также есть более свежая тема здесь:

Спасибо, я начну двигаться в этом направлении… пожелайте мне удачи…

Я застрял на этапе запуска повторной индексации. Мне удалось запустить процесс (хотя он пока недоступен через веб-интерфейс) и войти в приложение, но дальше продвинуться не получается.

image

Вам нужно запустить эти команды внутри контейнера. Что-то вроде

./launcher start app
./launcher enter app

Перед тем как выполнить sudo postgres

Редактирование: о, вы уже внутри контейнера.

Перед postgres -c нужно добавить sudo.

Думаю, sudo не сработает, но su помог, и теперь я копаться в postgres.

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

UPDATE users SET username_lower = 'xxx' WHERE id = xxx;

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

Продолжу поиск. Я пока не знаю, сколько у меня дубликатов…

/редактирование… это просто racerx. ЧЕРТ, RACERX!

image

Ты разобрался, как это исправить?

Я бы также вернул ID пользователей (который уникален), чтобы правильно их идентифицировать, а затем переименовал бы одного из этих двух пользователей :slight_smile:

Развивая мысль @Canapin, на случай если вы ещё не догадались, получить уникальные имена пользователей будет несложно, поскольку вы уже выяснили, что racerx — единственное дублирующееся имя.

Сначала, если вы ещё этого не сделали, убедитесь, что racerx2 ещё не существует, чтобы не переносить проблему на другое имя пользователя: (Если вы получили идентификатор, попробуйте другое имя пользователя.)

SELECT id FROM users WHERE username_lower = 'racerx2';

Когда у вас будет свободное имя пользователя, получите идентификаторы дублирующихся аккаунтов с именем racerx:

SELECT id from users WHERE username_lower = 'racerx';

Выберите один из них — неважно какой, хотя я бы выбрал наибольший, затем измените его имя пользователя: (Замените racerx2 на другое имя, если необходимо, а 12345 — на выбранный вами идентификатор racerx.)

UPDATE users SET username_lower = 'racerx2' WHERE id = 12345;

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

Мне было сложно изменить/добавить значение racerx в столбце username_lower с помощью синтаксиса, поэтому я поступил иначе: нашел ID нужных строк и изменил значение username_lower в конкретной строке.

Сначала я попытался получить отчет о всех строках в таблице users, где в столбце username_lower содержится “racerx”.

select all from users where username_lower ='racerx';

Исходя из этого, я решил изменить racerx на racerx2. Точно не помню, что именно я ввел, чтобы это произошло. Кажется, это было UPDATE SET from users username_lower racerx to racerx2.