كيفية تثبيت أداة إدارة مشروع Taiga على Ubuntu 16.04

Taiga هو تطبيق مجاني ومفتوح المصدر لإدارة المشاريع. بخلاف أدوات إدارة المشروع الأخرى ، يستخدم Taiga نهجًا رشيقًا تدريجيًا لإدارة تطوير المشروع. Taiga هو تطبيق قوي للغاية وقابل للتخصيص بالكامل. تمت كتابة الواجهة الخلفية لـ Taiga في Python باستخدام إطار Django. تمت كتابة الواجهة الأمامية في JavaScript باستخدام أطر عمل CoffeeScript و AngularJS. يحتوي Taiga على ميزات مثل التعاون في المشروع ، ولوحة Kanban ، وتتبع الأخطاء ، وإعداد التقارير ، وتتبع الوقت ، والتراكم ، و wiki ، والمزيد.

المتطلبات الأساسية

  • نسخة خادم Vultr Ubuntu 16.04 مع ذاكرة وصول عشوائي سعتها 1 غيغابايت على الأقل.
  • A المستخدم سودو .

في هذا البرنامج التعليمي ، سوف نستخدم taiga.example.comاسم النطاق الموجه إلى الخادم. استبدل جميع حالات التكرار taiga.example.comباسم نطاقك الفعلي.

قم بتحديث نظامك الأساسي باستخدام الدليل كيفية تحديث Ubuntu 16.04 . بمجرد تحديث نظامك ، تابع تثبيت PostgreSQL.

قم بتثبيت PostgreSQL

PostgreSQL هو نظام قاعدة بيانات علائقية للكائنات ومعروف باستقراره وسرعته. يستخدم Taiga PostgreSQL لتخزين قاعدة بياناته. أضف مستودع PostgreSQL إلى النظام.

echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list

قم باستيراد مفتاح توقيع GPG وقم بتحديث قوائم الحزم.

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update

قم بتثبيت خادم قاعدة بيانات PostgreSQL.

sudo apt -y install postgresql

قم بتشغيل خادم PostgreSQL وتمكينه من البدء تلقائيًا في وقت التمهيد.

sudo systemctl start postgresql
sudo systemctl enable postgresql

قم بتغيير كلمة المرور لمستخدم PostgreSQL الافتراضي.

sudo passwd postgres

تسجيل الدخول كمستخدم PostgreSQL.

sudo su - postgres

إنشاء مستخدم PostgreSQL جديد لـ Taiga.

createuser taiga 

يوفر PostgreSQL psqlالصدفة لتشغيل الاستعلامات في قاعدة البيانات. قم بالتبديل إلى غلاف PostgreSQL.

psql

تعيين كلمة مرور للمستخدم الذي تم إنشاؤه حديثًا لقاعدة بيانات Taiga.

ALTER USER taiga WITH ENCRYPTED password 'DBPassword';

استبدلها DBPasswordبكلمة مرور آمنة. إنشاء قاعدة بيانات جديدة لتثبيت Taiga.

CREATE DATABASE taiga OWNER taiga;

اخرج من psqlالقشرة.

\q

قم بالتبديل إلى sudoالمستخدم.

exit

قم بتثبيت Python

يحتاج Taiga إلى Python الإصدار 3.4 أو الأحدث و Python 3.5 مثبت مسبقًا في توزيع Ubuntu 16.04. قم بتثبيت بعض الحزم المطلوبة.

sudo apt -y install python3 python3-pip python3-dev python3-dev virtualenvwrapper

يتم استخدام بيئة Python الظاهرية لإنشاء بيئة افتراضية معزولة لمشروع Python. تحتوي البيئة الافتراضية على أدلة التثبيت الخاصة بها ولا تشارك المكتبات مع البيئات الافتراضية العالمية والبيئية الأخرى. بمجرد تثبيت Python 3 بنجاح ، يجب أن تكون قادرًا على التحقق من إصداره.

python3 -V

سترى ما يلي.

user@vultr:~$ python3 -V
Python 3.5.2

الترقية pip، وهو تطبيق إدارة تبعية.

sudo pip3 install --upgrade setuptools pip 

أيضًا ، قم بتثبيت بعض أدوات البناء التي ستكون مطلوبة لاحقًا لترجمة التبعيات.

sudo apt -y install build-essential binutils-doc autoconf flex bison libjpeg-dev libfreetype6-dev zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev automake libtool libffi-dev curl git tmux gettext

قم بتثبيت RabbitMQ

يستخدم Taiga RabbitMQ لمعالجة قائمة انتظار الرسائل. يتطلب RabbitMQ مكتبات Erlang للعمل. تثبيت إرلانج.

sudo apt -y install erlang

إضافة مستودع RabbitMQ.

echo 'deb http://www.rabbitmq.com/debian/ stable main' | sudo tee /etc/apt/sources.list.d/rabbitmq.list

استيراد مفتاح توقيع RabbitMQ GPG.

wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

تحديث معلومات المستودع.

sudo apt update

قم بتثبيت RabbitMQ.

sudo apt -y install rabbitmq-server

قم بتشغيل وتمكين خادم RabbitMQ.

sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

إضافة مستخدم RabbitMQ و vhost. أيضًا ، قم بتوفير الإذن للمستخدم عبر المضيف.

sudo rabbitmqctl add_user taiga StrongMQPassword
sudo rabbitmqctl add_vhost taiga
sudo rabbitmqctl set_permissions -p taiga taiga ".*" ".*" ".*"

تأكد من استبدال StrongMQPasswordكلمة مرور آمنة.

تثبيت Nodejs

مطلوب Node.js الإصدار 7 أو الأحدث لترجمة الواجهة الأمامية ل Taiga. إضافة مستودع Node.js الإصدار 8.

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -

قم بتثبيت Node.js pwgenوالأداة المساعدة.

sudo apt install -y nodejs pwgen npm

pwgenسيتم استخدامه لاحقًا لإنشاء سلسلة سرية قوية. قم بتثبيت CoffeeScript ، حيث سيتم استخدامه لتجميع ملفات Taiga المكتوبة في إطار عمل CoffeeScript.

sudo npm install -g coffee-script gulp

قم بتثبيت خلفية Taiga

أضف مستخدم نظام جديد لـ Taiga للتأكد من أن عمليات Taiga تعمل كمستخدم غير مميز.

sudo adduser taiga
sudo su - taiga

ملاحظة : من الآن فصاعدًا ، يجب تشغيل جميع الأوامر كمستخدم غير مميز taigaحتى يُطلب منك التبديل مرة أخرى إلى sudoالمستخدم.

قم بإنشاء دليل جديد لتخزين ملفات السجل.

mkdir -p ~/logs

استنساخ مستودع الواجهة الخلفية Taiga من GitHub والخروج من أحدث فرع مستقر.

git clone https://github.com/taigaio/taiga-back.git taiga-back
cd taiga-back
git checkout stable

الآن قم بإنشاء بيئة افتراضية جديدة لـ Taiga باستخدام Python 3.

mkvirtualenv -p /usr/bin/python3 taiga
pip3 install --upgrade setuptools

قم بتثبيت تبعيات Python المطلوبة باستخدام pip.

pip3 install -r requirements.txt

تعبئة قاعدة البيانات بالبيانات الأولية اللازمة.

python3 manage.py migrate --noinput
python3 manage.py loaddata initial_user
python3 manage.py loaddata initial_project_templates
python3 manage.py compilemessages
python3 manage.py collectstatic --noinput

ستقوم الأوامر المذكورة أعلاه بكتابة البيانات في قاعدة بيانات PostgreSQL. يقوم Taiga أيضًا بشحن بعض البيانات التجريبية أو النموذجية التي يمكن أن تكون مفيدة لتقييم المنتج. إذا كنت ترغب في تثبيت نموذج البيانات ، فقم بتشغيل ما يلي.

python3 manage.py sample_data

ملاحظة : يعد تثبيت بيانات العينة اختياريًا ومقصودًا فقط لتقييم المنتج.

قبل أن نبدأ في إنشاء ملف التكوين للواجهة الخلفية لـ Taiga ، نحتاج إلى إنشاء سلسلة سرية. سيتم استخدام هذه السلسلة لتشفير بيانات الجلسة.

إنشاء سلسلة عشوائية من 64 حرفًا.

pwgen -s -1 64

يجب أن ترى الإخراج كسلسلة عشوائية.

(taiga) taiga@vultr:~/taiga-back$ pwgen -s -1 64
fhDfyYVJ4EH3tvAyUzmfWSeCXuf5sy5EEWrMQPaf9t3JSFrpiL6yvUEOWsFOTscP

قم بإنشاء ملف تكوين جديد للواجهة الخلفية لـ Taiga.

nano ~/taiga-back/settings/local.py

تعبئة الملف سوف التعليمات البرمجية التالية.

from .common import *

MEDIA_URL = "https://taiga.example.com/media/"
STATIC_URL = "https://taiga.example.com/static/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "taiga.example.com"

SECRET_KEY = "Generated_Secret_Key"

DEBUG = False
PUBLIC_REGISTER_ENABLED = True

DEFAULT_FROM_EMAIL = "[email protected]"
SERVER_EMAIL = DEFAULT_FROM_EMAIL

#CELERY_ENABLED = True

EVENTS_PUSH_BACKEND = "taiga.events.backends.rabbitmq.EventsPushBackend"
EVENTS_PUSH_BACKEND_OPTIONS = {"url": "amqp://taiga:StrongMQPassword@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 = False
#EMAIL_HOST = "mail.example.com"
#EMAIL_HOST_USER = "[email protected]"
#EMAIL_HOST_PASSWORD = "SMTPPassword"
#EMAIL_PORT = 25

# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"

تأكد من استبدال example domain nameالرمز الفعلي في الرمز أعلاه. أيضًا ، Generated_Secret_Keyاستبدل بمفتاح StrongMQPasswordالسر الفعلي وكلمة المرور الفعلية لمستخدم قائمة انتظار رسائل Taiga. إذا كان لديك خادم SMTP جاهزًا وترغب في استخدام ميزات إرسال البريد الإلكتروني على الفور ، يمكنك إلغاء تعليق خيارات البريد الإلكتروني وتعيين القيمة المناسبة. إذا لم يكن لديك خادم بريد جاهز ، يمكنك تخطي إعداد ميزة البريد الإلكتروني الآن وتعيينها لاحقًا في ملف التكوين هذا.

إذا كنت ترغب في تمكين تسجيل دخول GitHub ، فأنشئ تطبيقًا في GitHub وقدم معرف عميل واجهة برمجة التطبيقات وسر العميل.

للتحقق على الفور من إمكانية بدء الواجهة الخلفية Taiga ، قم بتشغيل خادم Django المدمج.

workon taiga
python manage.py runserver

سترى الإخراج التالي إذا بدأ الخادم بنجاح.

(taiga) taiga@vultr:~/taiga-back$ workon taiga
(taiga) taiga@vultr:~/taiga-back$ python manage.py runserver
Trying import local.py settings...
Trying import local.py settings...
Performing system checks...

System check identified no issues (0 silenced).
October 28, 2017 - 10:29:38
Django version 1.10.6, using settings 'settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

للتحقق مما إذا كان يمكن الوصول إلى API ، افتح جلسة طرفية أخرى وقم بتشغيل ما يلي.

curl http://127.0.0.1:8000/api/v1/

سترى ناتجًا مشابهًا تم إرجاعه بواسطة مكالمة API.

user@vultr:~$ curl http://127.0.0.1:8000/api/v1/
{"webhooks": "http://127.0.0.1:8000/api/v1/webhooks", "invitations": "http://127.0.0.1:8000/api/v1/invitations", "severities": "http://127.0.0.1:8000/api/v1/severities", "memberships": "http://127.0.0.1:8000/api/v1/memberships", "user-storage": "http://127.0.0.1:8000/api/v1/user-storage", "epics/(?P<resource_id>\\d+)/voters": "http://127.0.0.1:8000/api/v1/epics/(?P<resource_id>\\d+)/voters", "wiki": "http://127.0.0.1:8000/api/v1/wiki", "priorities": "http://127.0.0.1:8000/api/v1/priorities", "userstories/attachments": "http://127.0.0.1:8000/api/v1/userstories/attachments", "epics/(?P<epic>[^/.]+)/related_userstories": "http://127.0.0.1:8000/api/v1/epics/(?P<epic>[^/.]+)/related_userstories", "timeline/user": "http://127.0.0.1:8000/api/v1/timeline/user", "userstories/(?P<resource_id>\\d+)/voters": "http://127.0.0.1:8000/api/v1/userstories/(?P<resource_id>\\d+)/voters", "wiki-links": "http://127.0.0.1:8000/api/v1/wiki-links", "epics/attachments": "http://127.0.0.1:8000/api/v1/epics/attachments", "issues/custom-attributes-values": "http://127.0.0.1:8000/api/v1/issues/custom-attributes-values

قم بإيقاف خادم الواجهة الخلفية Taiga بالضغط على " ctrl + C" وإلغاء تنشيط البيئة الافتراضية.

deactivate

قم بتثبيت الواجهة الأمامية

الواجهة الأمامية Taiga هي عنصر Taiga الذي يخدم واجهة مستخدم الويب. استنساخ مستودع الواجهة الأمامية Taiga من Github والخروج من أحدث فرع مستقر.

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

قم بإنشاء ملف تكوين جديد للواجهة الأمامية لـ Taiga.

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

تعبئة الملف.

{
    "api": "https://taiga.example.com/api/v1/",
    "eventsUrl": "wss://taiga.example.com/events",
    "eventsMaxMissedHeartbeats": 5,
    "eventsHeartbeatIntervalTime": 60000,
    "eventsReconnectTryInterval": 10000,
    "debug": true,
    "debugInfo": false,
    "defaultLanguage": "en",
    "themes": ["taiga"],
    "defaultTheme": "taiga",
    "publicRegisterEnabled": true,
    "feedbackEnabled": true,
    "privacyPolicyUrl": null,
    "termsOfServiceUrl": null,
    "maxUploadFileSize": null,
    "contribPlugins": [],
    "tribeHost": null,
    "importers": [],
    "gravatar": true
}

تأكد من استبدال example domainالمجال الفعلي. يمكنك أيضًا تغيير اللغة الافتراضية والمعلمات الأخرى في التكوين أعلاه.

تثبيت أحداث Taiga

بصرف النظر عن الواجهة الأمامية والخلفية ، نحتاج أيضًا إلى تثبيت أحداث Taiga. أحداث Taiga هي خادم مأخذ ويب ، وتمكن الواجهة الأمامية Taiga من إظهار التغييرات في الوقت الفعلي في الوحدات مثل backlog و Kanban والمزيد. كما يستخدم خادم RabbitMQ لمعالجة الرسائل.

استنساخ مستودع أحداث Taiga من Github.

cd ~
git clone https://github.com/taigaio/taiga-events.git taiga-events
cd taiga-events

قم بتثبيت تبعيات Node.js باستخدام npm.

npm install

إنشاء ملف تكوين جديد لأحداث Taiga.

nano ~/taiga-events/config.json

تعبئة الملف.

{
    "url": "amqp://taiga:StrongMQPassword@localhost:5672/taiga",
    "secret": "Generated_Secret_Key",
    "webSocketServer": {
        "port": 8888
    }
}

استبدل Generated_Secret_Keyبالمفتاح السري الطويل المكون من 64 حرفًا والذي أنشأته مسبقًا. يجب أن يكون مفتاح السر مطابقًا تمامًا للمفتاح الذي قدمته في ملف تكوين الواجهة الخلفية Taiga. أيضًا ، قم بتحديث StrongMQPasswordكلمة المرور الفعلية لمستخدم قائمة انتظار رسائل Taiga.

تكوين السيرك

السيرك هو مدير العمليات لتطبيقات Python. سنستخدم سيرك لتشغيل الواجهة الخلفية والأحداث Taiga.

العودة إلى sudoالمستخدم.

exit

ملاحظة : من الآن ستحتاج إلى تشغيل الأوامر باستخدام sudoالمستخدم.

sudo apt -y install circus

إنشاء ملف تكوين سيرك جديد لتشغيل الواجهة الخلفية Taiga.

sudo nano /etc/circus/conf.d/taiga.ini

تعبئة الملف.

[watcher:taiga]
working_dir = /home/taiga/taiga-back
cmd = gunicorn
args = -w 3 -t 60 --pythonpath=. -b 127.0.0.1:8001 taiga.wsgi
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/gunicorn.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 4
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/gunicorn.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 4

[env:taiga]
PATH = /home/taiga/.virtualenvs/taiga/bin:$PATH
TERM=rxvt-256color
SHELL=/bin/bash
USER=taiga
LANG=en_US.UTF-8
HOME=/home/taiga
PYTHONPATH=/home/taiga/.virtualenvs/taiga/lib/python3.5/site-packages

إنشاء تكوين سيرك جديد لتشغيل أحداث Taiga.

sudo nano /etc/circus/conf.d/taiga-events.ini

تعبئة الملف.

[watcher:taiga-events]
working_dir = /home/taiga/taiga-events
cmd = /usr/local/bin/coffee
args = index.coffee
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/taigaevents.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 12
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/taigaevents.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 12

أعد تشغيل السيرك وتمكين البدء في وقت التمهيد تلقائيًا.

sudo systemctl restart circusd
sudo systemctl enable circusd

تحقق من حالة السيرك.

circusctl status

إذا بدأ السيرك جميع عمليات Taiga بشكل صحيح ، فسترى الناتج التالي.

user@vultr:~$ circusctl status
circusd-stats: active
plugin:flapping: active
taiga: active
taiga-events: active

إذا رأيت أيًا من هذه العملية غير نشط ، فقم بتشغيل sudo chmod -R 777 /home/taiga/logsالسيرك وإعادة تشغيله. تحقق من حالة عمليات السيرك مرة أخرى ، هذه المرة ستجد بالتأكيد تشغيل الخدمة.

الآن ، قمنا بتثبيت وتشغيل Taiga بنجاح. قبل أن نتمكن من استخدامه ، نحتاج إلى الكشف عن التثبيت باستخدام أي خادم ويب للإنتاج.

قم بتثبيت Nginx باعتباره وكيل عكسي

سنستخدم Nginx كوكيل عكسي لخدمة التطبيق للمستخدمين. سنحصل أيضًا على شهادات SSL ونثبتها من Let's Encrypt.

Certbot هو العميل الرسمي لإصدار الشهادات لـ Let's Encrypt CA. قم بإضافة مستودع Certbot PPA إلى النظام.

sudo add-apt-repository ppa:certbot/certbot
sudo apt update

قم بتثبيت Nginx و Certbot.

sudo apt -y install nginx certbot

ملاحظة : للحصول على شهادات من Let's Encrypt CA ، يجب التأكد من أن النطاق الذي ترغب في إنشاء الشهادات له موجه نحو الخادم. إذا لم يكن الأمر كذلك ، فقم بإجراء التغييرات اللازمة على سجلات DNS الخاصة بنطاقك وانتظر حتى يتم نشر DNS قبل إجراء طلب الشهادة مرة أخرى. يتحقق Certbot من سلطة المجال قبل تقديم الشهادات.

استخدم الآن خادم الويب المضمن في Certbot لإنشاء الشهادات لنطاقك.

sudo certbot certonly --standalone -d taiga.example.com

من المرجح أن يتم تخزين الشهادات التي تم إنشاؤها في /etc/letsencrypt/live/taiga.example.com/الدليل. سيتم الاحتفاظ بشهادة SSL كـ fullchain.pem، وسيتم حفظ المفتاح الخاص باسم privkey.pem.

تنتهي صلاحية شهادات التشفير خلال 90 يومًا ، لذا يوصى بإعداد التجديد التلقائي للشهادات باستخدام وظائف Cron. Cron هي خدمة نظام تُستخدم لتشغيل المهام الدورية.

افتح ملف مهمة كرون.

sudo crontab -e

أضف السطر التالي.

0 0 * * * /usr/bin/certbot renew --quiet

سيتم تشغيل وظيفة cron المذكورة أعلاه يوميًا في منتصف الليل. إذا كانت الشهادة مستحقة لانتهاء صلاحيتها ، فسيتم تجديدها تلقائيًا.

إنشاء معلمة Diffie-Hellman قوية. يوفر طبقة إضافية من الأمان لتبادل البيانات بين المضيف والخادم.

sudo openssl dhparam -out /etc/ssl/dhparam.pem 2048 

قم بإنشاء كتلة خادم Nginx جديدة لخدمة واجهة Taiga الأمامية.

sudo nano /etc/nginx/sites-available/taiga

تعبئة الملف بما يلي.

server {
    listen 80;
    server_name taiga.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name taiga.example.com;

    access_log /home/taiga/logs/nginx.access.log;
    error_log /home/taiga/logs/nginx.error.log;

    large_client_header_buffers 4 32k;
    client_max_body_size 50M;
    charset utf-8;

    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;
    }

    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;
    }

     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";
    add_header Public-Key-Pins 'pin-sha256="klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY="; pin-sha256="633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q="; max-age=2592000; includeSubDomains';

    ssl on;
    ssl_certificate /etc/letsencrypt/live/taiga.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/taiga.example.com/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;

}

تأكد من تغيير domain nameو path to the SSL certificates. قم بتمكين المضيف الظاهري.

sudo ln -s /etc/nginx/sites-available/taiga /etc/nginx/sites-enabled/taiga

يمكنك الآن إعادة تشغيل خادم الويب Nginx وتمكينه من بدء التشغيل تلقائيًا.

sudo systemctl restart nginx
sudo systemctl status nginx

أخيرًا ، قم بإصلاح الملكية والإذن لملفات Taiga.

sudo chown -R taiga:taiga /home/taiga/
sudo chmod o+x /home/taiga/

استنتاج

يمكنك الآن الوصول إلى تثبيت Taiga بالذهاب إلى https://taiga.example.com. قم بتسجيل الدخول باستخدام حساب المسؤول الأولي باسم المستخدم " admin" وكلمة المرور " 123123". التثبيت جاهز الآن للاستخدام في الإنتاج. ابدأ بإنشاء مشروع جديد أو تقييم المنتج. إذا كنت تدير بالفعل مشروعًا على Github أو Jira أو Trello ، فيمكنك بسهولة استيراد المشاريع إلى Taiga باستخدام المستوردين .



Leave a Comment

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

نظرة ثاقبة على 26 أسلوبًا لتحليل البيانات الضخمة: الجزء الأول

6 أشياء شديدة الجنون حول نينتندو سويتش

6 أشياء شديدة الجنون حول نينتندو سويتش

يعرف الكثير منكم أن Switch سيصدر في مارس 2017 وميزاته الجديدة. بالنسبة لأولئك الذين لا يعرفون ، قمنا بإعداد قائمة بالميزات التي تجعل "التبديل" "أداة لا غنى عنها".

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

وعود التكنولوجيا التي لم يتم الوفاء بها بعد

هل تنتظر عمالقة التكنولوجيا للوفاء بوعودهم؟ تحقق من ما تبقى دون تسليم.

وظائف طبقات معمارية مرجعية للبيانات الضخمة

وظائف طبقات معمارية مرجعية للبيانات الضخمة

اقرأ المدونة لمعرفة الطبقات المختلفة في بنية البيانات الضخمة ووظائفها بأبسط طريقة.

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

كيف يمكن للذكاء الاصطناعي نقل أتمتة العمليات إلى المستوى التالي؟

اقرأ هذا لمعرفة مدى انتشار الذكاء الاصطناعي بين الشركات الصغيرة وكيف أنه يزيد من احتمالات نموها ومنح منافسيها القدرة على التفوق.

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

CAPTCHA: ما هي المدة التي يمكن أن تظل تقنية قابلة للتطبيق للتميز بين الإنسان والذكاء الاصطناعي؟

لقد أصبح حل CAPTCHA صعبًا جدًا على المستخدمين في السنوات القليلة الماضية. هل ستكون قادرة على أن تظل فعالة في اكتشاف البريد العشوائي والروبوتات في المستقبل القريب؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

التفرد التكنولوجي: مستقبل بعيد للحضارة الإنسانية؟

مع تطور العلم بمعدل سريع ، واستلام الكثير من جهودنا ، تزداد أيضًا مخاطر تعريض أنفسنا إلى تفرد غير قابل للتفسير. اقرأ ، ماذا يمكن أن يعني التفرد بالنسبة لنا.

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

التطبيب عن بعد والرعاية الصحية عن بعد: المستقبل هنا

ما هو التطبيب عن بعد والرعاية الصحية عن بعد وأثره على الأجيال القادمة؟ هل هو مكان جيد أم لا في حالة الوباء؟ اقرأ المدونة لتجد طريقة عرض!

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

هل تساءلت يومًا كيف يربح المتسللون الأموال؟

ربما سمعت أن المتسللين يكسبون الكثير من المال ، لكن هل تساءلت يومًا كيف يجنون هذا النوع من المال؟ دعنا نناقش.

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

يتسبب التحديث الإضافي لنظام macOS Catalina 10.15.4 في حدوث مشكلات أكثر من حلها

أصدرت Apple مؤخرًا macOS Catalina 10.15.4 تحديثًا تكميليًا لإصلاح المشكلات ولكن يبدو أن التحديث يتسبب في المزيد من المشكلات التي تؤدي إلى إنشاء أجهزة macOS. قراءة هذه المادة لمعرفة المزيد