[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f6zP0T3wtjFIL0q7lBcULQeDYdSAg0Ewi-_blLcbEo0M":3},{"data":4,"related":98},{"id":5,"title":6,"slug":7,"excerpt":8,"cover":9,"category":11,"author":14,"track":20,"level":23,"reading_minutes":26,"is_featured":27,"published_at":28,"updated_at":28,"body":29,"toc":30,"tags":66,"faqs":82,"related_services":92,"comments_enabled":96,"meta_title":19,"meta_description":97,"canonical_url":19,"noindex":27,"is_live":96},8,"رفع dkim=none در Postfix با راه‌اندازی OpenDKIM","postfix-opendkim-dkim-signing-fix","اگر ایمیل‌های سرور Postfix شما در Gmail به اسپم می‌روند و هدر پیام dkim=none نشان می‌دهد، یعنی هیچ امضای DKIM روی پیام‌ها درج نمی‌شود. در این مقاله OpenDKIM را نصب، پیکربندی و به Postfix وصل می‌کنیم و رکورد DNS را منتشر می‌کنیم.",{"url":10,"alt":6},"https:\u002F\u002Fapi.cloudicap.com\u002Fmedia\u002Fposts\u002F1b1288db-c0ed-41f3-8ee5-01f7b997c11d.webp",{"name":12,"slug":13},"ابزارهای Self-Hosted","self-hosted",{"name":15,"slug":16,"role":17,"bio":18,"linkedin_url":19,"avatar_url":19},"تحریریه کلودیکپ","cloudicap-editorial","تیم محتوای کلودیکپ","تیم فنی و محتوای کلودیکپ؛ مهندسانی که هر روز با DevOps، Kubernetes و زیرساخت ابری کار می‌کنند و تجربه‌هایشان را اینجا می‌نویسند.",null,{"value":21,"label":22},"engineers","مهندسان",{"value":24,"label":25},"intermediate","متوسط",6,false,"2026-10-09T13:30:31+00:00","\u003Ch2 id=\"۱-نشانه‌ی-مشکل-ایمیل-می‌رود-اما-در-اسپم-می‌نشیند\">۱. نشانه‌ی مشکل: ایمیل می‌رود، اما در اسپم می‌نشیند\u003C\u002Fh2>\u003Cp>یک روز صبح تیکت می‌آید: «\u003Ca href=\"\u002Fservices\u002Fmail-server-self-hosted\">ایمیل\u003C\u002Fa> بازیابی رمز عبور به Gmail نمی‌رسد» یا «همه‌ی ایمیل‌های اطلاع‌رسانی سایت رفتند داخل Spam». سریع به سرور می‌زنید؛ Postfix بالا است، صف خالی است (\u003Ccode>mailq\u003C\u002Fcode> چیزی نشان نمی‌دهد) و در \u003Ccode>\u002Fvar\u002Flog\u002Fmail.log\u003C\u002Fcode> هم خطای واضحی ثبت نشده. یعنی از دید سرور شما همه‌چیز «موفق» بوده است.\u003C\u002Fp>\u003Cp>حالا در Gmail روی پیام گیرافتاده در اسپم کلیک کنید و گزینه‌ی \u003Cstrong>Show original\u003C\u002Fstrong> را بزنید. چیزی شبیه این می‌بینید:\u003C\u002Fp>\u003Cblockquote>\u003Cp>Authentication-Results: mx.google.com;\u003Cbr>  spf=pass (google.com: domain of no-reply@example.com designates 203.0.113.10 as permitted sender);\u003Cbr>  dkim=none;\u003Cbr>  dmarc=pass (p=NONE sp=NONE) header.from=example.com\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>نکته‌ی کلیدی خط \u003Ccode>dkim=none\u003C\u002Fcode> است. یعنی هیچ امضای DKIM روی پیام وجود ندارد. DMARC فعلاً به‌خاطر SPF پاس می‌شود، ولی این پاس‌شدن شکننده است: کافی است پیام توسط یک mailing list فوروارد شود یا app شما از طریق یک relay بیرونی ارسال کند تا SPF از alignment خارج شود. آن‌وقت چون هیچ امضای DKIM هم وجود ندارد، DMARC شکست می‌خورد و پیام یا قرنطینه می‌شود یا رد.\u003C\u002Fp>\u003Cp>از سمت سرور هم می‌توانید مطمئن شوید که milter امضاکننده اصلاً اجرا نمی‌شود:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">grep -i dkim \u002Fvar\u002Flog\u002Fmail.log\n# خروجی خالی است؛ هیچ خطی درباره‌ی DKIM-Signature وجود ندارد.\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>در Gmail یا Outlook هم به‌جای \u003Ccode>dkim=pass\u003C\u002Fcode> عدد \u003Ccode>dkim=none\u003C\u002Fcode> (یا در سناریوهای بدتر \u003Ccode>dkim=fail\u003C\u002Fcode>) دیده می‌شود. نبود DKIM یکی از سه دلیل اصلی افتادن ایمیل‌های تراکنشی در اسپم است.\u003C\u002Fp>\u003Ch2 id=\"۲-علت-ریشه‌ای-postfix-به‌صورت-پیش‌فرض-هیچ-چیزی-را-امضا-نمی‌کند\">۲. علت ریشه‌ای: Postfix به‌صورت پیش‌فرض هیچ چیزی را امضا نمی‌کند\u003C\u002Fh2>\u003Cp>Postfix یک MTA است، نه یک امضاکننده‌ی رمزنگاری. DKIM به این شکل کار می‌کند که یک نرم‌افزار جداگانه (milter) پیام را قبل از رسیدن به صف ارسال می‌گیرد، هدرهای مشخصی را canonicalize می‌کند، با کلید خصوصی RSA هش را امضا می‌کند و هدر \u003Ccode>DKIM-Signature\u003C\u002Fcode> را به پیام اضافه می‌کند. گیرنده با خواندن رکورد TXT در DNS (که کلید عمومی در آن است) امضا را اعتبارسنجی می‌کند.\u003C\u002Fp>\u003Cp>پس تا وقتی این سه ضلع کنار هم نباشند، امضایی وجود ندارد:\u003C\u002Fp>\u003Col>\u003Cli>\u003Cp>یک جفت کلید DKIM تولید نشده است.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>رکورد TXT کلید عمومی در DNS منتشر نشده است.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>milter امضاکننده روی همان سروری که Postfix بیرون می‌دهد، متصل نشده است.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>اشتباه رایج دوم این است که مهندس فقط \u003Ccode>smtpd_milters\u003C\u002Fcode> را ست می‌کند. این پارامتر فقط روی پیام‌هایی اعمال می‌شود که از طریق SMTP وارد می‌شوند (submission). اما ایمیل‌های cron، \u003Ccode>mail()\u003C\u002Fcode> در PHP و اسکریپت‌هایی که از دستور \u003Ccode>sendmail\u003C\u002Fcode> استفاده می‌کنند، مستقیماً به Postfix تزریق می‌شوند و از مسیر SMTP عبور نمی‌کنند؛ آن‌ها پارامتر جداگانه‌ی \u003Ccode>non_smtpd_milters\u003C\u002Fcode> را می‌خوانند. اگر فقط اولی را ست کنید، ایمیل‌های اپلیکیشن امضا نمی‌شوند و ساعت‌ها دنبال چرایی می‌گردید.\u003C\u002Fp>\u003Ch2 id=\"۳-راه‌حل-گام‌به‌گام\">۳. راه‌حل گام‌به‌گام\u003C\u002Fh2>\u003Ch3 id=\"گام-۱-نصب-opendkim\">گام ۱: نصب OpenDKIM\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-bash\">sudo apt update\nsudo apt install opendkim opendkim-tools\n\n# روی خانواده‌ی RHEL:\n# sudo dnf install opendkim opendkim-tools\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"گام-۲-تولید-جفت-کلید\">گام ۲: تولید جفت کلید\u003C\u002Fh3>\u003Cp>نام selector را \u003Ccode>mail\u003C\u002Fcode> می‌گذاریم؛ در واقع این «نسخه»ی کلید است و بعداً برای چرخش کلید لازم می‌شود.\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">sudo mkdir -p \u002Fetc\u002Fopendkim\u002Fkeys\u002Fexample.com\nsudo opendkim-genkey -b 2048 -d example.com -s mail \\\n  -D \u002Fetc\u002Fopendkim\u002Fkeys\u002Fexample.com\nsudo chown -R opendkim:opendkim \u002Fetc\u002Fopendkim\u002Fkeys\nsudo chmod 600 \u002Fetc\u002Fopendkim\u002Fkeys\u002Fexample.com\u002Fmail.private\nls -l \u002Fetc\u002Fopendkim\u002Fkeys\u002Fexample.com\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>دو فایل ساخته می‌شود: \u003Ccode>mail.private\u003C\u002Fcode> (کلید خصوصی، فقط با دسترسی ریشه و کاربر opendkim) و \u003Ccode>mail.txt\u003C\u002Fcode> (محتوای رکورد DNS).\u003C\u002Fp>\u003Ch3 id=\"گام-۳-ساخت-جدول‌های-کلید-و-امضا\">گام ۳: ساخت جدول‌های کلید و امضا\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-ini\"># \u002Fetc\u002Fopendkim\u002Fkey.table\nmail._domainkey.example.com  example.com:mail:\u002Fetc\u002Fopendkim\u002Fkeys\u002Fexample.com\u002Fmail.private\u003C\u002Fcode>\u003C\u002Fpre>\u003Cpre>\u003Ccode class=\"language-ini\"># \u002Fetc\u002Fopendkim\u002Fsigning.table\n*@example.com  mail._domainkey.example.com\u003C\u002Fcode>\u003C\u002Fpre>\u003Cpre>\u003Ccode class=\"language-ini\"># \u002Fetc\u002Fopendkim\u002Ftrusted.hosts\n127.0.0.1\n::1\nlocalhost\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>جدول \u003Ccode>signing.table\u003C\u002Fcode> می‌گوید هر پیامی که From آن \u003Ccode>@example.com\u003C\u002Fcode> است با کدام selector امضا شود. برای چند دامنه، به‌ازای هر دامنه یک خط اضافه کنید.\u003C\u002Fp>\u003Ch3 id=\"گام-۴-پیکربندی-opendkim\">گام ۴: پیکربندی OpenDKIM\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-ini\"># \u002Fetc\u002Fopendkim.conf\nSyslog              yes\nUMask               002\nKeyTable            refile:\u002Fetc\u002Fopendkim\u002Fkey.table\nSigningTable        refile:\u002Fetc\u002Fopendkim\u002Fsigning.table\nExternalIgnoreList  refile:\u002Fetc\u002Fopendkim\u002Ftrusted.hosts\nInternalHosts       refile:\u002Fetc\u002Fopendkim\u002Ftrusted.hosts\nSocket              inet:12301@localhost\nCanonicalization    relaxed\u002Frelaxed\nMode                sv\nOversignHeaders     From\nPidFile             \u002Frun\u002Fopendkim\u002Fopendkim.pid\nUserID              opendkim\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>اگر توزیع شما از systemd socket activation استفاده می‌کند (روی Debian و Ubuntu رایج است)، سوکت را در فایل جدا تنظیم کنید و تعریف تکراری در \u003Ccode>opendkim.conf\u003C\u002Fcode> را بردارید:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-ini\"># \u002Fetc\u002Fdefault\u002Fopendkim\nSOCKET=\"inet:12301@localhost\"\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"گام-۵-وصل-کردن-milter-به-postfix\">گام ۵: وصل کردن milter به Postfix\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-bash\">sudo postconf -e 'milter_default_action = accept'\nsudo postconf -e 'milter_protocol = 6'\nsudo postconf -e 'smtpd_milters = inet:localhost:12301'\nsudo postconf -e 'non_smtpd_milters = inet:localhost:12301'\n\nsudo systemctl restart opendkim\nsudo systemctl restart postfix\nsudo systemctl status opendkim --no-pager\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>مقدار \u003Ccode>milter_default_action = accept\u003C\u002Fcode> یعنی اگر milter به‌هر دلیلی در دسترس نبود، Postfix ایمیل را دور نریزد و بدون امضا عبور دهد؛ این انتخاب هنگام راه‌اندازی امن‌تر است تا در صورت کرش OpenDKIM، صف شما قفل نشود.\u003C\u002Fp>\u003Ch3 id=\"گام-۶-انتشار-رکورد-dns\">گام ۶: انتشار رکورد DNS\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-bash\">sudo cat \u002Fetc\u002Fopendkim\u002Fkeys\u002Fexample.com\u002Fmail.txt\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>خروجی چیزی شبیه این است:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-ini\">mail._domainkey IN TXT ( \"v=DKIM1; h=sha256; k=rsa; \"\n    \"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...QAB\" ) ;\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>یک رکورد TXT بسازید با نام \u003Ccode>mail._domainkey.example.com\u003C\u002Fcode> و مقدار کل رشته‌ی \u003Ccode>v=DKIM1; h=sha256; k=rsa; p=...\u003C\u002Fcode> را بدون گیومه‌ها، بدون پرانتز و بدون شکستن خط داخلش بگذارید. اگر مقدار طولانی است، برخی کنترل‌پنل‌های DNS خودشان آن را به دو string تقسیم می‌کنند که اشکالی ندارد؛ مهم این است که نرم‌افزار DNS آن‌ها را دوباره به یکدیگر بچسباند.\u003C\u002Fp>\u003Ch2 id=\"۴-بررسی-اینکه-مشکل-واقعا-حل-شده-است\">۴. بررسی اینکه مشکل واقعاً حل شده است\u003C\u002Fh2>\u003Cp>اول صحت کلید و هم‌خوانی آن با DNS را چک کنید:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">sudo opendkim-testkey -d example.com -s mail -vvv\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>اگر همه‌چیز درست باشد، در انتهای خروجی \u003Ccode>key OK\u003C\u002Fcode> می‌بینید. اگر خطای \u003Ccode>key not secure\u003C\u002Fcode> دیدید، یعنی رکورد DNS هنوز propagate نشده یا مقدار اشتباه کپی شده است.\u003C\u002Fp>\u003Cp>سپس یک ایمیل آزمایشی بفرستید و لاگ را نگاه کنید:\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-bash\">echo \"DKIM test\" | mail -s \"dkim check\" you@gmail.com\nsleep 5\ngrep -i dkim \u002Fvar\u002Flog\u002Fmail.log\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>باید خطی شبیه این ببینید:\u003C\u002Fp>\u003Cblockquote>\u003Cp>opendkim[1234]: 1A2B3C4D: DKIM-Signature field added (s=mail, d=example.com)\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>در سمت گیرنده هم دوباره \u003Cstrong>Show original\u003C\u002Fstrong> را باز کنید. حالا باید این را ببینید:\u003C\u002Fp>\u003Cblockquote>\u003Cp>dkim=pass header.i=@example.com header.s=mail header.b=AbCdEfGh\u003C\u002Fp>\u003C\u002Fblockquote>\u003Cp>برای تست دقیق‌تر می‌توانید پیام را به سرویس‌های بررسی احراز هویت ایمیل بفرستید و نتیجه‌ی SPF، DKIM و DMARC را یک‌جا ببینید. نکته‌ی مهم این است که \u003Ccode>dkim=pass\u003C\u002Fcode> باید همراه با \u003Ccode>header.i=@example.com\u003C\u002Fcode> باشد؛ اگر دامنه‌ی امضا با دامنه‌ی From یکی نباشد، DMARC همچنان شکست می‌خورد.\u003C\u002Fp>\u003Ch2 id=\"۵-پیشگیری-و-بهترین-روش‌ها\">۵. پیشگیری و بهترین روش‌ها\u003C\u002Fh2>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>SPF و DMARC را فراموش نکنید.\u003C\u002Fstrong> DKIM جایگزین آن‌ها نیست، مکمل است. یک رکورد SPF معتبر و یک رکورد \u003Ccode>_dmarc\u003C\u002Fcode> با \u003Ccode>p=none\u003C\u002Fcode> بگذارید و بعد از چند هفته پایش، به \u003Ccode>quarantine\u003C\u002Fcode> و سپس \u003Ccode>reject\u003C\u002Fcode> بروید.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>الگوی چرخش کلید داشته باشید.\u003C\u002Fstrong> هر ۶ تا ۱۲ ماه یک selector جدید بسازید (مثلاً \u003Ccode>mail2\u003C\u002Fcode>)، رکورد DNS آن را منتشر کنید، حداقل ۴۸ ساعت صبر کنید تا propagate شود، بعد در \u003Ccode>signing.table\u003C\u002Fcode> امضا را به آن منتقل کنید و در پایان کلید قدیمی را حذف کنید. این‌طور هیچ‌وقت بدون امضا نمی‌مانید.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>کلید خصوصی را امن نگه دارید.\u003C\u002Fstrong> مالکیت \u003Ccode>opendkim:opendkim\u003C\u002Fcode> و مجوز \u003Ccode>600\u003C\u002Fcode> الزامی است. کلید را در بکاپ‌های رمزنگاری‌شده نگه دارید؛ گم‌شدن آن یعنی باید کل چرخه‌ی DNS را از نو طی کنید.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>گزارش‌های DMARC را جمع کنید.\u003C\u002Fstrong> با \u003Ccode>rua=mailto:dmarc@example.com\u003C\u002Fcode> می‌فهمید کدام سرویس‌های جانبی (خبرنامه، CRM، فاکتور) به‌جای سرور شما ایمیل می‌فرستند و هنوز DKIM ندارند.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>طول کلید را جدی بگیرید.\u003C\u002Fstrong> حداقل ۲۰۴۸ بیت. کلید ۱۰۲۴ بیتی هنوز «کار می‌کند» ولی اعتبار کمتری نزد گیرنده‌ها دارد.\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>پورت ۱۲۳۰۱ را فقط روی localhost باز کنید.\u003C\u002Fstrong> سوکت inet نباید از بیرون قابل دسترس باشد؛ milter در همان سرور اجرا می‌شود.\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>",[31,35,38,41,45,48,51,54,57,60,63],{"id":32,"text":33,"level":34},"۱-نشانه‌ی-مشکل-ایمیل-می‌رود-اما-در-اسپم-می‌نشیند","۱. نشانه‌ی مشکل: ایمیل می‌رود، اما در اسپم می‌نشیند",2,{"id":36,"text":37,"level":34},"۲-علت-ریشه‌ای-postfix-به‌صورت-پیش‌فرض-هیچ-چیزی-را-امضا-نمی‌کند","۲. علت ریشه‌ای: Postfix به‌صورت پیش‌فرض هیچ چیزی را امضا نمی‌کند",{"id":39,"text":40,"level":34},"۳-راه‌حل-گام‌به‌گام","۳. راه‌حل گام‌به‌گام",{"id":42,"text":43,"level":44},"گام-۱-نصب-opendkim","گام ۱: نصب OpenDKIM",3,{"id":46,"text":47,"level":44},"گام-۲-تولید-جفت-کلید","گام ۲: تولید جفت کلید",{"id":49,"text":50,"level":44},"گام-۳-ساخت-جدول‌های-کلید-و-امضا","گام ۳: ساخت جدول‌های کلید و امضا",{"id":52,"text":53,"level":44},"گام-۴-پیکربندی-opendkim","گام ۴: پیکربندی OpenDKIM",{"id":55,"text":56,"level":44},"گام-۵-وصل-کردن-milter-به-postfix","گام ۵: وصل کردن milter به Postfix",{"id":58,"text":59,"level":44},"گام-۶-انتشار-رکورد-dns","گام ۶: انتشار رکورد DNS",{"id":61,"text":62,"level":34},"۴-بررسی-اینکه-مشکل-واقعا-حل-شده-است","۴. بررسی اینکه مشکل واقعاً حل شده است",{"id":64,"text":65,"level":34},"۵-پیشگیری-و-بهترین-روش‌ها","۵. پیشگیری و بهترین روش‌ها",[67,70,73,76,79],{"name":68,"slug":69},"Postfix","postfix",{"name":71,"slug":72},"OpenDKIM","opendkim",{"name":74,"slug":75},"DKIM","dkim",{"name":77,"slug":78},"Mail Server","mail-server",{"name":80,"slug":81},"DNS","dns",[83,86,89],{"question":84,"answer":85},"چرا ایمیل‌های cron و اسکریپت‌ها همچنان بدون امضای DKIM ارسال می‌شوند؟","چون آن‌ها از مسیر SMTP سابمیشن وارد نمی‌شوند و مستقیماً با sendmail به Postfix تزریق می‌شوند. باید پارامتر non_smtpd_milters را هم روی همان سوکت milter تنظیم و Postfix را ری‌استارت کنید.",{"question":87,"answer":88},"تفاوت dkim=none و dkim=fail در هدر پیام چیست؟","dkim=none یعنی هیچ امضایی روی پیام وجود ندارد و علت آن معمولاً نبود milter یا نبود رکورد DNS است. dkim=fail یعنی امضا وجود دارد ولی اعتبارسنجی شکست خورده؛ مثلاً رکورد TXT اشتباه کپی شده، کلید خصوصی با کلید عمومی هم‌خوان نیست یا سرویس فوروارد بدنه‌ی پیام را تغییر داده است.",{"question":90,"answer":91},"آیا با راه‌اندازی DKIM دیگر نیازی به SPF و DMARC نیست؟","نه. DKIM تمامیت و اصالت پیام را ثابت می‌کند، SPF مجازبودن IP فرستنده را. DMARC به گیرنده می‌گوید وقتی هیچ‌کدام از این دو با دامنه‌ی From هم‌راستا نبودند چه کند. هر سه باید کنار هم پیکربندی شوند تا سیاست p=reject بدون ریسک قابل اعمال باشد.",[93,94,95],"mail-server-self-hosted","cloud-infrastructure","devops-consulting",true,"راه‌اندازی DKIM روی Postfix با OpenDKIM؛ از تولید کلید و milter تا رکورد DNS و تست dkim=pass برای جلوگیری از اسپم‌شدن ایمیل‌ها.",[99,113,126],{"id":100,"title":101,"slug":102,"excerpt":103,"cover":104,"category":106,"author":109,"track":110,"level":111,"reading_minutes":5,"is_featured":27,"published_at":112,"updated_at":112},7,"چرا همگام‌سازی JQL در Jira فقط ۵۰ ایشو برمی‌گرداند؟","jira-jql-search-nextpagetoken-pagination","اگر job همگام‌سازی Jira شما بدون خطا تمام می‌شود ولی فقط ۵۰ ایشو را می‌آورد یا در حلقه بی‌پایان گیر می‌کند، مشکل از JQL نیست؛ اندپوینت search به pagination مبتنی بر nextPageToken منتقل شده و startAt و total دیگر وجود ندارند.",{"url":105,"alt":101},"https:\u002F\u002Fapi.cloudicap.com\u002Fmedia\u002Fposts\u002Facfa9ea0-bda9-4ade-a1c3-0f1677851587.webp",{"name":107,"slug":108},"CI\u002FCD و اتوماسیون","cicd",{"name":15,"slug":16,"role":17,"avatar_url":19},{"value":21,"label":22},{"value":24,"label":25},"2026-10-08T15:34:25+00:00",{"id":114,"title":115,"slug":116,"excerpt":117,"cover":118,"category":120,"author":122,"track":123,"level":124,"reading_minutes":26,"is_featured":27,"published_at":125,"updated_at":125},5,"قفل state ترافورم گیر کرده؛ آزادسازی امن بعد از کیل شدن apply","terraform-state-lock-stuck-force-unlock","وقتی پایپلاین CI وسط اجرای apply کشته می‌شود، قفل state ترافورم در جدول DynamoDB باقی می‌ماند و اجرای بعدی با خطای Error acquiring the state lock متوقف می‌شود. در این مقاله علت ریشه‌ای، روش آزادسازی امن و راه‌های پیشگیری را بررسی می‌کنیم.",{"url":119,"alt":115},"https:\u002F\u002Fapi.cloudicap.com\u002Fmedia\u002Fposts\u002Fe26789f7-eced-4abb-b6a9-a91adf9b7500.webp",{"name":121,"slug":94},"زیرساخت ابری و IaC",{"name":15,"slug":16,"role":17,"avatar_url":19},{"value":21,"label":22},{"value":24,"label":25},"2026-10-08T09:49:26+00:00",{"id":127,"title":128,"slug":129,"excerpt":130,"cover":131,"category":133,"author":134,"track":135,"level":136,"reading_minutes":100,"is_featured":27,"published_at":137,"updated_at":137},4,"حلقه بی‌پایان Jira Automation: وقتی قانون خودش را صدا می‌زند","jira-automation-infinite-loop-fix","اگر trigger و action یک قانون Jira Automation روی یک رویداد بیفتند، قانون خودش را دوباره اجرا می‌کند و issue با صدها کامنت تکراری پر می‌شود. این مقاله علت، پاک‌سازی و راه‌حل پایدار را نشان می‌دهد.",{"url":132,"alt":128},"https:\u002F\u002Fapi.cloudicap.com\u002Fmedia\u002Fposts\u002F696958ce-e1fa-458e-b7df-1f1a99fe6a5f.webp",{"name":107,"slug":108},{"name":15,"slug":16,"role":17,"avatar_url":19},{"value":21,"label":22},{"value":24,"label":25},"2026-10-07T09:28:33+00:00"]