• Archery SQL审核平台部署、使用与改造指南

     

    1. 概述

    Archery 是一个开源的 SQL 审核查询平台,旨在提升 DBA 和开发人员的协作效率,实现 SQL 审核的标准化、流程化和自动化。本文档将介绍基于 Docker Compose 的部署方式、基本使用方法,以及针对授权时间和邮件通知功能的定制化改造。

    1. Docker Compose 部署

    2.1 前提条件

    • 已安装 Docker 和 Docker Compose。
    • 服务器预留足够资源(建议 4GB 以上内存)。

    2.2 快速部署步骤

    1. 拉取代码
    Plain Text
    git clone https://github.com/hhyo/Archery.git
    cd Archery
    1. 修改配置
    2. 编辑 src/docker-compose/docker-compose.yml文件,根据实际情况调整以下配置:
    • MySQL/Redis 连接信息:根据需求使用已用的mysql、redis或一起部署archery及数据库和中间件。
    1. 启动服务,导出 common 目录,在 src/目录下执行:
    Plain Text
    docker compose up -d
    docker cp archery:/opt/archery/common ./archery/
    docker cp archery:/opt/archery/sql/templates ./archery/sql/
    1. 修改数据持久化卷,为了方便后续改造建议添加以下目录挂载
    Shell
    volumes:
    – “./archery/common:/opt/archery/common”
    1. 重启服务
    Shell
    docker compose down
    docker compose up -d
    1. 等待容器启动后,执行数据库初始化(首次部署必须执行):
    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
    1. 创建管理员账户
    Plain Text
    python3 manage.py createsuperuser
    1. 访问平台打开浏览器,访问 http://服务器IP:9123。使用上一步创建的管理员账号登录。
    2. 相关配置

    3.1 系统配置

    登录后,在“系统管理” > “配置项管理”中,选择系统设置,配置数据库备份、邮件服务器、消息通知等。

    1. goInception 配置(用于对修改的数据进行备份,已集成在 docker-compose.yaml 中)
    • GO_INCEPTION_HOST/GO_INCEPTION_PORTgoinception服务的ip和端口
    • BACKUP_HOST/BACKUP_PORTmysql服务的ip和端口
    • BACKUP_USER/BACKUP_PASSWORDmysql的root账户和密码

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

    1. 工单通知
    • ARCHERY_BASE_URLhttp://archery.internal.cn(绑定的域名)
    • DDL_NOTIFY_AUTH_GROUPDBA(DDL工单通知权限组)

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

    3.2 工单审核流程配置

    在“系统管理” > “配置项管理”中,选择工单审核流配置,配置指定资源组的相关工单审核流程(需要先创建资源组)。

    • 分别配置查询权限申请流程、SQL上线申请流程、数据归档申请流程,可以指定多组依次审批,这里以DBA示例

    1. 使用流程
    2. 创建资源组,比如prod

    1. 修改Default组权限:

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

    1. 添加数据库实例

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

    1. 创建用户

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

    1. 用户登录后进行在线查询

    1. 缺少权限则提交申请

    1. 定制化改造

    5.1 调整查询权限的授权时间选项

    Archery 在申请查询权限时,授权时间选项的默认值可能缺少更灵活的选项,长期授权时间为一年,时间太长。

    改造目标

    1. 将“长期(一年)”选项调整为“三个月”。

    改造步骤

    1. 修改前端 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>
    1. 修改对应的 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端口为例。

    改造步骤

    1. 修改 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)  # 默认开启 TLS

    if 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 = 25

    def 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},继续使用普通连接”)

    1. 在 Archery 管理界面配置TLS邮件

    在“系统管理” > “配置项管理”中,选择系统设置,在工单通知内配置以下内容:

    • MAIL切到ON以开启邮件通知
    • MAIL_SSL切到OFF以关闭SSL
    • MAIL_SMTP_SERVERSMTP 服务器地址
    • MAIL_SMTP_PORT587 (这里以 outlook 的587端口为例)
    • MAIL_SMTP_USER/MAIL_SMTP_PASSWORD发件邮箱地址和密码
    1. 测试邮件功能

    在MAIL配置开关旁边,使用“测试连接”功能发送邮件,检查是否能够成功接收。

    1. 总结

    本文提供了通过 Docker Compose 一键部署 Archery 的详细步骤,简述了核心使用流程,并针对“查询授权时间调整”和“邮件 TLS 支持”两个常见需求给出了具体的代码改造方案。

    «
以专业成就每一位客户,让企业IT只为效果和安全买单

以专业成就每一位客户,让企业IT只为效果和安全买单

在线咨询
连接中...