开源项目管理工具Taiga

news2024/11/14 0:42:07

在这里插入图片描述

什么是 Taiga ?

Taiga 是一个免费开源,而且功能非常强大的项目管理平台,用于初创企业和敏捷开发团队。Taiga 专注于简洁性,并且界面很干净简单。Taiga 也非常个性化,并集合了很多其它功能和外部工具,还有大量社区创建的工具。

软件特点:

  1. 开源免费Taiga是完全开源的,允许用户自由使用、修改和分发。
  2. 友好的界面Taiga 提供了一个清晰、直观的用户界面,易于理解和使用。
  3. 敏捷管理:支持 ScrumKanban 两种主要的敏捷开发方法,用户可以根据团队的需求选择合适的方法。
  4. 任务管理:任务卡片详细记录每个工作项的状态、优先级、标签等信息,便于团队成员协作。
  5. 维基与文档:内置维基功能,方便团队共享知识和编写项目文档。
  6. 版本控制集成:无缝对接 Git,实现代码提交和版本控制的实时同步。
  7. 权限和角色管理:允许用户根据角色设置不同的权限,以控制对项目和任务的访问。
  8. 通知系统:通过电子邮件或应用内通知让用户了解重要的更新和变更。
  9. 自动化工作流:通过自定义规则和 Webhooks 实现自动化任务分配。
  10. 多语言支持Taiga 提供多种语言,满足全球化团队的需求。
  11. API 可扩展性:开放 API 允许与其他系统集成。
  12. 分析和报告:提供完整的仪表板和进度报告功能。

安装

在群晖上以 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 是群晖服务器的 IP
TAIGA_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 -启用或禁用匿名 telemetry
ENABLE_TELEMETRY=True

taiga.conf

taiga.confNginx 的配置文件,由多个块组成,定义了不同的请求处理规则,用于代理前端资源、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/taigaio

taigaio/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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时&#xff0c;你会删除一些文件夹或文件。如果你通过右键单击删除文件&#xff0c;则可以很容易从回收站恢复已删除的文件。但是&#xff0c;如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;XGBoost分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

丹娜生物增利不增收:核心产品原材料面临不利因素,销售费用率攀升

《港湾商业观察》黄懿 7月15日&#xff0c;丹娜&#xff08;天津&#xff09;生物科技股份有限公司&#xff08;下称“丹娜生物”&#xff09;针对北交所出具的IPO问询文件进行了首轮回复&#xff0c;其保荐人为招商证券。7月26日&#xff0c;监管部门发出第二封问询函。 公开…

分布式场景下websocket解决方案

在项目中遇到&#xff1a;多个服务作为websocket服务端时&#xff0c;怎么跟前端设备进行数据通信的问题。具体解决方案&#xff0c;分享一下。 1.遇到问题 项目中使用websocket与前端设备建立长链接&#xff0c;用于推送过车、车位数、支付等相关信息&#xff0c;由于项目是负…

监控摄像头内存卡格式化了怎么恢复?

监控摄像头在现代社会中的应用越来越广泛&#xff0c;无论是家庭安防还是商业场所的安全监控&#xff0c;它们都扮演着重要的角色。然而&#xff0c;内存卡的数据丢失问题也时有发生&#xff0c;尤其是当内存卡被不小心格式化时&#xff0c;很多重要的监控数据可能会永久丢失。…

SpringBoot下获取resources目录下文件的常用方法

哈喽&#xff0c;大家好&#xff0c;今天给大家带来SpringBoot获取resources目录下文件的常用方法&#xff0c;示例中的方法是读取resources目录下的txt和xlsx文件&#xff0c;并将xlsx导出到excel的简单写法。完整代码放在最后。 通过this.getClass()方法获取 method1 - met…

linux安装mysql数据库,含公网链接(有网络带网安装)

1.检查是否存在mysql mysql出现这个&#xff0c;代表没安装 -bash: mysql: command not found 2.检查是否有mariadb数据库&#xff0c;如果有&#xff0c;需要先卸载。 rpm -qa | grep mariadb3.卸载现有的数据库 rpm -e --上个命令显示的名字4.在线安装&#xff0c;需要外…

【多线程】线程的等待通知机制-wait与notify

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 我们都知道&#xff0c;线程在系统调度上是随机的&#xff0c;因此线程之间执⾏的先后顺序难以预知。但在实际开发中有时我们希望控制多个线程执行某个逻辑的先后顺序&#xff…

基于JSP高校应届生就业信息管理系统的设计与实现(全网第一无二,阿龙原创设计)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

C#骑砍逻辑类Mod制作详细解说

前言&#xff1a; 最近在研究骑砍的mod&#xff0c;主要是想修改其中的逻辑部分&#xff0c;因此有了这篇帖子。 一&#xff0c;文件夹与XML配置 在Modules创建一个新文件夹&#xff0c;文件夹名称随意&#xff0c;不影响实际的读取。 文件夹下面的位置需要固定&#xff0c;因…

大模型学习路线:从新手到专家的全面指南,从零基础到精通,非常详细收藏我这一篇就够了

随着人工智能技术的飞速发展&#xff0c;特别是近年来深度学习领域的突破&#xff0c;大规模预训练模型&#xff08;通常称为“大模型”&#xff09;已成为推动自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;等领域发展的关键力量。本文将为你…

CSS 嵌套元素的隐藏规则

简单介绍一下&#xff0c;在 HTML 和 CSS 中&#xff0c;元素大体分为 块级元素、内联元素&#xff08;行内元素&#xff09;、块级内联元素&#xff08;行内块元素&#xff09;。它们有着不同的嵌套规则和特殊之处。 1. 行内元素 行内元素特点&#xff1a;不独占一行、不可设…

06- Python的标识符

Python 标识符的知识点 简单地理解&#xff0c;标识符就是一个名字&#xff0c;就好像我们每个人都有属于自己的名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。 Python 中标识符的命名不是随意的&#xff0c;而是要遵守一定的命令规则&#xf…

Qt 调用MFC dll,动态库中有界面

一、创建MFC 动态库工程 下一步 创建 点击确定 二、创建接口 这个是系统创建的&#xff0c;改成自己的接口。 头文件&#xff1a; #ifndef __WEB_ENGINE__ #define __WEB_ENGINE__#ifdef __cplusplus extern "C" { #endif__declspec(dllexport) bool __stdcall Loa…

Datawhale AI 夏令营-CV竞赛-Task2

# Datawhale AI 夏令营 夏令营手册&#xff1a;从零上手CV竞赛 比赛&#xff1a;2024“大运河杯”数据开发应用创新大赛——城市治理赛道 代码运行平台&#xff1a;厚德云 赛题任务 本赛题的任务是开发智能识别系统&#xff0c;用于自动检测和分类城市管理中的违规行为。通…

Vue组件的好处和理解、基本使用、注意事项、组件嵌套、VueComponent理解和原型链

目录 1. 组件的好处和理解2. Vue组件的使用2.1 Vue中使用组件的三大步骤2.2 注意事项 4. 组件的嵌套5. VueComponent的理解6. VueComponent原型链 1. 组件的好处和理解 传统方式编写应用&#xff0c;存在2大问题&#xff1a; 依赖关系混乱&#xff0c;不好维护代码复用率不高…

中资优配:人气牛股10连板!

三大股指今日弱势轰动&#xff0c;均创2月初以来新低&#xff1b;小盘股较为生动&#xff0c;万得微盘股指数涨超1%&#xff1b;两市成交额再度萎缩至5000亿元下方&#xff1b;港股走势疲弱&#xff0c;两大股指均跌超1%。 具体来看&#xff0c;沪指在银行、酿酒等板块的拖累下…

ESP32-IDF http请求崩溃问题解决

文章目录 esp32s3 http请求崩溃问题代码讨论修正后不崩溃的代码 ESP32S3板子, 一运行http请求百度网站的例子, 就会panic死机, 记录下过程. esp32s3 http请求崩溃 一执行http请求的perform就会崩溃, 打印如图 ESP32-IDF 的http请求代码是根据官方demo来改的, 第一步先连接wi…

佰朔资本:大盘股和小盘股的区别?大中小盘股划分标准?

一般来说&#xff0c;大盘股&#xff1a;流通市值在500亿及以上&#xff0c;中盘股&#xff1a;流通市值在100亿~500亿之间&#xff0c;小盘股&#xff1a;流通市值在100亿及以下。 留意&#xff1a;流通市值是可以上市买卖流通的股数与股价乘积&#xff0c;总市值由流通市值与…

【项目源码】终于有人将打字游戏和编程英语结合起来啦!Java初学者的福音

Hello&#xff01;各位彦祖&#xff0c;亦菲们&#xff01;又是美好的一天&#xff01;今天给大家分享一个Java项目源码&#xff1a;Java打字游戏项目源码&#xff01; 看到这里&#xff0c;你可能会说&#xff01; 一个破打字游戏有什么可神气的&#xff01;&#xff01;&…