自 9e8207eae45f596bebb2e7fbc46055171010a5d8
后提交的改动,若涉及到复杂的部署操作都会在这里进行记录。
需要为 Reply 添加列 internal
,类型为 Boolean
。
导入 Group、Ticket 与 OpsLog。
导入 /resource/schema/QuickReply.json 。
- 导出
Config
数据 - 删除
value
列 - 重新创建
value
列,类型为Any
- 手动恢复数据。如果原来启用了企业微信通知,直接删掉
wechatToken
- 如果原来启用了百度翻译,新建一列 key =
translate.baidu
,value 为{ "appId", "appKey" }
,如果部署新版后没有问题,删除原来的translate.baidu.*
行。 - 部署新版本
创建一个名为 CACHE
的 Redis 实例。
重新导入 Group.json 。
导入 notification.json 。
重新导入 Reply.json 。
导入 TicketFilter.json 。
删除 Reply class 的 active 列,然后重新导入 Reply.json 。
修改了 Redis 中 Category 的格式,部署后需要清除 Category 的缓存:
> lean cache
> del categories
创建一个名为 QUEUE
的 Redis 实例,数据删除策略选择 noeviction
。
重新导入 OpsLog(增加 ticket 索引)OpsLog 没有索引,在自用的 LeanTicket 上 40000+ 的数据量已经出现查询超时了,慢查询条件为 where('ticket', '==', ptr).orderBy('createdAt')
。给 ticket 列加个索引,避免扫全表即可。
重新导入 notification.json 。并确保 notification 表有这个索引:
user(正序)联合 latestActionAt(倒序)
由于重写了触发器的实现,原有触发器将无法使用。
部署后,请在预备环境配置与原有触发器逻辑相同的新触发器,然后删除原有触发器。
导入 TimeTrigger.json,重新配置逻辑相同的定时触发器,删除 Automation class。
Jira 插件内置到主分支了,需要导入 JiraIssue.json,并将 HS_Config 里 Jira 相关的配置移到 Config class 里。新的配置格式是一个大的 Object(有别于 HS_Config 命名空间风格的配置),具体可参考开发环境。
交互式的 Slack 通知现已内置,可按需开启。之前未使用的应用需要导入 SlackNotification.json。
已使用的应用需要将环境变量中的配置移到 Config class 中(格式可参考开发环境),并重新设置 Slack App 的 interactive endpint。
导入 TicketFieldVariant.json(添加 description 列)。
重写了关键词搜索功能。在「全文搜索」中为 Ticket class 的 content、author、category、title、status、group、assignee、evaluation、tags、nid 列添加索引。
重新导入 Ticket(为 Ticket 增加 latestCustomerServiceReplyAt 与 firstCustomerServiceReplyAt)。
为 Ticket 创建索引 latestCustomerServiceReplyAt (倒序)
重新导入 TicketField.json,并将已有数据的 visible 设置为 true。
重新导入 TicketFieldVariant.json,并将已有数据的 titleForCustomerService 设置为和 title 相同。
重新导入 Category.json(增加 notices 列)
导入 View 表结构(resources/schema/View.json),导入内置视图的数据(resources/data/View.jsonl)。
已删除 ticket filter 功能,可以删除 TicketFilter class。
已删除「动态内容」功能,可以删除 DynamicContent class。
导入 FAQ.json FAQRevision.jaon,确保 FAQRevision 有以下两个索引:
FAQ(倒序)createdAt(倒序)FAQ(倒序)meta(倒序)createdAt(倒序)
临时支持通过自定义字段的值搜索工单,需要为 TicketFieldValue 的 values 字段创建全文搜索索引。 由于这是一个临时功能,未使用的应用可以不添加该索引。
重新导入 FAQ.json,FAQRevision.json。
导入 FAQFeedback.json~~,确保 FAQFeedback 有以下两个索引:~~
revision(倒序)author(倒序),唯一,不允许为空revision(倒序)type(倒序)
创建定时任务 analyzeArticles 58 * * * *
导入 DynamicContent.json。 导入 DynamicContentVariant.json。
导入 TicketStats.json。 导入 TicketStatusStats.json。
创建定时任务 statsHour 0 * * * *
导入以下文件:
- schema
- Category.json
- FAQTopic.json
- TicketField.json
- notification.json
- data
- TicketField.jsonl
- TicketFieldVariant.jsonl
- TicketForm.jsonl
部署后运行云函数 migrateNotifications
如果 TicketForm 中有 fieldIds 列包含 description
的数据,要把 description
改成 details
。此过程无法做到平滑。
导入 TicketField.json
控制台创建 TicketLog 日志表。运行云函数 syncTicketLog
同步工单数据到 TicketLog
数据仓库创建以下同步
- Category
- form
- name
- Ticket
- status
- category
- TicketField
- type
- TicketFieldValue
- ticket
- values
- TicketFieldVariant
- options
- field
- title
- locale
- TicketForm
- fieldIds
增加如下环境变量
TDS_TEXT_FILTER_HOST
: 文本过滤域名TDS_TEXT_FILTER_SCENE
: 场景 IDTDS_CLIENT_ID
: TDS 的 Client IDTDS_SERVER_SECRET
: TDS 的 Server SecretTEXT_FILTER_MAX_RETRY
: 文本过滤失败时重试次数,默认为 3
数据仓库创建以下同步
- Ticket
- evaluation
- category
- assignee
新增环境变量
TEXT_FILTER_RECOVERY_TIMEOUT
: 文本过滤每次失败后恢复的延迟,单位为秒,默认 60 秒
导入 _User
导入 TicketFormNote.json 和 TicketForm.json
导入 Ticket
(增加 reporter 列)
导入 data
TicketField.jsonl
,TicketFieldVariant.jsonl
:增加内置字段
新增环境变量
PERSIST_USERAGENT_INFO
:控制提单时是否持久化设备信息到工单字段中,默认否
新增环境变量
TDS_USER_PUBLIC_KEY
: 验签的 public keyTDS_USER_SIGNING_KEY
: 给内建用户 jwt 签名的 keyENABLE_TDS_USER_LOGIN
: 控制是否开启 TDS 内建用户登录
导入 TicketStats
(增加 likeCount
和 dislikeCount
列)
重新导入 _User
(默认关闭 create
权限)
重新导入 _User
(增加 active
列)
如果需要启用 Slack 统计推送请将云函数里的 dailyPushStatsToSlack
、weeklyPushStatsToSlack
和 monthlyPushStatsToSlack
设置为定时任务
导入 _User
(增加 inactive
列)
将 _User
中 active
为 false 的 object 的 inactive
设置为 true
删除 _User
中的 active
列
如需配置 Slack 周报等,请在 Config
下新增 key
为 slack-stats
,value
为 { "startDayOfPeriod": 周报从星期几开始统计(0-6 数字), "channel": "slack channel id" }
创建 name 为 collaborator
的 _Role,ACL 为所有用户可读,role:customerService
可写。
导入 FAQ
FAQTranslation
FAQFeedback
FAQRevision
(富文本多语言)
运行 eval $(lean env) && cd next/api && npm install && node scripts/article-i18n-migration.mjs
进行数据迁移
如果是迁移过来的,将 FAQ
的 question
, FAQFeedback
FAQRevision
的 FAQ
这两个字段设置为非必须
重新导入 Ticket
(增加 parent
列)
导入 TicketFormNote
TicketFormNoteTranslation
运行 eval $(lean env) && cd next/api && npm install && node scripts/ticket-form-note-i18n.mjs
进行数据迁移
导入 TicketField.json,添加 pattern 列。
导入 Ticket.json,添加 language 列
导入 _User.json,将字符串格式的 permissions 改为数组格式。
注意!_User schema 各部署之间存在差异,请使用对应分支下的 _User.json!
- 导入 SupportEmail.json 和 SupportEmailMessage.json 创建两个新的 Class。
- 导入 Ticket.json 添加 clannel 列。
- 在控制台创建定时任务,名称可设为「检查客服邮箱」,云函数选择
checkSupportEmailMessage
,时间间隔设为 1 分钟。
导入 QuickReply.json,添加 tags 列。
导入 DurationMetrics.json,创建 DurationMetrics class。
导入 Category.json,添加 aliases 列。
导入 SupportEmail.json,添加 mailbox 列。
导入 FAQ.json,添加 publishedFrom 和 publishedTo 列。
运行 /next/api/scripts/migrate-private-article.js,根据提示输入应用信息,完成对未发布文章的迁移。
部署完成后删除 FAQTransilation 的 private 列,FAQ 的 private 列。
运行 eval $(lean env) && cd next/api && npm install && node scripts/view-conditions-migration.mjs
进行数据迁移
导入 View.jsonl
,新增 objectId
为 incoming
的内置视图
导入 ReplyRevision.json,创建 ReplyRevision class。
导入 Category.json,添加 article
、isTicketEnabled
、ticketDescription
列
导入 Group.json,添加 permissions
列
导入 Reply.json,创建 edited 列。
部署完成后运行 next/api/scripts/set-reply-edited-flag.js,根据提示完成对存量数据的迁移。
导入 data
TicketField.jsonl
,TicketFieldVariant.jsonl
:增加内置字段location
,isp
。
- 导入 Ticket.json,添加
closedAt
列。
- 导入 FAQTopic.json,添加 comment 列。
- 导入 MergeUserTask.json,创建新 Class。