什么是 Taiga ?
Taiga
是一个免费开源,而且功能非常强大的项目管理平台,用于初创企业和敏捷开发团队。Taiga
专注于简洁性,并且界面很干净简单。Taiga
也非常个性化,并集合了很多其它功能和外部工具,还有大量社区创建的工具。
软件特点:
- 开源免费:
Taiga
是完全开源的,允许用户自由使用、修改和分发。 - 友好的界面:
Taiga
提供了一个清晰、直观的用户界面,易于理解和使用。 - 敏捷管理:支持
Scrum
和Kanban
两种主要的敏捷开发方法,用户可以根据团队的需求选择合适的方法。 - 任务管理:任务卡片详细记录每个工作项的状态、优先级、标签等信息,便于团队成员协作。
- 维基与文档:内置维基功能,方便团队共享知识和编写项目文档。
- 版本控制集成:无缝对接
Git
,实现代码提交和版本控制的实时同步。 - 权限和角色管理:允许用户根据角色设置不同的权限,以控制对项目和任务的访问。
- 通知系统:通过电子邮件或应用内通知让用户了解重要的更新和变更。
- 自动化工作流:通过自定义规则和
Webhooks
实现自动化任务分配。 - 多语言支持:
Taiga
提供多种语言,满足全球化团队的需求。 - API 可扩展性:开放
API
允许与其他系统集成。 - 分析和报告:提供完整的仪表板和进度报告功能。
安装
在群晖上以 Docker 方式安装。
Taiga
用到 9
个镜像,采用 docker-compose
安装方式,需要准备好三个文件
env.txt
env.txt
是环境变量文件,在官方的 .env
文件基础上修改而成,源文件地址: https://github.com/taigaio/taiga-docker/blob/main/.env
因为添加了中文注释,保存时记得采用
UTF-8
格式
# Taiga的URL - 定义Taiga应该在哪里提供服务的变量## Taiga 服务使用 "http" 或 "https"(安全)连接## 因为在局域网使用,所以采用 http 协议TAIGA_SCHEME=http## Taiga 服务的基本URL## 其中 192.168.0.197 是群晖服务器的 IPTAIGA_DOMAIN=192.168.0.197:9118## 子路径,将附加到 TAIGA_DOMAIN(使用 "" 或 "/subpath")TAIGA_SUBPATH="" ## 事件连接协议(使用 "ws" 或 "wss")WEBSOCKETS_SCHEME=ws# Taiga的密钥 - 提供加密签名的变量## 请将其更改为不可预测的随机值TAIGA_SECRET_KEY=M3JJcauWbz9Zzd6gt8d9mxrQPHpU69PWNsJJd6aFVXa3a8VrtrhHbLC7HE2ayS7a# Taiga的数据库设置 - 创建Taiga数据库并连接到它的变量## 数据库主机,使用的 docker-compose.yml 中的 service name POSTGRES_HOST=taiga-db## 数据库库名POSTGRES_DB=taiga## 连接到PostgreSQL的用户POSTGRES_USER=taiga## 数据库用户的密码POSTGRES_PASSWORD=taiga# Taiga 的 SMTP 设置 - 发送Taiga邮件给用户的变量## 使用SMTP服务器或在控制台中显示电子邮件("django.core.mail.backends.smtp.EmailBackend"或"django.core.mail.backends.console.EmailBackend")EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend## SMTP 服务器地址EMAIL_HOST=smtp.88.com## 默认 SMTP 端口EMAIL_PORT=465## 连接 SMTP 服务器的用户EMAIL_HOST_USER=wbsu2003@88.com## SMTP 用户的密码EMAIL_HOST_PASSWORD=<第三方邮件客户端密码>## 用于自动邮件的默认电子邮件地址DEFAULT_FROM_EMAIL=wbsu2003@88.com## 使用 SMTP 服务器的 TLS(安全)连接EMAIL_USE_TLS=False## 使用 SMTP 服务器的 SSL(安全)连接EMAIL_USE_SSL=True# Taiga的 RabbitMQ 设置 - 用于实时和异步事件的变量## 连接到RabbitMQ的用户RABBITMQ_USER=taiga## RabbitMQ用户的密码RABBITMQ_PASS=taiga## RabbitMQ容器名称RABBITMQ_VHOST=taiga# 由任何连接的 RabbitMQ 实例共享的唯一值RABBITMQ_ERLANG_COOKIE=secret-erlang-cookie# Taiga的附件 - 定义附件将被访问多长时间## token 的有效期(以秒为单位)ATTACHMENTS_MAX_AGE=360# Taiga's Telemetry -启用或禁用匿名 telemetryENABLE_TELEMETRY=True
taiga.conf
taiga.conf
是 Nginx
的配置文件,由多个块组成,定义了不同的请求处理规则,用于代理前端资源、API
请求、管理界面访问、静态文件服务和媒体文件服务,以及 WebSocket
事件通信。
该文件来自官方,未做任何修改,文件地址:https://github.com/taigaio/taiga-docker/blob/main/taiga-gateway/taiga.conf
server { listen 80 default_server; client_max_body_size 100M; charset utf-8; # Frontend location / { proxy_pass http://taiga-front/; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; } # API location /api/ { proxy_pass http://taiga-back:8000/api/; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; } # Admin location /admin/ { proxy_pass http://taiga-back:8000/admin/; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; } # Static location /static/ { alias /taiga/static/; } # Media location /_protected/ { internal; alias /taiga/media/; add_header Content-disposition "attachment"; } # Unprotected section location /media/exports/ { alias /taiga/media/exports/; add_header Content-disposition "attachment"; } location /media/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://taiga-protected:8003/; proxy_redirect off; } # Events location /events { proxy_pass http://taiga-events:8888/events; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; }}
docker-compose.yml
在官方的基础上,根据需要做了调整,源文件地址:https://github.com/taigaio/taiga-docker/blob/main/docker-compose.yml
version: "3.5"services: taiga-db: image: postgres:13 container_name: taiga-db environment: POSTGRES_DB: "${POSTGRES_DB}" POSTGRES_USER: "${POSTGRES_USER}" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 2s timeout: 15s retries: 5 start_period: 3s volumes: - ./db:/var/lib/postgresql/data taiga-back: image: taigaio/taiga-back:latest container_name: taiga-back volumes: - ./static:/taiga/static - ./media:/taiga/media env_file: env.txt depends_on: taiga-db: condition: service_healthy taiga-events-rabbitmq: condition: service_started taiga-async-rabbitmq: condition: service_started taiga-async: image: taigaio/taiga-back:latest container_name: taiga-async volumes: - ./static:/taiga/static - ./media:/taiga/media entrypoint: ["/taiga-back/docker/async_entrypoint.sh"] env_file: env.txt depends_on: taiga-db: condition: service_healthy taiga-events-rabbitmq: condition: service_started taiga-async-rabbitmq: condition: service_started taiga-async-rabbitmq: image: rabbitmq:3.8-management-alpine container_name: taiga-async-rabbitmq environment: RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}" RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}" RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}" RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}" hostname: "taiga-async-rabbitmq" volumes: - ./async:/var/lib/rabbitmq taiga-front: image: taigaio/taiga-front:latest container_name: taiga-front environment: TAIGA_URL: "${TAIGA_SCHEME}://${TAIGA_DOMAIN}" TAIGA_WEBSOCKETS_URL: "${WEBSOCKETS_SCHEME}://${TAIGA_DOMAIN}" TAIGA_SUBPATH: "${TAIGA_SUBPATH}" # ...your customizations go here # volumes: # - ./conf.json:/usr/share/nginx/html/conf.json taiga-events: image: taigaio/taiga-events:latest container_name: taiga-events environment: RABBITMQ_USER: "${RABBITMQ_USER}" RABBITMQ_PASS: "${RABBITMQ_PASS}" TAIGA_SECRET_KEY: "${TAIGA_SECRET_KEY}" depends_on: taiga-events-rabbitmq: condition: service_started taiga-events-rabbitmq: image: rabbitmq:3.8-management-alpine container_name: taiga-events-rabbitmq environment: RABBITMQ_ERLANG_COOKIE: "${RABBITMQ_ERLANG_COOKIE}" RABBITMQ_DEFAULT_USER: "${RABBITMQ_USER}" RABBITMQ_DEFAULT_PASS: "${RABBITMQ_PASS}" RABBITMQ_DEFAULT_VHOST: "${RABBITMQ_VHOST}" hostname: "taiga-events-rabbitmq" volumes: - ./events:/var/lib/rabbitmq taiga-protected: image: taigaio/taiga-protected:latest container_name: taiga-protected environment: MAX_AGE: "${ATTACHMENTS_MAX_AGE}" SECRET_KEY: "${TAIGA_SECRET_KEY}" taiga-gateway: image: nginx:1.19-alpine container_name: taiga-gateway ports: - "9118:80" volumes: - ./taiga.conf:/etc/nginx/conf.d/default.conf - ./static:/taiga/static - ./media:/taiga/media depends_on: - taiga-front - taiga-back - taiga-events
然后执行下面的命令
# 新建文件夹 taiga 和 子目录mkdir -p /volume1/docker/taiga/{async,db,events,media,static}# 进入 taiga 目录cd /volume1/docker/taiga# 将 env.txt 和 docker-compose.yml 放入当前目录# 一键启动docker-compose --env-file env.txt up -d
运行
在开始访问之前,还需要创建一个管理员,需要进入到容器内操作
# 进入 taiga-back 容器docker exec -it taiga-back /bin/bash# 创建管理员用户python manage.py createsuperuser
依次输入
Username
:用户名。例如:laosu
Email address
:邮件地址。例如:wbsu2003@gmail.com
Password
:密码。
接下来就可以访问了,在浏览器中输入 http://群晖IP:9118
点右上角的 Login
,进入到登录界面
输入我们前面创建的管理员账号,下面是登录成功后的主界面
点绿色按钮 NEW PROJECT
新建项目。模版类型包括:敏捷和看板两种
SCRUM
Scrum
是一个用于开发、交付和维护复杂产品的敏捷框架。尽管它最初侧重于软件开发,但它已用于研究、销售、营销和先进技术等其他领域。它专为十人或更少成员的团队而设计,这些团队将工作分解为可在时间限制内的迭代(称为冲刺)内完成的目标,迭代时间不超过一个月,最常见的是两周。
详细介绍和操作可以参考:https://community.taiga.io/t/quick-intro-to-scrum-module/124
KANBAN
Kanban
旨在通过平衡需求和可用容量以及改进系统级瓶颈的处理来管理工作。
详细介绍和操作可以参考::https://community.taiga.io/t/the-5-min-kanban-module-overview/122
中文
右上角用户 --> Edit Profile
--> Language
下拉找到 中文(简体)
,保存之后就是中文界面了
参考文档
Taiga.io
地址:https://github.com/taigaiotaigaio/taiga-docker: Deployment utilities for Taiga
地址:https://github.com/taigaio/taiga-docker
Taiga: Your opensource agile project management software
地址:https://taiga.io/
Taiga Documentation
地址:https://docs.taiga.io/
Taiga
地址:https://tree.taiga.io/project/taiga/timeline