“Organizing means first to evaluate the opportunity, and only then to set the task...”
— Unknown author
The art of organizing work and monitoring its performance in modern society is an integral part of successful business. It always starts small. At first, you are working on some project - everything is easy, there is only one task and you perform it. It is enough to keep this task in your memory. But every day there are subtasks, added notes, this is where comes the realization that everything is no longer possible to memorize. You can do with a daily planner here. The number of tasks is growing and you realize that it is impossible to complete the project entirely on your own. Then you have subordinates, you assign them part of the tasks, but how to monitor the performance? How to reassign tasks? The daily planner clearly would not do in this case.
Throughout the history of mankind, many projects have been executed from the simplest to incredibly complex. Various project management systems for goal achievement and management organization have been developed, each has its own advantages and disadvantages, but unfortunately, we will not review them, since they would be a large separate topic for us.
In the modern world, various software has been developed to fortify project management, making it more convinient. There are quite a lot of them, but today we will consider the decent software of Taiga project management system, which employs Agile methodologies families Scrum and Kanban. This software is mainly used by developers and designers. Unfortunately, even considering that the project is free, there is very little information about this software in the Russian segment of the Internet. Therefore, we, the Syncweb team, hoping to simplify the entry threshold to start using this project.
Checking the Requirements
First we will check the necessary minimum requirements for Taiga.io:
- you need root access;
- Python of version 3.4 or higher;
- PostgreSQL DBMS of version 9.4 or higher;
- RabbitMQ;
- at least 0.75 GB of RAM (required to install lxml), just in case we will use 1GB.
- During installation, you will need: Ruby of version 2.1 or higher and NodeJS of version 7.0 or higher.
For more information, please refer to the official website.
In general, you can install in several ways, but we are not looking for easy way and will do it manually. As an operating system (OS) we will use Ubuntu 18.04.
During the installation, you will need to modify or create quite a few files, and each installation must have its own settings. We will enclose such settings in brackets and title in English with explanations like example -.
Also we will often use console text editor vi, you can use any other. To enter text insertion mode, press i and start typing. And to save the changes and close the file, first press Esc, then :wq.
Installing Required Packages
To begin with, we will install several convenient packages:
Let's create the supp user:
And allow access via sudo:
Then edit the /etc/ssh/sshd_config file
Uncomment the line
PermitRootLogin no
And add
AllowUsers supp
Now restart the SSH daemon:
Let's log in under the supp user. Pre-install the required packages:
Ngix Installation
Next, you need to install Nginx, the official repository has version 1.14, so we will use the instructions from the official website.
First, install the necessary packages to connect the repository:
Now connect the repository of stable version:
Import the key for authentication of packages:
And now let's set:
Instructions for installation on your own can be found on the official Nginx page.
Then install RabbitMQ and Redis:
PostgreSQL Installation
Now install PostgreSQL DBMS, but the current version in repository is 10, and the official latest version is 11.3. If you look at the performance tests of different versions of PostgreSQL, for example, on the Habr website, you can see the performance improvements of newer versions compared to older ones. Therefore, we will install from the official website, using the instructions.
To begin with, add a repository:
Import the package authentication key:
Continuing installation:
Now, before further actions, restart the server:
After restarting the server, log in under our supp user and create a taiga user:
ATTENTION! Further actions must be performed under Taiga user
Initialize PostgreSQL DBMS setup:
Now let's make settings for RabbitMQ, where {YOUR_PASSWORD_EVENTS} is the RabbitMQ password, which will be used in the configuration files below.
BACKEND Installation
Now let's make settings for RabbitMQ, where {YOUR_PASSWORD_EVENTS} is the RabbitMQ password, which will be used in the configuration files below.
Create virtualenv taiga:
And install the necessary packages:
Now initialize the database:
After these steps, an admin user with 123123 password is created. You need to remember these, as you will enter these data at the initial authorization in the web-interface.
To create a non-empty database, for example, to see how to create and work with taiga.io or to demonstrate the work, enter the command
To complete backend configuration, create ~/taiga-back/settings/local.py settings file with the following contents, where:
- {YOUR_DOMAIN} is your domain, for example, example.ru;
- {YOUR_SECRET_KEY} is the secret key, the more complex and longer - the better, it will be used when configuring the (EVENTS) file coming up next;
- {YOUR_PASSWORD_EVENTS} is the password for push events, which was prescribed when configuring RabbitMQ;
- {YOUR_GOOGLE_EMAIL} is your Google Email, because in this example we use settings from Gmail;
- {YOUR_PASSWORD_EMAIL} is the password for Email.
Also, please pay attention to the HTTPS protocol
from .common import *
MEDIA_URL = "https://{YOUR_DOMAIN}/media/"
STATIC_URL = "https://{YOUR_DOMAIN}/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "{YOUR_DOMAIN}"
SECRET_KEY = "{YOUR_SECRET_KEY}"
DEBUG = False
PUBLIC_REGISTER_ENABLED = True
DEFAULT_FROM_EMAIL = "no-reply@{YOUR_DOMAIN}"
SERVER_EMAIL = DEFAULT_FROM_EMAIL
#CELERY_ENABLED = True
EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:{YOUR_PASSWORD_EVENTS}@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 = True
EMAIL_HOST = "smtp.gmail.com"
EMAIL_HOST_USER = "{YOUR_GOOGLE_EMAIL}"
EMAIL_HOST_PASSWORD = "{YOUR_PASSWORD_EMAIL}"
EMAIL_PORT = 587
# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"
Now all that is left is to run the backend and check:
FRONTEND Installation
Now let's proceed with the frontend installation.
Then copy the example configuration file:
And change the contents of the file according to the example below, where:
- {YOUR_DOMAIN} is your domain, for example, example.ru;
- defaultLanguage: ru parameter determines the default language;
- publicRegisterEnabled: true parameter is responsible for the possibility of free registration on the main page, if you do not need anyone to register - set the value to false:
{
"api": "https://{YOUR_DOMAIN}/api/v1/",
"eventsUrl": "wss://{YOUR_DOMAIN}/events",
"eventsMaxMissedHeartbeats": 5,
"eventsHeartbeatIntervalTime": 60000,
"eventsReconnectTryInterval": 10000,
"debug": false,
"debugInfo": false,
"defaultLanguage": "ru",
"themes": ["taiga"],
"defaultTheme": "taiga",
"publicRegisterEnabled": true,
"feedbackEnabled": true,
"supportUrl": "https://tree.taiga.io/support",
"privacyPolicyUrl": null,
"termsOfServiceUrl": null,
"GDPRUrl": null,
"maxUploadFileSize": null,
"contribPlugins": [],
"tribeHost": null,
"importers": [],
"gravatar": true,
"rtlLanguages": ["fa"]
}
EVENTS Installation
Installation is a little complicated, but we chose such path! Now let's set up events:
Now set nodejs:
Let's also set javascript dependencies:
Now configure the configuration event file, making a copy of it in advance:
The approximate contents of the file will be as follows, where:
- {YOUR_PASSWORD_EVENTS} - is the password created when configuring RabbitMQ;
- {YOUR_SECRET_KEY} - is the key used in the configuration file when configuring local.py backend:
{
"url": "amqp://taiga:{YOUR_PASSWORD_EVENTS}@localhost:5672/taiga",
"secret": "{YOUR_SECRET_KEY}",
"webSocketServer": {
"port": 8888
}
}
Now you need to add events as a service. To do this, create a file and make it similar to the code below:
[Unit]
Description=taiga_events
After=network.target
[Service]
User=taiga
WorkingDirectory=/home/taiga/taiga-events
ExecStart=/bin/bash -c "node_modules/coffeescript/bin/coffee index.coffee"
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
It remains to add the service to autorun and run it:
We handled the event service, but now we need to do the same for backend. So again create a file with the following content:
[Unit]
Description=taiga_back
After=network.target
[Service]
User=taiga
Environment=PYTHONUNBUFFERED=true
WorkingDirectory=/home/taiga/taiga-back
ExecStart=/home/taiga/.virtualenvs/taiga/bin/gunicorn --workers 4 --timeout 60 -b 127.0.0.1:8001 taiga.wsgi
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
Now launch a new taiga service and add to autorun:
Now check if the service has started successfully:
Let's get together, there are the last touches remaining. Final Nginx configuration touches. First, delete the default configuration:
or in some cases, the default configuration file may be somewhere else:
Create a folder for logs:
Установка сертификатов Let’s Encrypt
We will use HTTPS to improve the security of our website. Learn more about SSL certificates from our article. So, let's use free Let's Encrypt certificates and Certbot client
Now you can issue a certificate where: {YOUR_DOMAIN} is your domain, for example, example.ru;
Now create a DH (Diffie Hellman) key:
For installation on your own, you can use the instructions from the official website of Certbot.
server {
listen 80 default_server;
server_name _;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl default_server;
server_name {YOUR_DOMAIN};
large_client_header_buffers 4 32k;
client_max_body_size 50M;
charset utf-8;
access_log /home/taiga/logs/nginx.access.log;
error_log /home/taiga/logs/nginx.error.log;
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;
}
# Admin access (/admin/)
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;
}
# Events
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";
ssl_certificate /etc/letsencrypt/live/{YOUR_DOMAIN}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{YOUR_DOMAIN}/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;
}
Now check the configuration:
As you can see, there are no errors, so restart Nginx:
At this stage, you can already use the Taiga project management system, but you can also install asynchronous mode. The fact is that by default Taiga executes all tasks in synchronous mode, but some tasks can be executed in asynchronous mode, such as webhook or import/export.
Setting Asynchronous Tasks Mode
First, let's check that RabbitMQ server and Redis server are installed:
Then we need to change the line in the ~/taiga-back/settings/local.py file:
CELERY_ENABLED = True
Now create the /etc/systemd/system/taiga_celery.service file to create a service (daemon):
[Unit]
Description=taiga_celery
After=network.target
[Service]
User=taiga
Environment=PYTHONUNBUFFERED=true
WorkingDirectory=/home/taiga/taiga-back
ExecStart=/home/taiga/.virtualenvs/taiga/bin/celery -A taiga worker --concurrency 4 -l INFO
Restart=always
RestartSec=3
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=default.target
Now reboot systemd, add a new service to autorun and start:
The installation of the Taiga project management system is completed… Not really. We have not set the firewall up!
Firewall Configuration
Ubuntu 18 uses ufw, first check its status:
As you can see, the firewall is not active. Now let's check a list of pre-created templates (in ufw logic it's app):
As you can see, by default there are only settings for ssh. Here are templates for ports 80 and 443:
Checking:
Now activate
Checking:
And now the installation is finally completed.
Taiga.io Overview
Now it is time to look at the results of your work. Go to our address at https://{YOUR_DOMAIN}:

There's nothing wrong with the fact there is already data present on the image. If you remember, in the instructions we have shown the possibility to fill the database for demonstation purposes. On the top right, we log in by pressing the “Login” button:

Do you remember the admin user with 123123 password? Log in as admin and do not forget to change the password in the user settings. You can also select the language of the user interface. After logging in, we find ourselves on the dashboard:

In the upper part, select the project (in this example, the project “Project example 0” is selected), and then you find yourself in the project management screen. Let's see what Kanban looks like in the Taiga.io implementation:

Now let's see what Scrum looks like:

In each project, you can add or remove users, assign roles:

Of course, there are various settings of the project itself:

If you are familiar with Agile methodology, you have heard about Epics. The following image shows how this looks in Taiga.io:

This usability of the Taiga project management system does not end here. There is also software for mobile platforms. In particular, we will briefly review applications for Android devices:

This application has paid functions, but free features would be sufficient for most users. To connect to your server, select use custom server and enter your data:

After logging in, you also see the dashboard:

The functionality of this application is almost as good as its web version:

From mobile devices you can access Taiga via the web-interface, but unfortunately, not all browsers always adequately handle some features. For example, in Kanban task transfer doesn't always work in many browsers. After all, Taiga has its own API that allows you to use all the functionality.
Conclusion
We have reviewed the Taiga project management system, which uses Agile methodology families Kanban and Scrum. Of course, to fully learn to work with this system is not a moment's work, and this article didn't cover it, but if you imagine the opportunities after learning and implementing this software - it will undoubtedly benefit your business and future projects. We are the main examples of this. Syncweb actively and successfully uses Taiga in its internal projects.
In addition, Taiga is free of charge when used on your own servers. Availability of various integration capabilities, API, active development (the project is not abandoned, the updates are released regularly), active community - these are the advantages of Taiga. The main disadvantages, in our opinion, are the difficulty in installing and updating and a small number of Russian-language resources for this software, which slightly increases the threshold of knowledge for system administrators concerning installation and implementation to the organization, but we hope that our instruction will help to reduce this requirement. It wasn't hard with us, was it?