1. Archery项目简介与Docker部署价值
Archery作为一款开源的SQL审核工具,在数据库运维领域已经形成了稳定的用户群体。它最初由去哪儿网团队开发,旨在解决多环境下的SQL审核、执行和权限管理问题。根据2023年开源社区调研数据,超过60%的中大型互联网企业都在使用或测试类似的SQL审核工具,而Archery因其良好的插件化架构和相对完善的工单流程,成为许多团队的首选方案。
为什么选择Docker部署?这要从传统部署方式的痛点说起。我曾参与过多个企业的Archery部署项目,最深刻的体会是:Python环境依赖、组件服务协调和配置同步这三大问题会消耗团队大量精力。特别是在升级版本时,不同服务器上的环境差异经常导致各种"玄学"问题。而Docker通过容器化技术将应用及其所有依赖打包,实现了"一次构建,处处运行"的理想状态。
具体到Archery项目,Docker部署带来三个核心优势:
- 环境一致性:开发、测试、生产环境使用完全相同的镜像,彻底告别"在我机器上是好的"这类问题
- 快速部署:新节点部署时间从小时级缩短到分钟级,特别适合多机房场景
- 资源隔离:MySQL、Redis等组件运行在独立容器中,避免端口冲突和资源抢占
提示:虽然Docker解决了部署问题,但Archery的生产环境使用还需要考虑高可用方案。通常建议至少部署两个实例,并通过Nginx做负载均衡。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前的环境准备
2.1 硬件与操作系统要求
根据Archery官方文档和实际压测经验,不同规模团队的建议配置如下:
| 团队规模 | CPU核心 | 内存 | 存储 | 预估工单处理能力 |
|---|---|---|---|---|
| 小型(<20人) | 2核 | 4GB | 50GB | 20工单/分钟 |
| 中型(20-100人) | 4核 | 8GB | 100GB | 50工单/分钟 |
| 大型(>100人) | 8核+ | 16GB+ | 200GB+ | 100+工单/分钟 |
操作系统方面,推荐使用以下经过充分测试的发行版:
- Ubuntu 20.04/22.04 LTS(最稳定选择)
- CentOS 7.9(需升级内核到3.10.0-1160+)
- Debian 11(需手动安装docker-compose插件)
2.2 Docker环境配置
对于首次接触Docker的运维人员,需要特别注意以下安装细节:
bash复制# Ubuntu示例安装步骤
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker run hello-world
常见问题处理:
- 虚拟化支持检测失败:在BIOS中启用VT-x/AMD-V技术,Windows用户需关闭Hyper-V
- 权限问题:将当前用户加入docker组后需重新登录
bash复制sudo usermod -aG docker $USER - 镜像源配置:创建或修改/etc/docker/daemon.json
json复制{ "registry-mirrors": ["https://registry.docker-cn.com"] }
2.3 依赖组件检查
Archery依赖的容器化服务包括:
- MySQL 5.7+(建议8.0+)
- Redis 4.0+
- 可选消息队列(RabbitMQ/Celery)
使用以下命令验证组件可用性:
bash复制docker pull mysql:8.0
docker pull redis:6-alpine
3. Archery Docker部署全流程
3.1 获取官方Docker镜像
推荐使用官方维护的镜像版本,同时做好版本控制:
bash复制# 拉取稳定版镜像
docker pull archerysec/archery:latest
# 指定版本(推荐生产环境使用)
docker pull archerysec/archery:v1.8.2
镜像内部结构解析:
/opt/archery:主程序目录/etc/archery:配置文件目录/var/log/archery:日志目录- 使用supervisord管理进程
3.2 docker-compose部署方案
对于生产环境,建议使用docker-compose编排多容器。以下是优化后的compose文件示例:
yaml复制version: '3'
services:
archery:
image: archerysec/archery:v1.8.2
container_name: archery
environment:
- DB_HOST=archery-mysql
- DB_PORT=3306
- DB_USER=archery
- DB_PASSWORD=StrongPassword123!
- REDIS_HOST=archery-redis
ports:
- "9123:9123"
volumes:
- ./archery_data:/opt/archery
- ./archery_logs:/var/log/archery
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
container_name: archery-mysql
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: RootPassword456!
MYSQL_DATABASE: archery
MYSQL_USER: archery
MYSQL_PASSWORD: ArcheryPass789!
volumes:
- ./mysql_data:/var/lib/mysql
redis:
image: redis:6-alpine
container_name: archery-redis
ports:
- "6379:6379"
volumes:
- ./redis_data:/data
关键配置说明:
- 网络隔离:所有容器默认加入同一网络,可通过服务名互访
- 数据持久化:通过volumes挂载关键数据目录
- 资源限制:建议为mysql容器添加资源限制
yaml复制deploy: resources: limits: cpus: '2' memory: 2G
启动命令:
bash复制docker-compose up -d # 后台启动
docker-compose logs -f archery # 跟踪日志
3.3 初始化配置
容器启动后,需要执行数据库迁移和初始化:
bash复制# 进入容器
docker exec -it archery /bin/bash
# 执行初始化
cd /opt/archery
python3 manage.py migrate # 数据库迁移
python3 manage.py createsuperuser # 创建管理员
python3 manage.py initial # 初始化数据
重要目录权限设置:
bash复制chmod -R 755 /var/log/archery
chown -R www-data:www-data /opt/archery
4. 生产环境调优与维护
4.1 性能优化配置
在config.yaml中调整以下参数:
yaml复制# 数据库连接池配置
DATABASE_POOL: {
"max_connections": 20,
"stale_timeout": 300
}
# 查询结果缓存
CACHE_CONFIG: {
"CACHE_TYPE": "RedisCache",
"CACHE_REDIS_URL": "redis://archery-redis:6379/1",
"CACHE_DEFAULT_TIMEOUT": 3600
}
# 工单处理线程数
WORKFLOW_THREADS: 8
4.2 监控与日志方案
推荐部署Prometheus监控指标:
yaml复制# 在compose文件中添加
monitor:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
日志收集建议采用ELK方案:
bash复制docker run --name filebeat -d \
--volume="./archery_logs:/var/log/archery" \
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
docker.elastic.co/beats/filebeat:8.2.0
4.3 备份与升级策略
数据库备份方案:
bash复制# 每日全量备份
docker exec archery-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup_$(date +%Y%m%d).sql
# 使用cron定时任务
0 2 * * * /usr/bin/docker exec archery-mysql sh -c 'exec mysqldump -uarchery -p"ArcheryPass789!" archery' > /backups/archery_$(date +\%Y\%m\%d).sql
升级注意事项:
- 先备份数据库和配置文件
- 拉取新版本镜像测试
- 执行数据库迁移命令
bash复制
python3 manage.py migrate
5. 常见问题排查指南
5.1 容器启动失败排查
典型错误及解决方案:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 端口冲突 | 已有服务占用9123端口 | 修改compose文件端口映射 |
| 数据库连接失败 | 密码错误/网络隔离 | 检查docker网络和连接字符串 |
| 权限拒绝 | 挂载目录权限问题 | chmod -R 755挂载目录 |
5.2 性能问题优化
工单处理缓慢的可能原因:
- Redis缓存未生效 - 检查config.yaml中的REDIS_HOST配置
- 数据库连接泄漏 - 增加连接池监控
- 未启用Celery异步 - 配置消息队列并启动worker
5.3 邮件通知配置
在settings.py中配置SMTP:
python复制EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'noreply@example.com'
EMAIL_HOST_PASSWORD = 'EmailPassword123!'
测试邮件发送:
bash复制python3 manage.py sendtestemail recipient@example.com
我在实际部署中发现,国内企业邮箱(如腾讯企业邮)需要特别注意:
- 使用SSL而非TLS
- 端口通常为465
- 可能需要单独申请SMTP权限
