<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آرش رستمی</title>
        <link>https://virgool.io/feed/@codewitharash</link>
        <description>Passionate software developer building complex systems and efficient databases. Led projects end-to-end, write clean scalable code, solve real problems, mentor juniors, and co-found tech ventures.</description>
        <language>fa</language>
        <pubDate>2026-04-15 08:08:30</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/4101048/avatar/3U5Ffk.png?height=120&amp;width=120</url>
            <title>آرش رستمی</title>
            <link>https://virgool.io/@codewitharash</link>
        </image>

                    <item>
                <title>اگه سیستم‌ت بزرگ شده، وقتشه CQRS رو بشناسی</title>
                <link>https://virgool.io/@codewitharash/%D8%A7%DA%AF%D9%87-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%AA-%D8%A8%D8%B2%D8%B1%DA%AF-%D8%B4%D8%AF%D9%87-%D9%88%D9%82%D8%AA%D8%B4%D9%87-cqrs-%D8%B1%D9%88-%D8%A8%D8%B4%D9%86%D8%A7%D8%B3%DB%8C-a0tulphh2tot</link>
                <description>CQRS Patternمن چرا باید CQRS رو بلد باشم؟!یه زمانی یه «مدل واحد» برای نوشتن و خوندن دیتا کافی بود…ولی الان دیگه واقعاً نه 😄وقتی سیستم بزرگ می‌شه، همزمانی زیاد می‌شه، و نیاز به سرعتِ خوندن و گزارش‌گیری میاد وسط، اون مدل واحد کم‌کم کند و پیچیده می‌شه. (و تازه دردِ مقیاس‌پذیری هم اضافه می‌شه.)پس حداقل باید CQRS رو بفهمیم.CQRS یعنی چی، خیلی ساده؟CQRS مخففِ Command Query Responsibility Segregation ـه.یعنی:Command (فرمان) = هر چیزی که «وضعیت رو تغییر می‌ده»Query (پرس‌وجو) = هر چیزی که «فقط می‌خونه و نمایش می‌ده»ایده‌ی اصلی اینه که مدلی که باهاش می‌نویسی، لزوماً همون مدلی نیست که باهاش می‌خونی. این جدا کردن، تو بعضی سیستم‌ها خیلی ارزش داره…ولی حواست باشه: برای خیلی از پروژه‌های کوچیک، CQRS می‌تونه «پیچیدگی اضافه» بیاره. (martinfowler.com)چرا اصلاً این جدا کردن به درد می‌خوره؟چون می‌تونی هر سمت رو جداگانه بهینه کنی:سمت نوشتن: قوانین کسب‌وکار، اعتبارسنجی، همزمانی، جلوگیری از خرابکاریسمت خوندن: سرعت، سرچ، گزارش، مدل ساده برای UIمایکروسافت هم دقیقاً همین رو می‌گه: با جدا کردن مدلِ خواندن/نوشتن، می‌تونی کارایی و مقیاس‌پذیری رو بهتر کنی. یه نکته خیلی مهم: «همون لحظه نمی‌بینی»توی خیلی از پیاده‌سازی‌های CQRS، نوشتن که انجام شد، مدلِ خواندن با کمی تأخیر آپدیت می‌شه.یعنی ممکنه کاربر «ثبت کرد»، ولی «لیست» یک لحظه بعد آپدیت شه. این طبیعی‌ـه… ولی باید تو طراحی UI و تجربه کاربر حواست باشه.حالا Axon این وسط چیه؟Axon Framework یه فریمورک جاوا/اسپرینگ برای ساخت سیستم‌های رویدادمحور (event-driven) با محوریتِ DDD + CQRS + Event Sourcing ـه. (GitHub)به زبان خودمونی:Axon خیلی از «سیم‌کشی‌های تکراری» رو برات انجام می‌ده تا تو روی مدلِ دامنه و قوانین تمرکز کنی.چیزهایی که معمولاً تو Axon زیاد می‌بینی:Aggregate (هسته‌ی دامنه برای نوشتن)Command Handler (جایی که فرمان رو می‌گیره)Event (خروجیِ تغییر)Event Sourcing Handler (بازسازی وضعیت با رویدادها)Projection / Read Model (مدلِ خواندن)Axon وقتی Event Sourcing استفاده می‌کنی، وضعیتِ Aggregate رو با ریپلی کردن رویدادها بازسازی می‌کنه. نمونه‌ی خیلی ساده: «ثبت سفارش» و «دیدن سفارش‌ها»سناریو:کاربر سفارش ثبت می‌کنه.بعد می‌خواد لیست سفارش‌هاشو ببینه.1) سمت نوشتن: فرمان و رویدادفرمان (Command):«سفارش بساز»رویداد (Event):«سفارش ساخته شد»اینجا حداقل یک قانون داریم:سفارش بدون شناسه و آیتم‌ها معنی نداره.2) Aggregate: جایی که قوانین اصلی می‌شینناین‌جا تصمیم می‌گیریم آیا فرمان مجازه یا نه.اگر مجازه، رویداد تولید می‌کنیم.نکته‌ی Axon: خیلی وقت‌ها عمر Aggregate با یه «سازنده‌ی هندلرِ فرمان» شروع می‌شه.یک شبه‌کد خیلی خلاصه (جاوا/اسپرینگ + Axon)، فقط برای اینکه تصویر بسازه:@Aggregate
public class OrderAggregate {

  @AggregateIdentifier
  private String orderId;
  private boolean created;

  public OrderAggregate() {}

  @CommandHandler
  public OrderAggregate(CreateOrderCommand cmd) {
    // اعتبارسنجی خیلی ساده
    if (cmd.items().isEmpty()) throw new IllegalArgumentException(&quot;سفارش خالیه&quot;);
    AggregateLifecycle.apply(new OrderCreatedEvent(cmd.orderId(), cmd.items()));
  }

  @EventSourcingHandler
  public void on(OrderCreatedEvent evt) {
    this.orderId = evt.orderId();
    this.created = true;
  }
}
ایده‌ی اصلی:Command میاد.اگر معتبر بود، Event صادر می‌شه.با EventSourcingHandler وضعیت ذخیره/بازسازی می‌شه.3) سمت خواندن: Projection (مدلِ مخصوص نمایش)اینجا دیگه دنبال قوانین سخت نیستیم.دنبال یه جدول/مدل ساده‌ایم که UI راحت بخونه.پس رویداد OrderCreatedEvent رو می‌گیریم و یه رکورد تو دیتابیسِ خواندن می‌نویسیم:@Component
public class OrderProjection {

  private final OrderViewRepository repo;

  public OrderProjection(OrderViewRepository repo) {
    this.repo = repo;
  }

  @EventHandler
  public void on(OrderCreatedEvent evt) {
    repo.save(new OrderView(evt.orderId(), evt.items()));
  }

  @QueryHandler
  public List&lt;OrderView&gt; handle(GetOrdersQuery q) {
    return repo.findByUserId(q.userId());
  }
}
این‌جا دقیقاً همون جداسازی اتفاق افتاده:Aggregate = نوشتن و قوانینProjection = خواندن و نمایشو چون این دو جدا هستن، می‌تونی Read Model رو برای سرچ و سرعت، خیلی راحت‌تر بهینه کنی.کی CQRS + Axon انتخاب خوبیه؟حداقل وقتی که این‌ها رو داری:دامنه‌ی پیچیده و قانون زیادنیاز جدی به گزارش و خواندن سریعمقیاس‌پذیری و رویدادمحور بودن برات مهمه«ردپا» و تاریخچه‌ی تغییرات ارزش داره (اینجا Event Sourcing هم میاد وسط)ولی اگر پروژه‌ت کوچیکه و CRUD ساده جواب می‌ده، خیلی وقت‌ها CQRS فقط هزینه‌ی ذهنی می‌ذاره. جمع‌بندی خودمونیCQRS می‌گه:«نوشتن و خوندن رو قاطی نکن.»Axon کمک می‌کنه این جداسازی رو تمیزتر بسازی:Aggregate برای نوشتن، Projection برای خوندن، و اگر خواستی Event Sourcing برای تاریخچه و بازسازی. پ.ن: لینک پروژه گیت هاب که یک سمپل خوب برای شروع هست:https://github.com/a-rostami/CQRS-Axon-Implementation</description>
                <category>آرش رستمی</category>
                <author>آرش رستمی</author>
                <pubDate>Mon, 05 Jan 2026 08:56:27 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده Saga در Microservices: از تئوری تا پروداکشن</title>
                <link>https://virgool.io/@codewitharash/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-saga-%D8%AF%D8%B1-microservices-%D8%A7%D8%B2-%D8%AA%D8%A6%D9%88%D8%B1%DB%8C-%D8%AA%D8%A7-%D9%BE%D8%B1%D9%88%D8%AF%D8%A7%DA%A9%D8%B4%D9%86-jyr2jzdvg0lf</link>
                <description>Saga Patternبیاید رک باشیم:من چرا باید Saga رو یاد بگیرم؟!مگه همون Transaction دیتابیس کافی نیست؟یه زمانی بود…یه سرویس داشتی، یه دیتابیس، و یه BEGIN/COMMIT همه‌چی رو جمع می‌کرد.ولی الان که رفتیم سمت Microservices، هر سرویس دیتابیس خودش رو داره، هر کدوم latency و failure خودش رو داره، و “همه باهم commit شن” دیگه اونقدرها ساده نیست.پس مسئله اصلی چیه؟وقتی یک کار business چند مرحله‌ست و هر مرحله توی یک سرویس جدا انجام می‌شه، چطور مطمئن می‌شی سیستم تو وضعیت داغون گیر نمی‌کنه؟اینجاست که Saga میاد وسط.Saga دقیقاً یعنی چی؟Saga یه الگوی طراحی برای مدیریت یک فرایند چندمرحله‌ایه که هر مرحله‌اش یک Local Transaction توی یک سرویسه.هر step “تو سرویس خودش” commit می‌شه.اگر وسط کار fail شدی، به جای rollback واقعی، از Compensation استفاده می‌کنی.یعنی چی؟یعنی برگشتن به عقب با “عملیات جبرانی”.مثلاً:Inventory رزرو کردی؟جبرانش می‌شه Release کردن رزرو.Payment charge کردی؟جبرانش می‌شه Refund کردن (یا void کردن بسته به حالت‌ها).Shipment ساختی؟جبرانش می‌شه Cancel کردن shipment.این دقیقاً همون چیزیه که تو production باعث می‌شه سیستم “قابل کنترل” بمونه، نه اینکه failها تبدیل به دیتای کثیف و وضعیت‌های نصفه نیمه بشن.Saga چی رو حل می‌کنه؟ (با زبان بازار 😬)Saga بهت می‌گه:به جای اینکه دنبال strong consistency بین سرویس‌ها باشی (که یا نمی‌شه یا خیلی گرونه)، برو سمت eventual consistency ولی با قواعد و کنترل.نتیجه عملی‌ش:کمتر شدن orderهای گیر کردهکمتر شدن “پشتیبانی دستی”کمتر شدن شرایطی که باید SQL بزنی ببینی چی شدو مهم‌تر از همه: رفتار قابل پیش‌بینی در زمان failureSaga چی رو حل نمی‌کنه؟این قسمت رو خیلی‌ها نمی‌گن، ولی حداقل باید بدونی:Saga جادو نیست.Consistency رو “تغییر شکل” می‌ده، حذفش نمی‌کنه.Compensation همیشه “کامل” نیست.مثال: وقتی پول واقعاً از حساب رفت، برگشتش ممکنه چند ساعت طول بکشه. این یعنی طراحی حالت‌های میانی خیلی مهمه.برای بعضی دامنه‌ها، strong consistency واقعاً لازم می‌شه.اونجا ممکنه اصلاً معماری سرویس‌هات یا boundaryها نیاز به بازنگری داشته باشه.دو مدل اصلی Saga: Choreography vs Orchestrationاینجا دقیقاً جاییه که داستان واقعی شروع می‌شه.1) Choreography (Event-driven)هر سرویس با eventها تصمیم می‌گیره قدم بعدی چیه.مثلاً:OrderCreated → InventoryReserveRequestedInventoryReserved → PaymentChargeRequestedPaymentCharged → ShipmentCreateRequestedمزیت‌ها:ساده و سبک برای flowهای کوتاهcoupling کمتر به orchestrator مرکزیعیب‌ها:وقتی flow بزرگ می‌شه، سیستم تبدیل می‌شه به “یه عالمه event که هیچ‌کس نمی‌دونه کل داستان چیه”دیباگ و مشاهده end-to-end سخت‌تر می‌شهتغییر flow تو آینده دردناک‌تره2) Orchestration (Central coordinator)یک orchestrator (یک سرویس یا workflow engine) مسئول state و ترتیب stepهاست.مزیت‌ها:کنترل و observability بهترتغییر flow ساده‌ترretry/timeout/timerها متمرکزترعیب‌ها:نیاز به طراحی درست orchestratorاگر بد نوشته بشه، گلوگاه می‌شهجمع‌بندی خودمونی:اگه flow واقعاً business critical و چندمرحله‌ایه، Orchestration معمولاً production-friendly تره.مثال واقعی: Order Saga (سناریوی کلاسیک)فرض کن داریم:Order ServiceInventory ServicePayment ServiceShipping ServiceFlow:Order ایجاد می‌شه (و می‌ره به حالت PENDING)Inventory رزرو می‌شهPayment شارژ می‌شهShipping ساخته می‌شهOrder می‌ره به حالت CONFIRMEDحالا اگر Payment fail شد چی؟Inventory رو release کنOrder رو ببر CANCELLED یا FAILED_PAYMENTاگر Shipping fail شد چی؟Refund payment (یا mark as refund pending)Release inventoryOrder رو ببر FAILED_SHIPPINGنکته:اینجا دقیقاً همون‌جاست که “state” اهمیت پیدا می‌کنه.تو باید به وضوح stateهای میانی رو تعریف کنی، وگرنه هر failure یه حالت جدید و ناشناخته می‌سازه.ارزش واقعی Saga تو Production: 8 تا قانون که اگر رعایت نکنی، می‌سوزهاین‌ها اون چیزیه که از “Saga روی کاغذ” جدا می‌کنه از “Saga که پول درمیاره”.1) هر step باید Idempotent باشهچون پیام duplicate میاد. retry می‌خوری. consumer دوباره اجرا می‌شه.اگر idempotent نباشی، دو بار پول می‌کشی، دو بار shipment می‌سازی، یا دو بار رزرو می‌کنی.2) CorrelationId / SagaId اجباریهبدونش end-to-end tracing نداری.و بدون tracing یعنی production فقط حدس و گمان.saga_id3) Timeout و Retry سیاست می‌خوادRetry کورکورانه یعنی فشار بیشتر روی سرویس down شده.Backoff و circuit-breaker و سقف retry خیلی مهمه.4) Outbox Pattern رو جدی بگیرسناریوی معروف:دیتابیس commit شد ولی event منتشر نشد.این یعنی system state تغییر کرد ولی بقیه سرویس‌ها نفهمیدن.Outbox این مشکل رو با “ذخیره event کنار تراکنش” حل می‌کنه.5) Duplicate message handling داشته باشحتی اگر Kafka داری، حتی اگر دقیقاً once رو دوست داری… واقعیت اینه که همیشه “at least once” رو باید فرض کنی.6) Compensation رو واقعی طراحی کن، نه تزئینیRefund کردن پول همیشه ممکنه async باشه.Release inventory شاید سریع باشه.Shipping cancel شاید محدودیت داشته باشه.پس compensation تو باید state-aware باشه.7) State machine تعریف کنحداقل stateها رو واضح کن:PENDINGINVENTORY_RESERVEDPAYMENT_CHARGEDSHIPPING_CREATEDCONFIRMEDFAILED_*COMPENSATINGاین باعث می‌شه وقتی fail شدی، دقیق بدونی کجا بودی.8) Observability: لاگ، متریک، تریسSaga بدون observability یعنی تو production کور هستی.log با saga_idmetrics برای success/failure هر steptrace برای طول کشیدن stepهااین‌ها مستقیم روی SLA و هزینه تیم اثر می‌ذارن.انتخاب درست: کی Saga خوبه و کی نه؟Saga خوبه وقتی:فرایند چندمرحله‌ای business داریfailureها “طبیعی” هستن و باید مدیریت بشنمی‌خوای سیستم resilient باشه نه fragileSaga گزینه بدیه وقتی:کل فرایند باید strong consistency آنی داشته باشه (مثل بعضی سناریوهای مالی/حساس)compensation معنی نداره یا غیرممکنهboundary سرویس‌ها اشتباهه (گاهی باید سرویس‌ها رو merge کنی یا domain رو درست ببری)اما Temporal این وسط چی کار می‌کنه؟ (خیلی کوتاه)حالا این همه حرف… پیاده‌سازی‌ش چیه؟اینجا ابزارهایی مثل Temporal ارزش واقعی می‌دن:چون orchestration رو تبدیل می‌کنن به Workflowهای durable با:retry داخلیtimeout/timer داخلیstate management مطمئنو اجرای قابل اعتماد حتی اگر worker ریستارت بشهیعنی خیلی از دردهای “خودمون orchestrator بنویسیم” رو ازت می‌گیره.جمع‌بندیSaga قرار نیست سیستم رو ساده کنه.قرار نیست failure رو حذف کنه.Saga کمک می‌کنه failure “قابل مدیریت” بشه.و این دقیقاً همون چیزیه که تو production ارزش می‌ده.</description>
                <category>آرش رستمی</category>
                <author>آرش رستمی</author>
                <pubDate>Thu, 01 Jan 2026 12:56:14 +0330</pubDate>
            </item>
                    <item>
                <title>آقا kubectl که فقط get pods نیست 😄</title>
                <link>https://virgool.io/@codewitharash/%D8%A2%D9%82%D8%A7-kubectl-%DA%A9%D9%87-%D9%81%D9%82%D8%B7-get-pods-%D9%86%DB%8C%D8%B3%D8%AA-%F0%9F%98%84-aoxko5fk44vh</link>
                <description>Kubectlیه زمانی Debug کردن یعنی “یه بار ریستارت کن، درست میشه”…الان تو Kubernetes؟ریستارت می‌کنی، دوباره همون آش، همون کاسه… فقط با downtime بیشتر 😅اول یه سری سؤال سریع (تا ذهن‌مون قفل نکنه)Pod چرا CrashLoopBackOff شده؟چرا Pending مونده و بالا نمیاد؟چرا سرویس 5xx می‌ده ولی Podها “Running” هستن؟چرا یه Node خاص همه‌چی رو خراب می‌کنه؟چرا “هیچی تو log نیست” ولی کار نمی‌کنه؟خب…  اینجا kubectl get pods فقط در حد تابلو ورودی ساختمونه.اصل داستان تو سه‌تا چیزه: logs / describe / events.1) Logs: اون‌جایی که حقیقت لو می‌رهسریع‌ترین حالتkubectl logs &lt;pod&gt;اگه چندتا container دارهkubectl logs &lt;pod&gt; -c &lt;container&gt;اگه Crash کرده و Restart شده (شاه‌کلید!)kubectl logs &lt;pod&gt; -c &lt;container&gt; --previousدنبال کردن لحظه‌ای (مثل tail)kubectl logs -f &lt;pod&gt; -c &lt;container&gt;نکته‌ی بازار/واقعیت: خیلی وقتا “مشکل Kubernetes نیست”، مشکل اپلیکیشنه که تو startup می‌ترکه.--previous دقیقاً همون لحظه‌ی ترکیدن رو می‌ده.2) Describe: اتوپسی کامل، با “آخرش چی شد؟”اگه فقط یه چیز رو حفظ کنی، اینه:kubectl describe pod &lt;pod&gt;
اینجا دنبال اینا بگرد:Status / Reason (مثلاً OOMKilled، ImagePullBackOff)Readiness/Liveness probe (خیلی وقتا خودت با probe داری می‌زنیش زمین)Node که روش schedule شدهEvents پایین خروجی (طلای خالص)برای Deployment هم:kubectl describe deploy &lt;name&gt;و ReplicaSet:kubectl describe rs &lt;name&gt;متافور ساده: get می‌گه “ماشین روشنه یا نه”،describe می‌گه “چرا چراغ چک موتور روشنه” 🚗💡3) Events: تایم‌لاین اتفاقات (همون گزارش پلیس)وقتی همه‌چی گیج‌کننده‌ست، Events کمک می‌کنه بفهمی آخرین حرکت چی بوده.دیدن eventها در namespacekubectl get events --sort-by=.metadata.creationTimestampفقط eventهای یه Pod(دو روش)روش 1: از describe پایینشkubectl describe pod &lt;pod&gt;روش 2: با field selectorkubectl get events --field-selector involvedObject.name=&lt;pod&gt; \ 
--sort-by=.metadata.creationTimestampچیزایی که زیاد می‌بینی:FailedScheduling (کمبود resource، taint/toleration، affinity…)FailedMount (PVC/secret/configmap)Back-off pulling image (registry/credentials/tag)Killing (probe fail، OOM، eviction)4) Exec: وقتی می‌خوای “داخلش” رو ببینیوقتی Pod بالا میاد ولی سرویس خرابه، می‌ری داخلش.kubectl exec -it &lt;pod&gt; -c &lt;container&gt; -- shیا اگه bash داره:kubectl exec -it &lt;pod&gt; -c &lt;container&gt; -- bashچک‌های کلاسیک داخل container:DNS:nslookup &lt;service&gt;شبکه/HTTP:curl -v http://&lt;service&gt;:&lt;port&gt;/healthenv vars:printenv | sortواقعیت تلخ ولی مهم: خیلی از imageهای production “distroless” هستن و shell ندارن.اونجاست که می‌رسی به مرحله‌ی بعد…5) Ephemeral Debug Container (اگه خواستی حرفه‌ای‌تر )وقتی container اصلی ابزار نداره (نه curl، نه sh)، یه debug container موقت می‌چسبونی به همون Pod.نیاز به Kubernetes نسخه/کانفیگ مناسب داره (اکثراً الان اوکیه)، ولی اگه نداشتی، حداقل بدون مفهومش چیهkubectl debug -it &lt;pod&gt; --image=busybox \
 --target=&lt;container&gt; -- shیا با image قوی‌تر:kubectl debug -it &lt;pod&gt; --image=nicolaka/netshoot --target=&lt;container&gt;چرا این خوبه؟چون بدون دست زدن به image اصلی، ابزار دیباگ داری: curl, dig, tcpdump, …چک‌لیست ۵ دقیقه‌ای ✅دقیقه 1: وضعیت کلیkubectl get pods -o wideکدوم Podها مشکل دارن؟روی کدوم Node افتادن؟دقیقه 2: دلیل رسمی مشکلkubectl describe pod &lt;pod&gt;Reason چیه؟ (ImagePull? OOM? Scheduling?)پایینش Events چی می‌گه؟دقیقه 3: Log لحظه‌ی سقوطkubectl logs &lt;pod&gt; -c &lt;container&gt; --previousexception؟config missing؟connection refused به یه dependency؟دقیقه 4: Event تایم‌لاینkubectl get events --sort-by=.metadata.creationTimestamp | tail -n 30FailedMount؟FailedScheduling؟probe failing؟دقیقه 5: تست سریع از داخل (یا debug container)kubectl exec -it &lt;pod&gt; -c &lt;container&gt; -- shیا اگر نشد:kubectl debug -it &lt;pod&gt; --image=nicolaka/netshoot --target=&lt;container&gt;curl به dependencyهاnslookup سرویس‌هاچک env vars / configآخرش چی؟kubectl یه “get pods machine” نیست.یه جعبه‌ابزار دیباگه که اگه درست استفاده‌اش کنی، ۵ دقیقه‌ای از تاریکی می‌آی بیرون.اگه دوست داری، تو کامنت بگو بیشتر با CrashLoop درگیری یا Pending یا Network/Ingress؟</description>
                <category>آرش رستمی</category>
                <author>آرش رستمی</author>
                <pubDate>Sun, 28 Dec 2025 15:58:10 +0330</pubDate>
            </item>
                    <item>
                <title>کوبرنتیز رو از کجا شروع کنیم؟ (پایه‌ها + Helm Chart)</title>
                <link>https://virgool.io/@codewitharash/%DA%A9%D9%88%D8%A8%D8%B1%D9%86%D8%AA%DB%8C%D8%B2-%D8%B1%D9%88-%D8%A7%D8%B2-%DA%A9%D8%AC%D8%A7-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D9%86%DB%8C%D9%85-%D9%BE%D8%A7%DB%8C%D9%87-%D9%87%D8%A7-helm-chart-z1disc1ydwiq</link>
                <description>کوبرنتیز رو از کجا شروع کنیم؟ (پایه‌ها + Helm Chart)اگه تازه داری وارد کوبرنتیز می‌شی، احتمالاً یه عالمه کلمه می‌بینی که اولش گیج‌کننده‌ست:پاد، دیپلویمنت، سرویس، اینگرس… بعدشم kubectl که حس می‌کنی یه زبان جدیده 😄ولی واقعیت اینه که برای شروع، لازم نیست همه‌چیز رو بلد باشی.فقط باید چند تا مفهوم اصلی رو درست بفهمی و بدونی تو پروژه واقعی به چه دردت می‌خوره.اول از همه: کوبرنتیز قراره چی رو حل کنه؟به زبان ساده: تو یه سرویس داری (مثلاً یه API) و می‌خوای:● همیشه بالا باشه● اگه کرش کرد خودش بیاد بالا● اگه ترافیک زیاد شد چند نسخه ازش داشته باشی● نسخه جدید رو بدون دردسر دیپلوی کنیکوبرنتیز یه سیستم مدیریت اجرای کانتینرهاست که این کارها رو استاندارد و اتومات می‌کنه.مفهوم ۱: Pod (کوچک‌ترین واحد اجرا)Pod رو مثل یه “جعبه” تصور کن که داخلش کانتینر(های) برنامه‌ات اجرا می‌شن.● برنامه‌ات داخل Pod ران میشه● پادها ممکنه هر لحظه از بین برن و دوباره ساخته بشن● پس پاد “سرور ثابت” نیست، یه واحد موقتیهمفهوم ۲: Deployment (مدیر پادها)حالا سوال: اگه پاد مُرد چی؟ اگه بخوای ۳ تا نسخه از سرویس داشته باشی چی؟اینجاست که Deployment میاد وسط:● تعداد Replicaها رو مدیریت می‌کنه● اگر یکی افتاد، یکی دیگه می‌سازه● دیپلوی نسخه جدید / برگشت به نسخه قبل (Rollout / Rollback) رو هندل می‌کنهمفهوم ۳: Service (آدرس ثابت برای دسترسی)از اونجا که پادها ثابت نیستن (IP عوض میشه و …)، ما یه آدرس “پایدار” می‌خوایم. این همون Service هست:● یه راه ثابت برای دسترسی می‌ده● ترافیک رو بین پادها پخش می‌کنه (Load balancing ساده)مفهوم ۴: Ingress (ورودی از بیرون)اگه بخوای از بیرون اینترنت یا از طریق دامنه به سرویس‌ات دسترسی داشته باشی، معمولاً Ingress وارد بازی میشه:● دامنه/مسیرها رو روت می‌کنه (مثلاً /api بره سمت سرویس A)● معمولاً SSL/TLS هم همینجا مدیریت میشه (بسته به setup)مفهوم ۵: ConfigMap و Secret (تنظیمات و اطلاعات حساس)برنامه بدون کانفیگ هیچیه: URL دیتابیس، توکن‌ها، کلیدها، اسم سرویس‌ها و…● ConfigMap برای تنظیمات معمولی● Secret برای اطلاعات حساس (پسورد، توکن، کلید)نکته مهم: تنظیمات رو از کد جدا نگه داری، تو محیط‌های مختلف (dev/stage/prod) نجاتت می‌ده.حالا kubectl چی کاره‌ست؟kubectl ریموت کنترل کوبره. باهاش:● وضعیت منابع رو می‌بینی● لاگ می‌خونی● دیباگ می‌کنی● دیپلویمنت/سرویس رو چک می‌کنی(توی پست بعدی دقیقاً همینارو کاربردی می‌گم که تو پروژه واقعی چطور استفاده کنی.)اضافه مهم: Helm و Helm Chart (چرا همه تو پروژه‌ها ازش استفاده می‌کنن؟)حالا برسیم به جایی که تو کار واقعی خیلی می‌بینیش: Helm.Helm رو می‌گن “Package Manager کوبرنتیز”. یعنی به جای اینکه کلی فایل YAML جدا جدا داشته باشی (deployment, service, ingress, configmap, …)همه‌ش رو می‌ذاری توی یه پکیج مرتب به اسم Chart و با یه دستور نصب/آپدیتش می‌کنی.Helm Chart معمولاً شامل ایناست:● templateهای YAML (قابل پارامتری شدن)● یه فایل values.yaml برای تنظیمات● نسخه‌بندی و قابلیت reuseچرا Helm تو تیم‌ها مهمه؟چون تو عمل این اتفاق می‌افته:● شما dev/stage/prod داری● برای هر محیط یه سری مقدار فرق می‌کنه (replica، آدرس DB، منابع، دامنه، …)● اگه همه‌چی YAML خام باشه، مدیریت و نگهداریش دردسر میشهHelm کمک می‌کنه:● با یک چارت چند محیط رو مدیریت کنی● تنظیمات رو تو values.yaml کنترل کنی● دیپلوی و آپگریدت استاندارد و قابل تکرار باشهجمع‌بندی خودمونیبرای شروع کوبرنتیز لازم نیست بری سراغ بحث‌های خیلی سنگین. اگر اینا رو درست بفهمی، پایه‌ات محکمه:● Pod● Deployment● Service● Ingress● ConfigMap/Secret● و بعدش Helm Chart برای دیپلوی تمیز و تیمیمن توی پست‌های بعدی:● kubectl رو برای دیباگ واقعی می‌گم● یه سرویس ساده رو دیپلوی می‌کنیم● بعدش هم همون رو با Helm Chart پکیج می‌کنیمو سمپل‌ها رو توی گیت می‌ذارم که بشه تمرین کرد.</description>
                <category>آرش رستمی</category>
                <author>آرش رستمی</author>
                <pubDate>Sat, 27 Dec 2025 18:36:49 +0330</pubDate>
            </item>
            </channel>
</rss>