فلاسک+انگولر پروجیکٹ کے لیے گیتھب ایکشنز میں CI/CD
اس آرٹیکل میں، میں Plesk کنٹرول پینل اور Github ایکشنز کا استعمال کرتے ہوئے CI/CD ترتیب دینے کے اپنے تجربے کا اشتراک کروں گا۔ آج ہم سیکھیں گے کہ سادہ نام "Helloworld" کے ساتھ ایک سادہ پروجیکٹ کو کیسے ڈیپلائی کرنا ہے۔ یہ Python فریم ورک فلاسک میں لکھا گیا ہے، جس میں سیلری میں کارکنان اور انگولر 8 میں فرنٹ اینڈ ہے۔
مضمون کے پہلے حصے میں ہم اپنے پروجیکٹ اور اس کے حصوں کو دیکھیں گے۔ دوسرے میں، ہم یہ معلوم کریں گے کہ Plesk کو کنفیگر کرنے اور ضروری ایکسٹینشنز اور اجزاء (DB، RabbitMQ، Redis، Docker، وغیرہ) کو انسٹال کرنے کا طریقہ۔
تیسرے حصے میں، ہم آخر کار اس بات کا پتہ لگائیں گے کہ ڈیو اور پروڈ ماحول میں اپنے پروجیکٹ کو سرور پر تعینات کرنے کے لیے پائپ لائن کیسے ترتیب دی جائے۔ اور پھر ہم سائٹ کو سرور پر لانچ کریں گے۔
اور ہاں، میں اپنا تعارف کرانا بھول گیا۔ میرا نام اولیگ بورزوف ہے، میں ڈومکلک میں رہن قرض دینے والے مینیجرز کے لیے CRM ٹیم میں ایک مکمل اسٹیک ڈویلپر ہوں۔
منصوبے کا جائزہ
سب سے پہلے، آئیے دو پروجیکٹ ریپوزٹریز کو دیکھیں - بیک اینڈ اور فرنٹ - اور کوڈ سے گزریں۔
پسدید حصہ: فلاسک + اجوائن
بیک اینڈ کے لیے، میں نے ایک ایسا مجموعہ لیا جو ازگر کے ڈویلپرز میں کافی مقبول ہے: فلاسک فریم ورک (API کے لیے) اور سیلری (ٹاسک کیو کے لیے)۔ SQLAchemy کو بطور ORM استعمال کیا جاتا ہے۔ Alembic ہجرت کے لئے استعمال کیا جاتا ہے. ہینڈلز میں JSON کی توثیق کے لیے - Marshmallow۔
В ذخیرے ایک Readme.md فائل ہے جس میں ساخت کی تفصیلی وضاحت اور پروجیکٹ شروع کرنے کی ہدایات ہیں۔
docker دو ڈاکر فائلوں کے ساتھ (base.dockerfile ایک بنیادی تصویر بنانا جو شاذ و نادر ہی تبدیل ہوتا ہے اور Dockerfile اہم اسمبلیوں کے لیے)
.env_files - مختلف ماحول کے لیے ماحولیاتی متغیر والی فائلوں کے ساتھ۔
پروجیکٹ روٹ میں چار ڈاکر کمپوز فائلیں ہیں:
docker-compose.local.db.yml ترقی کے لیے مقامی ڈیٹا بیس کو بڑھانا؛
docker-compose.local.workers.yml ایک کارکن، ڈیٹا بیس، Redis اور RabbitMQ کی مقامی پرورش کے لیے؛
docker-compose.test.yml تعیناتی کے دوران ٹیسٹ چلانے کے لیے؛
docker-compose.yml تعیناتی کے لیے
اور ہماری دلچسپی کا آخری فولڈر ہے۔ .ci-cd. اس میں تعیناتی کے لیے شیل اسکرپٹ ہیں:
deploy.sh - منتقلی اور تعیناتی شروع کرنا۔ Github ایکشنز میں ٹیسٹ بنانے اور چلانے کے بعد سرور پر لانچ کیا گیا۔
rollback.sh - اسمبلی کے پچھلے ورژن میں کنٹینرز کو رول بیک کریں۔
curl_tg.sh - ٹیلی گرام پر تعیناتی کی اطلاعات بھیجنا۔
کونیی میں فرنٹ اینڈ
سامنے کے ساتھ ذخیرہ بیکوف کے مقابلے میں بہت آسان ہے۔ فرنٹ تین صفحات پر مشتمل ہے:
ای میل بھیجنے کے لیے ایک فارم اور لاگ آؤٹ بٹن کے ساتھ ہوم پیج۔
لاگ ان صفحہ۔
رجسٹریشن کا صفحہ۔
مرکزی صفحہ سنیاسی لگ رہا ہے:
روٹ میں دو فائلیں ہیں۔ Dockerfile и docker-compose.yml، نیز مانوس فولڈر .ci-cd بیک ریپوزٹری کے مقابلے اسکرپٹس کی قدرے کم تعداد کے ساتھ (چلنے والے ٹیسٹ کے لیے اسکرپٹس کو ہٹا دیا گیا ہے)۔
پلسک میں ایک پروجیکٹ شروع کرنا
آئیے Plesk کو ترتیب دے کر اور اپنی سائٹ کے لیے سبسکرپشن بنا کر شروع کریں۔
ایکسٹینشنز انسٹال کرنا
Plesk میں ہمیں چار ایکسٹینشنز کی ضرورت ہے:
Docker Plesk ایڈمن پینل میں کنٹینرز کی حالت کے انتظام اور بصری طور پر ڈسپلے کرنے کے لیے؛
Git سرور پر تعیناتی کے مرحلے کو ترتیب دینے کے لیے؛
Firewall آنے والی ٹریفک کی فلٹرنگ کو ترتیب دینے کے لیے۔
آپ انہیں ایکسٹینشن سیکشن میں پلسک ایڈمن پینل کے ذریعے انسٹال کر سکتے ہیں:
ہم ایکسٹینشنز کی تفصیلی ترتیب پر غور نہیں کریں گے؛ ہمارے ڈیمو مقاصد کے لیے، ڈیفالٹ سیٹنگز موزوں ہوں گی۔
سبسکرپشن اور ویب سائٹ بنانا
اس کے بعد، ہمیں اپنی ویب سائٹ helloworld.ru کے لیے سبسکرپشن بنانے اور وہاں ذیلی ڈومین dev.helloworld.ru شامل کرنے کی ضرورت ہے۔
ہم helloworld.ru ڈومین کے لیے سبسکرپشن بناتے ہیں اور سسٹم صارف کے لیے لاگ ان پاس ورڈ بتاتے ہیں:
صفحہ کے نیچے باکس کو چیک کریں۔ لیٹس انکرپٹ کے ساتھ ڈومین کو محفوظ کریں۔، اگر ہم سائٹ کے لیے HTTPS ترتیب دینا چاہتے ہیں:
اس کے بعد، اس سبسکرپشن میں، ہم ایک ذیلی ڈومین dev.helloworld.ru بناتے ہیں (جس کے لیے آپ مفت TLS سرٹیفکیٹ بھی جاری کر سکتے ہیں):
سرور کے اجزاء کو انسٹال کرنا
ہمارے پاس ایک سرور ہے۔ OS Debian اسٹریچ 9.12 اور انسٹال کنٹرول پینل پلسک اوبسیڈین 18.0.27.
ہمیں اپنے پروجیکٹ کے لیے انسٹال اور کنفیگر کرنے کی ضرورت ہے:
PostgreSQL (ہمارے معاملے میں dev اور prod ماحول کے لیے دو ڈیٹا بیس کے ساتھ ایک سرور ہوگا)۔
RabbitMQ (ایک ہی چیز، ماحول کے لیے مختلف vhosts کے ساتھ ایک مثال)۔
دو Redis مثالیں (dev اور prod ماحول کے لیے)۔
ڈوکر رجسٹری (مرتب کردہ ڈاکر امیجز کے مقامی اسٹوریج کے لیے)۔
ڈوکر رجسٹری کے لیے UI انٹرفیس۔
PostgreSQL کی
Plesk پہلے سے ہی PostgreSQL DBMS کے ساتھ آتا ہے، لیکن تازہ ترین ورژن نہیں (Plesk Obsidian لکھنے کے وقت حمایت کی پوسٹگریس ورژن 8.4–10.8)۔ ہم اپنی ایپلیکیشن کا تازہ ترین ورژن چاہتے ہیں (تحریر کے وقت 12.3)، لہذا ہم اسے دستی طور پر انسٹال کریں گے۔
ڈیبین آن لائن پر پوسٹگریس انسٹال کرنے کے لیے کافی تفصیلی ہدایات موجود ہیں (مثال کے طور پر)، تو میں ان کو تفصیل سے بیان نہیں کروں گا، میں صرف حکم دوں گا:
اس بات کو مدنظر رکھتے ہوئے کہ PostgreSQL میں معمولی ڈیفالٹ سیٹنگز ہیں، کنفیگریشن کو ایڈجسٹ کرنا ضروری ہے۔ یہ ہماری مدد کرے گا۔ کیلکولیٹر۔: آپ کو اپنے سرور کے پیرامیٹرز درج کرنے اور فائل میں ترتیبات کو تبدیل کرنے کی ضرورت ہے۔ /etc/postgresql/12/main/postgresql.confتجویز کردہ لوگوں کے لیے۔ یہاں یہ واضح رہے کہ ایسے کیلکولیٹر جادوئی گولی نہیں ہیں، اور آپ کے ہارڈ ویئر، ایپلیکیشن اور سوالات کی پیچیدگی کی بنیاد پر بیس کو زیادہ درست طریقے سے ٹیون کیا جانا چاہیے۔ لیکن شروع کرنے کے لیے یہ کافی ہے۔
کیلکولیٹر کی تجویز کردہ ترتیبات کے علاوہ، ہم بھی تبدیل کرتے ہیں۔ postgresql.confڈیفالٹ پورٹ 5432 دوسرے کو تفویض کیا جاتا ہے (ہماری مثال میں - 53983).
کنفیگریشن فائل کو تبدیل کرنے کے بعد، کمانڈ کے ساتھ postgresql-server کو ریبوٹ کریں:
service postgresql restart
ہم نے PostgreSQL کو انسٹال اور کنفیگر کیا۔ اب آئیے ایک ڈیٹابیس بنائیں، صارف برائے دیو اور پروڈ ماحول، اور صارفین کو ڈیٹا بیس کو منظم کرنے کے حقوق دیں:
$ su - postgres
postgres:~$ create database hw_dev_db_name;
CREATE DATABASE
postgres:~$ create user hw_dev_db_user with password 'hw_dev_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_dev_db_name to hw_dev_db_user;
GRANT
postgres:~$ create database hw_prod_db_name;
CREATE DATABASE
postgres:~$ create user hw_prod_db_user with password 'hw_prod_db_password';
CREATE ROLE
postgres:~$ grant ALL privileges ON database hw_prod_db_name to hw_prod_db_user;
GRANT
خرگوش
آئیے سیلری کے لیے ایک میسج بروکر، RabbitMQ انسٹال کرنے کی طرف بڑھتے ہیں۔ اسے ڈیبین پر انسٹال کرنا بہت آسان ہے:
اب آئیے اپنی ایپلیکیشن - Redis کے لیے آخری جزو کو انسٹال اور کنفیگر کرتے ہیں۔ سیلری کے کاموں کے نتائج کو ذخیرہ کرنے کے لیے اسے بیک اینڈ کے طور پر استعمال کیا جائے گا۔
ہم ایکسٹینشن کا استعمال کرتے ہوئے dev اور prod ماحول کے لیے Redis کے ساتھ دو Docker کنٹینرز اٹھائیں گے۔ Docker Plesk کے لئے.
پلسک پر جائیں، ایکسٹینشن سیکشن پر جائیں، ڈوکر ایکسٹینشن کو تلاش کریں اور اسے انسٹال کریں (ہمیں مفت ورژن کی ضرورت ہے):
انسٹال کردہ ایکسٹینشن پر جائیں، سرچ کے ذریعے تصویر تلاش کریں۔ redis bitnami اور تازہ ترین ورژن انسٹال کریں:
ہم ڈاؤن لوڈ کردہ کنٹینر میں جاتے ہیں اور کنفیگریشن کو ایڈجسٹ کرتے ہیں: پورٹ کی وضاحت کریں، زیادہ سے زیادہ مختص RAM سائز، ماحولیاتی متغیرات میں پاس ورڈ، اور والیوم کو ماؤنٹ کریں:
ہم پروڈ کنٹینر کے لیے 2-3 مراحل انجام دیتے ہیں، ترتیبات میں ہم صرف پیرامیٹرز کو تبدیل کرتے ہیں: پورٹ، پاس ورڈ، RAM سائز اور سرور پر والیوم فولڈر کا راستہ:
ڈاکر رجسٹری
بنیادی خدمات کے علاوہ، سرور پر اپنی ڈوکر امیج ریپوزٹری کو انسٹال کرنا اچھا ہوگا۔ خوش قسمتی سے، سرورز پر جگہ اب کافی سستی ہے (یقینی طور پر DockerHub کی سبسکرپشن سے سستی)، اور پرائیویٹ ریپوزٹری کو انسٹال کرنے کا عمل بہت آسان ہے۔
آئیے Plesk میں اپنی سبسکرپشن میں دو ذیلی ڈومینز بنائیں: docker.helloworld.ru اور docker-ui.helloworld.ru، اور ان کے لیے Let's Encrypt سرٹیفکیٹ ترتیب دیں۔
فائل کو docker.helloworld.ru ذیلی ڈومین فولڈر میں شامل کریں۔ docker-compose.yml اس طرح کے مواد کے ساتھ:
اور ہمیں Nginx کو اپنے کنٹینرز پر ری ڈائریکٹ کرنے کی ضرورت ہے۔ یہ Plesk کے ذریعے کیا جا سکتا ہے۔
docker.helloworld.ru اور docker-ui.helloworld.ru ذیلی ڈومینز کے لیے درج ذیل اقدامات کرنے کی ضرورت ہے:
کے حصے میں دیو ٹولز۔ ہماری ویب سائٹ پر جائیں ڈوکر پراکسی رولز:
اور ہمارے کنٹینر پر آنے والی ٹریفک کو پراکسی کرنے کے لیے ایک اصول شامل کریں:
ہم چیک کرتے ہیں کہ ہم مقامی مشین سے اپنے کنٹینر میں لاگ ان کر سکتے ہیں:
$ docker login docker.helloworld.ru -u hw_docker_admin -p hw_docker_password
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
آئیے docker-ui.helloworld.ru ذیلی ڈومین کے آپریشن کو بھی چیک کریں:
جب آپ براؤز ریپوزٹریز پر کلک کرتے ہیں، تو براؤزر اجازت دینے والی ونڈو دکھائے گا جہاں آپ کو ریپوزٹری کے لیے لاگ ان اور پاس ورڈ درج کرنے کی ضرورت ہوگی۔ جس کے بعد ہمیں ذخیروں کی فہرست والے صفحہ پر بھیج دیا جائے گا (ابھی کے لیے یہ خالی ہوگا):
پلسک فائر وال میں بندرگاہیں کھولنا
اجزاء کو انسٹال کرنے اور ترتیب دینے کے بعد، ہمیں بندرگاہوں کو کھولنے کی ضرورت ہے تاکہ اجزاء ڈوکر کنٹینرز اور بیرونی نیٹ ورک سے قابل رسائی ہوں۔
آئیے دیکھتے ہیں کہ Plesk کے لیے فائر وال ایکسٹینشن کی مثال کا استعمال کرتے ہوئے اسے کیسے کرنا ہے جسے ہم نے پہلے انسٹال کیا تھا۔
کے پاس جاؤ ٹولز اور سیٹنگز > سیٹنگز > فائر وال:
کے پاس جاؤ پلسک فائر وال رولز میں ترمیم کریں > کسٹم رول شامل کریں۔ اور ڈوکر سب نیٹ کے لیے درج ذیل ٹی سی پی پورٹس کھولیں (172.0.0.0 / 8):
RabbitMQ: 1883, 4369, 5671-5672, 25672, 61613-61614
ریڈیس: 32785، 32786
ہم ایک اصول بھی شامل کریں گے جو PostgreSQL بندرگاہوں اور RabbitMQ مینجمنٹ پینل کو بیرونی دنیا کے لیے کھول دے گا:
تبدیلیوں کا اطلاق کریں بٹن کا استعمال کرتے ہوئے قواعد کا اطلاق کریں:
گیتھب ایکشنز میں CI/CD ترتیب دینا
آئیے سب سے دلچسپ حصے پر آتے ہیں - ایک مسلسل انضمام پائپ لائن قائم کرنا اور اپنے پروجیکٹ کو سرور تک پہنچانا۔
یہ پائپ لائن دو حصوں پر مشتمل ہوگی:
تصویر بنانا اور ٹیسٹ چلانا (بیک اینڈ کے لیے) - گیتھب سائیڈ پر؛
منتقلی شروع کرنا (بیک اینڈ کے لیے) اور سرور پر کنٹینرز کی تعیناتی۔
Plesk پر تعینات کریں۔
آئیے پہلے دوسرے نکتے سے نمٹتے ہیں (چونکہ پہلا اس پر منحصر ہے)۔
ہم Plesk کے لیے Git ایکسٹینشن کا استعمال کرتے ہوئے تعیناتی کے عمل کو ترتیب دیں گے۔
آئیے بیک اینڈ ریپوزٹری کے لئے پروڈ ماحول کے ساتھ ایک مثال دیکھیں۔
ہم اپنی Helloworld ویب سائٹ کی سبسکرپشن پر جاتے ہیں اور Git سب سیکشن پر جاتے ہیں:
ہمارے گیتھب ریپوزٹری کے لنک کو "ریموٹ گٹ ریپوزٹری" فیلڈ میں چسپاں کریں اور ڈیفالٹ فولڈر کو تبدیل کریں۔ httpdocs دوسرے کو (مثال کے طور پر، /httpdocs/hw_back):
پچھلے مرحلے سے SSH پبلک کلید کو کاپی کریں اور شامل کریں یہ Github کی ترتیبات میں ہے۔
مرحلہ 2 میں اسکرین پر اوکے پر کلک کریں، جس کے بعد ہمیں پلسک میں ریپوزٹری پیج پر بھیج دیا جائے گا۔ اب ہمیں ماسٹر برانچ میں کمٹمنٹ کرتے وقت ریپوزٹری کو اپ ڈیٹ کرنے کے لیے کنفیگر کرنے کی ضرورت ہے۔ ایسا کرنے کے لیے، پر جائیں۔ ذخیرہ کی ترتیبات اور قیمت کو محفوظ کریں Webhook URL (گیتھب ایکشنز ترتیب دیتے وقت ہمیں بعد میں اس کی ضرورت ہوگی):
پچھلے پیراگراف سے اسکرین پر ایکشن فیلڈ میں، تعیناتی شروع کرنے کے لیے اسکرپٹ درج کریں:
cd {REPOSITORY_ABSOLUTE_PATH}
.ci-cd/deploy.sh {ENV} {DOCKER_REGISTRY_HOST} {DOCKER_USER} {DOCKER_PASSWORD} {TG_BOT_TOKEN} {TG_CHAT_ID}
جہاں:
{REPOSITORY_ABSOLUTE_PATH} - سرور پر پروڈ بیک اینڈ ریپوزٹری فولڈر کا راستہ؛ {ENV} - ماحول (dev/prod)، ہمارے معاملے میں prod; {DOCKER_REGISTRY_HOST} - ہمارے ڈاکر ریپوزٹری کا میزبان {TG_BOT_TOKEN} - ٹیلیگرام بوٹ ٹوکن؛ {TG_CHAT_ID} - اطلاعات بھیجنے کے لیے چیٹ/چینل آئی ڈی۔
اسکرپٹ کی مثال:
cd /var/www/vhosts/helloworld.ru/httpdocs/hw_back/
.ci-cd/deploy.sh dev docker.helloworld.ru docker_user docker_password 12345678:AAbcdEfghCH1vGbCasdfSAs0K5PALDsaw -1001234567890
ہم اپنی رکنیت سے ایک صارف کو ڈوکر گروپ میں شامل کرتے ہیں (تاکہ وہ کنٹینرز کا انتظام کر سکے):
sudo usermod -aG docker helloworld_admin
بیک اینڈ ریپوزٹری اور فرنٹ اینڈ کے لیے دیو ماحول اسی طرح ترتیب دیا گیا ہے۔
گیتھب ایکشنز میں تعیناتی پائپ لائن
آئیے گیتھب ایکشنز میں اپنی CI/CD پائپ لائن کا پہلا حصہ ترتیب دینے کی طرف بڑھتے ہیں۔
لیکن اس کی تجزیہ کرنے سے پہلے، آئیے Github میں ہمیں درکار خفیہ متغیرات کو پُر کریں۔ ایسا کرنے کے لیے، پر جائیں۔ ترتیبات -> راز:
DOCKER_REGISTRY - ہمارے ڈوکر ریپوزٹری کا میزبان (docker.helloworld.ru)؛
DOCKER_LOGIN - ڈوکر ریپوزٹری میں لاگ ان کریں؛
DOCKER_PASSWORD - اس کے لیے پاس ورڈ؛
DEPLOY_HOST - ایک میزبان جس پر Plesk ایڈمن پینل دستیاب ہے (مثال: helloworld.ru:8443 یا 123.4.56.78:8443)
DEPLOY_BACK_PROD_TOKEN — سرور پر پروڈ ریپوزٹری میں تعیناتی کے لیے ایک ٹوکن (ہم نے اسے پلیسک میں تعیناتی میں موصول کیا، مرحلہ 4)؛
DEPLOY_BACK_DEV_TOKEN - سرور پر دیو ریپوزٹری میں تعیناتی کے لیے ٹوکن۔
تعیناتی کا عمل آسان ہے اور تین اہم مراحل پر مشتمل ہے:
ہمارے ذخیرہ میں تصویر کی تعمیر اور اشاعت؛
ایک تازہ مرتب کردہ تصویر کی بنیاد پر کنٹینر میں ٹیسٹ چل رہے ہیں؛
برانچ (dev/master) کے لحاظ سے مطلوبہ ماحول میں تعیناتی۔
فرنٹ اینڈ
فرنٹ ریپوزٹری کے لیے Deploy.yml فائل بیکوف سے زیادہ مختلف نہیں۔ یہ ٹیسٹ چلانے کے مرحلے سے محروم ہوجاتا ہے اور تعیناتی کے لیے ٹوکن کے نام تبدیل کرتا ہے۔ سامنے کے مخزن کے راز، ویسے، الگ سے پُر کرنے کی ضرورت ہے۔
سائٹ سیٹ اپ
Nginx کے ذریعے ٹریفک کو پراکسی کرنا
ٹھیک ہے، ہم اختتام پر آ گئے ہیں. جو کچھ باقی ہے وہ Nginx کے ذریعے ہمارے کنٹینر پر آنے والی اور جانے والی ٹریفک کی پراکسینگ کو ترتیب دینا ہے۔ ہم نے پہلے ہی ڈوکر رجسٹری کو ترتیب دینے کے مرحلہ 5 میں اس عمل کا احاطہ کیا ہے۔ اسی چیز کو دیو اور پروڈ ماحول میں پچھلے اور سامنے والے حصوں کے لیے دہرانے کی ضرورت ہے۔
میں ترتیبات کے اسکرین شاٹس فراہم کروں گا۔
پسدید
فرنٹ اینڈ
уточнение уточнение. تمام یو آر ایل کو فرنٹ اینڈ کنٹینر سے پراکسی کیا جائے گا، سوائے ان کے جو اس سے شروع ہوں گے۔ /api/ - انہیں پچھلے کنٹینر کے ساتھ پراکسی کیا جائے گا (لہذا پچھلے کنٹینر میں، تمام ہینڈلرز کو شروع کرنا چاہیے۔ /api/).
کے نتائج
اب ہماری سائٹ helloworld.ru اور dev.helloworld.ru (بالترتیب پروڈ اور دیو ماحول) پر قابل رسائی ہونی چاہیے۔
مجموعی طور پر، ہم نے سیکھا کہ فلاسک اور اینگولر میں ایک سادہ ایپلیکیشن کیسے تیار کی جاتی ہے اور اسے Plesk چلانے والے سرور پر رول کرنے کے لیے Github ایکشنز میں ایک پائپ لائن قائم کرنا ہے۔
میں کوڈ کے ساتھ ریپوزٹریوں کے لنکس کی نقل تیار کروں گا: پسدید, فرنٹ اینڈ.