{"id":13694958,"url":"https://github.com/jly8866/archer","last_synced_at":"2025-05-15T12:04:57.188Z","repository":{"id":17623112,"uuid":"75372871","full_name":"jly8866/archer","owner":"jly8866","description":"基于inception的自动化SQL操作平台，支持SQL执行、LDAP认证、发邮件、OSC、SQL查询、SQL优化建议、权限管理等功能，支持docker镜像","archived":false,"fork":false,"pushed_at":"2023-07-25T21:51:06.000Z","size":9386,"stargazers_count":1569,"open_issues_count":36,"forks_count":639,"subscribers_count":83,"default_branch":"master","last_synced_at":"2025-04-08T02:38:31.278Z","etag":null,"topics":["devops","django","inception","mysql","python","sql","web"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jly8866.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2016-12-02T07:42:07.000Z","updated_at":"2025-03-27T04:09:41.000Z","dependencies_parsed_at":"2023-01-11T20:26:58.623Z","dependency_job_id":"c8a27a5a-41ae-499a-bf97-6c5ab62bd1bd","html_url":"https://github.com/jly8866/archer","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jly8866%2Farcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jly8866%2Farcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jly8866%2Farcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jly8866%2Farcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jly8866","download_url":"https://codeload.github.com/jly8866/archer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254337612,"owners_count":22054253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devops","django","inception","mysql","python","sql","web"],"created_at":"2024-08-02T17:01:52.750Z","updated_at":"2025-05-15T12:04:52.170Z","avatar_url":"https://github.com/jly8866.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# archer\n基于inception的自动化SQL操作平台，支持工单、审核、定时任务、邮件、OSC等功能，还可配置MySQL查询、慢查询管理、会话管理等\n\n****\n## 目录\n* [主要功能](#主要功能)\n* [设计规范](#设计规范)\n* [在线体验](#系统体验)\n* [安装](#采取docker部署)\n    * [docker部署](#采取docker部署)\n    * [手动安装](#手动安装步骤)\n* [运行](#启动前准备)\n* [功能集成](#其他功能集成) \n    * [在线查询\u0026脱敏查询](#在线查询)\n    * [慢日志管理](#慢日志管理)\n    * [SQL优化工具](#sqladvisor优化工具)\n    * [阿里云rds管理](#阿里云rds管理)\n* [Q\u0026A](#部分问题解决办法 )\n\n### 开发语言和推荐环境\n    python3.4及以上  \n    django1.8.17  \n    mysql : 5.6及以上  \n    linux : 64位linux操作系统均可  \n\n## 主要功能\n* 自动审核  \n  发起SQL上线，工单提交，由inception自动审核，审核通过后需要由审核人进行人工审核\n* 人工审核  \n  inception自动审核通过的工单，由其他研发工程师或研发经理来审核，DBA操作执行SQL  \n  为什么要有人工审核？  \n  这是遵循运维领域线上操作的流程意识，一个工程师要进行线上数据库SQL更新，最好由另外一个工程师来把关  \n  很多时候DBA并不知道SQL的业务含义，所以人工审核最好由其他研发工程师或研发经理来审核. 这是archer的设计理念\n* 回滚数据展示  \n  工单内可展示回滚语句，支持一键提交回滚工单\n* 定时执行SQL  \n  审核通过的工单可由DBA选择定时执行，执行前可修改执行时间，可随时终止\n* pt-osc执行  \n  支持pt-osc执行进度展示，并且可以点击中止pt-osc进程  \n* MySQL查询  \n  库、表、关键字自动补全  \n  查询结果集限制、查询结果导出、表结构展示、多结果集展示  \n* MySQL查询权限管理  \n  基于inception解析查询语句，查询权限支持限制到表级  \n  查询权限申请、审核和管理，支持审核流程配置，多级审核  \n* MySQL查询动态脱敏   \n  基于inception解析查询语句，配合脱敏字段配置、脱敏规则(正则表达式)实现敏感数据动态脱敏  \n* 慢日志管理  \n  基于percona-toolkit的pt_query_digest分析和存储慢日志，并在web端展现  \n* 邮件通知  \n  可配置邮件提醒，对上线申请、权限申请、审核结果等进行通知  \n  对异常登录进行通知\n\n## 设计规范\n* 合理的数据库设计和规范很有必要，尤其是MySQL数据库，内核没有oracle、db2、SQL Server等数据库这么强大，需要合理设计，扬长避短。互联网业界有成熟的MySQL设计规范，特此撰写如下。请读者在公司上线使用archer系统之前由专业DBA给所有后端开发人员培训一下此规范，做到知其然且知其所以然。  \n下载链接  https://github.com/jly8866/archer/blob/master/src/docs/mysql_db_design_guide.md\n\n## 主要配置文件\n* archer/archer/settings.py  \n\n## 采取docker部署\n* docker镜像，参考wiki\n    * inception镜像: https://hub.docker.com/r/hhyo/inception    \n    * archer镜像: https://hub.docker.com/r/hhyo/archer     \n* docker镜像制作感谢@小圈圈 提供\n\n## 手动安装步骤\n1. 环境准备  \n- 克隆代码到本地或者下载zip包  \n    `git clone https://github.com/jly8866/archer.git`   \n- 安装inception  \n[项目地址](https://github.com/hhyo/inception)  \n2. 安装python3，版本号\u003e=3.4(由于需要修改官方模块，请使用virtualenv或venv等单独隔离环境！)\n    ```\n    pip3 install virtualenv\n    virtualenv venv4archer --python=python3.4\n    ```\n3. 安装所需相关模块 \n    ```\n    source venv4archer/bin/activate\n    pip3 install -r requirements.txt\n    ```\n4. pymysql模块兼容inception版本信息  \n使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/对应文件\n\n## 启动前准备\n1. 创建archer本身的数据库表  \n- 修改archer/archer/settings.py所有的地址信息，包括DATABASES和INCEPTION_XXX部分  \n- 通过model创建archer本身的数据库表，如果是现有版本升级请使用src/init_sql内的变更脚本变更数据库  \n原v1.1.1分支请使用v1.1.1-\u003ev2.0.sql变更   \n原master分支请使用master-\u003ev2.0.sql变更   \n全新安装请使用如下方式初始化  \n    ```\n    python3 manage.py makemigrations sql  \n    python3 manage.py migrate \n    ```\n2. 创建admin系统root用户（该用户可以登录django admin来管理model）  \n    ```python3 manage.py createsuperuser```  \n3. 启动，有两种方式  \n(1)用django内置runserver启动服务，建议不要在生产环境使用   \n    ```bash debug.sh```  \n(2)用gunicorn+nginx启动服务  \n    安装模块`pip3 install gunicorn==19.7.1`  \n    nginx配置示例  \n    ```\n    server{\n            listen 9123; #监听的端口\n            server_name archer;\n            proxy_read_timeout 600s;  #超时时间与gunicorn超时时间设置一致，主要用于在线查询\n\n            location / {\n              proxy_pass http://127.0.0.1:8888;\n              proxy_set_header Host $host:9123; #解决重定向404的问题\n              proxy_set_header X-Real-IP $remote_addr;\n              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n              proxy_set_header X-Forwarded-Proto $scheme;\n            }\n\n            location /static {\n              alias /archer/static; #此处指向settings.py配置项STATIC_ROOT目录的绝对路径，用于nginx收集静态资源\n            }\n\n            error_page 404 /404.html;\n                location = /40x.html {\n            }\n\n            error_page 500 502 503 504 /50x.html;\n                location = /50x.html {\n            }\n        } \n    ```\n    启动  `bash startup.sh`\n4. 正式访问  \n    使用上面创建的管理员账号登录`http://X.X.X.X:port/login/`   \n    \n## 其他功能集成\n### 在线查询\n1. settings中QUERY改为True  \n2. 到【后台数据管理】-【从库地址配置】页面添加从库信息  \n3. 到【后台数据管理】-【工作流配置】页面配置审核流程   \n4. 用户申请权限、审核通过后即可进行在线查询  \n5. 如需要使用动态脱敏，请将settings中DATA_MASKING_ON_OFF改为True，并且到【后台数据管理】-【脱敏配置】页面配置脱敏规则和字段   \n\n### 慢日志管理\n1. settings中SLOWQUERY改为True  \n2. 安装percona-toolkit（版本=3.0.6），以centos为例   \n    ```\n    yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm \n    yum -y install percona-toolkit.x86_64 \n    ```\n3. 使用src/script/mysql_slow_query_review.sql创建慢日志收集表到archer数据库\n4. 将src/script/analysis_slow_query.sh部署到各个监控机器，注意修改脚本里面的 `hostname=\"${mysql_host}:${mysql_port}\" `与archer主库配置信息一致，否则将无法筛选到相关记录\n\n### SQLAdvisor优化工具\n1. 安装SQLAdvisor，[项目地址](https://github.com/Meituan-Dianping/SQLAdvisor)\n2. 修改配置文件SQLADVISOR为程序路径，路径需要完整，如'/opt/SQLAdvisor/sqladvisor/sqladvisor'  \n\n### 阿里云rds管理  \n1. 修改配置文件ALIYUN_RDS_MANAGE=True\n2. 安装模块\n    ```\n    pip3 install aliyun-python-sdk-core==2.3.5\n    pip3 install aliyun-python-sdk-core-v3==2.5.3\n    pip3 install aliyun-python-sdk-rds==2.1.1\n    ```\n3. 在【后台数据管理】-【阿里云认证信息】页面，添加阿里云账号的accesskey信息，重新启动服务  \n4. 在【后台数据管理】-【阿里云rds配置】页面，添加实例信息，即可实现对阿里云rds的进程管理、慢日志管理 \n\n### admin后台加固，防暴力破解\n1. patch目录下，名称为django_1.8.17_admin_secure_archer.patch\n2. 使用命令\n    ```\n    patch  python/site-packages/django/contrib/auth/views.py django_1.8.17_admin_secure_archer.patch\n    ```\n\n### 集成ldap\n1. 修改配置文件ENABLE_LDAP=True，安装相关模块，可以启用ldap账号登录，以centos为例\n    ```\n    yum install openldap-devel\n    pip install django-auth-ldap==1.3.0\n    ```\n2. 如果使用了ldaps，并且是自签名证书，需要打开settings中AUTH_LDAP_GLOBAL_OPTIONS的注释  \n3. settings中以AUTH_LDAP开头的配置，需要根据自己的ldap对应修改     \n\n\n## 系统体验\n[点击体验](http://139.199.0.191:9123/)\n  \n|  角色 | 账号 | 密码 |\n| --- | --- | --- |\n|  管理员| archer | archer |\n|  工程师| engineer | archer |\n|  审核人| auditor | archer |\n|  DBA| dba | archer |\n\n## 部分问题解决办法  \n### 查看错误日志\n```/tmp/default.log \u0026  /tmp/archer.err```\n#### 页面样式显示异常  \n- **runserver/debug.sh启动**  \nsettings里面关闭了debug，即DEBUG = False，需要在启动命令后面增加 --insecure，变成  \n- **nginx+gunicorn/startup.sh启动**  \nnginx的静态资源配置不正确   \n    ```\n    location /static {\n                  alias /archer/static; #此处指向settings.py配置项STATIC_ROOT目录的绝对路径，用于nginx收集静态资源，一般默认为archer按照目录下的static目录\n                }\n    ```\n#### 用户管理  \n- 偶现添加用户报错  \n采用nginx+gunicorn/startup.sh启动，多worker的部署可能出现，目前问题没有解决 \n- 无法登录（确认用户名和密码正确）  \n检查用户is_active字段是否为1\n\n#### SQL上线\n- 集群不显示数据库  \narcher会默认过滤一些系统数据库，过滤列表为`'information_schema', 'performance_schema', 'mysql', 'test', 'sys'`  \n\n- 审核人不显示  \n没有为审核人/DBA角色的有效用户    \n\n- 审核通过后没有执行按钮  \narcher的SQL上线流程为：工程师提交SQL-\u003e审核人审核-\u003eDBA执行，审核人只能审核归属自己审核的数据，DBA执行全部数据\n\n#### 检测SQL报错  \n- **invalid literal for int() with base 10:'Inception2'**    \n调整pymysql使其兼容Inception版本信息，  \n使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/目录下的文件  \n- **invalid source infomation**  \ninception用来审核的账号，密码不能包含*  \n- **Must start as begin statement**    \npython3的pymysql模块会向inception发送SHOW WARNINGS语句，导致inception返回一个\"Must start as begin statement\"错误被archer捕捉到报在日志里  \n使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/目录下的文件  \n- **Incorrect database name ''**  \ninception检查不支持子查询  \n- **Invalid remote backup information**  \ninception无法连接备份库\n\n#### 无法生成回滚语句\n- 检查配置文件里面inception相关配置  \n- 检查inception审核用户和备份用户权限，权限参考    \n    ```\n    — inception备份用户\n    GRANT SELECT, INSERT, CREATE ON *.* TO 'inception_bak'\n    — inception审核用户（主库配置用户，如果要使用会话管理需要赋予SUPER权限，如果需要使用OSC，请额外配置权限）\n    GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER,REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'inception'\n    — archer在线查询用户（从库配置用户）\n    GRANT SELECT ON *.* TO 'archer_read'\n    ```\n- 检查binlog格式，需要为ROW，binlog_row_image为FULL  \n- 检查DML的表是否存在主键   \n- 检查语句是否有影响数据  \n- 检查备份库是否开启autocommit  \n- 检查是否为连表更新语句  \n- 检查执行实例是否为mysql  \n\n#### 脱敏规则未生效\n- 检查脱敏字段是否命中（是否区分大小写）\n- 检查脱敏规则的正则表达式是否可以匹配到数据，无法匹配的会返回原结果\n- 检查是否关闭了CHECK_QUERY_ON_OFF参数，导致inception无法解析的语句未脱敏直接返回结果    \n脱敏规则配置参考  \n\n| 规则类型 | 规则脱敏所用的正则表达式，表达式必须分组，隐藏的组会使用****代替 | 需要隐藏的组 | 规则描述 |\n| --- | --- | --- | --- |\n| 手机号 | (.{3})(.*)(.{4}) | 2 | 保留前三后四|\n| 证件号码 | (.*)(.{4})$ | 2 | 隐藏后四位|\n| 银行卡 | (.*)(.{4})$ | 2 | 隐藏后四位|\n| 邮箱 | (.\\*)@(.\\*) | 2 | 去除后缀|\n\n#### 审核人看不到查询权限申请待审核工单  \n查询权限申请待办列表被隐藏至右上角的消息图标中，当有待审核信息时会显示图标，可以进入查看待办数据  \n\n#### 慢日志不显示\n- 检查脚本内的配置，hostname和archer主库配置内容保持一致，用于archer做筛选  \n- 检查mysql_slow_query_review_history表收集的日志信息hostname_max是否和hostname一致  \n\n#### 定时任务未执行   \n- 检查django-apscheduler相关表是否有创建，可使用`python3 manage.py migrate`创建  \n\n## 联系方式\n* QQ群1群524233225（已满）\n* QQ群2群669833720\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjly8866%2Farcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjly8866%2Farcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjly8866%2Farcher/lists"}