-
Archery SQL审核平台部署、使用与改造指南
- 概述
Archery 是一个开源的 SQL 审核查询平台,旨在提升 DBA 和开发人员的协作效率,实现 SQL 审核的标准化、流程化和自动化。本文档将介绍基于 Docker Compose 的部署方式、基本使用方法,以及针对授权时间和邮件通知功能的定制化改造。
- Docker Compose 部署
2.1 前提条件
- 已安装 Docker 和 Docker Compose。
- 服务器预留足够资源(建议 4GB 以上内存)。
2.2 快速部署步骤
- 拉取代码
Plain Text
git clone https://github.com/hhyo/Archery.git
cd Archery- 修改配置
- 编辑 src/docker-compose/docker-compose.yml文件,根据实际情况调整以下配置:
- MySQL/Redis 连接信息:根据需求使用已用的mysql、redis或一起部署archery及数据库和中间件。
- 启动服务,导出 common 目录,在 src/目录下执行:
Plain Text
docker compose up -d
docker cp archery:/opt/archery/common ./archery/
docker cp archery:/opt/archery/sql/templates ./archery/sql/- 修改数据持久化卷,为了方便后续改造建议添加以下目录挂载
Shell
volumes:
– “./archery/common:/opt/archery/common”- 重启服务
Shell
docker compose down
docker compose up -d- 等待容器启动后,执行数据库初始化(首次部署必须执行):
Plain Text
docker exec -ti archery /bin/bash
cd /opt/archery
source /opt/venv4archery/bin/activate
python3 manage.py makemigrations sql
python3 manage.py migrate
python3 manage.py dbshell<sql/fixtures/auth_group.sql
python3 manage.py dbshell<src/init_sql/mysql_slow_query_review.sql- 创建管理员账户
Plain Text
python3 manage.py createsuperuser- 访问平台,打开浏览器,访问 http://服务器IP:9123。使用上一步创建的管理员账号登录。
- 相关配置
3.1 系统配置
登录后,在“系统管理” > “配置项管理”中,选择系统设置,配置数据库备份、邮件服务器、消息通知等。
- goInception 配置(用于对修改的数据进行备份,已集成在 docker-compose.yaml 中)
- GO_INCEPTION_HOST/GO_INCEPTION_PORT:goinception服务的ip和端口
- BACKUP_HOST/BACKUP_PORT:mysql服务的ip和端口
- BACKUP_USER/BACKUP_PASSWORD:mysql的root账户和密码

- SQL优化
- SQLAdvisor:利用美团SQLAdvisor对收集的慢日志进行优化,一键获取优化建议,docker镜像已包含。
- SOAR:一个对SQL进行优化和改写的自动化工具,由小米人工智能与云平台的数据库团队开发与维护,docker镜像已包含。
- SQLADVISOR_PATH:/opt/archery/src/plugins/sqladvisor
- SOAR_PATH:/opt/archery/src/plugins/soar
- SOAR_TEST_DSN:root:xxxxx@服务器ip:3306/archery

- 工单通知
- ARCHERY_BASE_URL:http://archery.internal.cn(绑定的域名)
- DDL_NOTIFY_AUTH_GROUP:DBA(DDL工单通知权限组)

- 其他配置
- MY2SQL:通过多线程以更高的性能快速解析binlog。支持回滚、去除主键、去db前缀及分表输出文件等多种解析模式,并拥有完备的过滤筛选项,支持异步获取文件,并且通知执行结果,docker镜像已包含。
- MY2SQL:/opt/archery/src/plugins/my2sql
- DEFAULT_AUTH_GROUP:Default(新用户默认权限组)
- DEFAULT_RESOURCE_GROUP:prod(新用户默认资源组)
- CUSTOM_TITLE_SUFFIX:XXXXX数据库管控平台(网站标题自定义)

3.2 工单审核流程配置
在“系统管理” > “配置项管理”中,选择工单审核流配置,配置指定资源组的相关工单审核流程(需要先创建资源组)。
- 分别配置查询权限申请流程、SQL上线申请流程、数据归档申请流程,可以指定多组依次审批,这里以DBA示例

- 使用流程
- 创建资源组,比如prod

- 修改Default组权限:
添加peimission下的菜单(数据字典、sql查询、权限管理、在线查询)和提交(sql查询、sql上线工单)的相关权限

- 添加数据库实例
选择数据库类型,是主库还是从库,输入连接地址、端口和账户信息,取消勾选验证服务端SSL证书,输入字符集,配置到prod资源组

- 创建用户
输入用户名密码,勾选“有效”,配置权限组为Default,配置资源组为prod

- 用户登录后进行在线查询

- 缺少权限则提交申请

- 定制化改造
5.1 调整查询权限的授权时间选项
Archery 在申请查询权限时,授权时间选项的默认值可能缺少更灵活的选项,长期授权时间为一年,时间太长。
改造目标:
- 将“长期(一年)”选项调整为“三个月”。
改造步骤:
- 修改前端 HTML 模板
找到文件 ./archery/sql/templates/queryapplylist.html,定位到授权时间部分,进行如下修改:
Plain Text
<div class=”form-group”>
<select id=”valid_date” name=”valid_date”
title=”请选择授权时间:”
class=”form-control selectpicker show-tick bs-select-hidden “>
<option value=”day”>一天</option>
<option value=”week”>一周</option>
<option value=”month”>一月</option>
<option value=”year”>三月</option>
</select>
</div>- 修改对应的 JavaScript 逻辑
在同一文件中,找到处理 applyvalidate()函数中 valid_date的部分,修改时间计算逻辑将year实际时间修改为90天
Plain Text
if (applyvalidate()) {
//时间格式化
var date = new Date();
if (valid_date === ‘day’) {
valid_date = addDate(date, 1);} else if (valid_date === ‘week’) {
valid_date = addDate(date, 7);
} else if (valid_date === ‘month’) {
valid_date = addDate(date, 30);
} else if (valid_date === ‘year’) {
valid_date = addDate(date, 90);
} else {
valid_date = addDate(date, 1);
}- 修改后需重启 Archery 的 Web 服务(如 docker compose restart archery)。
5.2 使邮件通知支持 TLS 加密
部分邮箱使用的加密为 TLS,需要改造 Archery 来添加 TLS 支持。
改造目标:使用 TLS 加密发送邮件,这里以 outlook 的587端口为例。
改造步骤:
- 修改 MsgSender 类
修改文件 ./archery/common/utils/sendmsg.py中的 MsgSender类的 init和 send_email方法:
Plain Text
class MsgSender(object):
def __init__(self, **kwargs):
if kwargs:
…
self.MAIL_TLS = kwargs.get(“tls”, True) # 默认开启 TLS
else:
sys_config = SysConfig()
# email信息
…
self.MAIL_TLS = sys_config.get(“mail_tls”, True) # 默认开启 TLSif self.MAIL_REVIEW_SMTP_PORT:
self.MAIL_REVIEW_SMTP_PORT = int(self.MAIL_REVIEW_SMTP_PORT)
elif self.MAIL_SSL:
self.MAIL_REVIEW_SMTP_PORT = 465
elif self.MAIL_TLS:
self.MAIL_REVIEW_SMTP_PORT = 587 # TLS 默认端口
else:
self.MAIL_REVIEW_SMTP_PORT = 25def send_email(self, subject, body, to, **kwargs):
…
if self.MAIL_SSL:
server = smtplib.SMTP_SSL(
self.MAIL_REVIEW_SMTP_SERVER, self.MAIL_REVIEW_SMTP_PORT, timeout=3
)
else:
server = smtplib.SMTP(
self.MAIL_REVIEW_SMTP_SERVER, self.MAIL_REVIEW_SMTP_PORT, timeout=30
)if kwargs.get(“debug”, False):
server.set_debuglevel(1)if self.MAIL_TLS:
try:
server.starttls() # 启用 TLS 加密
logger.debug(“TLS 加密已启用”)
except Exception as e:
logger.warning(f”TLS 启动失败: {e},继续使用普通连接”)- 在 Archery 管理界面配置TLS邮件
在“系统管理” > “配置项管理”中,选择系统设置,在工单通知内配置以下内容:
- MAIL:切到ON以开启邮件通知
- MAIL_SSL:切到OFF以关闭SSL
- MAIL_SMTP_SERVER:SMTP 服务器地址
- MAIL_SMTP_PORT:587 (这里以 outlook 的587端口为例)
- MAIL_SMTP_USER/MAIL_SMTP_PASSWORD:发件邮箱地址和密码
- 测试邮件功能
在MAIL配置开关旁边,使用“测试连接”功能发送邮件,检查是否能够成功接收。
- 总结
本文提供了通过 Docker Compose 一键部署 Archery 的详细步骤,简述了核心使用流程,并针对“查询授权时间调整”和“邮件 TLS 支持”两个常见需求给出了具体的代码改造方案。