خب برسیم به قسمت جالب کار چطور از conda داخل داکر استفاده کنیم
سناریو از این قرار هست ما یک محیط ساخته و میخوایم الزامات راه اندازی جنگو رو داشته باشیم
اول از همه ایمیج مدنظرمون رو از داکرهاب میگیریم
این ایمیج محتوی conda و python3.11 هست هر دو رو داخل خودش داره
ما میخوایم پکیجهای خودمون رو که داخل فایل requirements.yml هست نصب کنیم
میدونیم از دوتا دستور میشه استفاده کرد
تو ایمیجش هم این ماجرا صحت داره پس ما میتونیم که از دستور دومی استفاده کنیم
منتها یک قاعده داشتیم اون هم این بود مقدار name در فایل requirements.yml رو به base تغییر بدیم
با فرض بر این که میخوایم یک اپلیکیشن جنگویی ساده رو بالا بیاریم داکرفایل رو مینویسیم
پس داکر فایل ما به شکل زیر خواهد بود
ما داریم از gunicorn با gevent استفاده میکنیم و برای اجرای اپ جنگویی لازم هست که دستور مربوطه رو در شل کانتینر اجرا کنیم
اما سوال پیش میاد ما الان پکیجهامون رو داخل محیط base داریم و شل هم یجای دیگه کار میکنه خب چطور اینارو باهم ارتباط بدیم
در پست اول راجب conda یک دستور خوندیم
حالا یک داکر فایل ساده مینویسیم
حالا بریم واسه اجرا کردنش
پایتون نسخه 3.10 مگه ما اول کار نگفتیم این ایمیج پایتون نسخه 3.11 هست
درسته داخل دپندنسی فایل requirements.yml هر نسخه از پایتون باشه conda وضعیت رو تغییر میده برامون
حالا از پایتون بیایم بیرون و پکیج هارو نگاه کنیم
یک سوال ازتون میپرسم اگر ما مقدار name در فایل requirements.yml رو به base تغییر ندیم شیوه کاریمون چجوری میشد؟؟؟
#conda
#pip
#env
@code_crafters
سناریو از این قرار هست ما یک محیط ساخته و میخوایم الزامات راه اندازی جنگو رو داشته باشیم
conda env create -n venv python=3.10 django gunicorn geventبریم واسه داکرایز کردنش
conda activate venv
django-admin startproject config .
conda env export > requirements.yml
اول از همه ایمیج مدنظرمون رو از داکرهاب میگیریم
docker pull continuumio/miniconda3ما ایمیج رو گرفتیم و داخل Dockerfile ازش استفاده میکنیم
این ایمیج محتوی conda و python3.11 هست هر دو رو داخل خودش داره
ما میخوایم پکیجهای خودمون رو که داخل فایل requirements.yml هست نصب کنیم
میدونیم از دوتا دستور میشه استفاده کرد
conda env create -f requirements.ymlتو پست قبل بهتون گفتم یادتون بمونه که conda همیشه خودش یک محیط درست میکنه با اسم base
conda env update -f requirements.yml
اولی محیط رو هم برامون ایجاد میکرد
دومی روی یک محیط از قبل موجود پکیجهارو نصب میکرد
تو ایمیجش هم این ماجرا صحت داره پس ما میتونیم که از دستور دومی استفاده کنیم
منتها یک قاعده داشتیم اون هم این بود مقدار name در فایل requirements.yml رو به base تغییر بدیم
با فرض بر این که میخوایم یک اپلیکیشن جنگویی ساده رو بالا بیاریم داکرفایل رو مینویسیم
پس داکر فایل ما به شکل زیر خواهد بود
FROM continuumio/miniconda3خب ادامه بدیم و یک داکر کامپوز ساده هم بنویسیم براش
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY . /code/
RUN /bin/bash -c "conda env update -f requirements.yml"
EXPOSE 8000
ما داریم از gunicorn با gevent استفاده میکنیم و برای اجرای اپ جنگویی لازم هست که دستور مربوطه رو در شل کانتینر اجرا کنیم
اما سوال پیش میاد ما الان پکیجهامون رو داخل محیط base داریم و شل هم یجای دیگه کار میکنه خب چطور اینارو باهم ارتباط بدیم
در پست اول راجب conda یک دستور خوندیم
conda run
کارش هم این بود که دستور شل رو با یک محیط conda ترکیب کنه
نکته جالب هروقت جایی لازم بود داخل دستور conda محیط رو مشخص کنید با سویچ n myenv- و اینکار رو نکنید conda پیش فرض محیط base رو در نظر میگیره
جالب شد همین کار مارو راه میندازه
حالا یک داکر فایل ساده مینویسیم
version: '3'
services:
conda:
build: .
image: conda-test
hostname: conda
container_name: conda
restart: on-failure
command: sh -c "conda run gunicorn -k gevent --workers 4 config.wsgi:application -b 0.0.0.0:8000"
expose:
- 8000
ports:
- 8000:8000
حالا بریم واسه اجرا کردنش
docker compose up -dیکم صبر کنید تا کار تموم بشه
docker psکانتینر در حال اجراست و لاگ هم اروری نداریم بریم داخل کانتینر یچیز جالب رو باهم نگاه کنیم
docker logs conda
docker exec -it conda bashچه چیزی رو میبینید؟؟؟
python
پایتون نسخه 3.10 مگه ما اول کار نگفتیم این ایمیج پایتون نسخه 3.11 هست
درسته داخل دپندنسی فایل requirements.yml هر نسخه از پایتون باشه conda وضعیت رو تغییر میده برامون
حالا از پایتون بیایم بیرون و پکیج هارو نگاه کنیم
conda env listکار تمومه کانتینر ما داره کار میکنه و تونستیم با درک شیوه کار کرد conda کارمون رو راه بندازیم
همه پکیجها نصب هستش
یک سوال ازتون میپرسم اگر ما مقدار name در فایل requirements.yml رو به base تغییر ندیم شیوه کاریمون چجوری میشد؟؟؟
#conda
#pip
#env
@code_crafters
👍3
امیدواریم هرچه سریعتر سیستم مالیاتی جامع کشوری راه اندازی بشه و در کنارش سیستم نظارت بر درآمدزایی هم رشد کنه
با این واقعیت کنار بیاید که سیستم مالیاتی به نفع همه و بالاخص قشر ضعیف و دهک پایین جامعه خواهد بود، بخودتون سخت نگیرید شما بعنوان کارمند نهایتا در ازای هر ده میلیون تومن فراتر از پایه حقوق ده میلیون تومن یک میلیون مالیات خواهید داد
چیزی از جیب شما کم نخواهد شد اما در مقابل افراد با درامد ناسالم شناسایی میشن ،هرکسی از روی هوا و کارهای ضد اجتماعی مثه فروش مواد مخدر پولدار نخواهد شد
از سیستم یکپارچه مالیات کشوری حمایت کنید و امیدوارم طرح بعدی سیستم نظارت جامع بر املاک و مستقلات کشوری راه اندازی بشه
با این واقعیت کنار بیاید که سیستم مالیاتی به نفع همه و بالاخص قشر ضعیف و دهک پایین جامعه خواهد بود، بخودتون سخت نگیرید شما بعنوان کارمند نهایتا در ازای هر ده میلیون تومن فراتر از پایه حقوق ده میلیون تومن یک میلیون مالیات خواهید داد
چیزی از جیب شما کم نخواهد شد اما در مقابل افراد با درامد ناسالم شناسایی میشن ،هرکسی از روی هوا و کارهای ضد اجتماعی مثه فروش مواد مخدر پولدار نخواهد شد
از سیستم یکپارچه مالیات کشوری حمایت کنید و امیدوارم طرح بعدی سیستم نظارت جامع بر املاک و مستقلات کشوری راه اندازی بشه
👎18👍7😐1
قابلیت TTL در MongoDb: راه حلی ساده و هوشمندانه برای مدیریت اطلاعات موقتی
ذخیره سازی اطلاعات موقتی، چالشی همیشگی در برنامه نویسی بوده است.
دو راه حل رایج برای این چالش عبارتند از:
استفاده از Redisو Session: که برای ذخیره سازی داده های کوتاه مدت مانند اطلاعات مربوط به سشن کاربر مناسب است.
ساخت مدل و حذف دوره ای با cron job: که برای داده های موقتی که نیاز به ساختار پیچیده تری دارند، مانند سبد خرید، مناسب است.
اما راه حل سومی هم وجود دارد که ساده تر و کارآمدتر است: TTL در MongoDb
در واقع TTL مخفف Time To Live است و به قابلیتی در MongoDb اشاره می کند که به شما امکان می دهد اسناد را پس از گذشت زمان مشخصی به طور خودکار حذف کنید.
مزایای استفاده از TTL:
حذف خودکار اطلاعات: دیگر نیازی به نوشتن کد برای حذف دستی اطلاعات منسوخ نیست. TTL این کار را به طور خودکار برای شما انجام می دهد.
کاهش حجم داده ها: با حذف خودکار اطلاعات غیرضروری، فضای ذخیره سازی پایگاه داده شما آزاد می شود.
افزایش کارایی و عملکرد: حذف خودکار اطلاعات، بهینه سازی و سرعت بخشیدن به عملکرد پایگاه داده شما کمک می کند.
معایب استفاده از TTL:
پیچیدگی جزئی کد: استفاده از TTL نیازمند ایجاد ایندکس TTL روی فیلد زمانی است. (مثلا یک فیلد با اسم CreateAt از DateTime)
مصرف رم و CPU: حذف خودکار اطلاعات به طور مداوم، می تواند رم و CPU بیشتری را مصرف کند. (البته خوب استفاده از cron job هم همین استفاده بیشتر از رم و CPU را میخواهد)
در کل TTL در MongoDb راه حلی ساده و کارآمد برای ذخیره سازی اطلاعات موقتی است.
با وجود معایبی مانند پیچیدگی جزئی کد و مصرف رم و CPU، مزایای TTL مانند حذف خودکار اطلاعات، کاهش حجم داده ها و افزایش کارایی و عملکرد، آن را به انتخابی ایده آل برای بسیاری از برنامه ها تبدیل می کند.
برای کسب اطلاعات بیشتر از لینک زیر استفاده کنید :
https://www.mongodb.com/docs/manual/core/index-ttl/
#mongodb
@Code_Crafters
ذخیره سازی اطلاعات موقتی، چالشی همیشگی در برنامه نویسی بوده است.
دو راه حل رایج برای این چالش عبارتند از:
استفاده از Redisو Session: که برای ذخیره سازی داده های کوتاه مدت مانند اطلاعات مربوط به سشن کاربر مناسب است.
ساخت مدل و حذف دوره ای با cron job: که برای داده های موقتی که نیاز به ساختار پیچیده تری دارند، مانند سبد خرید، مناسب است.
اما راه حل سومی هم وجود دارد که ساده تر و کارآمدتر است: TTL در MongoDb
در واقع TTL مخفف Time To Live است و به قابلیتی در MongoDb اشاره می کند که به شما امکان می دهد اسناد را پس از گذشت زمان مشخصی به طور خودکار حذف کنید.
مزایای استفاده از TTL:
حذف خودکار اطلاعات: دیگر نیازی به نوشتن کد برای حذف دستی اطلاعات منسوخ نیست. TTL این کار را به طور خودکار برای شما انجام می دهد.
کاهش حجم داده ها: با حذف خودکار اطلاعات غیرضروری، فضای ذخیره سازی پایگاه داده شما آزاد می شود.
افزایش کارایی و عملکرد: حذف خودکار اطلاعات، بهینه سازی و سرعت بخشیدن به عملکرد پایگاه داده شما کمک می کند.
معایب استفاده از TTL:
پیچیدگی جزئی کد: استفاده از TTL نیازمند ایجاد ایندکس TTL روی فیلد زمانی است. (مثلا یک فیلد با اسم CreateAt از DateTime)
مصرف رم و CPU: حذف خودکار اطلاعات به طور مداوم، می تواند رم و CPU بیشتری را مصرف کند. (البته خوب استفاده از cron job هم همین استفاده بیشتر از رم و CPU را میخواهد)
در کل TTL در MongoDb راه حلی ساده و کارآمد برای ذخیره سازی اطلاعات موقتی است.
با وجود معایبی مانند پیچیدگی جزئی کد و مصرف رم و CPU، مزایای TTL مانند حذف خودکار اطلاعات، کاهش حجم داده ها و افزایش کارایی و عملکرد، آن را به انتخابی ایده آل برای بسیاری از برنامه ها تبدیل می کند.
برای کسب اطلاعات بیشتر از لینک زیر استفاده کنید :
https://www.mongodb.com/docs/manual/core/index-ttl/
#mongodb
@Code_Crafters
Mongodb
TTL Indexes - Database Manual - MongoDB Docs
TTL indexes are special single-field indexes for automatically removing documents from a collection after a certain amount of time or at a specific clock time.
👍3❤1
داکر ، پلتفرم اوپن سورسی که به ما در توسعه دادن (Develop) ، انتقال دادن (Ship) و اجرا (Run) کمک میکنه، یکی از فواید داکر ، ایزوله سازی اپ ها هستش این بدین معنی است که شما میتوانید اپ های خود را مستقل از سیستم عامل اجرا کنید.
🔆 ساختار داکر چگونه است؟
🔅 داکر دارای یک هسته و دو Application می باشد ، داکر کلاینت و داکر Cli ، که هردو آنها به هسته یعنی Docker-Daemon درخواست میدهند ، اگر شما میخواید یک ایمیج را Pull کنید یا حتی یک ایمیج را اجرا کنید ، باید به هسته دستور اجرا شدن را بدید. نوع ارتباط بین کلاینت و هسته با Rest Api می باشد.
🔆 ماشین مجازی یا داکر؟
🔅داکر بر خلاف ماشین مجازی (Virtual Machine) نیازی به Hypervisor ندارد و کانتینر شمارو بصورت مستقیم روی سیستم عامل و همچنین با پراسس جدیدی اجرا میکند که باعث سبک تر بودن اپ (چه از لحاظ مصرفی و چه از لحاظ سرعت ) نسبت به ماشین مجازی میشود.
🔆 اپ ما چگونه در داکر اجرا میشود؟
🔹 1- در ابتدا شما باید بوسیله ی
🔸2 - بعد از ساختن ایمیج ، شما میتوانید آن را اجرا کنید ، داکر قابلیت اجرای چندین Instance از یک ایمیج را دارد که آن هارا بصورت کانتینر از هم مجزا میکند. که این یعنی شما میتوانید 4 پراسس از یک اپلیکیشن را اجرا کنید.
🔹3 - همانطور که در مورد دوم گفته شد ، شما بعد از اجرای ایمیج خود در اصل یک کانیتنر می سازید ، این کانتینر بصورت کاملا ایزوله از ایمیج ساخته میشود و بصورت پراسس اجرا میشود اینجوری تمامی تغییرات اعمال شده در کانتینر روی ایمیج تاثیری نمیزارد.
♦️ داکر سرویس ، یک ابزار برای مدیریت چندین کانیتنر بصورت همزمان است ، همچنین با داکر سرویس میتوانید از قابلیت های داکر Swram نیز استفاده کنید که در پست های آینده راجب آن توضیح میدهیم.
#Docker
#Guide
#Beginner
@code_crafters
🔆 ساختار داکر چگونه است؟
🔅 داکر دارای یک هسته و دو Application می باشد ، داکر کلاینت و داکر Cli ، که هردو آنها به هسته یعنی Docker-Daemon درخواست میدهند ، اگر شما میخواید یک ایمیج را Pull کنید یا حتی یک ایمیج را اجرا کنید ، باید به هسته دستور اجرا شدن را بدید. نوع ارتباط بین کلاینت و هسته با Rest Api می باشد.
🔆 ماشین مجازی یا داکر؟
🔅داکر بر خلاف ماشین مجازی (Virtual Machine) نیازی به Hypervisor ندارد و کانتینر شمارو بصورت مستقیم روی سیستم عامل و همچنین با پراسس جدیدی اجرا میکند که باعث سبک تر بودن اپ (چه از لحاظ مصرفی و چه از لحاظ سرعت ) نسبت به ماشین مجازی میشود.
🔆 اپ ما چگونه در داکر اجرا میشود؟
🔹 1- در ابتدا شما باید بوسیله ی
Docker Image
یک ایمیج برای خودتون بسازید ، این ایمیج خود ، ساختار چند لایه دارد ، اپ شما و ایمیج های دیگر استفاده شده بصورت جدا جدا گرفته و در مجموع یک ایمیج را شکل میدهند.🔸2 - بعد از ساختن ایمیج ، شما میتوانید آن را اجرا کنید ، داکر قابلیت اجرای چندین Instance از یک ایمیج را دارد که آن هارا بصورت کانتینر از هم مجزا میکند. که این یعنی شما میتوانید 4 پراسس از یک اپلیکیشن را اجرا کنید.
🔹3 - همانطور که در مورد دوم گفته شد ، شما بعد از اجرای ایمیج خود در اصل یک کانیتنر می سازید ، این کانتینر بصورت کاملا ایزوله از ایمیج ساخته میشود و بصورت پراسس اجرا میشود اینجوری تمامی تغییرات اعمال شده در کانتینر روی ایمیج تاثیری نمیزارد.
♦️ داکر سرویس ، یک ابزار برای مدیریت چندین کانیتنر بصورت همزمان است ، همچنین با داکر سرویس میتوانید از قابلیت های داکر Swram نیز استفاده کنید که در پست های آینده راجب آن توضیح میدهیم.
#Docker
#Guide
#Beginner
@code_crafters
❤9👍2
خب بیاید راجب یک موضوع دیگه خیلی سریع در چند پست باهم بررسی و یاد بگیریم
اتومیشن کردن پروژه (ما از یک پروژه جنگویی استفاده میکنیم اما جز در قسمت داکرایز کردن آن تفاوتی در سایر مراحل ندارد)در گیتهاب با استفاده از github actions
خب قبل از هرچیزی بیایم سناریویی که میخوایم انجام بدیم رو با هم بچینیم و پیاده سازیش کنیم
ما یک اپلیکیشن داریم که داخل گیتهاب در ریپوزیتوری خصوصی با نام test-action قرار دادیم
دوتا سرور داریم
ما از رانر خودمون استفاده میکنیم که کار کردن و تنظیم کردن اون رو هم یاد بگیریم
سناریو به چه شکل خواهد بود
ما پروژه رو با داکرایز کردن پیاده سازی میکنیم پس در هر دو سرور تست و اجرا با این رویکرد پیش خواهیم رفت
در مبحث مربوط به cd برای سرور تست delivery و برای سرور اجرا deployment پیش خواهیم رفت
خب ما یک پروژه با جنگو رو شروع میکنیم
داکرایز کردن آن:
در همان مسیر دایرکتوری my_project
فایل داکرکامپوز
محتویات آن
خب تا اینجای کار آماده شدیم
#git
#actions
@code_crafters
اتومیشن کردن پروژه (ما از یک پروژه جنگویی استفاده میکنیم اما جز در قسمت داکرایز کردن آن تفاوتی در سایر مراحل ندارد)در گیتهاب با استفاده از github actions
خب قبل از هرچیزی بیایم سناریویی که میخوایم انجام بدیم رو با هم بچینیم و پیاده سازیش کنیم
ما یک اپلیکیشن داریم که داخل گیتهاب در ریپوزیتوری خصوصی با نام test-action قرار دادیم
دوتا سرور داریم
یک سرور جهت تست با نام server-develope
یک سرور جهت اجرا با نام server-production
ما از رانر خودمون استفاده میکنیم که کار کردن و تنظیم کردن اون رو هم یاد بگیریم
دوستانی که سرور ندارن میتونن از environment خود گیتهاب جهت تست و تمرین استفاده کنن
سناریو به چه شکل خواهد بود
ما پروژه رو با داکرایز کردن پیاده سازی میکنیم پس در هر دو سرور تست و اجرا با این رویکرد پیش خواهیم رفت
در مبحث مربوط به cd برای سرور تست delivery و برای سرور اجرا deployment پیش خواهیم رفت
چرا از دو رویکرد برای cd استفاده میکنیم
در سرور تست اپلیکیشن توسط واحد مارکتینگ مورد تست و بررسی قرار میگیره و بعد از دریافت تاییدیه نهایی و رفع مشکلات و یا موارد بر روی سرور اجرا جهت در دسترس بودن کاربران نهایی قرار خواهد گرفت
خب ما یک پروژه با جنگو رو شروع میکنیم
conda env create -n tetstaction-venv python=3.10 django gunicorn gevent
conda activate tetstaction-venv
mkdir my_project
cd my_project
django-admin startproject config .
داکرایز کردن آن:
در همان مسیر دایرکتوری my_project
nano Dockerfileمقدار زیر را داخل آن بزارید
FROM continuumio/miniconda3
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY . /code/
RUN /bin/bash -c "conda env update -f requirements.yml"
EXPOSE 8000
فایل داکرکامپوز
nano docker-compose.yml
محتویات آن
ser version: '3'
services:
conda:
build: .
image: conda-test
hostname: conda
container_name: conda
restart: on-failure
command: sh -c "conda run gunicorn -k gevent --workers 4 config.wsgi:application -b 0.0.0.0:8000"
expose:
- 8000
ports:
- 8000:8000
خب تا اینجای کار آماده شدیم
دوتا سرور تست و اجرا داریماز پست بعد بریم سراغ github action
یک پروژه جنگویی داریم
اون رو داکرایز کردیم
و در یک ریپوی خصوصی گیتهاب گذاشتیم
#git
#actions
@code_crafters
👏4
خب میریم سراغ رانرهامون
اینکه رانر چیه و توضیحات مربوط به اون رو برید از Gemini گوگول بپرسید از تعاریف عبور میکنیم
ما دو نوع رانر داریم
به اکانت خود و ریپوی مدنظرتون برید و مسیر زیر رو دنبال کنید
Settings > Actions > Runners > New self-hosted runner
در کامنتها تصویر اول رو ببینید
تو این صفحه دستورالعمل مربوط به اجرا کردن رانر را میبینید مطابق آن پیش بروید من از سیستم عامل لینوکس بهره میبرم
در کامنتها تصویر دوم را ببینید
دستورات مربوطه در این صفحه با حفظ نکته زیر در سرور server-developer اجرا کنید
در بخش configure هنگام اجرا کردن بش اسکریپت config.sh/. موارد رو مطابق زیر پر کنید
Settings > Actions > Runners
یک رانر با نام و برچسب server-developer می بینید این یک self-hosted هست این نام رو فراموش نکنید
نکته قابل توجه:
دستور run.sh/. ترمینال رو مشغول نگه داشته و اگه این دستور رو خاتمه بدید و به همان صفحه رانرها برگردید میبینید که رانر به حالت offline رفته
ما باید رانر رو به یک سرویس تبدیل کنیم تا همیشه به حالت کار قرار گیرد دستورات زیر را در همان مسیر دایرکتوری که رانر در ان قرار دارد اجرایی کنید (actions-runner) اجرایی کنید
اکنون اگر بجای start در دستور دوم بالا مقدار status را بزارید میبینید که رانر ما بصورت سرویس بالا آمده و در حال اجرا قرار گرفته است
هر دو رانر ما آماده شدن
#git
#actions
@code_crafters
اینکه رانر چیه و توضیحات مربوط به اون رو برید از Gemini گوگول بپرسید از تعاریف عبور میکنیم
ما دو نوع رانر داریم
رانر میزبانی شده توسط گیتهاب(اگه سرور ندارید میتونید ازین مورد استفاده کنید)
رانر خود میزبانی شده که بهش self hosted میگیم و روی سرور بالا میاریم(میتونید روی لپتاپ خودتون هم بالا بیارید)
به اکانت خود و ریپوی مدنظرتون برید و مسیر زیر رو دنبال کنید
Settings > Actions > Runners > New self-hosted runner
در کامنتها تصویر اول رو ببینید
تو این صفحه دستورالعمل مربوط به اجرا کردن رانر را میبینید مطابق آن پیش بروید من از سیستم عامل لینوکس بهره میبرم
در کامنتها تصویر دوم را ببینید
دستورات مربوطه در این صفحه با حفظ نکته زیر در سرور server-developer اجرا کنید
در بخش configure هنگام اجرا کردن بش اسکریپت config.sh/. موارد رو مطابق زیر پر کنید
دستور اول مربوط به ساخت دایرکتوری می باشد در هر مسیری که دوست دارید آنرا اجرا کنید و بخاطر بسپارید تمامی دستورات ما جهت پیکربندی رانر در این مسیر این دایرکتوری انجام خواهیم داداکنون صفحه گیتهاب خود در مسیر زیر را اگر رفرش کنید با تصویر سوم در کامنت ها روبرو میشید
در مرحله اول کلید enter را بزنید تا پیش فرض بماند
در مرحله دوم هم مقدار server-developer را وارد کنید
در مرحله بعدی لیبل server-developer را وارد کنید
در مرحله بعدی کلید enter را بزنید
رانر ما اکنون آماده کار میباشد
دستور زیر را بزنید تا رانر شروع بکار کند
./run.sh
Settings > Actions > Runners
یک رانر با نام و برچسب server-developer می بینید این یک self-hosted هست این نام رو فراموش نکنید
نکته قابل توجه:
دستور run.sh/. ترمینال رو مشغول نگه داشته و اگه این دستور رو خاتمه بدید و به همان صفحه رانرها برگردید میبینید که رانر به حالت offline رفته
ما باید رانر رو به یک سرویس تبدیل کنیم تا همیشه به حالت کار قرار گیرد دستورات زیر را در همان مسیر دایرکتوری که رانر در ان قرار دارد اجرایی کنید (actions-runner) اجرایی کنید
sudo ./svc.sh install
systemctl start action<کلید tab را جهت کامل کردن بزنید>
اکنون اگر بجای start در دستور دوم بالا مقدار status را بزارید میبینید که رانر ما بصورت سرویس بالا آمده و در حال اجرا قرار گرفته است
برای سرور server-deployment به همان صفحه رانرها رفته و یک رانر جدید دیگر راه بندازید
Settings > Settings > Actions > New self-hosted runner
همان مراحل بالا را انجام بدید منتها نام و لیبل رو به server-deployment تغییر دهید
اکنون صفحه رانرها را رفرش کنید رانر server-deployment رو با server-developer میبینید
هر دو رانر ما آماده شدن
#git
#actions
@code_crafters
👏3
خب بریم سراغ اینکه اگه بخوایم رانر رو حذف کنیم چکار کنیم
ابتدا به سرور مدنظرمون و مسیر دایرکتوری که پست قبلی برای رانر ایجاد کردیم میریم و دستورات زیر رو میزنیم
Settings > Actions > runners > رانر خودراانتخابکنید > Remove
اگر صفحه رانرها رو رفرش کنید میبینید که رانر پاک شده است
#git
#actions
@code_crafters
ابتدا به سرور مدنظرمون و مسیر دایرکتوری که پست قبلی برای رانر ایجاد کردیم میریم و دستورات زیر رو میزنیم
systemctl stop action<کلید tab را جهت کامل کردن بزنید>مقدار توکن را مطابق تصویر دریافت کنید به مسیر رانرها بروید بر روی اسم رانر مدنظر خودتون کلیک کنید دکمه remove را بزنید مقدار توکن را کپی کرده صفحه را ببنید در دستور بالا جایگذاری کنید و رانر را حذف کنید
sudo ./svc.sh uninstall
./config.sh remove --token مقدارتوکن
Settings > Actions > runners > رانر خودراانتخابکنید > Remove
اگر صفحه رانرها رو رفرش کنید میبینید که رانر پاک شده است
#git
#actions
@code_crafters
👍3
خب بریم سراغ نوشتن workflows ها
یک دایرکتوری در مسیر root پروژه خود بسازید و اسم آن را github. بزارید و داخل آن نیز یک دایرکتوری دیگر با اسم workflows بسازید هر فایلی با پسوند yml. بعنوان یک flow شناخته میشه و به رانر برای اجرا داده میشود
ابتدا برای آن یک نام تعیین میکینیم تا در هنگام اجرا شدن در صفحه گیتهاب مربوط به نشان دادن بتوانیم آنرا تفکیک کنیم
در مرحله بعد ما مشخص میکنیم این flow چه هنگامی اجرا شود
در سناریوی اولی ما دو سرور داشتیم و هر سرور هم یک رانر داشت رانر مربوط به تست و توسعه رو با اسم server-develope لیبل آنرا نیز با نام server-develope گذاشتیم ما از اسم لیبل استفاده میکنیم میکنیم تا به گیتهاب بفهمونیم میخواهیم flow با اسم develope.yml را روی روی سرور و با رانر server-develope اجرا کند
خب این رو هم مشخص کردیم
بریم سراغ نوشتن jobها هر flow میتونه چندین job داشته باشه که در بلاک jobs نوشته میشه هر job یک مشخصه و چندین step و env و رانر متصل و ... میتونه داشته باشه
ما سه job خواهیم داشت
Pull
Dockerize
Push
اسم job رو گذاشتیم ،جهت گرفتن تغییرات ریپو بر روی سرور
این جاب روی رانر خود میزبان اجرا خواهد شد و چون در ابتدا برای این flow ما مقدار TARGET_SERVER تعریف کردیم پس این جاب و گامهای اون روی سروری اجرا میشه که رانر با لیبل server-developer قرار گرفته است
در گام اول ما یک نام با عنوان pull from github گذاشتیم
درون env ما دو مقدار متغییر قرار دادیم username برای نام کاربری در گیتهاب و TOKEN که توکن دسترسی به ریپوی پرایویت و اکانت گیتهاب ما می باشد و چون این مقدار امنیتی می باشد آنرا داخل سکرت ریپومون در مسیر زیر گذاشته و از آنجا دریافت میکنیم
Settings > Secrets and Varibles > Secret > New repository secret
تصویر اول در کامنتها
در قسمت run دستورات مربوط رو مینویسیم
بریم سراغ جاب بعدی dockerize
در این جاب مقدار need رو میبینید که به جاب pull رفرنس داده ،ما تا زمانیکه کدهارو نگرفتیم نمیتونیم داکرایز کنیم بابت همین نیاز هست منتظر بمونیم pull تموم بشه و بعد
#actions
@code_crafters
یک دایرکتوری در مسیر root پروژه خود بسازید و اسم آن را github. بزارید و داخل آن نیز یک دایرکتوری دیگر با اسم workflows بسازید هر فایلی با پسوند yml. بعنوان یک flow شناخته میشه و به رانر برای اجرا داده میشود
در سناریوی پست اول گفتیم که دو سرور خواهیم داشت server-develope با server-deploymentابتدا میریم سراغ فایل develope.yml و ذره ذره آنرا توضیح خواهیم داد
در این دایرکتوری دوتا فایل خواهیم ساخت
develop.yml
deployment.yml
ابتدا برای آن یک نام تعیین میکینیم تا در هنگام اجرا شدن در صفحه گیتهاب مربوط به نشان دادن بتوانیم آنرا تفکیک کنیم
name: develope applicationنام را ست کردیم
در مرحله بعد ما مشخص میکنیم این flow چه هنگامی اجرا شود
on:مشخص کردیم هنگامیکه پوش داشتیم و روی برنچ main این پوش صورت گرفته بود این flow اجرا گردد
push:
branches:
- main
در سناریوی اولی ما دو سرور داشتیم و هر سرور هم یک رانر داشت رانر مربوط به تست و توسعه رو با اسم server-develope لیبل آنرا نیز با نام server-develope گذاشتیم ما از اسم لیبل استفاده میکنیم میکنیم تا به گیتهاب بفهمونیم میخواهیم flow با اسم develope.yml را روی روی سرور و با رانر server-develope اجرا کند
env:
TARGET_SERVER: server-developer
خب این رو هم مشخص کردیم
بریم سراغ نوشتن jobها هر flow میتونه چندین job داشته باشه که در بلاک jobs نوشته میشه هر job یک مشخصه و چندین step و env و رانر متصل و ... میتونه داشته باشه
ما سه job خواهیم داشت
Pull
Dockerize
Push
قبل از ادامه در سرورخب بریم سراغ جاب pull
۱-در مسیر var/www/ پروژه روclone میکنیم
۲-نصب و پیکربندی داکر و داکرکامپوز
pull:
runs-on: self-hosted
steps:
- name: pull from github
env:
USERNAME: "CodeCrafters-ir"
TOKEN: ${{ secrets.TOKEN }}
run: |
cd /var/www/test-action
git config --global user.email "[email protected]"
git config --global user.name "behzad azadi"
git pull https://$USERNAME:$[email protected]/CodeCrafters-ir/test-actions.git
اسم job رو گذاشتیم ،جهت گرفتن تغییرات ریپو بر روی سرور
این جاب روی رانر خود میزبان اجرا خواهد شد و چون در ابتدا برای این flow ما مقدار TARGET_SERVER تعریف کردیم پس این جاب و گامهای اون روی سروری اجرا میشه که رانر با لیبل server-developer قرار گرفته است
در گام اول ما یک نام با عنوان pull from github گذاشتیم
درون env ما دو مقدار متغییر قرار دادیم username برای نام کاربری در گیتهاب و TOKEN که توکن دسترسی به ریپوی پرایویت و اکانت گیتهاب ما می باشد و چون این مقدار امنیتی می باشد آنرا داخل سکرت ریپومون در مسیر زیر گذاشته و از آنجا دریافت میکنیم
Settings > Secrets and Varibles > Secret > New repository secret
تصویر اول در کامنتها
در قسمت run دستورات مربوط رو مینویسیم
ابتدا به مسیر دایرکتوری پروژه میریم معمولا در جامعه توسعه دهندگان و لینوکس مسیر آن در var/www/ می باشد
مقادیر نام و ایمیل رو برای گیت تنظیم میکنیم
و سپس جهت دریافت کدها و تغییرات pull میکنیم به نحوه جا دادن username و token دقت کنید
بریم سراغ جاب بعدی dockerize
dockerize:
runs-on: self-hosted
needs:
- pull
steps:
- name: Create image
run: |
echo $SUDO_PASSWORD | sudo -Sv
cd /var/www/test-action
sudo docker build . -t conda-test --no-cache
- name: Run container
run: |
echo $SUDO_PASSWORD | sudo -Sv
cd /var/www/test-action
sudo docker compose down
sudo docker compose up -d
در این جاب مقدار need رو میبینید که به جاب pull رفرنس داده ،ما تا زمانیکه کدهارو نگرفتیم نمیتونیم داکرایز کنیم بابت همین نیاز هست منتظر بمونیم pull تموم بشه و بعد
داخل هر گام مقدار کد#git
echo $SUDO_PASSWORD | sudo -Sv
رو میبینیم چون نیاز هست در کامندها از sudo استفاده کنیم اینگونه براش پسورد رو میگذاریم
مقدار متغییر
$SUDO_PASSWORD
رو هم در env گلوبال میزاریم
env:
TARGET_SERVER: server-developer
SUDO_PASSWORD: ${{ secrets.SUDO_PASSWORD }}
در بالاتر یاد گرفتیم چطوری متغییر امنیتی رو تنظیم کنیم
#actions
@code_crafters
👏2
خب بریم سراغ جاب push
ابتدا به اکانت داکرهاب خودمون میریم یدونه ریپوزیتوری پرایویت میسازی با اسم conda-test
برای لاگین در داکر هاب نام کاربری و پسورد لازم داخل env تعریف میکنیم و پسورد رو میبریم داخل سکرت ریپومون
دستورات run:
خب بریم سراغ flow مربوط به deployment
ابتدا یک نام بهش میدیم
در جاب اول ایمیج رو pull میکنیم
خب همه چی مشخص هست درسته؟؟؟
در جاب دوم لازم هست ایمیج رو اجرا کنید تا اینجای کار اومدیم پس یاد گرفتین خودتون این جاب رو چجوری بنویسید
چندتا نکته:
پروژه و کدها رو میتونید در گیتهاب ببینید
https://github.com/CodeCrafters-ir/test-actions.git
خب سوال:
اگه بخوایم همین سناریو رو در گیتلب هم یاد بگیریم چی؟؟؟
اموزش بچههای دواپس هابیز رو در یوتیوب ببینید
https://youtube.com/playlist?list=PLYrn63eEqAzannVocQrddqsBK-C17e-Sm&si=F_C_OiGw6i3l4aoN
#git
#actions
@code_crafters
ابتدا به اکانت داکرهاب خودمون میریم یدونه ریپوزیتوری پرایویت میسازی با اسم conda-test
push-image:خب نیاز داریم اول جاب dockerize تموم بشه بعد ،پس needs رو براش مینویسیم
runs-on: self-hosted
env:
USERNAME: 'behzadazadi2693'
DOCKER_PASSWORD: $"{{ secrets.DOCKER_PASSWORD }}"
needs:
- dockerize
steps:
- name: push image to docker account
run: |
echo $SUDO_PASSWORD | sudo -Sv
sudo docker login -u $USERNAME -p $DOCKER_PASSWORD
sudo docker tag conda-test $USERNAME/conda-test:v1
sudo docker push $USERNAME/conda-test:v1
برای لاگین در داکر هاب نام کاربری و پسورد لازم داخل env تعریف میکنیم و پسورد رو میبریم داخل سکرت ریپومون
دستورات run:
پسورد ران برای دستور sudo تنظیم میکنیم
ابتدا لاگین میکنیم
طبق قاعده خاص داکر ایمیج رو نام گذاری میکنیم برای ریپوزیتوری پرایویتمون در داکر هاب
و سپس پوش میکنیم داخل داکر هاب
خب بریم سراغ flow مربوط به deployment
نکته: ابتدا در سرور server-deployment داکر و داکرکامپوز رو نصب میکنیمخب برگردیم سر طراحی این flow
ابتدا یک نام بهش میدیم
name: deployment applicationدر مرحله بعدی مشخص میکنیم چه وقتی این flow کار کنه؟؟؟
یادتون هست در تعریف سناریو گفتیم که برای سرور دیپلوی بیام بصورت دستیش کنیم؟؟؟حالا باید مشخص کنیم که این flow در کدوم سرور بوسیله کدوم رانر اجرا بشه(پسورد sudo رو هم بزاریم براش)
درسته پس این مقدار باید بشکل زیر باشه
on:
Workflow_dispatch
env:
TARGET_SERVER: server-deployment
SUDO_PASSWORD: ${{ secrets.SUDO_PASSWORD }}
در جاب اول ایمیج رو pull میکنیم
pull-image:
runs-on: self-hosted
steps:
- name: pull image
env:
USERNAME_HUB: "behzad-azadi2693"
PASSWORD_HUB: ${{ secrets.TOKEN }}
run: |
echo $SUDO_PASSWORD | sudo -Sv
sudo docker login -u $USERNAME -p $DOCKER_PASSWORD
sudo docker push $USERNAME/conda-test:v1
خب همه چی مشخص هست درسته؟؟؟
در جاب دوم لازم هست ایمیج رو اجرا کنید تا اینجای کار اومدیم پس یاد گرفتین خودتون این جاب رو چجوری بنویسید
چندتا نکته:
شما میتونید روی یک سرور کار کنید
در قسمت runs-on اگر مقدار ubuntu-latest رو قرار بدید روی رانرهای خود گیتهاب کار خواهد کرد
اگرهم تغییر ندید و به هر دلیلی رانرتون ارور بده گیتهاب بازم میبره روی رانر خودش اما بدلیل دستور sudo و پسورد بهتون خطا خواهد داد
ایا میشه از این ساده تر هم نوشت؟؟بله action های آماده وجود داره که برید بخونید راجبشون
در قسمت on هم میتونید علاوه push و dispatch حتی cronjob ,pull request هم تنظیم کنید
پروژه و کدها رو میتونید در گیتهاب ببینید
https://github.com/CodeCrafters-ir/test-actions.git
خب سوال:
اگه بخوایم همین سناریو رو در گیتلب هم یاد بگیریم چی؟؟؟
اموزش بچههای دواپس هابیز رو در یوتیوب ببینید
https://youtube.com/playlist?list=PLYrn63eEqAzannVocQrddqsBK-C17e-Sm&si=F_C_OiGw6i3l4aoN
#git
#actions
@code_crafters
👍4👏1
در ادامه مباحث مربوط به github action
تست پروژه و کدها
ما قبل از اینکه بخواهیم پروژه رو pull و داکرایز کنیم نیاز هست ابتدا تستهایی که توسط تیم توسعه صورت گرفته رو انجام دهیم و در صورت پایان بدون خطا اقدام به انجام جابهای دیگر کنیم
پس ما یک جاب test مینویسیم و دیگر جابها رو الزام میکنیم بعد از آن اجرا شوند
جاب test ما بشکل زیر خواهد بود
یک نکته جالب میبینیم که از مقدار :container در جاب استفاده شده است
در واقع در اینجا به مطرح کردیم که یک کانتینر از یک ایمیج برام بالا بیار دستورات زیر رو داخلش اجرا کن برام ،اتفاق جالبی که میافته این هست پس از اتمام دستورات کانتینر رو برامون پایین میاره
یک کانتینر از ایمیج python:slim-bullsey بالا بیار جنگورو نصب کن ،کدهارو تست کن و کانتینر رو برام حذف کن
دیگر لازم نیست برای قسمت تست هم یک کانتینر نگهداریم
حالا کافیست داخل دیگر جابها با استفاده از :needs همه جاب ها رو موظف کنیم که در انتظار بمونن تا تست با موفقیت به اتمام برسد
#git
#actions
@code_crafters
تست پروژه و کدها
ما قبل از اینکه بخواهیم پروژه رو pull و داکرایز کنیم نیاز هست ابتدا تستهایی که توسط تیم توسعه صورت گرفته رو انجام دهیم و در صورت پایان بدون خطا اقدام به انجام جابهای دیگر کنیم
پس ما یک جاب test مینویسیم و دیگر جابها رو الزام میکنیم بعد از آن اجرا شوند
در فریمورک جنگو میدانیم که برای تست
نیاز به نصب جنگو
و سپس اجرای دستور
python manage.py test
می باشیم
جاب test ما بشکل زیر خواهد بود
test:
runs-on: self-hosted
container:
image: python:slim-bullseye
steps:
- name: Run Django tests
run: |
pip install django
python manage.py test
یک نکته جالب میبینیم که از مقدار :container در جاب استفاده شده است
در واقع در اینجا به مطرح کردیم که یک کانتینر از یک ایمیج برام بالا بیار دستورات زیر رو داخلش اجرا کن برام ،اتفاق جالبی که میافته این هست پس از اتمام دستورات کانتینر رو برامون پایین میاره
یک کانتینر از ایمیج python:slim-bullsey بالا بیار جنگورو نصب کن ،کدهارو تست کن و کانتینر رو برام حذف کن
دیگر لازم نیست برای قسمت تست هم یک کانتینر نگهداریم
حالا کافیست داخل دیگر جابها با استفاده از :needs همه جاب ها رو موظف کنیم که در انتظار بمونن تا تست با موفقیت به اتمام برسد
#git
#actions
@code_crafters
👍3❤1
بچهها نظرتون چیه یک وبسایت داشته باشیم برای کانال و در اون شروع کنیم گذاشتن مطالب آموزشی؟؟؟
دوستانی که میخواهند با من همکاری کنن لطفا بهم پیام بدن
دوستانی که میخواهند با من همکاری کنن لطفا بهم پیام بدن
👍15❤1
Configuration management???
یا به اختصار cm
ما تا اینجا مدام کد زدیم سرویس بالا آورده و در توسعه نرم افزار عمل کردیم این رو در دنیای IT با عنوان saas میشناسن و در چندپست قبل نیز راجب ci cd حرف زدیم که این ابزار رو اوردیم و در این بخش مورد استفاده قرار دادیم
اما اون چیزی که تا اینجای کار فراموش کردیم بحث زیرساختی هست که بهش IaC میگن بسیار مورد اهمیت و جایگاه ویژه داره در این خصوص نیز ما دو موضوع رو داریم یکی خود زیرساخت و دیگری هم مدیریت پیکربندی هست ،دو ابزار بسیار معروف و کاربردی داریم
Terraform
Ansible
ترافرم رو برای پیکربندی زیر ساخت
و انسیبل رو برای مدیریت پیکربندی CM استفاده میکنند
در این سلسله اموزشی سعی داریم که راجب انسیبل بگیم و یکم باهاش کار کنیم
راجب انسیبل بیشتر بدونیم
سناریو به چه صورت خواهد بود ما دوتا سرور داریم توسعه و استقرار و میخوایم هر کدوم رو مختص به کاربردش پیکربندی کنیم
ابتدا انسیبل رو روی سیستم خود نصب کنید Link
در یک مسیر دلخواه خودتون یک دایرکتوری با اسم base-ansible بسازید و داخل اون برید (این اسم الزامی و ما فقط جهت پیش بردن این دسته پیامها میسازیم)
بیاید همین ابتدای کار یک چیز باحال رو تست کنیم
#ansible
#CM
@code_crafters
یا به اختصار cm
ما تا اینجا مدام کد زدیم سرویس بالا آورده و در توسعه نرم افزار عمل کردیم این رو در دنیای IT با عنوان saas میشناسن و در چندپست قبل نیز راجب ci cd حرف زدیم که این ابزار رو اوردیم و در این بخش مورد استفاده قرار دادیم
اما اون چیزی که تا اینجای کار فراموش کردیم بحث زیرساختی هست که بهش IaC میگن بسیار مورد اهمیت و جایگاه ویژه داره در این خصوص نیز ما دو موضوع رو داریم یکی خود زیرساخت و دیگری هم مدیریت پیکربندی هست ،دو ابزار بسیار معروف و کاربردی داریم
Terraform
Ansible
ترافرم رو برای پیکربندی زیر ساخت
و انسیبل رو برای مدیریت پیکربندی CM استفاده میکنند
در این سلسله اموزشی سعی داریم که راجب انسیبل بگیم و یکم باهاش کار کنیم
راجب انسیبل بیشتر بدونیم
انسیبل (Ansible) یک ابزار متنباز و قدرتمند برای مدیریت و پیکربندی سیستمها، استقرار برنامهها، اتوماسیون وظایف و هماهنگی آنهاست. به عبارت دیگر، انسیبل یک ابزار Remote Administration بسیار قوی با امکانات بسیار کارآمد است که از پروتکل SSH برای برقراری ارتباط و مدیریت سیستمها و دستگاهها استفاده میکند.
برخی از مزایای استفاده از انسیبل:
سادگی: انسیبل از زبان یامال (YAML) برای نوشتن Playbookها استفاده میکند که یادگیری آن آسان است.
قدرت: انسیبل میتواند وظایف پیچیدهای را خودکار کند و برای مدیریت زیرساختهای بزرگ و پیچیده مناسب است.
انعطافپذیری: انسیبل میتواند برای مدیریت انواع مختلف سیستمها، از جمله سرورها، روترها، سوئیچها و دستگاههای ذخیرهسازی استفاده شود.
مقیاسپذیری: انسیبل میتواند برای مدیریت تعداد زیادی از سیستمها به طور همزمان استفاده شود.
رایگان: انسیبل یک ابزار متنباز و رایگان است.
برخی از کاربردهای انسیبل:
مدیریت پیکربندی: انسیبل میتواند برای پیکربندی سیستمها، نصب نرمافزار، بهروزرسانی سیستمعامل و تنظیمات امنیتی استفاده شود.
استقرار برنامه: انسیبل میتواند برای استقرار برنامهها به طور خودکار در چندین سیستم استفاده شود.
اتوماسیون وظایف: انسیبل میتواند برای خودکارسازی وظایف روزانه، مانند پشتیبانگیری، نظارت و گزارشدهی استفاده شود.
هماهنگی: انسیبل میتواند برای هماهنگی وظایف بین چندین سیستم استفاده شود.
اگر به دنبال یک ابزار قدرتمند و کارآمد برای مدیریت و اتوماسیون وظایف IT خود هستید، انسیبل یک گزینه عالی است
سناریو به چه صورت خواهد بود ما دوتا سرور داریم توسعه و استقرار و میخوایم هر کدوم رو مختص به کاربردش پیکربندی کنیم
ابتدا انسیبل رو روی سیستم خود نصب کنید Link
در یک مسیر دلخواه خودتون یک دایرکتوری با اسم base-ansible بسازید و داخل اون برید (این اسم الزامی و ما فقط جهت پیش بردن این دسته پیامها میسازیم)
بیاید همین ابتدای کار یک چیز باحال رو تست کنیم
بعد از نصب انسیبل
وارد دایرکتوری base-ansible بشید
یک فایل با اسم info.yml بسازید
این متن رو بصورت دقیق داخل ان بنویسید و ذخیره کنید
- hosts: localhost
tasks:
- name: FACTS
debug:
msg: "{{ ansible_facts }}"
در دایرکتوری خط فرمان رو باز کنید و دستور زیر رو بزنید
ansible-playbook info.yml
در خروجی این دستور در خروجی این دستور مهمترین اطلاعات مربوط به سیستم خودتون رو میبینید درسته؟؟؟
حالا کافیه همین رو تنظیم کنیم جهت اجرا روی سرور خودمون
عجله نکنید ذره ذره پیش میریم و یاد میگیریم
#ansible
#CM
@code_crafters
Digitalocean
How To Install and Configure Ansible on Ubuntu 20.04 | DigitalOcean
Configuration management systems are designed to streamline the process of controlling large numbers of servers, for administrators and operations teams. The…
❤4
روابط در پایگاه داده ها
انواع روابط
به طور کلی، سه نوع رابطه در پایگاه داده ها داریم:
رابطه یک به یک: مانند رابطه هر فرد با شناسنامه اش. هر فرد یک شناسنامه دارد و هر شناسنامه فقط برای یک نفر است.
رابطه یک به چند: مانند رابطه مادر و فرزندانش. هر فرزند فقط یک مادر دارد، ولی هر مادر می تواند چند فرزند داشته باشد.
رابطه چند به چند: مانند رابطه دانش آموز و درس. هر دانش آموز می تواند چند درس را انتخاب کند و هر درس می تواند توسط چند دانش آموز انتخاب شود.
الان مسئله اصلی مطرح میشود
چه فرقی بین رابطه Foreign Key (کلید خارجی ) با رابطه یک به چند وجود دارد ؟؟؟
بهتر این طوری شروع کنیم :
هر رابطه کلید خارجی یک رابطه یک به چند است، اما هر رابطه یک به چند یک رابطه کلید خارجی نیست. =)
کمی در ابتدا گیچ کننده است .
ما هم باید از دید پایگاه داده ها این مورد ببینیم
آیا وقتی شما رابطه یک به چند می زنید بر روی جدول هایی شما چیزی اضافه میشود؟؟
شاید ندانید ولی در حقیقت خیر !!
شاید شما بگید ما داریم اینجا زحمت میکشم😂 پس این رابطه یک به چند ما چی شده است باید به ارزتان برسانم .
وجود دارند ولی بر روی جدول ها چیزی اضافه نمی شود و در بیرون جدول ها قرار میگیرند.
یک چیزی مثل قانون هستند به برنامه خود دستور میدهید که این جدول با این جدول به این صورت رفتار کند و کاری به ستون ها در پایگاه داده ندارید
ولی در رابطه کلید خارجی قدمی جلوتر میروید و بروی جدول یک ستون ایجاد میکند
استفاده از کلید خارجی سرعت بیشتری دارد و موجب راحت تر دسترسی به داده ها می شود و مهم ترین نکته آن این است که اجازه نمیدهد که همین طوری داده ای وارد پایگاه داده کنید و یا از آن حذف کنید.
با این حال، استفاده از کلید خارجی همیشه ضروری نیست قرار نیست با یادگیری هر چیزی از آن حتما استفاده کنید.
در برخی موارد، ممکن است استفاده از روشهای دیگر برای پیادهسازی رابطه یک به چند مناسبتر باشد.
به عنوان مثال، اگر تعداد رکوردها در جدول فرزند کم باشد شما با استفاده از کلید خارجی موجب افزایش حجم جدول والد با اضافه شدن یک ستون دیگر میشوید
مشکل در آپدیت اطلاعات فرزند و عدم انعطاف پذیری (نمی توان همین طوری اطلاعات را وارد یا حذف کنید)
خلاصه همین طوری ازش استفاده نکنید و اگه استفاده کردید فرق آن را بدانید .
#Database
@Code_Crafters
انواع روابط
به طور کلی، سه نوع رابطه در پایگاه داده ها داریم:
رابطه یک به یک: مانند رابطه هر فرد با شناسنامه اش. هر فرد یک شناسنامه دارد و هر شناسنامه فقط برای یک نفر است.
رابطه یک به چند: مانند رابطه مادر و فرزندانش. هر فرزند فقط یک مادر دارد، ولی هر مادر می تواند چند فرزند داشته باشد.
رابطه چند به چند: مانند رابطه دانش آموز و درس. هر دانش آموز می تواند چند درس را انتخاب کند و هر درس می تواند توسط چند دانش آموز انتخاب شود.
الان مسئله اصلی مطرح میشود
چه فرقی بین رابطه Foreign Key (کلید خارجی ) با رابطه یک به چند وجود دارد ؟؟؟
بهتر این طوری شروع کنیم :
هر رابطه کلید خارجی یک رابطه یک به چند است، اما هر رابطه یک به چند یک رابطه کلید خارجی نیست. =)
کمی در ابتدا گیچ کننده است .
چشمها را بايد شست
جور ديگر بايد ديد
ما هم باید از دید پایگاه داده ها این مورد ببینیم
آیا وقتی شما رابطه یک به چند می زنید بر روی جدول هایی شما چیزی اضافه میشود؟؟
شاید ندانید ولی در حقیقت خیر !!
شاید شما بگید ما داریم اینجا زحمت میکشم
وجود دارند ولی بر روی جدول ها چیزی اضافه نمی شود و در بیرون جدول ها قرار میگیرند.
یک چیزی مثل قانون هستند به برنامه خود دستور میدهید که این جدول با این جدول به این صورت رفتار کند و کاری به ستون ها در پایگاه داده ندارید
ولی در رابطه کلید خارجی قدمی جلوتر میروید و بروی جدول یک ستون ایجاد میکند
رابطه یک به چند مثل یک قانون نانوشته است که به برنامه تان می گوید چطور بین دو جدول ارتباط برقرار کند. اما با استفاده از کلید خارجی، این قانون را به صورت فیزیکی در پایگاه داده تان هم ثبت می کنید.
استفاده از کلید خارجی سرعت بیشتری دارد و موجب راحت تر دسترسی به داده ها می شود و مهم ترین نکته آن این است که اجازه نمیدهد که همین طوری داده ای وارد پایگاه داده کنید و یا از آن حذف کنید.
با این حال، استفاده از کلید خارجی همیشه ضروری نیست قرار نیست با یادگیری هر چیزی از آن حتما استفاده کنید.
در برخی موارد، ممکن است استفاده از روشهای دیگر برای پیادهسازی رابطه یک به چند مناسبتر باشد.
به عنوان مثال، اگر تعداد رکوردها در جدول فرزند کم باشد شما با استفاده از کلید خارجی موجب افزایش حجم جدول والد با اضافه شدن یک ستون دیگر میشوید
مشکل در آپدیت اطلاعات فرزند و عدم انعطاف پذیری (نمی توان همین طوری اطلاعات را وارد یا حذف کنید)
خلاصه همین طوری ازش استفاده نکنید و اگه استفاده کردید فرق آن را بدانید .
#Database
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
سنیور به کسی میگن که بلده ساز خوب بزنه
اما اکسپرت کسی هست که ساز خودش رو خوب میزنه
(تلفیق موسیقی کوردی و اسپانیایی)
#fun
@code_crafters
اما اکسپرت کسی هست که ساز خودش رو خوب میزنه
(تلفیق موسیقی کوردی و اسپانیایی)
#fun
@code_crafters
❤8👍2🔥2
در پست قبلی اومدیم انسیبل رو معرفی کردیم اندکی هم راجب CM حرف زدیم یک فایل ساده ساختیم و یک بلوک yaml داخلش نوشتیم و با اجرا کردن این بلوک تمامی اطلاعات حساس رو مشاهده کردیم
یک سناریو کوچک مطرح کردیم که دوتا سرور توسعه و استقرار داریم هدف ما این هست که این سرورهارو پیکربندی کنیم و اطمینان حاصل کنیم که با یک دستور تمام موارد مورد نیاز و خواست ما بر روی سرورهامون صورت بگیره
با توجه به مطالبی که در بالا گفتیم ما نیاز داریم که سرورهامون رو دسته بندی کنیم و در گروههای تکی و چندتایی معرفی کنیم
در یک جا لازم داریم داکر روی همه سرورها نصب بشه در برخی سرورها لازم هست که فقط گیت رو نصب کنیم
inventory directory
در دایرکتوری کاری خودمون که در پست قبل ساختیم یک دایرکتوری با نام inventory ایجاد میکنیم
در داخل inventory یک فایل با نام main.yml میسازیم و کدهای زیر رو داخل اون میزاریم
ما سه گروه ایجاد کردهایم تا بتونیم سناریوی خودمون رو پیش ببریم
توضیحات
گام اول ما برای سناریوی مدنظرمون به اتمام رسید
دقت داشته باشید ما از یک ساختار ساده و منظم استفاده میکنیم ،در ساختار بزرگ و پیچیده شما برای هر گروه یک فایل yaml جداگانه خواهید دید
#ansible
#CM
@code_crafters
یک سناریو کوچک مطرح کردیم که دوتا سرور توسعه و استقرار داریم هدف ما این هست که این سرورهارو پیکربندی کنیم و اطمینان حاصل کنیم که با یک دستور تمام موارد مورد نیاز و خواست ما بر روی سرورهامون صورت بگیره
ما بر روی سرور توسعه نیاز به داکر و داکر کامپوز و گیت داریمدر سناریوی ما فقط دو سرور داریم ،در دنیای واقعی ممکن هست که چندین سرور داشته باشیم
بر روی سرور استقرار اما نیاز به گیت نداریم
با توجه به مطالبی که در بالا گفتیم ما نیاز داریم که سرورهامون رو دسته بندی کنیم و در گروههای تکی و چندتایی معرفی کنیم
در یک جا لازم داریم داکر روی همه سرورها نصب بشه در برخی سرورها لازم هست که فقط گیت رو نصب کنیم
دغدغه ما در این سطحپس ما باید امکان این رو داشته باشیم که سرورهامون رو در حین حال تفکیک کنیم و اینکه در کنار هم نیز داشته باشیم پس بیاید با اولین مفهوم در انسیبل آشنا بشیم
ما نیاز داریم دو سرور توسعه و استقرار رو در یک جاهایی جدا از هم داشته باشیم و پیکربندی هرکدوم رو جداگانه بزنیم
در جای دیگه هردوی این سرور رو یکجا داشته باشیم تا یک عملیات یکسان روی هردو صورت بگیره
inventory directory
دایرکتوری inventory در Ansible راهی قدرتمند برای سازماندهی و مدیریت دادههای موجودی شما ارائه میدهد. این به شما امکان میدهد چندین منبع موجودی را در یک مکان واحد ادغام کنید و مقیاسپذیری و قابلیت نگهداری را بهبود ببخشید.در خصوص چالشی که بالاتر مطرح کردیم انسیبل از طریق inventory این امکان رو بهمون میده که سرورهای خودمون رو بتونیم دسته بندی و گروه بندی و معرفی کنیم
نکته:ما در انسیبل از ساختار yaml نویسی استفاده میکنیم
در دایرکتوری کاری خودمون که در پست قبل ساختیم یک دایرکتوری با نام inventory ایجاد میکنیم
در داخل inventory یک فایل با نام main.yml میسازیم و کدهای زیر رو داخل اون میزاریم
all:
hosts:
develope:
ansible_host: server_ip
deployment:
ansible_host: server_ip
develope:
hosts:
develope_server:
ansible_host: server_ip
deployment:
hosts:
deployment_server:
ansible_host: server_ip
ما سه گروه ایجاد کردهایم تا بتونیم سناریوی خودمون رو پیش ببریم
توضیحات
گروه all
جهت نصب همه پیکربندی های یکسان و یکدست در همه میزبانها(داکر و داکرکامپوز)
گروه develop
جهت نصب و پیکربندی سرور تست و توسعه
گروه deployment
جهت نصب و پیکربندی سرور استقرار
در هر گروه با بلوک hosts موجودیتهای خودمون رو در اون بخش مشخص میکنیم
یک اسم براش در نظر میگیریم
و در ansible_host آدرس اون موجودیت رو بهش میدیم
نکته
مقدار ip سرور خود را در server_ip جاساز کنید
نام گذاری و دسته بندی ها باید بگونهای باشد که معرف کامل زیر ساخت شما باشد
گام اول ما برای سناریوی مدنظرمون به اتمام رسید
دقت داشته باشید ما از یک ساختار ساده و منظم استفاده میکنیم ،در ساختار بزرگ و پیچیده شما برای هر گروه یک فایل yaml جداگانه خواهید دید
#ansible
#CM
@code_crafters
🙏2👍1
یکی از موضوعات دوست داشتنی در هوش مصنوعی ریاضیاتش هست که همه از دستش فرار میکنیم از بس که جذاب هست
یکی ازین کتابها با عنوان جبرخطی شناخته میشه که از خود ریاضیات بیشتر دوست داشتنی تره😅😅😅
یک مهندس عزیز در اینترنت سعی کرده که این مورد رو با زبان ساده آموزش بده تا شیرینیش رو ازش بگیره براتون
لینکش رو در زیر براتون میزارم
https://chistio.ir/%D8%AF%D9%88%D8%B1%D9%87-%D8%AC%D8%A8%D8%B1-%D8%AE%D8%B7%DB%8C-linear-algebra-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82/
#AI
#ML
@code_crafters
یکی ازین کتابها با عنوان جبرخطی شناخته میشه که از خود ریاضیات بیشتر دوست داشتنی تره😅😅😅
یک مهندس عزیز در اینترنت سعی کرده که این مورد رو با زبان ساده آموزش بده تا شیرینیش رو ازش بگیره براتون
لینکش رو در زیر براتون میزارم
https://chistio.ir/%D8%AF%D9%88%D8%B1%D9%87-%D8%AC%D8%A8%D8%B1-%D8%AE%D8%B7%DB%8C-linear-algebra-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82/
#AI
#ML
@code_crafters
چیستیو | علوم داده و نرم افزار
دوره ریاضیات پایه و جبر خطی (Linear Algebra) برای یادگیری ماشین | چیستیو | علوم داده و نرم افزار
برای فراگیری و تسلط بر مبانی و مفاهیمِ یادگیریِ ماشین (machine learning) و یادگیریِ عمیق (deep learning) بهتر است پیشنیازهای ریاضیِ آنها را بلد باشیم. همچنین جبرِ خطی یا همان linear algebra از جمله مباحثی است که نقش بهسزایی در فراگیریِ الگوریتمها و روشهای…
❤4👍1