docker-compose一键部署doccano:企业级标注平台搭建指南
引言:标注平台的企业级挑战与解决方案
你是否还在为团队协作标注数据而烦恼?手动搭建标注系统耗时费力,数据安全难以保障,多用户协作效率低下?本文将带你通过docker-compose一键部署企业级标注平台doccano,解决数据标注过程中的协作难题,提升标注效率。读完本文,你将掌握:
- doccano企业级部署的完整流程
- 关键配置参数的优化策略
- 多用户协作与权限管理技巧
- 数据安全与备份方案
- 平台监控与性能调优方法
1. 什么是doccano?
doccano是一款面向机器学习从业者的开源标注工具(Open source annotation tool for machine learning practitioners),支持文本分类、序列标注、关系抽取等多种标注任务,提供直观的用户界面和强大的协作功能,是企业构建标注流水线的理想选择。
2. 企业级部署优势
| 部署方式 | 复杂度 | 可维护性 | 扩展性 | 安全性 | 推荐度 |
|---|---|---|---|---|---|
| 源码部署 | 高 | 低 | 中 | 低 | ⭐⭐ |
| 单容器部署 | 低 | 中 | 低 | 中 | ⭐⭐⭐ |
| docker-compose部署 | 中 | 高 | 高 | 高 | ⭐⭐⭐⭐⭐ |
docker-compose部署通过容器化技术将doccano的各个组件(后端服务、数据库、消息队列、前端等)有机整合,实现一键部署、配置灵活、易于维护的企业级应用。
3. 部署准备工作
3.1 系统要求
- 操作系统:Linux/Unix(推荐Ubuntu 20.04+)
- 内存:至少4GB(生产环境建议8GB+)
- 磁盘空间:至少20GB可用空间
- Docker版本:20.10+
- Docker Compose版本:v2.0+
3.2 环境检查
# 检查Docker是否安装
docker --version
# 检查Docker Compose是否安装
docker compose version
若未安装Docker和Docker Compose,请先执行以下命令安装:
# 安装Docker
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
3.3 网络端口规划
doccano部署将使用以下端口,确保这些端口未被占用或在防火墙中开放:
- 80:Web应用端口(Nginx前端)
- 5432:PostgreSQL数据库端口(内部使用)
- 5672:RabbitMQ消息队列端口(内部使用)
- 5555:Celery监控工具Flower端口(可选)
4. 一键部署步骤
4.1 获取项目代码
# 克隆doccano仓库
git clone https://gitcode.com/gh_mirrors/do/doccano
cd doccano
4.2 配置环境变量
# 进入docker目录
cd docker
# 复制环境变量示例文件
cp .env.example .env
# 编辑环境变量文件
vi .env
关键配置参数说明:
# 平台管理员设置(必填)
ADMIN_USERNAME=admin # 管理员用户名
ADMIN_PASSWORD=your_strong_password # 管理员密码(建议至少8位,包含大小写字母、数字和特殊符号)
ADMIN_EMAIL=admin@company.com # 管理员邮箱
# RabbitMQ消息队列设置(内部组件通信)
RABBITMQ_DEFAULT_USER=doccano # RabbitMQ用户名
RABBITMQ_DEFAULT_PASS=doccano # RabbitMQ密码
# PostgreSQL数据库设置
POSTGRES_USER=doccano # 数据库用户名
POSTGRES_PASSWORD=doccano # 数据库密码
POSTGRES_DB=doccano # 数据库名称
# Flower监控设置(可选,如需启用请配置)
FLOWER_BASIC_AUTH=flower_user:strong_password # Flower访问认证,格式:用户名:密码
4.3 启动服务
# 后台启动所有服务
docker-compose -f docker-compose.prod.yml --env-file .env up -d
启动过程需要下载相关镜像,根据网络情况可能需要5-10分钟。成功启动后,会看到类似以下输出:
Creating network doccano_network-backend ... done
Creating network doccano_network-frontend ... done
Creating doccano_postgres_1 ... done
Creating doccano_rabbitmq_1 ... done
Creating doccano_backend_1 ... done
Creating doccano_celery_1 ... done
Creating doccano_flower_1 ... done
Creating doccano_nginx_1 ... done
4.4 验证部署
# 检查容器状态
docker-compose -f docker-compose.prod.yml ps
所有服务状态应为"Up"。此时,访问服务器IP地址(无需端口,默认80端口)即可打开doccano登录页面:
http://服务器IP地址
使用配置的管理员用户名和密码登录系统。
5. 企业级配置优化
5.1 持久化存储配置
docker-compose.prod.yml中已默认配置数据持久化,关键数据将存储在以下卷中:
volumes:
postgres_data: # PostgreSQL数据库数据
static_volume: # 静态资源文件
media: # 用户上传的媒体文件
tmp_file: # 临时文件存储
如需自定义存储路径,可修改为:
volumes:
postgres_data:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '/path/to/your/postgres_data' # 替换为实际路径
# 其他卷类似
5.2 安全加固
5.2.1 修改默认密码
.env文件中所有默认密码(ADMIN_PASSWORD、RABBITMQ_DEFAULT_PASS、POSTGRES_PASSWORD)必须修改为强密码。
5.2.2 配置HTTPS(推荐)
- 准备SSL证书(可通过Let's Encrypt免费获取)
- 修改nginx配置:
# 编辑nginx配置模板
vi docker/nginx/nginx.conf.template
添加HTTPS配置:
server {
listen 443 ssl;
server_name your-domain.com; # 替换为你的域名
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# SSL相关配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 其他配置与80端口类似,将API_URL修改为https
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://backend:8000/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 其他location配置...
}
- 修改docker-compose.prod.yml,添加SSL证书挂载:
nginx:
image: doccano/doccano:frontend
# ...其他配置
volumes:
- static_volume:/static
- media:/media
- ./nginx/ssl:/etc/nginx/ssl # 添加SSL证书挂载
ports:
- 80:8080
- 443:443 # 添加HTTPS端口映射
# ...其他配置
5.3 性能优化
5.3.1 调整资源限制
根据服务器配置,适当调整各容器的资源限制:
services:
backend:
# ...其他配置
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G
celery:
# ...其他配置
deploy:
resources:
limits:
cpus: '4' # Celery处理任务,可适当增加CPU资源
memory: 4G
reservations:
cpus: '2'
memory: 2G
postgres:
# ...其他配置
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
5.3.2 数据库优化
对于大规模标注任务,建议修改PostgreSQL配置:
postgres:
image: postgres:13.3-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
- ./postgres.conf:/var/lib/postgresql/data/postgresql.conf # 挂载自定义配置文件
environment:
POSTGRES_USER: "${POSTGRES_USER}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
POSTGRES_DB: "${POSTGRES_DB}"
command: postgres -c config_file=/var/lib/postgresql/data/postgresql.conf # 指定配置文件
networks:
- network-backend
6. 平台使用指南
6.1 登录系统
访问部署好的doccano平台(http://服务器IP或https://你的域名),使用管理员账号登录:
![登录界面示意图]
6.2 创建项目
- 点击"Create Project"按钮
- 填写项目信息:
- Name: 项目名称(如"产品评论情感分析")
- Description: 项目描述
- Task Type: 选择任务类型(文本分类、序列标注、关系抽取等)
![创建项目示意图]
6.3 导入数据集
- 进入项目后,点击"Actions" > "Import Dataset"
- 选择文件格式(支持JSON、CSV、TXT等)
- 上传数据集文件
支持的导入格式示例(JSON):
{"text": "这款手机续航能力很强,值得推荐!"}
{"text": "屏幕显示效果出色,但价格偏高。"}
6.4 定义标签
- 点击左侧菜单"Labels"
- 点击"Add Label"按钮
- 设置标签信息:
- Label Text: 标签名称(如"正面"、"负面")
- Shortcut Key: 快捷键(方便标注)
- Background Color: 背景颜色
- Text Color: 文本颜色
![定义标签示意图]
6.5 添加成员与权限管理
- 点击左侧菜单"Members"
- 点击"Add"按钮
- 选择用户并分配角色:
- Admin: 项目管理员,拥有所有权限
- Annotator: 标注员,只能进行标注操作
- Reviewer: 审核员,可审核标注结果
6.6 开始标注
- 点击"Start Annotation"进入标注界面
- 根据任务类型进行标注:
- 文本分类:选择对应的标签
- 序列标注:选中文本片段并分配标签
- 关系抽取:先标注实体,再标注实体间关系
![标注界面示意图]
6.7 导出标注结果
- 点击"Actions" > "Export Dataset"
- 选择导出格式(JSON、CSV、CoNLL等)
- 点击"Export"按钮下载标注结果
导出的JSON格式示例:
{"doc_id": 1, "text": "这款手机续航能力很强,值得推荐!", "label": ["正面"], "username": "annotator1"}
{"doc_id": 2, "text": "屏幕显示效果出色,但价格偏高。", "label": ["中性"], "username": "annotator2"}
7. 运维与管理
7.1 服务监控
7.1.1 容器状态监控
# 查看容器状态
docker-compose -f docker-compose.prod.yml ps
# 查看服务日志
docker-compose -f docker-compose.prod.yml logs -f backend # 查看后端服务日志
docker-compose -f docker-compose.prod.yml logs -f celery # 查看任务队列日志
docker-compose -f docker-compose.prod.yml logs -f postgres # 查看数据库日志
7.1.2 使用Flower监控任务
如果配置了FLOWER_BASIC_AUTH,可通过http://服务器IP:5555访问Flower监控界面,查看Celery任务执行情况。
7.2 数据备份
# 创建备份脚本 backup.sh
#!/bin/bash
BACKUP_DIR="/path/to/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份数据库
docker exec doccano_postgres_1 pg_dump -U doccano doccano > $BACKUP_DIR/doccano_db_$TIMESTAMP.sql
# 备份媒体文件
tar -czf $BACKUP_DIR/doccano_media_$TIMESTAMP.tar.gz -C ./docker media
# 保留最近30天的备份
find $BACKUP_DIR -type f -mtime +30 -delete
添加执行权限并设置定时任务:
chmod +x backup.sh
crontab -e
# 添加以下内容,每天凌晨3点执行备份
0 3 * * * /path/to/backup.sh
7.3 版本升级
# 进入项目目录
cd doccano
# 拉取最新代码
git pull origin master
# 重新构建并启动服务
cd docker
docker-compose -f docker-compose.prod.yml --env-file .env down
docker-compose -f docker-compose.prod.yml --env-file .env up -d --build
8. 常见问题解决
8.1 服务启动失败
检查日志找出具体原因:
docker-compose -f docker-compose.prod.yml logs backend
常见原因及解决方法:
- 端口冲突:确保80、5432、5672等端口未被其他服务占用
- 环境变量配置错误:检查.env文件中的必填参数是否正确设置
- 数据卷权限问题:确保宿主机目录有足够权限
8.2 标注数据丢失
- 检查数据备份策略是否生效
- 确认PostgreSQL容器是否正常运行:
docker-compose -f docker-compose.prod.yml ps postgres - 查看数据库日志,排查是否有错误信息
8.3 系统运行缓慢
- 检查服务器资源使用情况:
top或htop - 调整容器资源限制,增加CPU或内存分配
- 优化数据库查询,检查是否有慢查询
9. 总结与展望
通过docker-compose一键部署doccano,我们快速搭建了一个功能完善的企业级标注平台,实现了数据标注的协作化、流程化管理。本文详细介绍了从部署准备、环境配置、一键启动到平台使用、运维管理的全过程,帮助团队快速上手企业级数据标注工作。
未来,你还可以基于此平台进行更多扩展:
- 集成自动标注模型,提升标注效率
- 开发自定义导出格式,对接下游训练流程
- 构建标注质量评估体系,提升数据质量
立即行动,部署你的企业级标注平台,让数据标注工作事半功倍!
附录:docker-compose配置详解
完整的docker-compose.prod.yml配置文件解析:
version: "3.7"
services:
# 后端API服务
backend:
image: doccano/doccano:backend
volumes:
- static_volume:/backend/staticfiles # 静态文件存储
- media:/backend/media # 媒体文件存储
- tmp_file:/backend/filepond-temp-uploads # 临时上传文件存储
environment:
ADMIN_USERNAME: "${ADMIN_USERNAME}" # 管理员用户名
ADMIN_PASSWORD: "${ADMIN_PASSWORD}" # 管理员密码
ADMIN_EMAIL: ${ADMIN_EMAIL} # 管理员邮箱
CELERY_BROKER_URL: "amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq" # Celery消息队列地址
DATABASE_URL: "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable" # 数据库连接地址
ALLOW_SIGNUP: "False" # 是否允许用户注册(企业环境建议设为False)
DEBUG: "False" # 是否开启调试模式(生产环境设为False)
DJANGO_SETTINGS_MODULE: "config.settings.production" # Django配置文件
depends_on:
- postgres # 依赖PostgreSQL数据库
networks:
- network-backend
- network-frontend
# Celery任务队列(处理异步任务如导入导出)
celery:
image: doccano/doccano:backend
volumes:
- media:/backend/media
- tmp_file:/backend/filepond-temp-uploads
entrypoint: ["/opt/bin/prod-celery.sh"] # Celery启动脚本
environment:
PYTHONUNBUFFERED: "1" # 实时输出日志
CELERY_BROKER_URL: "amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq"
DATABASE_URL: "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable"
DJANGO_SETTINGS_MODULE: "config.settings.production"
depends_on:
- postgres
- rabbitmq # 依赖RabbitMQ消息队列
networks:
- network-backend
# Celery监控工具
flower:
image: doccano/doccano:backend
entrypoint: ["/opt/bin/prod-flower.sh"] # Flower启动脚本
environment:
PYTHONUNBUFFERED: "1"
CELERY_BROKER_URL: "amqp://${RABBITMQ_DEFAULT_USER}:${RABBITMQ_DEFAULT_PASS}@rabbitmq"
DATABASE_URL: "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable"
DJANGO_SETTINGS_MODULE: "config.settings.production"
FLOWER_BASIC_AUTH: "${FLOWER_BASIC_AUTH}" # Flower访问认证
depends_on:
- celery
ports:
- 5555:5555 # Flower端口
networks:
- network-backend
- network-frontend
# RabbitMQ消息队列
rabbitmq:
image: rabbitmq:3.10.7-alpine # 使用轻量级Alpine镜像
environment:
RABBITMQ_DEFAULT_USER: "${RABBITMQ_DEFAULT_USER}"
RABBITMQ_DEFAULT_PASS: "${RABBITMQ_DEFAULT_PASS}"
ports:
- 5672:5672 # RabbitMQ默认端口
networks:
- network-backend
# Nginx前端服务
nginx:
image: doccano/doccano:frontend
command: >
/bin/sh -c
"envsubst '
$${WORKER_PROCESSES}
'< /etc/nginx/nginx.conf.template
> /etc/nginx/nginx.conf
&& nginx -g 'daemon off;'" # 生成Nginx配置并启动
environment:
API_URL: "http://backend:8000" # 后端API地址
GOOGLE_TRACKING_ID: "" # 谷歌统计ID(可选)
WORKER_PROCESSES: "auto" # Nginx工作进程数(自动)
volumes:
- static_volume:/static
- media:/media
ports:
- 80:8080 # 映射80端口
depends_on:
- backend
networks:
- network-frontend
# PostgreSQL数据库
postgres:
image: postgres:13.3-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/ # 数据库数据持久化
environment:
POSTGRES_USER: "${POSTGRES_USER}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
POSTGRES_DB: "${POSTGRES_DB}"
networks:
- network-backend
# 数据卷定义
volumes:
postgres_data:
static_volume:
media:
tmp_file:
# 网络定义
networks:
network-backend: # 后端服务网络
network-frontend: # 前端服务网络
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



