Skip to content

About

devops sho

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

🚀 DevOps Journey

یک پروژه‌ی یادگیری عملی (hands-on) برای آموزش گام‌به‌گام مفاهیم DevOps — از یک اپ ساده‌ی Flask تا Containerization، CI/CD با GitHub Actions، Publish روی Docker Hub و Deploy روی Render.

خود پروژه از نظر محتوایی چیز خاصی نیست؛ یک صفحه‌ی ساده که تعداد تسک‌ها و زیرتسک‌های مسیر یادگیری را نشان می‌دهد. ارزش واقعی پروژه در فرآیند راه‌اندازی‌شه، نه در اپلیکیشن. هدف این است که با ساختن همین اپ کوچک، چالش‌های واقعی DevOps (venv، Docker، CI، Secrets، Deploy) را از نزدیک تجربه و مستند کنیم.

🔗 دمو زنده: https://devops-journey-b34p.onrender.com/ (روی پلن Free ران می‌شود؛ بعد از مدتی بی‌فعالیتی sleep می‌کند و اولین ریکوئست ممکنه چند ثانیه طول بکشه)


📌 این پروژه چیست؟

یک اپلیکیشن مینیمال Flask که:

  • یک صفحه HTML (راست‌به‌چپ / فارسی) با لیست تسک‌ها و زیرتسک‌های مسیر DevOps نمایش می‌دهد.
  • به‌عنوان بستری استفاده می‌شود برای تمرین قدم‌به‌قدم مفاهیم زیر:
مرحله چیزی که یاد گرفته/تمرین شده
1. محیط توسعه Python virtual environment، مدیریت وابستگی‌ها
2. کنترل نسخه Git / GitHub، .gitignore
3. اپلیکیشن یک وب‌اپ ساده با Flask
4. Containerization نوشتن Dockerfile، build/run/cleanup کانتینر
5. CI تست خودکار با GitHub Actions
6. CD Build و Push خودکار ایمیج به Docker Hub (multi-arch: amd64 + arm64)
7. Deploy استقرار روی Render.com از طریق render.yaml

🗂 ساختار پروژه

devops-journey/
├── app.py                          # اپلیکیشن Flask
├── templates/
│   └── index.html                  # صفحه‌ی اصلی (فارسی/RTL)
├── tests/
│   └── test_app.py                 # تست‌های واحد ساده (pytest)
├── dockerfile                      # تعریف ایمیج Docker (حروف کوچک!)
├── requirements.txt                # وابستگی‌های پایتون
├── render.yaml                     # تنظیمات Deploy روی Render
├── .github/
│   └── workflows/
│       ├── test.yml                # CI: اجرای تست‌ها روی هر push/PR
│       └── docker-publish.yml      # CD: build و push ایمیج به Docker Hub
└── SESSION_LOG.md                  # لاگ کامل و صادقانه‌ی خطاها و راه‌حل‌ها

▶️ اجرا به‌صورت محلی

# ساخت و فعال‌سازی محیط مجازی
python3 -m venv venv
source venv/bin/activate   # ویندوز: venv\Scripts\activate

# نصب وابستگی‌ها
pip install -r requirements.txt

# اجرای اپ
python3 app.py

اپ روی http://127.0.0.1:5005 بالا می‌آید.


🐳 اجرا با Docker

# ساخت ایمیج
docker build -t devops-journey .

# اجرا
docker run -d -p 5005:5005 --name devops-container devops-journey

سپس روی http://localhost:5005 قابل مشاهده است.

ایمیج آماده هم روی Docker Hub موجود است (به‌صورت خودکار توسط CI/CD ساخته و منتشر می‌شود، multi-arch برای amd64 و arm64):

docker pull mostafahass/devops-journey:latest

🔄 CI/CD

دو ورک‌فلوی GitHub Actions روی هر push به main اجرا می‌شوند:

  • test.yml — محیط پایتون را برپا می‌کند، وابستگی‌ها را نصب می‌کند و تست‌های tests/ را با pytest اجرا می‌کند.
  • docker-publish.yml — با استفاده از Buildx و QEMU، ایمیج را برای linux/amd64 و linux/arm64 می‌سازد و به Docker Hub push می‌کند (احراز هویت از طریق GitHub Secrets).

☁️ Deploy

Deploy روی Render.com از طریق render.yaml انجام شده؛ اپ به‌صورت Docker-based Web Service روی پلن رایگان (Region: Frankfurt) اجرا می‌شود.


📝 چرا SESSION_LOG.md مهم است

فایل SESSION_LOG.md روایتِ واقعی و بدون سانسور هر خطایی است که در طول ساخت این پروژه پیش آمده: از خراب‌شدن venv روی macOS به‌خاطر ناسازگاری libexpat، تا اشتباه تایپی در mapping پورت داکر، تا دیباگ‌کردن یک secret اشتباه در GitHub Actions. هدف این فایل مستندسازی روش عیب‌یابی است، نه فقط نتیجه‌ی نهایی — چون بخش اصلی یادگیری DevOps دقیقاً همینجاست: با خطاها روبه‌رو شدن و ریشه‌یابی سیستماتیک آن‌ها.

خلاصه‌ای از خطاهای واقعی مواجه‌شده:

# خطا علت راه‌حل
1 شکست python3 -m venv ناسازگاری pyexpat/libexpat روی macOS استفاده از uv venv
2 Address already in use روی پورت 5005 پروسه‌ی قدیمی هنوز پورت را نگه داشته بود lsof + kill
3 TemplateNotFound: index.html نام پوشه template به‌جای templates تغییر نام پوشه
4 تایپوی mapping پورت داکر (500 به‌جای 5005) اشتباه تایپی مستندسازی و اصلاح در اجرای بعدی
5 تعارض در docker rmi کانتینرهای متوقف‌شده هنوز به ایمیج ارجاع داشتند docker rm روی همه‌ی کانتینرهای بازمانده
6 شکست Login به Docker Hub در CI مقدار نامعتبر Secret ساخت توکن جدید + اصلاح مقدار Secret
7 no matching manifest for linux/arm64 ایمیج فقط برای amd64 ساخته شده بود افزودن build چندمعماری با QEMU

جزئیات کامل هر مورد در SESSION_LOG.md موجود است.


🎯 هدف پروژه

این ریپازیتوری قرار نیست یک محصول کامل باشد؛ یک دفترچه‌ی یادگیری زنده است برای تمرین DevOps از صفر: نوشتن کد، containerize کردن، اتوماسیون تست و انتشار، و رفع اشکال واقعی در هر مرحله.

About

devops sho

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages