校验并加载导入包

加载导入包由 Specivo 完成,而不是本工具,并且需要 Specivo 0.11.0 或更高版本。导入命令对所有迁移工具都一样;本页只介绍与 RT 导入包相关的要点。完整说明见 Specivo 用户指南中的 从其他项目管理系统导入。

先做备份

正式导入之前,先备份 Specivo 的数据库和数据目录。

把导入包复制到 Specivo 服务器上一个应用可写的目录(导入过程会在导入包旁边保存一个小的链接文件)。然后按以下顺序运行:

# 1. Check the bundle. Reads only the bundle: no database is touched.
python -m specivo.cli.import_data --source bundle --path rt-export --validate

# 2. Rehearse. The whole import runs in a transaction that is always rolled back.
python -m specivo.cli.import_data --source bundle --path rt-export --dry-run

# 3. Import.
python -m specivo.cli.import_data --source bundle --path rt-export

使用 Docker 时,在每条命令前加上 docker compose exec api,并使用容器内的路径。

单独存放的附件

用 --files-path 生成的导入包没有 files/ 目录。把文件目录一并复制过去,并在每条命令中指定它:

rsync -a --partial rt-export rt-files specivo-host:/srv/import/
python -m specivo.cli.import_data --source bundle --path /srv/import/rt-export \
    --files-path /srv/import/rt-files --validate

同一个 RT 的多个导入包

来自同一个 RT 安装的多个导入包(每个队列一个,或者切换前再做的一次导出)共用生成时所用的 --instance。第一个按上面的方式加载,之后的每一个都加上 --continue-import:

python -m specivo.cli.import_data --source bundle --path rt-billing --continue-import

已导入的记录会被跳过;导入包之间的关联和引用会在两端都进入 Specivo 后建立,不论哪个导入包先导入。保留 Specivo 在导入包旁写入的链接文件(specivo-links.rt.<instance>.sqlite),每次加载都使用同一个文件。

RT 迁移值得了解的选项

Specivo 选项 适用场景
--import-admins 把 RT 的超级用户设为 Specivo 管理员。不加此项时,他们会作为普通账户导入,并在报告中列出。
--merge-duplicate-statuses Specivo 中已有与 RT 同名的状态(new、open、resolved):直接复用这些状态,而不是每个名字再新增一个。
--project-key-map support=SUP 自行指定项目标识,而不使用由队列标识符推导出来的那个。
--project <refs> 只加载导入包中的部分项目(按队列的 RT id 指定)。

阅读导入报告

导入报告列出了创建的内容、跳过的内容,以及导入包的 not_carried_over:RT 中有、但导入包无法容纳的内容(见哪些内容不会迁移)。报告还会列出所有未激活的用户(RT 的非特权用户和已禁用用户会被锁定)、RT 标记为管理员的每个账户,以及每个没有邮箱地址的账户。

导入之后:

  • 为 Manager(管理者)、Developer(开发者)和 Reporter(报告者)三个角色分配权限:Specivo 创建它们时不带任何权限,每个角色的导入数据里记录了导致创建该角色的 RT 权限;
  • 检查文章类对应的项目(Articles: ...):应用于多个队列的文章类会有一个单独的项目;
  • 需要登录的请求者(例如客户门户场景)需要解锁账户,或者在导出时加上 --activate-unprivileged;
  • 如果导入包里有 RT privileged users 用户组,检查一下:它对应 RT 的 Privileged 组,所有特权用户都作为成员带入;
  • 检查 RT 的 Everyone 组曾拥有哪些权限(见下文)。

RT 的 Everyone 组与公开项目

每个导入的项目都设为 私有:只有成员(直接加入或通过用户组加入)才能打开。报告的 not_carried_over 列出了 RT 的 Everyone 组在所有队列上以及逐个队列拥有的权限,每个项目也在 extra(rt_everyone_rights)中保留了自己的那份列表。RT 的 Everyone 包括请求者以及任何通过邮件创建过工单的人,所以那里出现 ShowTicket 之类的权限,很少意味着这个队列本来就打算对所有人开放(见哪些内容不会迁移)。

如果某个项目确实应该让所有有账户的人都能查看,在导入后把它设为公开。公开项目会向每个已登录的非成员用户显示其内容,权限由内置角色 Non member(非成员)决定:默认可以查看工作项,管理员可在 管理 → 角色 中修改。Specivo 的网页会显示项目的可见性,但没有切换开关;管理员,或者在该项目中的角色拥有 manage_project 权限的用户,可以通过 REST API 修改:

curl -X PATCH https://your-specivo-host/api/v1/projects/SUPPORT/ \
  -H "Authorization: Bearer spv_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"is_public": true}'

{"is_public": false} 可将其改回私有。无需账户即可读取是另一回事:实例管理员需要在公开项目的 设置 中单独启用,并为整个实例开启匿名访问。