یک پروژهی یادگیری عملی (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 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دو ورکفلوی GitHub Actions روی هر push به main اجرا میشوند:
test.yml— محیط پایتون را برپا میکند، وابستگیها را نصب میکند و تستهایtests/را باpytestاجرا میکند.docker-publish.yml— با استفاده از Buildx و QEMU، ایمیج را برایlinux/amd64وlinux/arm64میسازد و به Docker Hub push میکند (احراز هویت از طریق GitHub Secrets).
Deploy روی Render.com از طریق render.yaml انجام شده؛ اپ بهصورت Docker-based Web Service روی پلن رایگان (Region: Frankfurt) اجرا میشود.
فایل 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 کردن، اتوماسیون تست و انتشار، و رفع اشکال واقعی در هر مرحله.