Taiga: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
K (Änderungen von Tim00 (Diskussion) wurden auf die letzte Version von Hsh-peterhormanns zurückgesetzt)
Markierung: Zurücksetzung
 
(5 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 19: Zeile 19:
Das Backend ist eine Python-/Django-Anwendung. Die Sourcen werden aus dem Git-Repository bei Github ausgecheckt:
Das Backend ist eine Python-/Django-Anwendung. Die Sourcen werden aus dem Git-Repository bei Github ausgecheckt:


cd ~
<syntaxhighlight lang=shell>
git clone https://github.com/kaleidos-ventures/taiga-back
cd ~
cd taiga-back
git clone https://github.com/kaleidos-ventures/taiga-back
git checkout stable
cd taiga-back
git checkout stable
</syntaxhighlight>


Dann wird im Projekt-Verzeichnis ein Python.Virtualenv angelegt:
Dann wird im Projekt-Verzeichnis ein Python.Virtualenv angelegt:


cd ~/taiga-back
<syntaxhighlight lang=shell>
python3 -m venv .venv --prompt taiga-back
cd ~/taiga-back
source .venv/bin/activate
python3 -m venv .venv --prompt taiga-back
(taiga-back) pip install --upgrade pip wheel
source .venv/bin/activate
(taiga-back) pip install -r requirements.txt
(taiga-back) pip install --upgrade pip wheel
(taiga-back) pip install git+https://github.com/kaleidos-ventures/taiga-contrib-protected.git@6.0.0#egg=taiga-contrib-protected
(taiga-back) pip install -r requirements.txt
(taiga-back) pip install git+https://github.com/kaleidos-ventures/taiga-contrib-protected.git@6.7.0#egg=taiga-contrib-protected
</syntaxhighlight>


Es folgt die Konfiguration der Django-Anwendung
Es folgt die Konfiguration der Django-Anwendung


cd ~/taiga-back
<syntaxhighlight lang=shell>
cp settings/config.py.prod.example settings/config.py
cd ~/taiga-back
nano settings/config.py
cp settings/config.py.prod.example settings/config.py
nano settings/config.py
</syntaxhighlight>


Folgende Einstellungen müssen angepasst werden:
Folgende Einstellungen müssen angepasst werden:
Zeile 43: Zeile 49:
In der Struktur "DATABASES" wird die angelegte PostgreSQL-Datenbank eingetragen.
In der Struktur "DATABASES" wird die angelegte PostgreSQL-Datenbank eingetragen.


DATABASES = {
<syntaxhighlight lang=python>
    'default': {
DATABASES = {
        'ENGINE': 'django.db.backends.postgresql',
    'default': {
        'NAME': 'xyz00_taiga',
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'xyz00_taiga',
        'NAME': 'xyz00_taiga',
        'PASSWORD': 'das-passwort-von-xyz00_taiga',
        'USER': 'xyz00_taiga',
        'HOST': '127.0.0.1',
        'PASSWORD': 'das-passwort-von-xyz00_taiga',
        'PORT': '5432',
        'HOST': '127.0.0.1',
    }
        'PORT': '5432',
}
    }
}
</syntaxhighlight>


Für die Variablen "SITES" und TAIGA_URL muss die richtige Domain eingetragen werden, als "SECRET_KEY" wird ein zufällige Zeichenkette eingetragen.
Für die Variablen "SITES" und TAIGA_URL muss die richtige Domain eingetragen werden, als "SECRET_KEY" wird ein zufällige Zeichenkette eingetragen.


SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxx"
<syntaxhighlight lang=python>
TAIGA_URL = "https://projekte.hs-example.de"
SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxx"
SITES = {
TAIGA_URL = "https://projekte.hs-example.de"
    "api": {"domain": "projekte.hs-example.de", "scheme": "https", "name": "api"},
SITES = {
    "front": {"domain": "projekte.hs-example.de", "scheme": "https", "name": "front"}
    "api": {"domain": "projekte.hs-example.de", "scheme": "https", "name": "api"},
}
    "front": {"domain": "projekte.hs-example.de", "scheme": "https", "name": "front"}
}
</syntaxhighlight>


Im Bereich "MEDIA AND STATIC" werden die bisher auskommentierten Variablen "MEDIA_ROOT" und "STATIC_ROOT" definiert.
Im Bereich "MEDIA AND STATIC" werden die bisher auskommentierten Variablen "MEDIA_ROOT" und "STATIC_ROOT" definiert.


# MEDIA_ROOT = '/home/taiga/media'
<syntaxhighlight lang=python>
MEDIA_ROOT = '/home/pacs/xyz00/users/taiga/data/media'
# MEDIA_ROOT = '/home/taiga/media'
MEDIA_URL = f"{ TAIGA_URL }/media/"
MEDIA_ROOT = '/home/pacs/xyz00/users/taiga/data/media'
DEFAULT_FILE_STORAGE = "taiga_contrib_protected.storage.ProtectedFileSystemStorage"
MEDIA_URL = f"{ TAIGA_URL }/media/"
THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE
DEFAULT_FILE_STORAGE = "taiga_contrib_protected.storage.ProtectedFileSystemStorage"
# STATIC_ROOT = '/home/taiga/static'
THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE
STATIC_ROOT = '/home/pacs/xyz00/users/taiga/data/static'
# STATIC_ROOT = '/home/taiga/static'
STATIC_URL = f"{ TAIGA_URL }/static/"
STATIC_ROOT = '/home/pacs/xyz00/users/taiga/data/static'
STATIC_URL = f"{ TAIGA_URL }/static/"
</syntaxhighlight>


Für das Versenden von E-Mail ist der Bereich "EMAIL" anzupassen.
Für das Versenden von E-Mail ist der Bereich "EMAIL" anzupassen.


DEFAULT_FROM_EMAIL = 'noreply@projekte.hs-example.de'
<syntaxhighlight lang=python>
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'noreply@projekte.hs-example.de'
EMAIL_HOST = '127.0.0.1'
EMAIL_USE_TLS = True
EMAIL_PORT = 4587
EMAIL_HOST = '127.0.0.1'
EMAIL_HOST_USER = 'xyz00-taiga'
EMAIL_PORT = 4587
EMAIL_HOST_PASSWORD = 'passwort-von-xyz00-taiga'
EMAIL_HOST_USER = 'xyz00-taiga'
EMAIL_HOST_PASSWORD = 'passwort-von-xyz00-taiga'
</syntaxhighlight>


Alle Zeilen, die mit "EVENTS_PUSH" oder "CELERY" beginnen, können auskommentiert werden, lediglich  
Alle Zeilen, die mit "EVENTS_PUSH" oder "CELERY" beginnen, können auskommentiert werden, lediglich  


CELERY_ENABLED = False
<syntaxhighlight lang=python>
CELERY_ENABLED = False
</syntaxhighlight>


sollte gesetzt werden.
sollte gesetzt werden.
Zeile 91: Zeile 107:
Zum Schluss ist bei mir konfiguriert:
Zum Schluss ist bei mir konfiguriert:


PUBLIC_REGISTER_ENABLED = True
<syntaxhighlight lang=python>
USER_EMAIL_ALLOWED_DOMAINS = "hs-example.de"
PUBLIC_REGISTER_ENABLED = True
USER_EMAIL_ALLOWED_DOMAINS = "hs-example.de"
</syntaxhighlight>


und  
und  


ENABLE_TELEMETRY = False
<syntaxhighlight lang=python>
ENABLE_TELEMETRY = False
</syntaxhighlight>


Falls man aber auch Benutzer von anderen E-Mail Domains erlauben möchte, muss man diese in <code>USER_EMAIL_ALLOWED_DOMAINS</code> hinzufügen, oder wenn man gar keine Beschränkung möchte, diese Zeile ganz auskommentieren. Das macht zum Beispiel Sinn, wenn <code>PUBLIC_REGISTER_ENABLED</code> abgeschaltet ist.
Falls man aber auch Benutzer von anderen E-Mail Domains erlauben möchte, muss man diese in <code>USER_EMAIL_ALLOWED_DOMAINS</code> hinzufügen, oder wenn man gar keine Beschränkung möchte, diese Zeile ganz auskommentieren. Das macht zum Beispiel Sinn, wenn <code>PUBLIC_REGISTER_ENABLED</code> abgeschaltet ist.
Zeile 102: Zeile 122:
Nun werden mit den folgenden Kommandos die Datenverzeichnisse angelegt
Nun werden mit den folgenden Kommandos die Datenverzeichnisse angelegt


cd ~
<syntaxhighlight lang=shell>
mkdir data
cd ~
mkdir data/static
mkdir data
mkdir data/media
mkdir data/static
mkdir data/media
</syntaxhighlight>


Und die initialen Daten in die Datenbank geladen
Und die initialen Daten in die Datenbank geladen


cd ~/taiga-back
<syntaxhighlight lang=shell>
source .venv/bin/activate
cd ~/taiga-back
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py migrate --noinput
source .venv/bin/activate
(taiga-back) CELERY_ENABLED=False DJANGO_SETTINGS_MODULE=settings.config python manage.py createsuperuser
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py migrate --noinput
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py loaddata initial_project_templates
(taiga-back) CELERY_ENABLED=False DJANGO_SETTINGS_MODULE=settings.config python manage.py createsuperuser
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py compilemessages
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py loaddata initial_project_templates
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py collectstatic --noinput
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py compilemessages
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py collectstatic --noinput
</syntaxhighlight>


An dieser Stelle können wir den Server testweise starten
An dieser Stelle können wir den Server testweise starten


DJANGO_SETTINGS_MODULE=settings.config python manage.py runserver
<syntaxhighlight lang=shell>
DJANGO_SETTINGS_MODULE=settings.config python manage.py runserver
</syntaxhighlight>


Und in einer anderen Shell die API abfragen. Das Kommando
Und in einer anderen Shell die API abfragen. Das Kommando


curl http://localhost:8000/api/v1/
<syntaxhighlight lang=shell>
curl http://localhost:8000/api/v1/
</syntaxhighlight>


liefert eine JSON-Datenstruktur mit der API-Definition. Den Server kann man mit "Ctrl-C" wieder beenden.
liefert eine JSON-Datenstruktur mit der API-Definition. Den Server kann man mit "Ctrl-C" wieder beenden.
Zeile 129: Zeile 157:
Nun wird die Anwendung im Apache Webserver konfiguriert. Im Domain-Verzeichnis "~/doms/projekte.hs-example.de/" wird eine Datei ".htaccess" mit der Passenger-Konfiguration abgelegt:
Nun wird die Anwendung im Apache Webserver konfiguriert. Im Domain-Verzeichnis "~/doms/projekte.hs-example.de/" wird eine Datei ".htaccess" mit der Passenger-Konfiguration abgelegt:


PassengerFriendlyErrorPages off
<syntaxhighlight lang=apache>
PassengerPython /home/pacs/xyz00/users/taiga/taiga-back/.venv/bin/python3
SetEnv PYTHONPATH /home/pacs/xyz00/users/taiga-back
SetEnv PYTHONPATH /home/pacs/xyz00/users/taiga/taiga-back
SetEnv PATH /home/pacs/xyz00/users/taiga-back/.venv/bin:%{ENV:PATH}
SetEnv DJANGO_SETTINGS_MODULE settings.config
SetEnv DJANGO_SETTINGS_MODULE settings.config
</syntaxhighlight>


Die Verzeichnisse "subs/www", "subs-ssl/www" und "htdocs-ssl" werden gelöscht.
Die Verzeichnisse "subs/www", "subs-ssl/www" und "htdocs-ssl" werden gelöscht.
In "app-ssl" wird eine Datei "passenger_wsgi.py" mit folgendem Inhalt abgelegt:
In "app-ssl" wird eine Datei "passenger_wsgi.py" mit folgendem Inhalt abgelegt:


from taiga.wsgi import application
<syntaxhighlight lang=python>
from taiga.wsgi import application
</syntaxhighlight>


An dieser Stelle sollte sich die Backend-API auch im Browser unter der URL "https://projekte.hs-example.de/api/v1/" aufrufen lassen. Unter "https://projekte.hs-example.de/admin/" ist eine Anmeldung mit dem angelegten Admin-Account im Django-Backend möglich.
An dieser Stelle sollte sich die Backend-API auch im Browser unter der URL "https://projekte.hs-example.de/api/v1/" aufrufen lassen. Unter "https://projekte.hs-example.de/admin/" ist eine Anmeldung mit dem angelegten Admin-Account im Django-Backend möglich.


== Einrichtung der Benachrichtigungen per E-Mail ==
== Einrichtung der Benachrichtigungen per E-Mail ==
Es kann ein Cronjob eingerichtet werden, der alle paar Minuten prüft, ob Benachrichtigungen per E-Mail hinausgeschickt werden sollen.
Es kann ein Systemd Timer eingerichtet werden, der alle paar Minuten prüft, ob Benachrichtigungen per E-Mail hinausgeschickt werden sollen.


EDITOR=nano crontab -e
<code>~/.config/systemd/user/taiga_mails.service</code>
<syntaxhighlight lang=ini>
[Unit]
Description=send mails from taiga


Füge diese Zeile am Ende der Datei ein:
[Service]
*/2 * * * * cd $HOME/taiga-back && .venv/bin/python3 manage.py send_notifications --settings=settings.config
WorkingDirectory=/home/pacs/xyz00/users/taiga/taiga-back
Type=oneshot
ExecStart=.venv/bin/python3 manage.py send_notifications --settings=settings.config
</syntaxhighlight>


In Nano wird mit Strg-X beendet und mit y das Speichern bestätigt.
<code>~/.config/systemd/user/taiga_mails.timer</code>
<syntaxhighlight lang=ini>
[Unit]
Description=send mails from taiga
 
[Timer]
OnCalendar=*:0/2
Persistent=True
 
[Install]
WantedBy=timers.target
</syntaxhighlight>
 
Timer aktivieren und starten:
<syntaxhighlight lang=shell>
$ systemctl --user enable taiga_mails.timer
$ systemctl --user start taiga_mails.timer
</syntaxhighlight>


Die Absenderadresse wird übrigens am besten in der Datei <code>taiga-back/settings/config.py</code> in der Variable <code>DEFAULT_FROM_EMAIL</code> eingetragen.
Die Absenderadresse wird übrigens am besten in der Datei <code>taiga-back/settings/config.py</code> in der Variable <code>DEFAULT_FROM_EMAIL</code> eingetragen.
Zeile 157: Zeile 211:
Auschecken von Github:
Auschecken von Github:


cd ~
<syntaxhighlight lang=shell>
git clone https://github.com/kaleidos-ventures/taiga-front-dist.git taiga-front-dist
cd ~
cd ~/taiga-front-dist
git clone https://github.com/kaleidos-ventures/taiga-front-dist.git taiga-front-dist
git checkout stable
cd ~/taiga-front-dist
git checkout stable
</syntaxhighlight>


Konfiguration
Konfiguration


cd ~/taiga-front-dist/dist
<syntaxhighlight lang=shell>
cp conf.example.json conf.json
cd ~/taiga-front-dist/dist
cp conf.example.json conf.json
</syntaxhighlight>


In "conf.json" muss der Wert "api" angepasst werden, ggf. kann die Default-Sprache auf "de" geändert werden.  
In "conf.json" muss der Wert "api" angepasst werden, ggf. kann die Default-Sprache auf "de" geändert werden.  


"api": "https://projekte.hs-example.de/api/v1/",
<syntaxhighlight lang=json>
"defaultLanguage": "de",
"api": "https://projekte.hs-example.de/api/v1/",
"defaultLanguage": "de",
</syntaxhighlight>


Im Domainverzeichnis werden zum Abschluss Links für die statischen Inhalte gesetzt:
Im Domainverzeichnis werden zum Abschluss Links für die statischen Inhalte gesetzt:


cd ~/doms/projekte.hs-example.de/
<syntaxhighlight lang=shell>
ln -s $HOME/taiga-front-dist/dist htdocs-ssl
cd ~/doms/projekte.hs-example.de/
cd htdocs-ssl
ln -s $HOME/taiga-front-dist/dist htdocs-ssl
ln -s $HOME/data/media media
cd htdocs-ssl
ln -s $HOME/data/static static
ln -s $HOME/data/media media
ln -s $HOME/data/static static
</syntaxhighlight>


Zum Schluss wird in diesem Verzeichnis "htdocs-ssl" noch eine Datei ".htaccess" mit dem folgenden Inhalt angelegt:
Zum Schluss wird in diesem Verzeichnis "htdocs-ssl" noch eine Datei ".htaccess" mit dem folgenden Inhalt angelegt:


  DirectoryIndex disabled
<syntaxhighlight lang=apache>
  RewriteEngine On
DirectoryIndex disabled
  RewriteBase /
RewriteEngine On
 
RewriteBase /
  RewriteCond %{REQUEST_URI} !^/api(.*)  
  RewriteCond %{REQUEST_URI} !^/admin(.*)
RewriteCond %{REQUEST_URI} !^/api(.*)  
  RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/admin(.*)
  RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*) /index.html
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*) /index.html
</syntaxhighlight>


== Theme anpassen ==
== Theme anpassen ==
Zeile 197: Zeile 261:
Falls ein paar Sachen über CSS abgeschaltet oder anders dargestellt werden sollen, gibt es die Möglichkeit, eine eigene CSS einzubinden. Dazu muss in der Datei <code>~/taiga-front-dist/dist/index.html</code> folgende Zeile eingefügt werden (diese Zeile muss nach einem Update von Taiga wieder erneut eingetragen werden):
Falls ein paar Sachen über CSS abgeschaltet oder anders dargestellt werden sollen, gibt es die Möglichkeit, eine eigene CSS einzubinden. Dazu muss in der Datei <code>~/taiga-front-dist/dist/index.html</code> folgende Zeile eingefügt werden (diese Zeile muss nach einem Update von Taiga wieder erneut eingetragen werden):


    <link rel="stylesheet" href="/v-1618228552362/styles/mytheme.css">
<syntaxhighlight lang=html>
 
<link rel="stylesheet" href="/v-1618228552362/styles/mytheme.css">
</syntaxhighlight>
Die Datei <code>taiga-front-dist/dist/v-1618228552362/styles/mytheme.css</code> kann z.B. folgenden Inhalt haben:
Die Datei <code>taiga-front-dist/dist/v-1618228552362/styles/mytheme.css</code> kann z.B. folgenden Inhalt haben:


<pre>
<syntaxhighlight lang=css>
/* disable the search bar, and the empty highlighted project div on the discover page, before login */
/* disable the search bar, and the empty highlighted project div on the discover page, before login */
section.discover tg-discover-search-bar, div.empty-highlighted-project  {
section.discover tg-discover-search-bar, div.empty-highlighted-project  {
Zeile 211: Zeile 276:
     display: None;
     display: None;
}
}
</pre>
</syntaxhighlight>


== Weitere Optionen zur Einrichtung ==
== Weitere Optionen zur Einrichtung ==
Zeile 218: Zeile 283:
* in der Datei <code>taiga-front-dist/dist/conf.json</code> muss <code>"publicRegisterEnabled": false,</code> eingetragen werden.
* in der Datei <code>taiga-front-dist/dist/conf.json</code> muss <code>"publicRegisterEnabled": false,</code> eingetragen werden.
* siehe auch https://docs.taiga.io/setup-faqs.html#disable-registration
* siehe auch https://docs.taiga.io/setup-faqs.html#disable-registration
== Import von Trello Boards ==
siehe die Anleitung hier: https://docs.taiga.io/importers.html#_trello
In Kurzform:
* Bei Trello anmelden
* auf https://trello.com/power-ups/admin/ gehen
* dort eine neue Integration anlegen: https://trello.com/power-ups/admin/new
* die Namen sind nicht so wichtig, die Iframe-Konnektor-URL kann leer gelassen werden.
* Dann im Menü auf "API Schlüssel" gehen
* Dort den "API-Schlüssel" kopieren
* Dann bei "Erlaubte Ursprünge" die eigene URL (mit https://) von Taiga hinzufügen
* Und den Schlüssel unter "Geheim" kopieren
Dann mit dem nano Editor die folgende Datei bearbeiten:
<syntaxhighlight lang=shell>
nano taiga-back/settings/config.py
</syntaxhighlight>
Diese Zeilen einfügen:
<syntaxhighlight lang=python>
IMPORTERS["trello"] = {
    "active": True,
    "api_key": "dein-API-schlüssel",
    "secret_key": "dein-geheimer-schlüssel"
}
</syntaxhighlight>
Dann Taiga neustarten:
<syntaxhighlight lang=shell>
~/bin/restart.sh
</syntaxhighlight>
Dann noch die folgende Datei bearbeiten:
<syntaxhighlight lang=shell>
nano taiga-front-dist/dist/conf.json
</syntaxhighlight>
und den Wert bei <code>enableTrelloImporter</code> auf <code>true</code> setzen.


= Taiga mit Ansible installieren =
= Taiga mit Ansible installieren =
Zeile 224: Zeile 332:
Damit lassen sich die Installationsschritte automatisiert durchführen.
Damit lassen sich die Installationsschritte automatisiert durchführen.


Die Quellen für das Ansible Skript können hier eingesehen werden: https://github.com/tpokorra/Hostsharing-Ansible-Taiga/
Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/taiga


Dort ist auch eine README Datei mit einer Anleitung.
Dort ist auch eine README Datei mit einer Anleitung.
Zeile 233: Zeile 341:
* [https://www.taiga.io/ Taiga Homepage]
* [https://www.taiga.io/ Taiga Homepage]
* [https://docs.taiga.io/setup-production.html#_introduction Installationsanleitung (from Source Code)]
* [https://docs.taiga.io/setup-production.html#_introduction Installationsanleitung (from Source Code)]
* [https://github.com/tpokorra/Hostsharing-Ansible-Taiga Ansible Playbook für Hostsharing]
* [https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/taiga Ansible Playbook für Hostsharing]





Aktuelle Version vom 3. Dezember 2024, 14:46 Uhr

Taiga installieren

Taiga ist eine Software für die agile Projektverwaltung. Es werden Scrum- und einfache Kanban-Projekte unterstützt. Weitere Komponenten sind ein Issue-Tracker und ein Wiki pro Projekt. User Stories können optional zu Epics zugeordnet werden.

Bei Hostsharing kann Taiga im Managed Webspace mit dem Apache Passenger Modul betrieben werden. Es wird eine PostgreSQL Datenbank benötigt.

Diese Installationsanleitung beschreibt ein minimales Setup und verzichtet auf die Komponenten "taiga-events" und "taiga-protected".

Vorbereitung in HSAdmin

Mit Hilfe von HSAdmin werden angelegt:

  • ein User mit der Shell '/bin/bash', im Beispiel "xyz00-taiga"
  • beim User wird eine Domain aufgeschaltet, mein Beispiel ist: "projekte.hs-example.de"
  • ein PostgreSQL-User und eine PostgreSQL-Datenbank, beide heißen hier: "xyz00_taiga"

Installation des Backend

Das Backend ist eine Python-/Django-Anwendung. Die Sourcen werden aus dem Git-Repository bei Github ausgecheckt:

cd ~
git clone https://github.com/kaleidos-ventures/taiga-back
cd taiga-back
git checkout stable

Dann wird im Projekt-Verzeichnis ein Python.Virtualenv angelegt:

cd ~/taiga-back
python3 -m venv .venv --prompt taiga-back
source .venv/bin/activate
(taiga-back) pip install --upgrade pip wheel
(taiga-back) pip install -r requirements.txt
(taiga-back) pip install git+https://github.com/kaleidos-ventures/taiga-contrib-protected.git@6.7.0#egg=taiga-contrib-protected

Es folgt die Konfiguration der Django-Anwendung

cd ~/taiga-back
cp settings/config.py.prod.example settings/config.py
nano settings/config.py

Folgende Einstellungen müssen angepasst werden:

In der Struktur "DATABASES" wird die angelegte PostgreSQL-Datenbank eingetragen.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'xyz00_taiga',
        'USER': 'xyz00_taiga',
        'PASSWORD': 'das-passwort-von-xyz00_taiga',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

Für die Variablen "SITES" und TAIGA_URL muss die richtige Domain eingetragen werden, als "SECRET_KEY" wird ein zufällige Zeichenkette eingetragen.

SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxx"
TAIGA_URL = "https://projekte.hs-example.de"
SITES = {
    "api": {"domain": "projekte.hs-example.de", "scheme": "https", "name": "api"},
    "front": {"domain": "projekte.hs-example.de", "scheme": "https", "name": "front"}
}

Im Bereich "MEDIA AND STATIC" werden die bisher auskommentierten Variablen "MEDIA_ROOT" und "STATIC_ROOT" definiert.

# MEDIA_ROOT = '/home/taiga/media'
MEDIA_ROOT = '/home/pacs/xyz00/users/taiga/data/media'
MEDIA_URL = f"{ TAIGA_URL }/media/"
DEFAULT_FILE_STORAGE = "taiga_contrib_protected.storage.ProtectedFileSystemStorage"
THUMBNAIL_DEFAULT_STORAGE = DEFAULT_FILE_STORAGE
# STATIC_ROOT = '/home/taiga/static'
STATIC_ROOT = '/home/pacs/xyz00/users/taiga/data/static'
STATIC_URL = f"{ TAIGA_URL }/static/"

Für das Versenden von E-Mail ist der Bereich "EMAIL" anzupassen.

DEFAULT_FROM_EMAIL = 'noreply@projekte.hs-example.de'
EMAIL_USE_TLS = True
EMAIL_HOST = '127.0.0.1'
EMAIL_PORT = 4587
EMAIL_HOST_USER = 'xyz00-taiga'
EMAIL_HOST_PASSWORD = 'passwort-von-xyz00-taiga'

Alle Zeilen, die mit "EVENTS_PUSH" oder "CELERY" beginnen, können auskommentiert werden, lediglich

CELERY_ENABLED = False

sollte gesetzt werden.

Zum Schluss ist bei mir konfiguriert:

PUBLIC_REGISTER_ENABLED = True
USER_EMAIL_ALLOWED_DOMAINS = "hs-example.de"

und

ENABLE_TELEMETRY = False

Falls man aber auch Benutzer von anderen E-Mail Domains erlauben möchte, muss man diese in USER_EMAIL_ALLOWED_DOMAINS hinzufügen, oder wenn man gar keine Beschränkung möchte, diese Zeile ganz auskommentieren. Das macht zum Beispiel Sinn, wenn PUBLIC_REGISTER_ENABLED abgeschaltet ist.

Nun werden mit den folgenden Kommandos die Datenverzeichnisse angelegt

cd ~
mkdir data
mkdir data/static
mkdir data/media

Und die initialen Daten in die Datenbank geladen

cd ~/taiga-back
source .venv/bin/activate
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py migrate --noinput
(taiga-back) CELERY_ENABLED=False DJANGO_SETTINGS_MODULE=settings.config python manage.py createsuperuser
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py loaddata initial_project_templates
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py compilemessages
(taiga-back) DJANGO_SETTINGS_MODULE=settings.config python manage.py collectstatic --noinput

An dieser Stelle können wir den Server testweise starten

DJANGO_SETTINGS_MODULE=settings.config python manage.py runserver

Und in einer anderen Shell die API abfragen. Das Kommando

curl http://localhost:8000/api/v1/

liefert eine JSON-Datenstruktur mit der API-Definition. Den Server kann man mit "Ctrl-C" wieder beenden.

Nun wird die Anwendung im Apache Webserver konfiguriert. Im Domain-Verzeichnis "~/doms/projekte.hs-example.de/" wird eine Datei ".htaccess" mit der Passenger-Konfiguration abgelegt:

SetEnv PYTHONPATH /home/pacs/xyz00/users/taiga-back
SetEnv PATH /home/pacs/xyz00/users/taiga-back/.venv/bin:%{ENV:PATH}
SetEnv DJANGO_SETTINGS_MODULE settings.config

Die Verzeichnisse "subs/www", "subs-ssl/www" und "htdocs-ssl" werden gelöscht. In "app-ssl" wird eine Datei "passenger_wsgi.py" mit folgendem Inhalt abgelegt:

from taiga.wsgi import application

An dieser Stelle sollte sich die Backend-API auch im Browser unter der URL "https://projekte.hs-example.de/api/v1/" aufrufen lassen. Unter "https://projekte.hs-example.de/admin/" ist eine Anmeldung mit dem angelegten Admin-Account im Django-Backend möglich.

Einrichtung der Benachrichtigungen per E-Mail

Es kann ein Systemd Timer eingerichtet werden, der alle paar Minuten prüft, ob Benachrichtigungen per E-Mail hinausgeschickt werden sollen.

~/.config/systemd/user/taiga_mails.service

[Unit]
Description=send mails from taiga

[Service]
WorkingDirectory=/home/pacs/xyz00/users/taiga/taiga-back
Type=oneshot
ExecStart=.venv/bin/python3 manage.py send_notifications --settings=settings.config

~/.config/systemd/user/taiga_mails.timer

[Unit]
Description=send mails from taiga

[Timer]
OnCalendar=*:0/2
Persistent=True

[Install]
WantedBy=timers.target

Timer aktivieren und starten:

$ systemctl --user enable taiga_mails.timer
$ systemctl --user start taiga_mails.timer

Die Absenderadresse wird übrigens am besten in der Datei taiga-back/settings/config.py in der Variable DEFAULT_FROM_EMAIL eingetragen.

Installation des Frontend

Auschecken von Github:

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

Konfiguration

cd ~/taiga-front-dist/dist
cp conf.example.json conf.json

In "conf.json" muss der Wert "api" angepasst werden, ggf. kann die Default-Sprache auf "de" geändert werden.

"api": "https://projekte.hs-example.de/api/v1/",
"defaultLanguage": "de",

Im Domainverzeichnis werden zum Abschluss Links für die statischen Inhalte gesetzt:

cd ~/doms/projekte.hs-example.de/
ln -s $HOME/taiga-front-dist/dist htdocs-ssl
cd htdocs-ssl
ln -s $HOME/data/media media
ln -s $HOME/data/static static

Zum Schluss wird in diesem Verzeichnis "htdocs-ssl" noch eine Datei ".htaccess" mit dem folgenden Inhalt angelegt:

DirectoryIndex disabled
RewriteEngine On
RewriteBase /
 
RewriteCond %{REQUEST_URI} !^/api(.*) 
RewriteCond %{REQUEST_URI} !^/admin(.*)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*) /index.html

Theme anpassen

Falls ein paar Sachen über CSS abgeschaltet oder anders dargestellt werden sollen, gibt es die Möglichkeit, eine eigene CSS einzubinden. Dazu muss in der Datei ~/taiga-front-dist/dist/index.html folgende Zeile eingefügt werden (diese Zeile muss nach einem Update von Taiga wieder erneut eingetragen werden):

<link rel="stylesheet" href="/v-1618228552362/styles/mytheme.css">

Die Datei taiga-front-dist/dist/v-1618228552362/styles/mytheme.css kann z.B. folgenden Inhalt haben:

/* disable the search bar, and the empty highlighted project div on the discover page, before login */
section.discover tg-discover-search-bar, div.empty-highlighted-project   {
   display: None;
}

/* hide the "New Project Button" */
.navbar-dropdown a.create-project-btn, .project-list-wrapper .create-project-btn {
    display: None;
}

Weitere Optionen zur Einrichtung

Falls die Registrierung von neuen Benutzern nicht jedem offen stehen sollte, müssen 2 Änderungen vorgenommen werden:

Import von Trello Boards

siehe die Anleitung hier: https://docs.taiga.io/importers.html#_trello

In Kurzform:

  • Bei Trello anmelden
  • auf https://trello.com/power-ups/admin/ gehen
  • dort eine neue Integration anlegen: https://trello.com/power-ups/admin/new
  • die Namen sind nicht so wichtig, die Iframe-Konnektor-URL kann leer gelassen werden.
  • Dann im Menü auf "API Schlüssel" gehen
  • Dort den "API-Schlüssel" kopieren
  • Dann bei "Erlaubte Ursprünge" die eigene URL (mit https://) von Taiga hinzufügen
  • Und den Schlüssel unter "Geheim" kopieren

Dann mit dem nano Editor die folgende Datei bearbeiten:

nano taiga-back/settings/config.py

Diese Zeilen einfügen:

IMPORTERS["trello"] = {
    "active": True,
    "api_key": "dein-API-schlüssel",
    "secret_key": "dein-geheimer-schlüssel"
}

Dann Taiga neustarten:

~/bin/restart.sh

Dann noch die folgende Datei bearbeiten:

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

und den Wert bei enableTrelloImporter auf true setzen.

Taiga mit Ansible installieren

Alternativ lässt sich Taiga auch mit einem Ansible Skript bei Hostsharing installieren. Damit lassen sich die Installationsschritte automatisiert durchführen.

Die Quellen für das Ansible Skript können hier eingesehen werden: https://codeberg.org/tpokorra/hs.ansible/src/branch/main/playbooks/taiga

Dort ist auch eine README Datei mit einer Anleitung.

Links