Установка Wekan Open-Source kanban (аналог Trello)

16.05.2019

Установка Wekan вручную

Установка Ubuntu

Для начала установим чистую Ubuntu на сервер. Для этого я взял установочный образ ubuntu-18.04.1.0-live-server-amd64.

Устанавливаем Ubuntu
Устанавливаем Ubuntu

После подключаемся к серверу через Putty или через CMD

ssh root@IP_адрес_сервера

Обновляем пакеты системы до актуального состояния

sudo apt update
sudo apt upgrade

Установка Nodejs

Wekan использует библиотеки nodejs. Мы не будем использовать репозиторий убунты а установим NVM (Node Version Manager).

Прежде чем мы приступим к установке nodejs, создадим пользователя wekan в системе.

useradd -m -s /bin/bash wekan
passwd wekan

Логинимся под новым пользователем и качаем установочный скрипт

su - wekan
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash

Команда установит nvm под пользователем 'itlocate' и добавит новую конфигурацию в файл конфигурации '.bashrc'.

source ~/.bashrc

Теперь протестируем с помощью команды nvm, как показано ниже

command -v nvm
nvm --version

Вы увидите, что у вас установлен nvm '0.33.8'. Теперь установим nodejs 4.8 с помощью NVM.

nvm install v4.8
nvm use node

Проверяем версию

node -v
Установка Nodejs
Установка Nodejs

Установка и настройка БД MongoDB

Обратно логинимся под пользователем с рут правами которого вы создали при установке системы

su - username

Для работы Wekan необходима MongoDB 3.2.x. Сейчас мы её и установим, добавляем репозиторий.

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

Теперь устанавливаем

sudo apt update
sudo apt install -y mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-mongos mongodb-org-tools

После установки прописываем службу, для автоматического старта mongo при загрузке системы

sudo systemctl start mongod
sudo systemctl enable mongod

Теперь необходимо её настроить. Логинимся в mongo.

mongo

Создаём нового пользователя admin с полными правами

db.createUser(
  {
    user: "admin",
    pwd: "Password",
    roles: [ { role: "root", db: "admin" } ]
  }
)
При успехе вы должны увидеть примерно такое окно
При успехе вы должны увидеть примерно такое окно

Выходим из приложения

exit

Теперь админа мы создали. Для включения аутентификации нам необходимо отредактировать файл /etc/mongod.conf.

vim /etc/mongod.conf

Ищем и раскомментируем строку security

security:
  authorization: enabled

Сохраняемся и выходим. ESC потом :wq и Enter. Теперь нужно перезапустить службу MongoDB

systemctl restart mongod

Теперь нужно создать базы данных для Wekan. Назовём базу wekan, пользователя wekan с паролем WekanPassword. Логинимся под админом.

mongo -u admin -p

И выполняем запрос

use wekan
db.createUser(
    {
      user: "wekan",
      pwd: "WekanPassword",
      roles: ["readWrite"]
    }
 )
При успехе вы должны увидеть примерно такое окно
При успехе вы должны увидеть примерно такое окно

Установка Wekan

Логинимся под пользователем wekan и скачиваем архив для установки.

su - wekan
wget https://github.com/wekan/wekan/releases/download/v0.63/wekan-0.63.tar.gz
tar xf wekan-0.63.tar.gz

У нас появится новая директория bundle. Перейдём в каталог и установим все зависимости Wekan.

cd bundle/programs/server
npm install
При успехе вы должны увидеть примерно такое окно
При успехе вы должны увидеть примерно такое окно

Теперь мы попробуем запустить Wekan. Осталось настроить переменные для приложения Wekan.

export MONGO_URL='mongodb://wekan:WekanPassword@127.0.0.1:27017/wekan?authSource=wekan'
export ROOT_URL='http://192.168.1.57/'
export MAIL_URL='smtp://user:pass@mail.domain.co:25/'
export MAIL_FROM='wekan@domain.co'
export PORT=8000

Теперь идём в каталог bundle и запускаем приложение Node.js

cd ~/bundle
node main.js

Теперь сервер запущен на 8000 порту. Открываем браузер и вводим туда: http://192.168.1.57:8000

Окно авторизации
Окно авторизации

Настройка Wekan

Сервер Wekan работает, теперь нам нужно создать службу в systemd

su - wekan
cd bundle/
vim .env

Скопируйте туда следующую конфигурацию

MONGO_URL='mongodb://wekan:WekanPassword@127.0.0.1:27017/wekan?authSource=wekan'
 ROOT_URL='http://wekan.itlocate.ru'
 MAIL_URL='smtp://user:pass@mail.domain.co:25/'
 MAIL_FROM='wekan@domain.co'
 PORT=8000
 HTTP_FORWARDED_COUNT=1

Сохраните и выйдите. Теперь создадим службу wekan.service. Её нужно создать от пользователя root.

cd /etc/systemd/system/
vim wekan.service

Скопируйте это

[Unit]
 Description=Wekan Server
 After=syslog.target
 After=network.target
 
 [Service]
 Type=simple
 Restart=on-failure
 StartLimitInterval=86400
 StartLimitBurst=5
 RestartSec=10
 ExecStart=/home/wekan/.nvm/versions/node/v4.8.7/bin/node bundle/main.js
 EnvironmentFile=/home/wekan/bundle/.env
 ExecReload=/bin/kill -USR1 $MAINPID
 RestartSec=10
 User=wekan
 Group=wekan
 WorkingDirectory=/home/wekan
 StandardOutput=syslog
 StandardError=syslog
 SyslogIdentifier=Wekan
 
 [Install]
 WantedBy=multi-user.target

Сохраните и выйдите. Теперь создадим службу wekan.service.

Перезапустим systemd следующей командой

systemctl daemon-reload

прописываем службу, для автоматического старта mongo при загрузке системы

systemctl start wekan
systemctl enable wekan

Теперь проверьте сервис Wekan, используя команды ниже

netstat -plntu
systemctl status wekan
Должны увидеть что Wekan запушен на 8000 порту
Должны увидеть что Wekan запушен на 8000 порту

Установим Nginx в качестве прокси для Wekan

Устанавливаем

sudo apt install nginx -y

После установки открываем директорию /etc/nginx/sites-available' и создаём новый виртуальный хост wekan.

cd /etc/nginx/sites-available
vim wekan

Копируем туда

# this section is needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# HTTP
server {
    listen 80; # if this is not a default server, remove "default_server"
    listen [::]:80 ipv6only=on;

    server_name wekan.itlocate.ru;

    # redirect non-SSL to SSL
    location / {
        rewrite     ^ https://wekan.itlocate.ru$request_uri? permanent;
    }
}

# HTTPS server
server {
    listen 443 ssl http2; # we enable HTTP/2 here (previously SPDY)
    server_name wekan.itlocate.ru; # this domain must match Common Name (CN) in the SSL certificate

    ssl_certificate /etc/letsencrypt/live/wekan.itlocate.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/wekan.itlocate.ru/privkey.pem;

    # If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
    # This works because IE 11 does not present itself as MSIE anymore
    if ($http_user_agent ~ "MSIE" ) {
        return 303 https://browser-update.org/update.html;
    }

    # Pass requests to Wekan.
    # If you have Wekan at https://wekan.itlocate.ru/wekan , change location to:
    # location /wekan {
    location / {
        # proxy_pass http://127.0.0.1:8000/wekan;
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # allow websockets
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr; # preserve client IP

        # this setting allows the browser to cache the application in a way compatible with Meteor
        # on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
        # the root path (/) MUST NOT be cached
        #if ($uri != '/wekan') {
        #    expires 30d;
        #}
    }
}

Ещё необходимо немного подправить nginx.conf

vim /etc/nginx/nginx.conf

Заменяем содержимое на следующее

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

        ## Max attachment size that can be uploaded to Wekan:
        client_max_body_size 100M;
	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	types_hash_max_size 2048;
	server_tokens off;
        set_real_ip_from 0.0.0.0/32; # All addresses get a real IP.
        real_ip_header X-Forwarded-For;
        limit_conn_zone $binary_remote_addr zone=arbeit:10m;
        client_body_timeout 60;
        client_header_timeout 60;
        keepalive_timeout 10 10;
        send_timeout 60;
        reset_timedout_connection on;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:30m;
        ssl_session_timeout 1d;
        ssl_ciphers ECDH+aRSA+AESGCM:ECDH+aRSA+SHA384:ECDH+aRSA+SHA256:ECDH:EDH+CAMELLIA:EDH+aRSA:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA;
        ssl_dhparam /etc/ssl/dh_param.pem;
        ssl_ecdh_curve secp384r1;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header X-XSS-Protection '1; mode=block';
        add_header X-Frame-Options SAMEORIGIN;
        add_header Strict-Transport-Security 'max-age=31536000';
        add_header X-Content-Options nosniff;
        add_header X-Micro-Cache $upstream_cache_status;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";
        gzip_buffers 16 8k;
        gzip_comp_level 1;
        gzip_http_version 1.1;
        gzip_min_length 10;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/x-icon application/vnd.ms-fontobject font/opentype application/x-font-ttf;
        gzip_vary on;
        gzip_proxied any; # Compression for all requests.

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

Сохраните и выйдите. Теперь перезапустим службу nginx.

systemctl restart nginx
systemctl enable nginx

Проверяем что 80 порт открыт на nginx

netstat -plntu

На этом с nginx закончим.

Проверяем

Внимание! В Wekan пользователей по умолчанию нету. После установки его необходимо создать через терминал. Как это сделать, читайте ниже!

Переходим по адресу http://wekan.itlocate.ru. Жмём на регистрацию, заполняем форму и жмём зарегистрировать. И скорее всего у вас ничего не выйдет) Потому что мы активируем первого пользователя из терминала! Пароль от wekan: WekanPassword

mongo -u wekan -p --authenticationDatabase "wekan"

Выполните следующий запрос

use wekan
db.users.update({username:'itlocate'},{$set:{isAdmin:true}})
Должны увидеть примерно это
Должны увидеть примерно это

Заново пробуем зайти

Поздравляю! У вас получилось! =)

Установка Snap пакетом

Во время установки Ubuntu

А можно прямо во время установки системы выбрать snap пакет wekan

Всё намного проще)
Всё намного проще)

На установленную систему Ubuntu

Вот список команд для убунты:

sudo apt install snapd
sudo snap install wekan
sudo snap set wekan root-url="http://wekan.itlocate.ru/"
sudo snap set wekan port="8000"
sudo systemctl restart snap.wekan.mongodb
sudo systemctl restart snap.wekan.wekan

Файл сервиса wekan лежит тут: /etc/systemd/system/snap.wekan.wekan.service. Проверить статус сервиса можно командой ниж:

systemctl status  snap.wekan.wekan

В дополнение к работе с snap пактом Wekan рассмотрим ещё несколько команд:

Используйте следующую команду для включения сервиса wekan при загрузке системы.

sudo snap enable wekan

Используйте следующую команду для отключения запуска сервиса wekan при загрузке системы.

sudo snap disable wekan

MongoDB сервис порт также может быть изменён на любой другой:

sudo snap set wekan mongodb-port=27019

Для изменения порта можно использовать MongoDB CLI. (но для этого нужен пакет MongoDB 3.2.x tools):

mongo --port 27019

Если вы внесли какие-либо изменения в сервис wekan вам потребуется перезапук. Это можно сделать следующей командой:

sudo systemctl restart snap.wekan.wekan

Автоматически установить snap обновления можно следующей командой, где 01:00-03:00 это промежуток времени между часом ночи и тремя часами ночи:

snap set core refresh.schedule=01:00-03:00

Автоматические обновления сервер получает когда выходит новый релиз wekan, по расписанию или в процессе выполнения команды:

sudo snap refresh

Также можно дополнительно настроить почтовые уведомления

sudo snap set wekan mail-url='smtps://user:pass@mailserver.example.com:453'
sudo snap set wekan mail-from='Wekan Boards <wekan@example.com>'

Рекомендованные настроеки Nginx configuration,/etc/nginx/nginx.conf

user nginx;
worker_processes auto;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
	worker_connections 1024;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	types_hash_max_size 2048;
	server_tokens off;
        set_real_ip_from 0.0.0.0/32; # All addresses get a real IP.
        real_ip_header X-Forwarded-For;
        limit_conn_zone $binary_remote_addr zone=arbeit:10m;
        client_body_timeout 60;
        client_header_timeout 60;
        keepalive_timeout 10 10;
        send_timeout 60;
        reset_timedout_connection on;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:30m;
        ssl_session_timeout 1d;
        ssl_ciphers ECDH+aRSA+AESGCM:ECDH+aRSA+SHA384:ECDH+aRSA+SHA256:ECDH:EDH+CAMELLIA:EDH+aRSA:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA;
        ssl_ecdh_curve secp384r1;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header X-XSS-Protection '1; mode=block';
        add_header X-Frame-Options SAMEORIGIN;
        add_header Strict-Transport-Security 'max-age=31536000';
        add_header X-Content-Options nosniff;
        add_header X-Micro-Cache $upstream_cache_status;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";
        gzip_buffers 16 8k;
        gzip_comp_level 1;
        gzip_http_version 1.1;
        gzip_min_length 10;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/x-icon application/vnd.ms-fontobject font/opentype application/x-font-ttf;
        gzip_vary on;
        gzip_proxied any; # Compression for all requests.

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;
}

Создание Nginx файла Virtual Host для Wekan на HTTP протоколе. Откройте конфигурационный файл

sudo nano /etc/nginx/conf.d/wekan.conf

И добавьте туда следующее содержимое:

# This section is needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# HTTP
server {
    listen 80;
    server_name wekan.example.com;
    
    # If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
    # This works because IE 11 does not present itself as MSIE anymore
    if ($http_user_agent ~ "MSIE" ) {
        return 303 https://browser-update.org/update.html;
    }

    # Pass requests to Wekan.
    # If you have Wekan at https://example.com/wekan, change the location to:
    # location /wekan {
    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # allow websockets
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr; # preserve client IP

        # this setting allows the browser to cache the application in a way compatible with Meteor
        # on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
        # the root path (/) MUST NOT be cached
        #if ($uri != '/wekan') {
        #    expires 30d;
        #}
    }
}

Установка SSL сертификата Let's Encrypt для Wekan

Если вы хотите использовать Wekan с SSL сертификатом, то читайте ниже что необходимо сделать. Будем использовать Let's Encrypt для защиты доступа к панели мониторинга Wekan, так как это бесплатный сертификат и его легко получить. Чтобы certbot смог создать сертификат SSL, вам нужен открытый порт 80, который не используется ни одной веб-службой. Если у вас работает брандмауэр UFW, откройте порт с помощью:

sudo ufw allow proto tcp from any to any port 80,443

Мы запросим сертификат с помощью certbot-auto. Поставщик сертификата запросит действующий адрес электронной почты (туда будут приходить уведомлений об истечении срока действия сертификата и действующего домена, используемый Wekan.

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
mv certbot-auto /usr/local/bin
export DOMAIN="wekan.example.com"
export EMAIL="wekan-mail@example.com"
certbot-auto certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -n -m $EMAIL --keep-until-expiring

Ок, теперь сконфигурируем Nginx. Откроем:

sudo vim /etc/nginx/conf.d/wekan.conf

И вставим туда содержимое ниже:

# this section is needed to proxy web-socket connections
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

# HTTP
server {
    listen 80; 
    server_name example.com;
    # redirect non-SSL to SSL
    location / {
        rewrite     ^ https://example.com$request_uri? permanent;
    }
}

# HTTPS server
server {
    listen 443 ssl http2; # we enable HTTP/2 here (previously SPDY)
    server_name example.com; # this domain must match Common Name (CN) in the SSL certificate

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # If your application is not compatible with IE <= 10, this will redirect visitors to a page advising a browser update
    # This works because IE 11 does not present itself as MSIE anymore
    if ($http_user_agent ~ "MSIE" ) {
        return 303 https://browser-update.org/update.html;
    }

    # Pass requests to Wekan.
    # If you have Wekan at https://example.com/wekan , change location to:
    # location /wekan {
    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; # allow websockets
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Forwarded-For $remote_addr; # preserve client IP

        # this setting allows the browser to cache the application in a way compatible with Meteor
        # on every applicaiton update the name of CSS and JS file is different, so they can be cache infinitely (here: 30 days)
        # the root path (/) MUST NOT be cached
        #if ($uri != '/wekan') {
        #    expires 30d;
        #}
    }
}

Включим автозапуск сервиса при старте системы с wekan:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если всё хорошо то можем запускать Nginx

sudo systemctl start nginx
sudo systemctl enable nginx

Теперь нужно перейти по URL или на IP адрес вашего сервера через браузер и создать аккаунт администратора. Так как первый пользователь, который будет зарегистрирован в Wekan автоматом получает права админа. Вот так! И да, если у вас будет ошибка на счёт email адреса, то просто проигнорируйте это, ведь email не обязательный параметр и без него wekan прекрасно работает. Все последующие пользователи будут регистрироваться с обычными правами. Если вы хотите отключить открытыю регистрацию пользователей, то эту настройку вы можете найти dmin Panel / Settings / Registration / Disable self-registration

Спасибо что дочитали эту ну уж очень большую простыню из конфигов и прочей ерунды! Хочу в ближайшем времени сделать обзорчик этой системы, возможно запилить видос, так что жмакай на RSS в верхнем правом углу сайта дабы не пропустить сиё чудо цифровой революции просторов интернета!

Автору на кофе ☕ или просто поднять мотивацию писать больше статей для вас 😉 !
Отдельное спасибо всем, кто отправляет донатики 😀! Очень приятно и неожиданно. Благодаря вам сайт может и в дальнейшем обходиться без рекламных баннеров.
13319