如何脚本化设置向导?

您好,

听起来这似乎是一个常见问题,如果是的话,我先表示歉意:我显然没有仔细查找 :blush: 我该如何编写一个脚本来实现与向导相同的功能,而不是通过 Web 界面操作?

脚本的开头可以类似于规范测试中的 Fabricate(admin) fixture。也许可以从容器的 自定义部分 调用它。

提前感谢您的帮助!

Wizard 一半是站点设置,一半是 API 调用。

对于 API 调用,您可以阅读 如何逆向工程 Discourse API;对于站点设置,请遵循以下示例:

2 个赞

但……也许我困惑的地方就在这里:为了调用 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

你具体想实现什么?是想自动化创建管理员用户并设置一些配置吗?

1 个赞

是的,没错。我想从头创建一个新论坛,并通过一个无需任何浏览器交互的脚本来填充用户、分类和主题。

或许可以先创建该数据库,并在安装过程中将其恢复?

我没有任何数据库:用户、分类和主题将使用来自 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 不再需要运行向导,尽管系统仍会提示需要运行。

我靠做进口业务赚取了相当一部分收入。我相当确信,下面描述的方式,基本上是所有经常从事进口业务的人都在采用的做法。

我的建议是:

  • 配置并运行导入工具
  • 测试它是否按预期工作
  • 编写脚本以重新运行导入工具,从而导入自首次运行以来获取的数据
  • 测试该脚本
  • 当以上所有步骤都正常后,执行最终的导入操作
  • 将数据恢复到生产服务器

迁移任务与设置生产服务器的任务完全不同,两者的要求也各异。通常,迁移任务需要一些生产服务器不需要的东西(但我认为 mailmain 导入工具是个例外)。

在多站点服务器上运行迁移任务似乎尤其不明智。

3 个赞

感谢您的建议,我会遵循这个流程。有超过 100GB 的 mbox 归档文件,至少需要进行几次测试。

关于这一点……看起来 mbox 导入器总是创建新类别,无法使用现有类别。您对此是否有所了解?

我之前不知道 foolhardy 的含义:我很喜欢这个词,以后会再用 :- )

这恰恰是重新从头开始导入的一个糟糕主意。那很可能需要数周时间。当你重新运行导入器时,它只会导入新数据(而且我经常修改它以完全跳过旧数据)。

你可以通过创建 CategoryCustomField 来修改脚本,使其使用现有分类。我建议从一个空数据库开始,让脚本自动创建分类,之后你可以按需自定义它。当你再次运行脚本时,它会继续使用该分类。

2 个赞

您导入数据的真正风险在于,不同年份的数据可能存在差异,因此适用于 10 年前数据的处理方式可能不适用于 5 年前的数据,依此类推。不过,也许您会走运。

3 个赞

这让我不禁思考…

1 个赞

不确定这是否算作一种恭维 :wink:
我始终使用多站点进行导入。它允许多个论坛共存:一个供我调试,而客户可以在其相邻站点上审查导入内容。此外,将数据库复制以从特定点重新开始也非常容易。

2 个赞

等等……什么!?

哇,真是令人惊讶!你大概是地球上唯一一位不在 CDCK 工作、却比我更懂导入操作的人了。既然你使用多站点进行导入,那我也会考虑采用同样的方法。我通常会在同一台主机上启动独立的容器,前面加上 Traefik 作为代理,所以这算是在某种程度上类似,但又不完全一样。

3 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.