TeamKit

Narzędzia do wspomagania pracy zespołowej.

Wdrażanie

Poniższe wdrożenie testowano na maszynie z systemem Linux Debian 10 z dostępem przez SSH lub terminal.

Aplikacja będzie zainstalowana pod użytkownikiem teamkit w katalogu /home/teamkit/teamkit-server. Jeśli planujesz instalować aplikację w innym miejscu, konieczne będzie zamienianie wszystkich ścieżek ręcznie.

Wymagania

Zacząć warto od upewnienia się, że system jest aktualny:

apt-get update
apt-get upgrade

Wymagane programy.

TeamKit opiera się o następujące oprogramowanie:

  1. Baza danych PostgreSQL.
  2. Redis.
  3. Python 3.x
  4. Nginx - serwer HTTP
  5. Supervisor

Wymagane składniki można zainstalować poleceniem:

sudo apt-get install rsync vim postgresql libpq-dev\
        git gcc python3-venv python3-dev redis-server\
        supervisor nginx make

sudo systemctl enable nginx
sudo systemctl enable supervisor
sudo systemctl enable redis
sudo systemctl enable postgresql

Następnie należy stworzyć użytkownika TeamKit:

useradd -m -U teamkit
passwd teamkit

Baza danych

createuser -P teamkit
createdb -E utf8 teamkit -O teamkit

Konfiguracja

Zaloguj się jako użytkownik teamkit.

Zakładając, że editor jest symlinkiem do vima, emacsa or nano:

# jako użytkownik teamkit

mkdir teamkit-server
cd ~/teamkit-server

# pliki konfiguracyjne i katalogi
make config
make deployconfig

mkdir -p teamkit/logs

# python
python3 -m venv env
env/bin/pip install wheel
env/bin/pip install -r requirements/dist.txt

env/bin/python manage.dist.py migrate

Alternatywnie, skopiuj teamkit/settings/email.py.base do teamkit/settings/email.py, oraz teamkit/settings/db.py.base do teamkit/settings/db.py, zmodyfikuj je zgodnie ze stworzoną przez Ciebie bazą danych, a następnie wykonaj dalsze polecenia.

Daphne

Należy zedytować plik bin/daphne.base do pliku bin/daphne, ustawiając odpowiednie ścieżki.

Przykład:

#!/bin/bash

NAME="teamkit"
DJANGODIR="/home/teamkit/teamkit-server"
USER=teamkit
GROUP=teamkit

SOCKFILE=$DJANGODIR"/run/daphne.sock"
DJANGO_SETTINGS_MODULE="teamkit.settings.dist"
DJANGO_ASGI_MODULE="teamkit.asgi"

cd $DJANGODIR
source env/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

exec daphne -u $SOCKFILE ${DJANGO_ASGI_MODULE}:application \
    --access-log - --proxy-headers

Następnie należy ustawić flagę wykonywalną na tym pliku.

chmod +x bin/daphne

Nginx

Do /etc/nginx/sites-available należy dodać nowy wpis, np. teamkit.mojadomena.pl.

upstream gunicorn_teamkitdaphne {
    server unix:/home/teamkit/teamkit-server/run/daphne.sock fail_timeout=0;
}

server {
    listen 80;
    listen [::]:80;

    server_name teamkit.mojadomena.pl;

    # logging
    access_log /var/log/nginx/teamkit.tools-access.log;
    error_log /var/log/nginx/teamkit.tools-error.log;

    location /static/ {
        alias /home/teamkit/teamkit-server/teamkit/static/dist/;
    }

    location /uploads/ {
        alias /home/teamkit/teamkit-server/teamkit/uploads/;
    }

    location ~ /ws/$ {
        proxy_pass http://gunicorn_teamkitdaphne;

        proxy_redirect off;
        proxy_http_version 1.1;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;

        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto http;

        proxy_redirect off;

        proxy_connect_timeout       600;
        proxy_send_timeout          600;
        proxy_read_timeout          600;
        send_timeout                600;

        proxy_pass http://gunicorn_teamkitdaphne;

        break;
    }
}

Jeśli planujesz dodanie certyfikatu SSL np. przez LetsEncrypt, w powyższej konfiguracji trzeba zmienić X-Forwarded-Proto na https.

W przeciwnym wypadku, w teamkit/settings/dist.py ustaw:

FORCE_HTTP_FOR_WEBSOCKETS = True

Supervisor

W katalogu /etc/supervisor/conf.d/teamkit.conf umieść:

[program:teamkit]
command = /home/teamkit/teamkit-server/bin/daphne
user = teamkit
stdout_logfile = /home/teamkit/teamkit-server/teamkit/logs/daphne_supervisor.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8

autostart=true
autorestart=true
supervisorctl reread
supervisorctl update

Cron

Do /etc/cron.daily/ dodaj wykonywalny plik expired-toolstates:

sudo -u teamkit /home/teamkit/teamkit-server/env/bin/python /home/teamkit/teamkit-server/manage.dist.py remove_expired_toolstates

Ten skrypt odpowiada za regularne usuwanie narzędzi z ustawionym terminem usunięcia.

Restart

Na sam koniec wykonaj następujące polecenia.

service supervisor restart
service nginx restart

Strona TeamKit powinna być już dostępna pod domeną teamkit.mojadomena.pl


Rozwój oprogramowania

Node

TeamKit korzysta z webpack+SASS+Vue.js. Do zarządzania wersjami najlepiej używać nvm.

Po zainstalowaniu nvma, użyj poniższej komendy, aby zainstalować środowisko Node 10.x

nvm install 10

Następnie włącz je dla developmentu.

$ nvm use 10
Now using node v10.10.0 (npm v6.4.1)

Zestawianie środowiska

Python

python3 -m venv env
source env/bin/activate
pip install -r requirements/local.txt // lub requirements/dist.txt dla środowiska produkcyjnego

JavaScript

npm install
npm run watch // albo npm run build dla jednorazowej kompilacji

Aby zbudować produkcyjne assety, użyj polecenia:

npm run build-dist

Django

Zakładając, że editor jest symlinkiem do vima, emacsa or nano:

make config
./manage.py migrate
./manage.py createsuperuser
./manage.py runserver

Alternatywnie, skopiuj teamkit/settings/db.py.base do teamkit/settings/db.py i zmodyfikuj je zgodnie ze stworzoną przez Ciebie bazą danych, a następnie wykonaj dalsze polecenia.