MostafaOps
73 subscribers
1 video
3 files
10 links
Download Telegram
Channel created
Channel photo updated
ما ساعت ۱۶ میت اینتروداکشن این دوره رو با هم برگزار می‌کنیم و در مورد این که چه کارهایی می‌خوایم بکنیم و پروژه‌ای که می‌خوایم با هم جلو ببریم چیه اینجا صحبت می‌کنیم:
meet.google.com/fvd-svch-kan
4👍4
MostafaOps-Phase1.pdf
155.7 KB
فاز اول پروژه

1. Gitlab CI/CD
2. Docker
3. Docker-compose
👍5
MostafaOps
MostafaOps-Phase1.pdf
از هیچ قسمت از پروژه نترسین، کلید انجام دادنش اینه که نترسین، چندتا لینک هم گذاشتم. مثال هم کم نیست توی اینترنت!
مطمئنم از پسش برمیاید 🤓
👍1
پروژه رو بخونین، لینک‌های داخلش رو هم بخونین
تلاش‌تون رو بکنین
فردا میایم و حلش می‌کنیم و کارهایی بچه‌های گروه اختصاصی انجام دادن رو دیباگ می‌کنیم 😉
MostafaOps
MostafaOps-Phase1.pdf
دوستان عزیزی که تازه توی گیت‌لب ثبت‌نام کردن، نمی‌تونن از رانرهای رایگان گیت‌لب استفاده کنن
بهشون توصیه می‌کنم توی لوکال‌شون یه گیت‌لب رانر ستاپ کنن و از اون استفاده کنن

https://alirezarezvani.medium.com/easy-steps-to-setup-your-own-gitlab-runner-on-gitlab-or-locally-e6618212c442

این لینک رو می‌تونین بخونین برای این موضوع
👍3
خب دم همه‌ی کسایی که خارج از گروه اختصاصی و داخل گروه اختصاصی روی فاز اول پروژه وقت گذاشتن
برای خودم که تا اینجای مسیر خیلی جذاب بوده 🤓🔥

امروز ساعت ۱۶ منتظر همه‌تون هستم که بریم این قسمت رو با هم حل کنیم و کیف کنیم 🤓
توی این جلسه اول خودم فاز اول پروژه رو حل می‌کنم، و بعد اعضای گروه اختصاصی هر کدوم نشون میدن چیکار کردن و من اگه نکته‌ای باشه میگم که بهترش بکنن!

لینک جلسه:
https://meet.google.com/fvd-svch-kan
می‌بینم‌تون ❤️
👍2
امروز ساعت ۱۸ ادامه بدیم یا بذاریم فردا ساعت ۱۸
Anonymous Poll
29%
امروز ساعت ۱۸
71%
فردا ساعت ۱۸
https://gitlab.com/mostafabayat76/mostafaops

این هم ریپوزیتوری‌ایه که سعی می‌کنم همه‌ی قسمت‌های پروژه رو روش پوش بکنم و در آینده اگه دوست داشتین مورد استفاده قرار بدین
🙏63
خلاصه‌ی جلسه‌ی آنلاین اول:
در قدم اول اومدیم یه پروژه ساختیم و با استفاده از فایل .gitlab-ci.yml براش پایپ‌لاین ساختیم!
گفتیم مفاهیم اصلی و بنیادینش ایناست:
1. pipelines
که می‌تونی برای کارهای مختلفی که می‌خوای به صورت اتوماتیک انجام بشه پایپ‌لاین تعریف کنی، مثلا ساخت اپلیکیشن و دیپلوی و آپدیتش توی پروداکشن
2. stages
هر پایپ‌لاین از تعدادی استیج تشکیل شده، که به صورت پشت سر هم اجرا میشن، و نه به صورت موازی
3. jobs
هر استیج از تعدادی جاب تشکیل شده که شما می‌تونین با زبان yaml اون رو کاملاً تعیین کنید

ساده‌ترین فایل .gitab-ci.yml:
stages:
- print

print-message:
stage: print
image: reg-pub.pegah.tech/docker.io/library/ruby:2.7
script:
- echo "Let's use Gitlab CI/CD"


بعدش در مورد رانر صحبت کردیم، گفتیم رانر چیزیه که جاب‌های تعریف شده در ci/cd رو اجرا می‌کنه، و یه سرور یا یه کانتینر یا همچین چیزیه که بتونه یه سری دستورات رو اجرا کنه
‍۱. رانرها یا توسط gitlab.com راه‌اندازی شدن و در اختیار همه قرار گرفتن (که برای یوزرهای جدید بدون شماره خارجی غیرفعاله)
۲. یا توسط خودمون راه‌اندازی میشن و به gitlab.com متصل میشن

این رانرها :
1. instance runners
که می‌تونن جاب‌های همه‌ی پروژه‌ها رو اجرا کنن
2. group runners
که می‌تونن جاب‌های پروژه‌های داخل یک گروه رو اجرا کنن
3. project runners
که فقط مخصوص یک پروژه هستن
ولی نصب همه‌ی این‌ها به یک شکله و تفاوتی نمی‌کنه

ما تصمیم گرفتیم از طریق داکر رانر رو نصب کنیم، و executer اون رو هم داکر تعریف کنیم!
ابتدا از طریق
settings > CI/CD > Runners > New Runner
یه رانر می‌سازیم و authentication token رو کپی می‌کنیم
سپس با استفاده از این کامند یک کانتینر موقت می‌سازیم و رانر رو رجیستر می‌کنیم
docker run --name runner --rm -it -v /tmp/mostafaops/runner/config:/etc/gitlab-runner --entrypoint bash gitlab/gitlab-runner:v17.3.1
gitlab-runner register --url https://gitlab.com --token <token>

مهمه که بدونیم باید /etc/gitlab-runner رو به یه دایرکتوری مطمئن mount کنیم که پرسیست باشه و بتونیم بعدا ازش استفاده کنیم
سپس با استفاده از docker-compose رانر رو اجرا می‌کنیم:
services:
gitlab-runner:
image: reg-pub.pegah.tech/docker.io/gitlab/gitlab-runner:v17.3.1
container_name: runner
restart: always
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock

نکته‌ی مهم mount کردن docker.sock به کانتینره که به رانر قدرت ایجاد کانتینر به ازای هر جاب رو میده (با توجه به این که ما executer رو داکر گذاشتیم) و سپس توی پروژه‌مون می‌تونیم ببینیم که رانرمون سبز شده و قابل استفاده‌ست
12👍3
فردا ساعت ۱۸ می‌بینم‌تون ❤️
شاید فاز بعدی رو هم برای کسایی که پروژه رو انجام دادن زودتر توی چنل گذاشتم
👍6👌2🙏1
از فاز بعدی می‌خوایم وارد کوبرنتیز بشیم که قسمت جذاب ماجراست 🤓
کسانی که فاز اول رو بدون مشکل انجام دادن و سوالی ندارن می‌تونن با خوندن این دوتا لینک شروع کنن:
https://medium.com/@mfsilv/kubernetes-a-gentle-introduction-9d23de7f00e0
https://medium.com/@mfsilv/kubernetes-for-dummies-the-cluster-7cf6a7b5532
🔥42
دوستان عذر می‌خوام
من از دیشب یه مشکلی برام پیش اومد و امروز نمی‌تونم در خدمت‌تون باشم
ایشالا فردا هم خلاصه‌ی جلسه‌ی دیروز و هم توضیحات مربوط به فاز بعدی پروژه رو می‌ذارم براتون
ممنونم بابت بردباری‌تون 🙃❤️
🙏105
سلام و وقت بخیر خدمت دوستان عزیزم که با ما همراه بودید
اول از همه پوزش بابت این دو روز که من خیلی درگیر بودم، و جدای از اون، دو بار دیتاسنترمون با خاموشی کامل مواجه شد و فشار کاری و شب‌بیداری نذاشت که این دوره رو اونجوری که دلم می خواست ادامه بدم 🤓
ولی امروز اومدم با خلاصه‌ی جلسه دوم و انتشار فاز دوم پروژه

با ما همراه باشید 🤓❤️
😍75👏1👌1
خلاصه‌ی جلسه‌ی آنلاین دوم:
خب توی قسمت ما اومدیم و یک اپلیکیشن ساده رو به شکل‌های مختلف اجرا کردیم! و توی این قدم‌ها عملاً می‌خواستیم ببینیم داکر و داکرکامپوز چه نقشی رو توی application deployment بازی می‌کنن. به صورت کلی فلوی این جلسه به این صورت بود:
1. run application on My laptop (we call it locally) => run application on a gitlab ci job (raw process, without contianer)
2. build docker image and run application on docker container locally => build and run application on gitlab ci job (container, using docker run command)
3. use docker compose to build and run application locally => use docker compose to build and run application locally (container, using docker compose)

۱. اپلیکیشن ساده‌ی ما با زبان پایتون و با استفاده از فریمورک fastapi بود:
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
return {"message": "Let's call the API"}

و با استفاده از کامند زیر میشه این وب‌سرور رو اجرا کرد:
# python3.10 -m venv .venv
pip install --upgrade pip
pip install fastapi uvicorn
uvicorn app:app --host 0.0.0.0 --port 8000

و خب اگه دوست دارین می‌تونین از virtual environment پایتون استفاده کنین (اگه بلد نیستین سرچ کنین) (خط کامنت شده‌ی اول برای این موضوعه)
با این کامند میشه از عملکرد درست اپلیکیشن اطمینان حاصل کرد
curl localhost:8000

۲. در قسمت بعدی می‌ریم سراغ این که با استفاده از رانری که در جلسه‌ی قبل ستاپ کردیم، یه جاب بنویسیم که اپلیکیشن توش اجرا بشه:
stages:
- run

run-app:
stage: run
image: python:3.10
before_script:
- pip install --upgrade pip
- pip install fastapi uvicorn
script:
- uvicorn app:app --host 0.0.0.0 --port 8000 &
- sleep 3
- curl localhost:8000 -s

در توضیح قسمت‌های مختلف گفتیم که
- مشخص کردن stage مهمه که نشون میده جاب شما متعلق به چه stageایه و توی چه ترتیبی قراره اجرا بشه
- وقتی image رو مشخص کنی، تعیین می‌کنی که کانتینری که جاب شما ایجاد می‌کنه با چه ایمیجی ساخته بشه، می‌تونین از ایمیج‌های پابلیک (مثل داکرهاب) استفاده کنین. (می‌تونین تحقیق کنین که چجوری میشه از ایمیج‌های پرایوت استفاده کرد. یعنی ایمیج‌هایی که روی رجیستری‌هایی هستند که نیاز به authentication دارند) ما در این جاب از ایمیج python3.10 استفاده می‌کنیم.
- با استفاده از before-scripts می‌تونین کامندهایی که قبل از اجرای کامندهای اصلی‌تون باید اجرا بشه رو مشخص می‌کنین، که توی این قسمت پکیج‌های fastapi و uvicorn رو نصب می‌کنیم
- در قسمت scripts میایم اپلیکیشن رو اجرا و با کارکتر & به بکگراند منتقلش می‌کنیم، سپس چندثانیه صبر می‌کنیم تا سرور بالا بیاد و بعد بهش ریکوئست می‌زنیم.
* مشکلی که توی جلسه خوردیم و حلش کردیم این بود که بعد از اجرای اپلیکیشن صبر نمی‌کردیم که سرور بالا بیاد، با گذاشتن sleep تونستیم خروجی مناسب رو بگیریم.

۳. گفتیم برای این که اپلیکیشن رو به صورت کانتینری اجرا کنیم باید اول یک داکر ایمیج براش درست کنیم، و برای ساختن داکر ایمیج باید داکرفایل داشته باشیم، پس فرآیندش این شکلیه:
Writing Dockerfile => Build Docker image from Dockerfile => Run a container based on Docker image => expose port or mount a directory (optional)
FROM python:3.10

WORKDIR /code
RUN pip install fastapi uvicorn
COPY app.py /code/app.py
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

اول از همه گفتیم که docker imageها به صورت لایه لایه ساخته میشن، و تعیین می‌کنن که container ساخته شده بر اساس این image چجوری خواهد بود. هر خط از dockerfile یه لایه به داکر ایمیج اضافه می‌کنه.

ادامه در پیام بعد 👇
👌4
ادامه‌ی خلاصه‌ی جلسه‌ی آنلاین دوم:
در توضیح قسمت‌های مختلف گفتیم که
- با FROM مشخص می‌کنیم که base image ما چی باشه، در واقع از یک ایمیج از قبل ساخته شده استفاده می‌کنیم تا بهش چیزهای اختصاصی خودمون رو اضافه کنیم و یه ایمیج جدید داشته باشیم. (می‌تونین در مورد FROM scratch تحقیق کنین 😉)
- با WORKDIR مشخص می‌کنین current directory یا دایرکتوری‌ای که موقع بیلد و موقع اجرا (build time and run time) در حال حاضر روش هستین چیه.
- با RUN می‌تونین موقع بیلد کامند ران کنین، در واقع در ایمیج نهایی و کانتینرهایی که از روش ساخته خواهد شد مطمئنین که این کامندها زده شده. مثلا در مثال ما مطمئنیم که پکیج‌های fastapi و uvicorn نصب شدند.
- با COPY می‌تونین فایل‌هایی رو از فایل‌سیستم جایی که داره ایمیج‌تون بیلد میشه به داکر ایمیج‌تون منتقل کنید. و مطمئن باشید که در کانتینرهایی که از این ایمیج ساخته خواهد شد اون فایل‌ها وجود خواهند داشت
- با CMD‍ می‌تونین تعیین کنین که در زمان اجرای کانتینر ساخته شده بر اساس این ایمیج چه کامندی اجرا بشه، عموماً شما توی این کامند اپلیکیشن‌تون رو اجرا می‌کنین. این کامند در زمان بیلد اجرا نخواهد شد. (می‌تونین در رابطه با ENTRYPOINT تحقیق کنین 😉)

حالا کافیه با این کامند از روی dockerfileمون یه docker image داشته باشیم:
docker build -t mostafabayat/mostafaops:v1 .

با `-t`مشخص می‌کنیم ایمیج ما چی باشه، به صورت کلی ایمیج از قسمت‌های آدرس رجیستری، ریپوزیتوری، اسم ایمیج، و تگ ایمیج تشکیل شده، مثلاَ:
docker.io/mostafabayat/mostafaops:v1

registry address: docker.io
registry repository: mostafabayat (my account in dockerhub)
docker image name: mostafaops
docker tag: v1

که عموماً اسم ایمیج مشخصاً می‌کنه اپلیکیشن چیه، و تگ ایمیج ورژن اون اپلیکیشن رو مشخص می‌کنه.
و در کامندهای docker اگه آدرس رجیستری رو تعیین نکنیم، به صورت پیش‌فرض از docker.io استفاده می‌کنه (یا دیگر آدرس‌های داکرهاب)
اگه تگ ایمیج رو مشخص نکنین به صورت پیش‌فرض از تگ latest استفاده میشه.

حالا با استفاده از کامند زیر میشه از روی داکر ایمیج ساخته شده کانتینر ساخت و اپلیکیشن رو توی یه کانتینر اجرا کرد:
docker run --name app --rm -p 8000:8000 mostafabayat/mostafaops:v1

با --name میشه برای کانتینرتون اسم تعیین کنین، با --rm مشخص می‌کنین که بعد از تموم شدن این کانتینر اثری ازش نمونه و کاملاً پاک بشه.
نکته‌ی مهم قسمت -p 8000:8000 عه که با این قسمت مشخص می‌کنین که چه پورتی از کامپیوتر یا سرورتون (که بهش میگیم host) به چه پورتی از کانتینر متصل بشه! با هم صحبت کردیم که یه کانتینر به لحاظ نتورکی و به لحاظ فایل سیستم از هاست ایزوله‌ست. و اگه این قسمت رو نذارین از کروم‌تون مثلا نمی‌تونین بهش دسترسی داشته باشین.
و سپس ایمیجی که می‌خواین ازش استفاده کنین رو تعیین می‌کنین.
دقت کنید که همه‌ی این آپشن‌های مربوط به کامند docker run رو باید قبل از ایمیج بذارین!!

(می‌تونین در مورد override کردن CMD موقع اجرا تحقیق کنین 😉) این تحقیق بشدت توصیه میشه!!!!!
👌4