如何在Ubuntu 16.04上安装Taiga项目管理工具

Taiga是用于项目管理的免费和开源应用程序。与其他项目管理工具不同,Taiga使用增量敏捷方法来管理项目的开发。Taiga是一个非常强大且完全可定制的应用程序。Taiga的后端使用Django框架以Python编写。前端是使用CoffeeScript和AngularJS框架以JavaScript编写的。Taiga包括项目协作,看板,漏洞跟踪,报告,时间跟踪,积压,Wiki等功能。

先决条件

  • 具有至少1GB RAM的Vultr Ubuntu 16.04服务器实例。
  • 一个sudo的用户

在本教程中,我们将使用taiga.example.com指向服务器的域名作为域名。taiga.example.com用您的实际域名替换所有出现的。

使用指南如何更新Ubuntu 16.04更新基本系统。系统更新后,继续安装PostgreSQL。

安装PostgreSQL

PostgreSQL是一个对象关系数据库系统,以其稳定性和速度而闻名。Taiga使用PostgreSQL来存储其数据库。将PostgreSQL存储库添加到系统中。

echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

导入GPG签名密钥并更新软件包列表。

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update

安装PostgreSQL数据库服务器。

sudo apt -y install postgresql

启动PostgreSQL服务器,并使其在启动时自动启动。

sudo systemctl start postgresql
sudo systemctl enable postgresql

更改默认PostgreSQL用户的密码。

sudo passwd postgres

以PostgreSQL用户身份登录。

sudo su - postgres

为Taiga创建一个新的PostgreSQL用户。

createuser taiga 

PostgreSQL提供了psql在数据库上运行查询的外壳。切换到PostgreSQL shell。

psql

为新创建的Taiga数据库用户设置密码。

ALTER USER taiga WITH ENCRYPTED password 'DBPassword';

替换DBPassword为安全密码。创建新数据库以进行Taiga安装。

CREATE DATABASE taiga OWNER taiga;

psql外壳退出。

\q

切换到sudo用户。

exit

安装Python

Taiga需要Python 3.4或更高版本,并且Python 3.5预先安装在Ubuntu 16.04发行版中。安装更多所需的软件包。

sudo apt -y install python3 python3-pip python3-dev python3-dev virtualenvwrapper

Python虚拟环境用于为Python项目创建隔离的虚拟环境。虚拟环境包含其自己的安装目录,并且不与全局和其他虚拟环境共享库。成功安装Python 3后,您应该可以检查其版本。

python3 -V

您将看到以下内容。

user@vultr:~$ python3 -V
Python 3.5.2

Upgrade pip,这是一个依赖项管理器应用程序。

sudo pip3 install --upgrade setuptools pip 

另外,安装一些构建工具,稍后将需要使用这些工具来编译依赖关系。

sudo apt -y install build-essential binutils-doc autoconf flex bison libjpeg-dev libfreetype6-dev zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev automake libtool libffi-dev curl git tmux gettext

安装RabbitMQ

Taiga使用RabbitMQ处理消息队列。RabbitMQ需要使用Erlang库才能工作。安装Erlang。

sudo apt -y install erlang

添加RabbitMQ存储库。

echo 'deb http://www.rabbitmq.com/debian/ stable main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list

导入RabbitMQ GPG签名密钥。

wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

更新存储库信息。

sudo apt update

安装RabbitMQ。

sudo apt -y install rabbitmq-server

启动并启用RabbitMQ服务器。

sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

添加RabbitMQ用户和虚拟主机。另外,通过主机向用户提供权限。

sudo rabbitmqctl add_user taiga StrongMQPassword
sudo rabbitmqctl add_vhost taiga
sudo rabbitmqctl set_permissions -p taiga taiga ".*" ".*" ".*"

确保StrongMQPassword用安全密码替换。

安装Nodejs

需要Node.js 7或更高版本来编译Taiga的前端。添加Node.js版本8存储库。

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -

安装Node.js和pwgen实用程序。

sudo apt install -y nodejs pwgen npm

pwgen稍后将用于生成强秘密字符串。安装CoffeeScript,因为它将用于编译以CoffeeScript框架编写的Taiga文件。

sudo npm install -g coffee-script gulp

安装Taiga后端

为Taiga添加新的系统用户,以确保Taiga进程以非特权用户身份运行。

sudo adduser taiga
sudo su - taiga

注意从现在开始,所有命令都必须以非特权用户身份运行,taiga直到要求您切换回该用户为止sudo

创建一个新目录来存储日志文件。

mkdir -p ~/logs

从GitHub克隆Taiga后端存储库,并签出最新的稳定分支。

git clone https://github.com/taigaio/taiga-back.git taiga-back
cd taiga-back
git checkout stable

现在,使用Python 3为Taiga创建新的虚拟环境。

mkvirtualenv -p /usr/bin/python3 taiga
pip3 install --upgrade setuptools

使用安装所需的Python依赖项pip

pip3 install -r requirements.txt

用必要的初始数据填充数据库。

python3 manage.py migrate --noinput
python3 manage.py loaddata initial_user
python3 manage.py loaddata initial_project_templates
python3 manage.py compilemessages
python3 manage.py collectstatic --noinput

上面的命令会将数据写入PostgreSQL数据库。Taiga还提供了一些演示或样本数据,可用于评估产品。如果要安装示例数据,请运行以下命令。

python3 manage.py sample_data

注意安装样本数据是可选的,仅用于评估产品。

在继续为Taiga后端创建配置文件之前,我们需要生成一个秘密字符串。该字符串将用于加密会话数据。

生成64个字符的随机字符串。

pwgen -s -1 64

您应该将输出视为随机字符串。

(taiga) taiga@vultr:~/taiga-back$ pwgen -s -1 64
fhDfyYVJ4EH3tvAyUzmfWSeCXuf5sy5EEWrMQPaf9t3JSFrpiL6yvUEOWsFOTscP

为Taiga后端创建一个新的配置文件。

nano ~/taiga-back/settings/local.py

将下面的代码填充到文件中。

from .common import *

MEDIA_URL = "https://taiga.example.com/media/"
STATIC_URL = "https://taiga.example.com/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "taiga.example.com"

SECRET_KEY = "Generated_Secret_Key"

DEBUG = False
PUBLIC_REGISTER_ENABLED = True

DEFAULT_FROM_EMAIL = "[email protected]"
SERVER_EMAIL = DEFAULT_FROM_EMAIL

#CELERY_ENABLED = True

EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:StrongMQPassword@localhost:5672/taiga"}

# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
#EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
#EMAIL_USE_TLS = False
#EMAIL_HOST = "mail.example.com"
#EMAIL_HOST_USER = "[email protected]"
#EMAIL_HOST_PASSWORD = "SMTPPassword"
#EMAIL_PORT = 25

# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"

请确保example domain name将上述代码替换为实际的代码。另外,用Taiga消息队列用户Generated_Secret_Key的实际密钥和StrongMQPassword实际密码替换。如果您已准备好SMTP服务器,并且希望立即使用电子邮件发送功能,则可以取消注释电子邮件选项并设置适当的值。如果尚未准备好邮件服务器,则可以暂时跳过设置电子邮件功能,稍后再在此配置文件中进行设置。

如果要启用GitHub登录,请在GitHub中创建一个应用程序,并提供API客户端ID和客户端密码。

要立即检查Taiga后端是否可以启动,请运行内置的Django服务器。

workon taiga
python manage.py runserver

如果服务器已成功启动,您将看到以下输出。

(taiga) taiga@vultr:~/taiga-back$ workon taiga
(taiga) taiga@vultr:~/taiga-back$ python manage.py runserver
Trying import local.py settings...
Trying import local.py settings...
Performing system checks...

System check identified no issues (0 silenced).
October 28, 2017 - 10:29:38
Django version 1.10.6, using settings 'settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

要验证是否可以访问该API,请打开另一个终端会话并运行以下命令。

curl http://127.0.0.1:8000/api/v1/

您将看到API调用返回的类似输出。

user@vultr:~$ curl http://127.0.0.1:8000/api/v1/
{"webhooks": "http://127.0.0.1:8000/api/v1/webhooks", "invitations": "http://127.0.0.1:8000/api/v1/invitations", "severities": "http://127.0.0.1:8000/api/v1/severities", "memberships": "http://127.0.0.1:8000/api/v1/memberships", "user-storage": "http://127.0.0.1:8000/api/v1/user-storage", "epics/(?P<resource_id>\\d+)/voters": "http://127.0.0.1:8000/api/v1/epics/(?P<resource_id>\\d+)/voters", "wiki": "http://127.0.0.1:8000/api/v1/wiki", "priorities": "http://127.0.0.1:8000/api/v1/priorities", "userstories/attachments": "http://127.0.0.1:8000/api/v1/userstories/attachments", "epics/(?P<epic>[^/.]+)/related_userstories": "http://127.0.0.1:8000/api/v1/epics/(?P<epic>[^/.]+)/related_userstories", "timeline/user": "http://127.0.0.1:8000/api/v1/timeline/user", "userstories/(?P<resource_id>\\d+)/voters": "http://127.0.0.1:8000/api/v1/userstories/(?P<resource_id>\\d+)/voters", "wiki-links": "http://127.0.0.1:8000/api/v1/wiki-links", "epics/attachments": "http://127.0.0.1:8000/api/v1/epics/attachments", "issues/custom-attributes-values": "http://127.0.0.1:8000/api/v1/issues/custom-attributes-values

按下“ ctrl + C” 停止Taiga后端服务器,然后停用虚拟环境。

deactivate

安装前端

Taiga前端是Taiga的组件,可为Web用户界面提供服务。从Github克隆Taiga前端存储库,并签出最新的稳定分支。

cd ~
git clone https://github.com/taigaio/taiga-front-dist.git taiga-front-dist
cd taiga-front-dist
git checkout stable

为Taiga前端创建一个新的配置文件。

nano ~/taiga-front-dist/dist/conf.json

填充文件。

{
    "api": "https://taiga.example.com/api/v1/",
    "eventsUrl": "wss://taiga.example.com/events",
    "eventsMaxMissedHeartbeats": 5,
    "eventsHeartbeatIntervalTime": 60000,
    "eventsReconnectTryInterval": 10000,
    "debug": true,
    "debugInfo": false,
    "defaultLanguage": "en",
    "themes": ["taiga"],
    "defaultTheme": "taiga",
    "publicRegisterEnabled": true,
    "feedbackEnabled": true,
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": null,
    "contribPlugins": [],
    "tribeHost": null,
    "importers": [],
    "gravatar": true
}

请确保将替换example domain为实际域。您也可以在上述配置中更改默认语言和其他参数。

安装Taiga活动

除了前端和后端之外,我们还需要安装Taiga事件。Taiga事件是一个Web套接字服务器,它使Taiga前端能够显示积压,看板等模块中的实时更改。它还使用RabbitMQ服务器进行消息处理。

从Github克隆Taiga事件存储库。

cd ~
git clone https://github.com/taigaio/taiga-events.git taiga-events
cd taiga-events

使用安装Node.js依赖项npm

npm install

为Taiga事件创建一个新的配置文件。

nano ~/taiga-events/config.json

填充文件。

{
    "url": "amqp://taiga:StrongMQPassword@localhost:5672/taiga",
    "secret": "Generated_Secret_Key",
    "webSocketServer": {
        "port": 8888
    }
}

替换Generated_Secret_Key为您先前生成的实际64个字符的长密钥。密钥应与您在Taiga后端配置文件中提供的密钥完全相同。另外,StrongMQPassword使用Taiga消息队列用户的实际密码更新。

配置马戏团

Circus是Python应用程序的流程管理器。我们将使用马戏团来运行Taiga后端和事件。

切换回sudo用户。

exit

注意从现在开始,您将需要使用sudouser 运行命令。

sudo apt -y install circus

创建一个新的马戏团配置文件以运行Taiga后端。

sudo nano /etc/circus/conf.d/taiga.ini

填充文件。

[watcher:taiga]
working_dir = /home/taiga/taiga-back
cmd = gunicorn
args = -w 3 -t 60 --pythonpath=. -b 127.0.0.1:8001 taiga.wsgi
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/gunicorn.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 4
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/gunicorn.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 4

[env:taiga]
PATH = /home/taiga/.virtualenvs/taiga/bin:$PATH
TERM=rxvt-256color
SHELL=/bin/bash
USER=taiga
LANG=en_US.UTF-8
HOME=/home/taiga
PYTHONPATH=/home/taiga/.virtualenvs/taiga/lib/python3.5/site-packages

创建新的马戏团配置以运行Taiga事件。

sudo nano /etc/circus/conf.d/taiga-events.ini

填充文件。

[watcher:taiga-events]
working_dir = /home/taiga/taiga-events
cmd = /usr/local/bin/coffee
args = index.coffee
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/taigaevents.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 12
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/taigaevents.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 12

重新启动马戏团并启用以在启动时自动启动。

sudo systemctl restart circusd
sudo systemctl enable circusd

检查马戏团的状态。

circusctl status

如果马戏团已正确启动所有Taiga进程,则您将看到以下输出。

user@vultr:~$ circusctl status
circusd-stats: active
plugin:flapping: active
taiga: active
taiga-events: active

如果您看到任何未激活的进程,请运行sudo chmod -R 777 /home/taiga/logs并重新启动Circus。再次检查马戏团进程的状态,这一次您肯定会发现该服务正在运行。

现在,我们已经成功安装并运行了Taiga。在使用它之前,我们需要使用任何生产Web服务器公开安装。

安装Nginx作为反向代理

我们将使用Nginx作为反向代理来为用户提供应用程序。我们还将从Let's Encrypt获取并安装SSL证书。

Certbot是Let's Encrypt CA的官方证书颁发客户端。将Certbot PPA存储库添加到系统中。

sudo add-apt-repository ppa:certbot/certbot
sudo apt update

安装Nginx和Certbot。

sudo apt -y install nginx certbot

注意要从Let's Encrypt CA获得证书,必须确保要为其生成证书的域指向服务器。如果不是,请对您域的DNS记录进行必要的更改,并等待DNS传播,然后再次提出证书请求。Certbot在提供证书之前会检查域权限。

现在,使用Certbot中的内置Web服务器为您的域生成证书。

sudo certbot certonly --standalone -d taiga.example.com

生成的证书很可能存储在/etc/letsencrypt/live/taiga.example.com/目录中。SSL证书将保留为fullchain.pem,私钥将另存为privkey.pem

让我们加密证书的有效期限为90天,因此建议使用Cron作业为证书设置自动续订。Cron是一项系统服务,用于运行定期任务。

打开cron作业文件。

sudo crontab -e

添加以下行。

0 0 * * * /usr/bin/certbot renew --quiet

上面的cron工作将每天在午夜运行。如果证书到期,它将自动续订证书。

生成一个强大的Diffie-Hellman参数。它为主机和服务器之间的数据交换提供了额外的安全性。

sudo openssl dhparam -out /etc/ssl/dhparam.pem 2048 

创建一个新的Nginx服务器块来服务Taiga前端。

sudo nano /etc/nginx/sites-available/taiga

用以下内容填充文件。

server {
    listen 80;
    server_name taiga.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name taiga.example.com;

    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;

    large_client_header_buffers 4 32k;
    client_max_body_size 50M;
    charset utf-8;

    index index.html;

    # Frontend
    location / {
        root /home/taiga/taiga-front-dist/dist/;
        try_files $uri $uri/ /index.html;
    }

    # Backend
    location /api {
        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://127.0.0.1:8001/api;
        proxy_redirect off;
    }

    location /admin {
        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://127.0.0.1:8001$request_uri;
        proxy_redirect off;
    }

    # Static files
    location /static {
        alias /home/taiga/taiga-back/static;
    }

    # Media files
    location /media {
        alias /home/taiga/taiga-back/media;
    }

     location /events {
        proxy_pass http://127.0.0.1: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;
    }

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header Public-Key-Pins 'pin-sha256="klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY="; pin-sha256="633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q="; max-age=2592000; includeSubDomains';

    ssl on;
    ssl_certificate /etc/letsencrypt/live/taiga.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/taiga.example.com/privkey.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
    ssl_session_cache shared:SSL:10m;
    ssl_dhparam /etc/ssl/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;

}

请务必更改domain namepath to the SSL certificates。启用虚拟主机。

sudo ln -s /etc/nginx/sites-available/taiga /etc/nginx/sites-enabled/taiga

现在,您可以重新启动Nginx Web服务器,并使它能够在启动时自动启动。

sudo systemctl restart nginx
sudo systemctl status nginx

最后,修复Taiga文件的所有权和权限。

sudo chown -R taiga:taiga /home/taiga/
sudo chmod o+x /home/taiga/

结论

现在,您可以访问进入Taiga安装https://taiga.example.com。使用具有用户名“ admin”和密码“ 123123” 的初始管理员帐户登录。现在,您的安装已准备好用于生产。首先创建一个新项目或评估产品。如果您已经在Github,Jira或Trello上管理项目,则可以使用importers轻松地将项目导入Taiga 。



Leave a Comment

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

大數據的13個商業數據提取工具

什麼是日誌文件系統,它是如何工作的?

什麼是日誌文件系統,它是如何工作的?

我們的計算機以稱為日誌文件系統的有組織的方式存儲所有數據。這是一種有效的方法,可以讓計算機在您點擊搜索時立即搜索和顯示文件。 https://wethegeek.com/?p=94116&preview=true

技術奇點:人類文明的遙遠未來?

技術奇點:人類文明的遙遠未來?

隨著科學的快速發展,接管了我們的大量工作,我們陷入無法解釋的奇點的風險也在增加。閱讀,奇點對我們意味著什麼。

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

洞察 26 種大數據分析技術:第 1 部分

2021 年人工智能對醫療保健的影響

2021 年人工智能對醫療保健的影響

過去幾十年,醫療保健領域的人工智能取得了巨大飛躍。因此,醫療保健中人工智能的未來仍在日益增長。