“Организовать - это значит сначала оценить возможность, а уже потом ставить задачу...”
— Неизвестный автор
Искусство организовать работу и следить за ее исполнением в современном обществе является неотъемлемой частью успешного бизнеса. Всё начинается с малого. Сначала Вы один работаете над каким-нибудь проектом - всё легко, есть одна задача и вы её реализуете. Достаточно держать эту задачу в своей памяти. Но с каждым днем появляются подзадачи, добавляются заметки и приходит осознание того, что всё уже не получается запоминать. Тут можно обойтись ежедневником. Количество задач растёт и Вы понимаете, что тянуть проект в одного становится невозможно. У Вас появляются подчиненные, Вы перекладываете часть задач на своих подчиненных, но как следить за выполнением поставленных задач? Как переназначать задачи? Тут явно уже будет не хватать ежедневника.
За всю историю человечества были реализованы множества проектов от самых простых до невероятно сложных. Для достижения поставленных целей и организации управления были разработаны различные системы управления проектами, каждая имеет свои преимущества и недостатки, но, к сожалению, разбирать мы их не будем, поскольку разговор про них является очень большой отдельной темой.
В современном мире в качестве помощи и удобства менеджменту для управления проектами были разработаны различные ПО (программное обеспечение). Их довольно много, но сегодня мы рассмотрим достойное ПО системы управления проектами Taiga использующий Scrum и Kanban семейства методологий Agile. В основном это ПО используется разработчиками и дизайнерами. К сожалению, даже при бесплатности проекта в русском сегменте Интернета довольно мало информации об этом ПО. Поэтому мы - команда Syncweb, надеемся, что благодаря нашим стараниям, упростим порог входа для начала использования данного проекта.
Проверяем требования
Для начала проверим необходимые минимальные требования к Taiga.io:
- должен быть root доступ;
- Python >= 3.4;
- СУБД PostgreSQL >= 9.4;
- RabbitMQ;
- не менее 0,75 ГБ оперативной памяти (требуется для установки lxml), на всякий случай возьмем 1ГБ.
- Во время установки потребуется: Ruby >= 2.1 и NodeJS >= 7.0
Для более подробной информации можно обратиться к официальному сайту.
Вообще установить можно несколькими способами, но мы не ищем легких путей и воспользуемся ручным. В качестве операционной системы (ОС) будем использовать Ubuntu 18.04.
В ходе установки нужно будет изменять или создавать достаточно много файлов, и для каждой установки должны быть указаны свои параметры. Такие параметры мы будем заключать в скобки и названием на английском с пояснениями, как пример -
Так же мы используем зачастую консольный текстовый редактор vi, Вы можете использовать любой другой. Для входа в режим вставки текста нажмите i и начинайте ввод. А для сохранения изменений и закрытия файла сначала нажмите Esc, затем :wq.
Установка необходимых пакетов
Для начала установим несколько удобных пакетов:
Cоздадим пользователя supp:
И разрешим доступ через sudo:
Затем отредактируем файл /etc/ssh/sshd_config
Раскоментируем строчку
PermitRootLogin no
И добавим
AllowUsers supp
Теперь перезапустим демона SSH:
Перезайдем под пользователем supp. Предварительно установим необходимые пакеты:
Установка Nginx
Далее необходимо установить Nginx, в официальном репозитории имеется версия 1.14, поэтому воспользуемся инструкцией с официального сайта.
Теперь установим Nginx. Для начала установим необходимые пакеты для подключения репозитория:
Теперь подключим репозиторий стабильной версии:
Импортируем ключ для проверки подлинности пакетов:
А теперь установим:
Инструкции для самостоятельной установки можно посмотреть на официальной странице Nginx.
Затем устанавливаем RabbitMQ и Redis:
Установка PostgreSQL
Теперь установим СУБД PostgreSQL, но текущая версия в репозитории 10, а официальная последняя версия 11.3. Если посмотреть тестирования производительности различных версий PostgreSQL, например, на сайте Habr, то можно увидеть увеличение производительности более новых версий по сравнению с предыдущими. Поэтому поставим с официального сайта, воспользовавшись инструкцией.
Для начала добавим репозиторий:
Импортируем ключ проверки подлинности пакетов:
Продолжаем установку:
Теперь перед дальнейшими действиями перезагрузим сервер:
После перезагрузки сервера авторизуемся под нашим пользователем supp и создадим пользователя taiga:
ВНИМАНИЕ! Дальнейшие действия необходимо производить из под пользователя Taiga
Инициализируем настройку СУБД PostgreSQL:
Теперь произведем настройки для RabbitMQ, где {YOUR_PASSWORD_EVENTS} - пароль RabbitMQ, который будет использоваться в конфигурационных файлах ниже
Установка BACKEND
Теперь произведем настройки для RabbitMQ, где {YOUR_PASSWORD_EVENTS} - пароль RabbitMQ, который будет использоваться в конфигурационных файлах ниже
Создаем virtualenv taiga:
И устанавливаем необходимые пакеты:
Теперь инициализируем базу данных:
После этих действий создается пользователь admin с паролем 123123. Запомним, поскольку будем вводить эти данные при первичной авторизации в web-интерфейсе.
Для создания не пустой базы, например, чтобы посмотреть как создавать и работать с taiga.io или для демонстрации работы необходимо также ввести команду:
Для завершения настроек backend’а необходимо создать файл настроек ~/taiga-back/settings/local.py со следующим содержимым, где:
- {YOUR_DOMAIN} - Ваш домен, например, example.ru;
- {YOUR_SECRET_KEY} - секретный ключ, чем сложнее и длиннее - тем лучше, его же будем использовать при конфигурации файла для событий (EVENTS) чуть ниже;
- {YOUR_PASSWORD_EVENTS} - пароль для пушей для событий (Events), который прописывали при настройке RabbitMQ;
- {YOUR_GOOGLE_EMAIL} - Ваш Email Google, поскольку в данном примере мы используем настройки от почтовика Google;
- {YOUR_PASSWORD_EMAIL} - пароль от Email.
Так же просим обратить внимание на протокол HTTPS
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"
Теперь осталось запустить backend и проверить:
Установка FRONTEND
Теперь приступим к установке frontend’а.
Затем копируем пример конфигурационного файла:
И изменим содержимое файла по примеру ниже, где:
- {YOUR_DOMAIN} - Ваш домен, например, example.ru;
- параметр defaultLanguage: ru - говорит о языке по умолчанию;
- параметр publicRegisterEnabled: true отвечает за возможность свободной регистрации на главной странице, если Вам не нужно, чтобы любой мог зарегистрироваться - поставьте значение 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
Немного сложновата установка, но мы же сами выбрали такой путь! Теперь займемся установкой событий (Events):
Теперь установим nodejs:
Установим также зависимости javascript:
Теперь настроим конфигурационный файл событий предварительно скопировав его:
Примерное содержимое файла будет следующим, где:
- {YOUR_PASSWORD_EVENTS} - пароль, который создавали при настройке RabbitMQ;
- {YOUR_SECRET_KEY} - ключ, который использовали в файле конфигурации при настройке backend’а local.py:
{
"url": "amqp://taiga:{YOUR_PASSWORD_EVENTS}@localhost:5672/taiga",
"secret": "{YOUR_SECRET_KEY}",
"webSocketServer": {
"port": 8888
}
}
Теперь необходимо добавить события как службу. Для этого создаем файл и приводим к виду ниже:
[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
Осталось добавить службу в автозапуск и запустить её:
Со службой событий мы справились, но теперь необходимо сделать тоже самое и для backend’а. поэтому снова создаем файл со следующим содержимым:
[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
Теперь запускаем новую службу taiga и добавляем в автозапуск:
Теперь проверим службу, что она успешно запустилась:
Соберемся, остались последние штрихи. Донастроем Nginx. Для начала удалим конфигурацию по умолчанию:
или для некоторых случаев файл конфигурации по умолчанию может находиться в другом месте:
Создадим папку для логов:
Установка сертификатов Let’s Encrypt
Поскольку мы будем использовать HTTPS для повышения безопасности нашего сайта. Подробнее о SSL сертификатах, вы можете узнать из нашей статьи. Итак, воспользуемся бесплатными сертификатами Let's Encrypt и клиентом Certbot.
Теперь можно будет выпустить сертификат, где: {YOUR_DOMAIN} - Ваш домен, например, example.ru:
Теперь создадим DH (Diffie Hellman) ключ:
Для самостоятельной установки можно воспользоваться инструкцией с официального сайта 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;
}
Теперь проверяем конфигурацию:
Как видим - ошибок нет, а значит перезапускаем Nginx:
На этом этапе уже можно пользоваться системой управления проектами Taiga (Тайга), но можно доустановить асинхронный режим. Дело в том, что по умолчанию Taiga выполняет все задачи в синхронном режиме, но некоторые задачи могут выполняться в асинхронном режиме, например, webhook или импорт/экспорт.
Установка режима Асинхронные задачи
Для начала проверим, что RabbitMQ сервер и Redis сервер установлены:
Затем нам надо изменить строчку в файле ~/taiga-back/settings/local.py:
CELERY_ENABLED = True
Теперь создаем файл /etc/systemd/system/taiga_celery.service для создания службы (демона):
[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
Теперь перезагружаем systemd, добавляем новую службу в автозапуск и стартуем:
На этом установка системы управления проектами Taiga закончена. На самом деле - нет. Мы не настроили firewall!
Настройка firewall
В ubuntu 18 используется ufw, для начала проверим его статус:
Как видим - firewall не активен. Теперь посмотрим список заранее созданных шаблонов (в логике ufw это app от application - приложение):
Как видно, по умолчанию присутствует только настройки для ssh. Теперь шаблоны для 80 и 443 портов:
Проверим:
Теперь активируем
Проверяем:
На этом теперь точно установка закончена.
Обзор Taiga.io
Теперь пришло время посмотреть на результаты своего труда. Заходим по нашему адресу https://{YOUR_DOMAIN}:
Не пугайтесь о наличии на изображении уже существующих данных. Если вспомним - в инструкции мы указали о возможности заполнить базу для демонстрации возможностей. Справа вверху авторизуемся нажав кнопку “Login”:
Помним пользователя admin и пароль 123123? Вводим и не забываем сменить его в настройках пользователя. Там же можно выбрать язык интерфейса пользователя. После входа мы оказываемся на рабочем столе (Dashboard):
В верхней части выбираем проект (в данном примере выбран проект “Project example 0”), после чего мы оказываемся в управлении проектом. Посмотрим как выглядит Kanban в реализации Taiga.io:
Теперь посмотрим как будет выглядеть Scrum:
В каждом проекте можно добавлять или удалять пользователей, распределять роли:
Конечно же есть и различные настройки самого проекта:
Если Вы знакомы с методологией Agile, то слышали об Epics. Следующее изображение показывает как выглядит это в Taiga.io:
На этом удобства использования системы управления проектами Taiga не заканчивается. Здесь присутствует ПО для мобильных платформ, в частности в кратце рассмотрим приложения для устройств на базе ОС Android:
Данное приложение имеет платные функции, но для большинства хватит и бесплатных возможностей. Для подключения к своему серверу выбираем use custom server и вводим наши данные:
После входа мы также видим рабочий стол (dasboard):
По функциональности данное приложение практически не уступает своей web-версии:
С мобильных устройств можно заходить через web-интерфейс в Taiga, но, к сожалению, не все браузеры всегда адекватно обрабатывают некоторые возможности. Например, в Kanban перенос задач не всегда работает во многих браузерах. В конце концов - Taiga имеет собственное API, позволяющее использовать весь функционал.
Заключение
Мы с Вами рассмотрели ПО системы управления проектами Taiga работающая с Kanban и Scrum семейства Agile методологии. Конечно, полноценно научиться работать с данной системой - дело не минутное, да и в этой статье мы не затрагивали эту тему, но если представить открывающиеся возможности после изучения и внедрения данного ПО- то это несомненно принесёт пользу Вашему бизнесу и будущим проектам. Главным примером являемся мы сами. Наша компания Syncweb активно и успешно использует её в своих внутренних проектах.
К тому же при использовании на своих серверах Taiga бесплатна. Наличие различных возможностей интеграции, API, активная разработка(проект не брошен, регулярно выходят обновления), активное сообщество только даёт плюсы в сторону использования Taiga. К главным минусам мы бы отнесли сложность в установке и обновлении и малом количестве русскоязычных ресурсов по данному ПО, что несколько повышает порог знаний системных администраторов для установки и внедрения в организацию, но мы надеемся, что наша инструкция поможет снизить данное требование. С нами было ведь не сложно, правда?