Повторный импорт уже импортированных писем

Я успешно установил Discourse с использованием облачного сервиса Digital Ocean, с целью миграции нескольких списков рассылки listserv, если окажется, что Discourse способен выполнить все необходимые нам задачи. В процессе тестирования я использовал Thunderbird на Windows 10 для сохранения новых писем, поступающих из списка рассылки каждые несколько дней, в папку на Windows, которую затем копировал в папку /var/discourse/shared/standalone/import/data/ExampleCategory1 (или ExampleCategory2) с помощью FileZilla. После этого я запускал контейнер импорта и выполнял скрипт import_mbox.sh. Пока всё работало исправно, и я мог вручную заставить Discourse воспроизводить то, что поступало через списки рассылки, на которые я подписан.

Однако представьте, что у меня есть категории ExampleCategory1 и ExampleCategory2, и по ошибке я помещаю письма, предназначенные для первой папки (ExampleCategory1), во вторую (ExampleCategory2), а затем запускаю импорт, прежде чем замечаю ошибку (при перетаскивании в FileZilla что-то пошло не так!)

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

Чтобы исправить это, я удалил все темы/сообщения в ExampleCategory2 через веб-интерфейс, а затем дополнительно выполнил команду rake destroy:topics[“ExampleCategory2”], чтобы быть уверенным, и планировал просто снова запустить import_mbox.sh (у меня есть копии всех писем, которые должны находиться в каждой категории). Однако Discourse, похоже, запоминает, какие письма он уже импортировал, даже после удаления сообщений, и поэтому не импортирует их повторно!

Как мне это исправить?

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

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

Когда вы говорите «очистить базу данных», вы имеете в виду удаление всех тем и сообщений из Discourse, а также всех записей о входящих электронных письмах, обработанных импортером (но сохранить структуру Discourse, пользователей и т. д. нетронутыми)? Или вы имеете в виду базу данных импортированных электронных писем, что позволит оставить существующие сообщения на месте, но даст возможность повторно запустить импортер с помощью старых писем?

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

Если вы удалили все импортированные посты, то можно сделать что-то вроде

  PostCustomField.where(name: "import_id").destroy_all

Огромное спасибо, @pfaffman! Похоже, всё сработало, хотя я не до конца понимаю, что происходило «под капотом».

Я выполнил ./launcher enter app, затем ввёл rails c, после чего PostCustomField.where(name: "import_id").destroy_all. На экране появилось много текста (некоторые части были выделены красным и зелёным). Затем, когда я вышел из консоли Rails и снова запустил import_mbox.sh, все оригинальные письма, которые ранее были импортированы, а затем мною удалены (путём удаления тем), снова появились в Discourse. Если я копирую письма в другую папку категории, они также импортируются повторно, как дубликаты, как я и предполагал.

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

Вы также упоминали о полной очистке базы данных и повторном импорте всего. Как проще всего выполнить очистку?

Рад, что это сработало! И рад, что начинать заново не будет проблемой. Я действительно считаю, что лучше начать с чистого листа, если есть возможность.

Самый простой способ очистить — это

   rm -r /var/discourse/shared/standalone/post*

а затем пересобрать. Ещё один вариант: сразу после пересборки создать резервную копию, и тогда вы сможете восстановить именно её.