Как написать скрипт для мастера установки?

Здравствуйте,

Похоже, это уже есть в FAQ, и я заранее извиняюсь, если так и есть: видимо, я недостаточно тщательно искал :blush: Как я мог бы написать скрипт, который выполняет ту же задачу, что и мастер настройки, вместо того чтобы делать это через веб-интерфейс?

Он мог бы начинаться с чего-то похожего на фикстуру Fabricate(admin) из тестов. И, возможно, вызываться из пользовательского раздела контейнера.

Заранее спасибо за помощь!

Wizard наполовину состоит из настроек сайта, наполовину — из вызовов API.

Что касается вызовов API, вы можете ознакомиться с инструкцией Как провести реверс-инжиниринг API Discourse, а для настроек сайта следуйте примеру здесь:

Но, возможно, я заблудился именно здесь: чтобы вызвать API, мне нужен API-ключ. А значит, и пользователь-администратор, которого у меня пока нет. Возможно ли вызвать API без API-ключа? Или получить API-ключ, который не привязан к пользователю и имеет права администратора?

Похоже, что для создания пользователя-администратора следует использовать rake:admin. Скорее всего, пользователь-администратор уже создан, но не одобрен, поэтому мне нужно изменить его статус на одобренный.

Или, возможно, я могу создать ключ API с помощью api_key:create_master и использовать его для создания пользователя-администратора?

root@forum:/var/www/discourse# RAILS_DB=secondsite rake 'api_key:create_master[MASTERKEY]'
ad676e7413778aaaaa5d315c35f188591ef0edb4a4d4b2d644b9247a88421cfa

Однако, похоже, я не до конца понимаю, как должен использоваться этот мастер-ключ, потому что это не работает:

# curl -X GET "https://forum2/categories" -H "Accept: application/json" -H "Api-Key: ad676e7413778aa3a5d315c35f91ef0edb4a4d4b2d644b924b7a88421cfa"
{"errors":["You are not permitted to view the requested resource. The API username or key is invalid."],"error_type":"invalid_access"}

Однако, если я создам пользователя-администратора:

root@forum:/var/www/discourse# RAILS_DB=secondsite rake 'admin:create' 
Email:  loic@dachary.org
Password:  
Repeat password:  

Ensuring account is active!

Account created successfully with username loic
Do you want to grant Admin privileges to this account? (Y/n)  Y

Your account now has Admin privileges!

а затем использую тот же мастер-ключ, указав недавно созданного пользователя, это работает:

curl -X GET "https://forum2/categories" -H "Accept: application/json" -H "Api-Key: ad676e7413778aa3a5d315c358591ef0edb4a4d4b2d644b924b7a88421cfa" -H "Api-Username: loic"
{"category_list":{"can...

и у него есть права администратора, поскольку он также может получать доступ к /admin/site_settings/category/branding.

Чего именно вы пытаетесь добиться? Вы хотите автоматизировать создание пользователя-администратора и настройку некоторых параметров?

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

Может, сначала создать эту базу данных, а затем восстановить её в процессе установки?

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

Если вы хотите импортировать данные, сделайте это отдельным процессом.

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

Для контекста: это часть работы, которую я выполняю по импорту Mailman2 в Discourse. Тест будет запускаться через tox, который:

  • создаст новый экземпляр Discourse
  • выполнит различные тесты
  • уничтожит экземпляр Discourse

Предполагая установку с несколькими сайтами, создание утверждённого пользователя-администратора и ключа API администратора можно выполнить с помощью следующих команд:

  • docker exec app env RAILS_DB=secondsite rake 'api_key:create_master[MYKEY]'
  • ( echo user1@example.com ; echo $pass ; echo $pass ; echo ) | docker exec -i app env RAILS_DB=secondsite rake 'admin:create'

Примечание: если у вас не установка с несколькими сайтами, просто удалите env RAILS_DB=secondsite.

Затем проверьте, что всё работает, выполнив:

curl -X GET https://forum2/admin/backups -H "Accept: application/json" -H "Api-Key: 886171a73dd12759b5d6c1915b0f0d4475e8b3fff3d97954b95171200b6" -H "Api-Username: user1"
[]

(особая благодарность Jay Pfaffman за идею)

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

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

Моя рекомендация следующая:

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

Задача миграции и настройка продакшн-сервера — это совершенно разные процессы с разными требованиями. Обычно для миграции требуются инструменты, которые не нужны на продакшн-сервере (хотя, на мой взгляд, импортер Mailman является исключением).

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

Спасибо за совет, я буду следовать этому процессу. У нас более 100 ГБ архивов mbox, поэтому потребуется как минимум несколько тестов.

Касательно этого… похоже, что импортер mbox всегда создает новую категорию и не может использовать существующую. Не знаете ли вы что-нибудь об этом?

Я не знал значения слова безрассудный: мне оно нравится, и я буду его использовать :slight_smile:

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

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

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

Заставило задуматься…

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

Погодите… что!?

Ну, я в шоке! Вы, пожалуй, единственный человек на планете, который не работает в CDCK, но, по-моему, знает об импорте даже больше, чем я. И если вы используете multisite для импорта, то, ну что ж, я тоже подумаю над этим. Обычно я запускаю отдельные контейнеры на том же хосте с Traefik перед ними, так что, думаю, это отчасти то же самое, но не совсем.