[{"data":1,"prerenderedAt":565},["ShallowReactive",2],{"header-service-categories":3,"footer-service-categories":159,"article-gitlab-cicd-pipeline-design":202,"related-gitlab-cicd-pipeline-design":227},[4,37,129],{"id":5,"name":6,"description":7,"image":8,"slug":9,"service_groups":10,"key":29,"title":6,"services":30},1,"عملیات و پشتیبانی","پایداری  و پشتیبانی برای سرویس‌های حیاتی","","support",[11,22],{"id":12,"name":13,"name_en":14,"image":15,"description":16,"slug":14,"headline":17,"tagline":18,"hidden":19,"group_type":20,"sort_order":21,"category":5},10,"پشتیبانی و خدمات دواپس","devops-support","/media/service_group_images/group-10-devops-support.png","\u003Cp>خدمات پشتیبانی ماهانه DevOps برای راه‌اندازی، نگهداری و عیب‌یابی زیرساخت‌های استقرار و مانیتورینگ ارائه می‌شود. این سرویس شامل پیاده‌سازی CI/CD، داکرایز کردن پروژه‌ها، راه‌اندازی مانیتورینگ، مدیریت لاگ و بهینه‌سازی فرایندهای استقرار است. هر پلن شامل تعداد ساعت مشخصی پشتیبانی است و در صورت مصرف بیشتر، ساعات مازاد به‌صورت جداگانه محاسبه خواهد شد.\u003C/p>","پشتیبانی و خدمات DevOps","راه‌اندازی، نگهداری و بهینه‌سازی زیرساخت DevOps برای استقرار سریع‌تر و پایدارتر",false,"F",91,{"id":5,"name":23,"name_en":9,"image":24,"description":25,"slug":9,"headline":26,"tagline":27,"hidden":19,"group_type":20,"sort_order":28,"category":5},"پشتیبانی و مدیریت سرور لینوکسی","/media/service_group_images/group-01-support_r0RZtMn.png","\u003Cp>خدمات پشتیبانی ماهانه برای مدیریت، عیب‌یابی و نگهداری سرورهای لینوکسی ارائه می‌شود. هر پلن شامل تعداد ساعت مشخصی پشتیبانی است و در صورت مصرف بیشتر، ساعات مازاد به‌صورت جداگانه محاسبه خواهد شد.\u003C/p>","پشتیبانی تخصصی سرور، متناسب با نیاز کسب‌وکار شما","از رفع خطاهای زیرساختی تا مدیریت روزمره سرور، با پلن‌های ماهانه و شفاف",90,"operations",[31,34],{"id":12,"name":13,"name_en":14,"image":32,"description":16,"slug":14,"headline":17,"tagline":18,"hidden":19,"group_type":20,"sort_order":21,"category":5,"services":33,"serviceCategoryKey":29,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-10-devops-support.png",[],{"id":5,"name":23,"name_en":9,"image":35,"description":25,"slug":9,"headline":26,"tagline":27,"hidden":19,"group_type":20,"sort_order":28,"category":5,"services":36,"serviceCategoryKey":29,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-01-support_r0RZtMn.png",[],{"id":38,"name":39,"description":40,"image":8,"slug":41,"service_groups":42,"key":106,"title":39,"services":107},2,"زیرساخت و میزبانی","میزبانی مطمئن برای محصولاتی که باید همیشه در دسترس باشند","Infrastructure",[43,52,61,70,79,88,97],{"id":38,"name":44,"name_en":45,"image":46,"description":47,"slug":45,"headline":48,"tagline":49,"hidden":19,"group_type":50,"sort_order":51,"category":38},"لایسنس نرم‌افزارهای مدیریت سرور","license","/media/service_group_images/group-02-license.png","\u003Cp>در این بخش می‌توانید لایسنس‌های موردنیاز برای مدیریت، امنیت، مجازی‌سازی و بهینه‌سازی سرور را به‌صورت ماهانه تهیه یا تمدید کنید. تمامی لایسنس‌ها با هدف افزایش کارایی، امنیت و سهولت مدیریت سرور ارائه می‌شوند.\u003C/p>","لایسنس‌های ضروری برای مدیریت حرفه‌ای سرور","از کنترل‌پنل و وب‌سرور تا امنیت و مجازی‌سازی، همه‌چیز برای یک زیرساخت کامل","S",80,{"id":53,"name":54,"name_en":55,"image":56,"description":57,"slug":55,"headline":58,"tagline":59,"hidden":19,"group_type":20,"sort_order":60,"category":38},5,"سرور مجازی ایران با منابع اختصاصی","iran-vm","/media/service_group_images/group-05-iran-vm.png","\u003Cp>سرور مجازی ایران برای کسب‌وکارهایی مناسب است که به منابع اختصاصی‌تر، کنترل بیشتر و عملکرد پایدارتر نسبت به هاست اشتراکی نیاز دارند. این سرویس با پلن‌های متنوع و IP اختصاصی ارائه می‌شود.\u003C/p>","قدرت بیشتر، کنترل کامل‌تر، میزبانی در ایران","از پروژه‌های در حال رشد تا سرویس‌های حرفه‌ای، با منابع اختصاصی و دسترسی پایدار",70,{"id":62,"name":63,"name_en":64,"image":65,"description":66,"slug":64,"headline":67,"tagline":68,"hidden":19,"group_type":20,"sort_order":69,"category":38},4,"هاست لینوکس ایران برای میزبانی سایت","linux-host","/media/service_group_images/group-04-linux-host.png","\u003Cp>هاست لینوکس ایران برای میزبانی سایت‌های شرکتی، فروشگاهی و شخصی با منابع متنوع، پهنای باند نامحدود و امکان استفاده از کنترل‌پنل‌های محبوب ارائه می‌شود. این سرویس برای راه‌اندازی سریع و پایدار وب‌سایت در داخل ایران مناسب است.\u003C/p>","میزبانی لینوکسی سریع و پایدار در ایران","انتخابی مناسب برای سایت‌های ایرانی با دسترسی بهتر، منابع متنوع و مدیریت آسان",63,{"id":71,"name":72,"name_en":73,"image":74,"description":75,"slug":73,"headline":76,"tagline":77,"hidden":19,"group_type":20,"sort_order":78,"category":38},8,"هاست ایمیل حرفه‌ای","email","/media/service_group_images/group-08-email.png","\u003Cp>سرویس ایمیل برای راه‌اندازی و مدیریت ایمیل سازمانی با تنظیمات بهینه و کاهش ریسک اسپم‌شدن ارائه می‌شود. این سرویس دارای پنل تحت وب، امکان ساخت حساب‌های متعدد و بکاپ هفتگی است.\u003C/p>","ایمیل سازمانی پایدار و حرفه‌ای برای کسب‌وکار شما","ارسال و دریافت مطمئن ایمیل با تنظیمات بهینه، پنل تحت وب و پشتیبانی مداوم",62,{"id":80,"name":81,"name_en":82,"image":83,"description":84,"slug":82,"headline":85,"tagline":86,"hidden":19,"group_type":20,"sort_order":87,"category":38},9,"هاست لینوکس خارج با کیفیت بین‌المللی","linux-host-eu","/media/service_group_images/group-09-linux-host-eu.png","\u003Cp>هاست لینوکس خارج برای سایت‌هایی مناسب است که به میزبانی با کیفیت بالا در خارج از کشور نیاز دارند. این سرویس با فضای مناسب، پهنای باند نامحدود، SSL و امکان استفاده از کنترل‌پنل‌های محبوب ارائه می‌شود.\u003C/p>","میزبانی لینوکسی خارج، مناسب پروژه‌های حرفه‌ای‌تر","کیفیت بالا، منابع مناسب و انتخابی مطمئن برای وب‌سایت‌های بین‌المللی یا خاص",61,{"id":89,"name":90,"name_en":91,"image":92,"description":93,"slug":91,"headline":94,"tagline":95,"hidden":19,"group_type":20,"sort_order":96,"category":38},3,"فضای بکاپ و نگهداری نسخه پشتیبان","backup","/media/service_group_images/group-03-backup.png","\u003Cp>هاست بکاپ مناسب ذخیره‌سازی امن فایل‌های پشتیبان سایت و سرور است و با فضای متنوع، ترافیک نامحدود و دسترسی FTP/SFTP ارائه می‌شود. این سرویس برای نگهداری نسخه‌های پشتیبان منظم و دسترسی سریع طراحی شده است\u003C/p>","فضایی مطمئن برای نگهداری بکاپ‌های مهم شما","ذخیره‌سازی سریع، ترافیک نامحدود و دسترسی امن برای مدیریت بهتر نسخه‌های پشتیبان",50,{"id":98,"name":99,"name_en":100,"image":101,"description":102,"slug":100,"headline":103,"tagline":104,"hidden":19,"group_type":20,"sort_order":105,"category":38},7,"خدمات مانیتورینگ","monitoring","/media/service_group_images/group-07-monitoring.png","\u003Cp>این سرویس برای پایش وضعیت دسترس‌پذیری و سلامت سرویس‌ها طراحی شده و با گزارش‌گیری، عیب‌یابی و اطلاع‌رسانی از طریق ایمیل و تلگرام، به شما در شناسایی سریع اختلال‌ها کمک می‌کند.\u003C/p>","همیشه از وضعیت سرویس‌های خود باخبر باشید","پایش لحظه‌ای آپتایم، گزارش دقیق و اطلاع‌رسانی سریع در زمان بروز اختلال",0,"infrastructure",[108,111,114,117,120,123,126],{"id":38,"name":44,"name_en":45,"image":109,"description":47,"slug":45,"headline":48,"tagline":49,"hidden":19,"group_type":50,"sort_order":51,"category":38,"services":110,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-02-license.png",[],{"id":53,"name":54,"name_en":55,"image":112,"description":57,"slug":55,"headline":58,"tagline":59,"hidden":19,"group_type":20,"sort_order":60,"category":38,"services":113,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-05-iran-vm.png",[],{"id":62,"name":63,"name_en":64,"image":115,"description":66,"slug":64,"headline":67,"tagline":68,"hidden":19,"group_type":20,"sort_order":69,"category":38,"services":116,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-04-linux-host.png",[],{"id":71,"name":72,"name_en":73,"image":118,"description":75,"slug":73,"headline":76,"tagline":77,"hidden":19,"group_type":20,"sort_order":78,"category":38,"services":119,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-08-email.png",[],{"id":80,"name":81,"name_en":82,"image":121,"description":84,"slug":82,"headline":85,"tagline":86,"hidden":19,"group_type":20,"sort_order":87,"category":38,"services":122,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-09-linux-host-eu.png",[],{"id":89,"name":90,"name_en":91,"image":124,"description":93,"slug":91,"headline":94,"tagline":95,"hidden":19,"group_type":20,"sort_order":96,"category":38,"services":125,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-03-backup.png",[],{"id":98,"name":99,"name_en":100,"image":127,"description":102,"slug":100,"headline":103,"tagline":104,"hidden":19,"group_type":20,"sort_order":105,"category":38,"services":128,"serviceCategoryKey":106,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-07-monitoring.png",[],{"id":89,"name":130,"description":131,"image":8,"slug":132,"service_groups":133,"key":132,"title":130,"services":152},"امنیت و ابزارها","ریسک کمتر، کنترل بیشتر","security",[134,143],{"id":135,"name":136,"name_en":137,"image":138,"description":139,"slug":137,"headline":140,"tagline":141,"hidden":19,"group_type":20,"sort_order":142,"category":89},12,"اسکن های امنیتی ایستا","static-scans","/media/service_group_images/group-12-static-scans.png","\u003Cp>پایش امنیت کد منبع، کتابخانه ها و اطلاعات حساس برای شناسایی آسیب پذیری ها پیش از انتشار نرم افزار.\u003C/p>","سرویس های اسکن ایستای امنیت نرم افزار","شناسایی آسیب پذیری ها پیش از اجرا و انتشار نرم افزار",101,{"id":144,"name":145,"name_en":146,"image":147,"description":148,"slug":146,"headline":149,"tagline":150,"hidden":19,"group_type":20,"sort_order":151,"category":89},11,"اسکن های امنیتی پویا (به زودی)","dynamic-scans","/media/service_group_images/group-11-dynamic-scans.png","\u003Cp>سرویس‌های اسکن امنیتی، راهکاری برای پایش مستمر امنیت نرم‌افزار و شناسایی خودکار آسیب‌پذیری‌ها پیش از انتشار هستند. این خدمات با پنل مدیریت فارسی و قابلیت ادغام با GitLab ارائه می‌شوند. در حال حاضر سرویس اسکن ایستا (کد، کتابخانه‌ها و سکرت‌ها) فعال بوده و پلن‌های اسکن پویا، ترکیبی و زیرساخت به‌زودی اضافه خواهند شد.\u003C/p>","سرویس های اسکن پویای امنیت نرم افزار","شناسایی آسیب پذیری های برنامه در حال اجرا پیش از آنکه به تهدید تبدیل شوند",100,[153,156],{"id":135,"name":136,"name_en":137,"image":154,"description":139,"slug":137,"headline":140,"tagline":141,"hidden":19,"group_type":20,"sort_order":142,"category":89,"services":155,"serviceCategoryKey":132,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-12-static-scans.png",[],{"id":144,"name":145,"name_en":146,"image":157,"description":148,"slug":146,"headline":149,"tagline":150,"hidden":19,"group_type":20,"sort_order":151,"category":89,"services":158,"serviceCategoryKey":132,"serviceCategoryImage":8},"https://api.dornadevops.com/media/service_group_images/group-11-dynamic-scans.png",[],[160,169,193],{"id":5,"name":6,"description":7,"image":8,"slug":9,"service_groups":161,"key":29,"title":6,"services":164},[162,163],{"id":12,"name":13,"name_en":14,"image":15,"description":16,"slug":14,"headline":17,"tagline":18,"hidden":19,"group_type":20,"sort_order":21,"category":5},{"id":5,"name":23,"name_en":9,"image":24,"description":25,"slug":9,"headline":26,"tagline":27,"hidden":19,"group_type":20,"sort_order":28,"category":5},[165,167],{"id":12,"name":13,"name_en":14,"image":32,"description":16,"slug":14,"headline":17,"tagline":18,"hidden":19,"group_type":20,"sort_order":21,"category":5,"services":166,"serviceCategoryKey":29,"serviceCategoryImage":8},[],{"id":5,"name":23,"name_en":9,"image":35,"description":25,"slug":9,"headline":26,"tagline":27,"hidden":19,"group_type":20,"sort_order":28,"category":5,"services":168,"serviceCategoryKey":29,"serviceCategoryImage":8},[],{"id":38,"name":39,"description":40,"image":8,"slug":41,"service_groups":170,"key":106,"title":39,"services":178},[171,172,173,174,175,176,177],{"id":38,"name":44,"name_en":45,"image":46,"description":47,"slug":45,"headline":48,"tagline":49,"hidden":19,"group_type":50,"sort_order":51,"category":38},{"id":53,"name":54,"name_en":55,"image":56,"description":57,"slug":55,"headline":58,"tagline":59,"hidden":19,"group_type":20,"sort_order":60,"category":38},{"id":62,"name":63,"name_en":64,"image":65,"description":66,"slug":64,"headline":67,"tagline":68,"hidden":19,"group_type":20,"sort_order":69,"category":38},{"id":71,"name":72,"name_en":73,"image":74,"description":75,"slug":73,"headline":76,"tagline":77,"hidden":19,"group_type":20,"sort_order":78,"category":38},{"id":80,"name":81,"name_en":82,"image":83,"description":84,"slug":82,"headline":85,"tagline":86,"hidden":19,"group_type":20,"sort_order":87,"category":38},{"id":89,"name":90,"name_en":91,"image":92,"description":93,"slug":91,"headline":94,"tagline":95,"hidden":19,"group_type":20,"sort_order":96,"category":38},{"id":98,"name":99,"name_en":100,"image":101,"description":102,"slug":100,"headline":103,"tagline":104,"hidden":19,"group_type":20,"sort_order":105,"category":38},[179,181,183,185,187,189,191],{"id":38,"name":44,"name_en":45,"image":109,"description":47,"slug":45,"headline":48,"tagline":49,"hidden":19,"group_type":50,"sort_order":51,"category":38,"services":180,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":53,"name":54,"name_en":55,"image":112,"description":57,"slug":55,"headline":58,"tagline":59,"hidden":19,"group_type":20,"sort_order":60,"category":38,"services":182,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":62,"name":63,"name_en":64,"image":115,"description":66,"slug":64,"headline":67,"tagline":68,"hidden":19,"group_type":20,"sort_order":69,"category":38,"services":184,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":71,"name":72,"name_en":73,"image":118,"description":75,"slug":73,"headline":76,"tagline":77,"hidden":19,"group_type":20,"sort_order":78,"category":38,"services":186,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":80,"name":81,"name_en":82,"image":121,"description":84,"slug":82,"headline":85,"tagline":86,"hidden":19,"group_type":20,"sort_order":87,"category":38,"services":188,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":89,"name":90,"name_en":91,"image":124,"description":93,"slug":91,"headline":94,"tagline":95,"hidden":19,"group_type":20,"sort_order":96,"category":38,"services":190,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":98,"name":99,"name_en":100,"image":127,"description":102,"slug":100,"headline":103,"tagline":104,"hidden":19,"group_type":20,"sort_order":105,"category":38,"services":192,"serviceCategoryKey":106,"serviceCategoryImage":8},[],{"id":89,"name":130,"description":131,"image":8,"slug":132,"service_groups":194,"key":132,"title":130,"services":197},[195,196],{"id":135,"name":136,"name_en":137,"image":138,"description":139,"slug":137,"headline":140,"tagline":141,"hidden":19,"group_type":20,"sort_order":142,"category":89},{"id":144,"name":145,"name_en":146,"image":147,"description":148,"slug":146,"headline":149,"tagline":150,"hidden":19,"group_type":20,"sort_order":151,"category":89},[198,200],{"id":135,"name":136,"name_en":137,"image":154,"description":139,"slug":137,"headline":140,"tagline":141,"hidden":19,"group_type":20,"sort_order":142,"category":89,"services":199,"serviceCategoryKey":132,"serviceCategoryImage":8},[],{"id":144,"name":145,"name_en":146,"image":157,"description":148,"slug":146,"headline":149,"tagline":150,"hidden":19,"group_type":20,"sort_order":151,"category":89,"services":201,"serviceCategoryKey":132,"serviceCategoryImage":8},[],{"id":-1,"title":203,"slug":8,"excerpt":204,"content":205,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":209,"publishedAt":8,"readTime":211,"image":212,"tags":213,"tagsFa":218,"views":105},"طراحی پایپ لاین برای تست و دیپلوی سطح مبتدی با Gitlab CI/CD","در این مقاله سعی میکنیم یک سناریو ساده برای یک پروژه ساده پایتونی با فریمورک flask رو پیاده سازی کنیم. این سناریو سه مرحله تست, بیلد و استقرار یا دیپلوی پروژه و قرار دادن ان روی اینترنت رو خودکار سازی میکنه و همچنین در طراحی پایپ لاین ها خیلی مهم هست که نکات امنیتی و منطقی برای مدیریت سرور ها رعایت بشود چون در صورت وجود داشتن ایراد منطقی یا امنیتی ممکنه به مشکلات گسترده و مهمی بر بخوریم. ( مثل مدیریت نکردن نسخه های قدیمی که توسط پایپ لاین اجرا شدن که باعث درگیر شدن تمام منابع سرور و در نهایت غیر قابل دسترس شدن سرور و پایین اومدن سرویس میشه یا نشت اطلاعات حساس حین اجرای پایپ لاین که باعث بوجود اوردن دسترسی های سطح بالا بدون احراز هویت به دیگران میدهد)","\u003Ch1>&nbsp;\u003C/h1>\u003Cp>طراحی یک CI/CD (continuous integration/continuous delivery/deployment) برای هر پروژه ای یک نیاز حیاتی برای خودکار سازی فرایند های تست و بررسی تغییرات اعمال شده و اعمال کردن تغییرات جدید روی سرویس های در حال اجرا محصول است.\u003C/p>\u003Cp>در این مقاله سعی میکنیم یک سناریو ساده برای یک پروژه ساده پایتونی با فریمورک flask رو پیاده سازی کنیم. این سناریو سه مرحله تست, بیلد و استقرار یا دیپلوی پروژه و قرار دادن ان روی اینترنت رو خودکار سازی میکنه و همچنین در طراحی پایپ لاین ها خیلی مهم هست که نکات امنیتی و منطقی برای مدیریت سرور ها رعایت بشود چون در صورت وجود داشتن ایراد منطقی یا امنیتی ممکنه به مشکلات گسترده و مهمی بر بخوریم. ( مثل مدیریت نکردن نسخه های قدیمی که توسط پایپ لاین اجرا شدن که باعث درگیر شدن تمام منابع سرور و در نهایت غیر قابل دسترس شدن سرور و پایین اومدن سرویس میشه یا نشت اطلاعات حساس حین اجرای پایپ لاین که امکان بوجود اوردن دسترسی های سطح بالا بدون احراز هویت به دیگران میدهد)\u003C/p>\u003Cp>برای شروع یک سری مفاهیم پایه پایپ لاین نویسی در گیت لب رو مرور میکنیم\u003C/p>\u003Cp>تنظیمات پایپ لاین برای گیت لب باید در فایلی با این نام نوشته شود و تنظیمات کلی پایپ لاین هر پروژه را میتوان از این مسیر دنبال و بررسی کرد\u003C/p>\u003Cpre>\u003Ccode class=\"language-plaintext\">~/ ls\r\n├── app.py\r\n├── index.html\r\n├── .gitlab-ci.yml  # the pipeline configuration file\r\n└── Dockerfile\r\n\u003C/code>\u003C/pre>\u003Cp>هر پایپ لاین شامل جاب(job) های مختلف هست. جاب ها نشون دهنده تسک ها و عملیات های مختلفی هستن که قراره توسط گیتلب رانر (gitlab runner) اجرا بشه مثل جاب test, جاب build, جاب deploy\u003Cbr>برای تعریف کردن جاب به شکل زیر فایل گیتلب ci رو شروع میکنیم\u003C/p>\u003Cpre>\u003Ccode class=\"language-plaintext\">test_job:\r\n\timage: python:3.9-slim-bookworm\r\n\tstage: test\r\n\tbefore_script:\r\n\t\t- apt update &amp;&amp; apt install make -y\r\n\tscript: \r\n\t\t- echo \"doing test job\"\r\n\t\t- echo \"this is variable $VAR\" # رانر مقدار VAL را جایگزین خواهد کرد\r\n\t\t- make test\r\n\tafter_script:\r\n\t\t- echo \"runs after script\"\r\n\ttags:\r\n\t - docker\r\n\u003C/code>\u003C/pre>\u003Cp>نمونه بالا یک نمونه ساده از یک جاب برای ران کردن تست کیس های پروژه ازمایشی ما هست\u003C/p>\u003Cp>اگر در مورد Gitlab Runner چیزی نمیدونید میتونید از مقاله \u003Ca href=\"https://dornadevops.com/blog/devops/gitlab-runner-basics/\">نحوه راه اندازی و تنظیم Gitlab Runner\u003C/a> شروع کنید.\u003C/p>\u003Cp>برگردیم به پایپ لاینمون\u003Cbr>خط اول اسم جاب رو مشخص میکنیم\u003Cbr>خط دوم متغیر image هست که در صورت استفاده از داکر برای محیط اجرا شدن این جاب پایپ لاین ازش استفاده میکنیم و ایمیج داکری مورد نظرمون رو مشخص میکنیم\u003Cbr>خط سوم stage هست که در ادامه توضیحش میدیم\u003Cbr>خط بعدی before script هست که قبل از اجرا شدن دستورات script اجرا میشود\u003Cbr>و در نهایت خط اخر script هست که بصورت لیست یا ارایه مقادیر تعریف میشن براش و هر خط نشون دهنده دستوری هست که نیازه که به ترتیب اجرا بشه\u003C/p>\u003Cp>بطور کلی پایپ لاین مسیر زیر رو برای اجرا پیش میبره\u003Cbr>مرحله(stage) -&gt; جاب (job)\u003Cbr>پایپ‌لاین به&nbsp;\u003Ci>مرحله‌ها\u003C/i>&nbsp;تقسیم می‌شود که&nbsp;\u003Cstrong>به ترتیب\u003C/strong>&nbsp;اجرا می‌شوند; اگر یک مرحله شکست بخورد، مراحل بعدی اصلاً اجرا نمی‌شوند. هر مرحله شامل چند&nbsp;\u003Ci>جاب\u003C/i>&nbsp;است و جاب‌های داخل یک مرحله&nbsp;\u003Cstrong>به‌صورت موازی\u003C/strong>&nbsp;اجرا می‌شوند.\u003C/p>\u003Cfigure class=\"image image-style-align-center image_resized\" style=\"width:20.79%;\">\u003Cimg style=\"aspect-ratio:491/1084;\" src=\"https://api.dornadevops.com/media/articles/posts/mermaid-diagram.png\" width=\"491\" height=\"1084\">\u003C/figure>\u003Chr>\u003Cp>در ادامه به پایپ لاین طراحی شده نهایی میپردازیم و مفاهیم پیشرفته تر از طراحی پایپ لاین رو بررسی میکنیم\u003C/p>\u003Ch2>جاب تست\u003C/h2>\u003Cpre>\u003Ccode class=\"language-plaintext\">test_job:\r\n  stage: test\r\n  image: python:3.9-slim-bookworm\r\n  rules:\r\n    - if: $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == \"prod\"\r\n      variables:\r\n        BRANCH: \"merge test\"\r\n    - if: $CI_COMMIT_BRANCH == \"dev\"\r\n      variables:\r\n        BRANCH: \"dev\"\r\n    - if: $CI_COMMIT_BRANCH == \"prod\"\r\n      variables:\r\n        BRANCH: \"prod\"\r\n    - when: always\r\n      variables:\r\n        BRANCH: \"unknown\"\r\n  before_script:\r\n    - apt update\r\n    - apt install make -y\r\n  script:\r\n    - echo \"branch is $BRANCH\"\r\n    - make test\r\n  tags:\r\n    - docker\r\n\u003C/code>\u003C/pre>\u003Ch3>تعریف کردن rule در جاب ها\u003C/h3>\u003Cp>ما میتونیم برای هر جابی که توی پایپ لاین داریم شروطی مشخص کنیم که بتونیم از اون جاب بصورت کلی تر و جامع تری برای اتفاقات مختلفی که روی مخزن پروژه رخ میده استفاده کنیم. در اینجا در هر سناریویی یک دستور ساده اجرا میشه و دلیل قرار دادن شرط ها برای این جاب بیشتر جنبه اموزشی و بصورت واقعی مشاهده کردن اتفاقی هست که برای پایپ لاین میوفته (و البته اینکه برای سناریو مدنظرمون نیاز داشتیم که برای هر merge request رخ داده روی برنچ prod یک بار تست رو اجرا کنیم)\u003Cbr>برای نوشتن rule از متغیر های عمومی که گیت لب برای هر جاب تعریف میکنه میتونیم استفاده کنیم. لیست این متغیر ها به شکل زیر هست\u003C/p>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Variable\u003C/th>\u003Cth>Meaning\u003C/th>\u003Cth>Typical use in \u003Ccode>rules:\u003C/code>\u003C/th>\u003C/tr>\u003C/thead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Ccode>CI_COMMIT_BRANCH\u003C/code>\u003C/td>\u003Ctd>The branch name for branch pipelines. Empty for tag pipelines.\u003C/td>\u003Ctd>اجرای جاب فقط برای کامیت های یک برنچ\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_COMMIT_TAG\u003C/code>\u003C/td>\u003Ctd>The tag name for tag pipelines. Empty for branch pipelines.\u003C/td>\u003Ctd>Run jobs only for releases/tags.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_PIPELINE_SOURCE\u003C/code>\u003C/td>\u003Ctd>What started the pipeline, like \u003Ccode>push\u003C/code>, \u003Ccode>merge_request_event\u003C/code>, \u003Ccode>schedule\u003C/code>, \u003Ccode>web\u003C/code>, or \u003Ccode>api\u003C/code>.\u003C/td>\u003Ctd>Differentiate push vs MR vs scheduled pipelines.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_COMMIT_REF_NAME\u003C/code>\u003C/td>\u003Ctd>The branch or tag name of the ref being built.\u003C/td>\u003Ctd>Match a ref without caring whether it is a branch or tag.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_DEFAULT_BRANCH\u003C/code>\u003C/td>\u003Ctd>Your project’s default branch, usually \u003Ccode>main\u003C/code> or \u003Ccode>master\u003C/code>.\u003C/td>\u003Ctd>Run jobs only on the default branch.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_MERGE_REQUEST_ID\u003C/code>\u003C/td>\u003Ctd>Present in merge request pipelines.\u003C/td>\u003Ctd>Detect MR pipelines.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_MERGE_REQUEST_SOURCE_BRANCH_NAME\u003C/code>\u003C/td>\u003Ctd>Source branch name of the merge request.\u003C/td>\u003Ctd>Target a specific MR source branch.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_MERGE_REQUEST_TARGET_BRANCH_NAME\u003C/code>\u003C/td>\u003Ctd>Target branch of the merge request.\u003C/td>\u003Ctd>Run only when an MR targets a branch like \u003Ccode>main\u003C/code>.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_OPEN_MERGE_REQUESTS\u003C/code>\u003C/td>\u003Ctd>Indicates open merge requests for the branch.\u003C/td>\u003Ctd>Avoid duplicate branch pipelines when an MR exists.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_COMMIT_REF_PROTECTED\u003C/code>\u003C/td>\u003Ctd>\u003Ccode>true\u003C/code> if the ref is protected.\u003C/td>\u003Ctd>Restrict jobs to protected branches/tags.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_COMMIT_MESSAGE\u003C/code>\u003C/td>\u003Ctd>Full commit message.\u003C/td>\u003Ctd>Skip or run jobs based on message text.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_COMMIT_TITLE\u003C/code>\u003C/td>\u003Ctd>First line of the commit message.\u003C/td>\u003Ctd>Match commit titles for special behavior.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_PROJECT_PATH\u003C/code>\u003C/td>\u003Ctd>Namespace/project path like \u003Ccode>group/project\u003C/code>.\u003C/td>\u003Ctd>Limit jobs to specific projects in templates.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_PROJECT_NAMESPACE\u003C/code>\u003C/td>\u003Ctd>Top-level namespace or group.\u003C/td>\u003Ctd>Apply rules across a group of projects.\u003C/td>\u003C/tr>\u003Ctr>\u003Ctd>\u003Ccode>CI_SERVER_HOST\u003C/code>\u003C/td>\u003Ctd>GitLab host name.\u003C/td>\u003Ctd>Adjust behavior for self-managed vs SaaS setups.\u003C/td>\u003C/tr>\u003C/tbody>\u003C/table>\u003C/figure>\u003Cp>قواعد از بالا به پایین ارزیابی می‌شوند اولین تطابق برنده است\u003C/p>\u003Cp>اگر هیچ قاعده‌ای تطابق نکند و Fallback هم نباشد، \u003Cstrong>آن جاب به‌سادگی به پایپ‌لاین اضافه نمی‌شود\u003C/strong>. این خطا نیست؛ یک ویژگی است که در جاب دیپلوی از آن سوءاستفاده خواهیم کرد.\u003C/p>\u003Cp>از روش هایی که توی rules پایپ لاین استفاده میشود مشخص کردن variable در صورت وارد شدن اون شرط بخصوص هست که توی این جاب نحوه طراحی و تنظیم کردن این رفتار رو میتونید ببینید\u003Cbr>در مورد شرط اخر \u003Ccode>when: always\u003C/code> هم نوعی مفهوم else توی بلاک های شرط برنامه نویسی رو داره و وقتی اجرا میشه که هیچکدوم از شرط ها موفق نبوده باشن، این Rule نقش یک fallback را دارد و اگر هیچ‌کدام از Ruleهای قبلی match نشوند، Job را با \u003Ccode>BRANCH=unknown\u003C/code> وارد Pipeline می‌کند.\u003C/p>\u003Ch2>جاب دیپلوی\u003C/h2>\u003Cpre>\u003Ccode class=\"language-plaintext\">build_and_deploy:\r\n  stage: buildanddeploy\r\n  rules:\r\n    - if: $CI_COMMIT_BRANCH == \"dev\"\r\n      variables:\r\n        BRANCH: \"dev\"\r\n        DEPLOY_PORT: 5000\r\n    - if: $CI_COMMIT_BRANCH == \"prod\"\r\n      variables:\r\n        BRANCH: \"prod\"\r\n        DEPLOY_PORT: 6000\r\n  before_script:\r\n    - chmod 400 $SSH_KEY\r\n    - tar -czf pipeline-files.tar.gz $(git ls-files)\r\n    - scp -o StrictHostKeyChecking=no -i \"$SSH_KEY\" pipeline-files.tar.gz root@203.0.113.10:/root/\r\n  script:\r\n    - |\r\n      ssh -o StrictHostKeyChecking=no -i \"$SSH_KEY\" root@203.0.113.10 \"\r\n        mkdir -p /root/deploy &amp;&amp; tar -xzf /root/pipeline-files.tar.gz -C /root/deploy &amp;&amp; cd /root/deploy\r\n        docker ps -aq --filter name=python-app-$BRANCH | xargs -r docker stop &amp;&amp;\r\n        docker ps -aq --filter name=python-app-$BRANCH | xargs -r docker rm &amp;&amp;\r\n        docker build -t python-proj-$BRANCH . &amp;&amp;\r\n        docker run --name python-app-$BRANCH --restart unless-stopped -p $DEPLOY_PORT:5000 -d python-proj-$BRANCH\"\r\n  tags:\r\n    - shell\r\n\u003C/code>\u003C/pre>\u003Cp>نکاتی که در وهله اول در مورد این جاب به چشم میخورد یکی این هست که مقداری برای image مشخص نشده. دلیل این موضوع اینه که تگ این جاب رو برای تسک خاصی که نیازه انجام بده روی shell تنظیم کردیم و دستورات مستقیما روی ماشین گیتلب رانر اجرا خواهد شد و نیازی به اجرای کانتینر و محیط ایزوله شده نیست\u003C/p>\u003Cp>نکته دوم توی تعریف rule ها هست که بدون شرط else نوشته شده این یک الگوی امنیتی هست که به دلیل اهمیت بالای دیپلوی کردن روی سرور اصلی باید مطمین باشیم که خارج از شروط تعریف شده این جاب اجرا نشود\u003C/p>\u003Cp>نکته سوم ساختار اسکریپت و استفاده از متغیر ها درون اسکریپت و الگوی before_script هست\u003Cbr>کاری که ما میخوایم توی این جاب انجام بدیم اینه که از توی ماشین گیتلب رانر که کل محتوای پروژه رو در محیطش داره برداریم و به سرور منتقل کنیم و از اونجا فرایند بیلد کردن ایمیج و دیپلوی کردن اون رو انجام بدیم (به دلیل پیچیدگی و دسترسی های امنیتی بالایی که روش docker in docker داره از این راه استفاده میکنیم). برای انتقال محتوای اپدیت شده بعد از کامیت یا هر ایونت دیگری که باعث ران شدن پایپ لاین شده از دستور tar استفاده میکنیم\u003C/p>\u003Cp>خط \u003Ccode>\u003Cstrong>tar -czf pipeline-files.tar.gz $(git ls-files)\u003C/strong>\u003C/code> بسته‌بندی پروژه. \u003Ccode>git ls-files\u003C/code> لیست فایل‌هایی را که Git در حال track کردن آن‌هاست برمی‌گرداند؛ بنابراین فایل‌های untracked، از جمله فایل‌هایی که توسط \u003Ccode>.gitignore\u003C/code> نادیده گرفته شده‌اند، در این خروجی قرار نمی‌گیرند.\u003C/p>\u003Cp>بعد از درست شدن فایل فشرده شده اون رو با دستور scp به سرور منتقل میکنیم که در این دستور هم از دو اپشن -i و StrictHostKeyChecking=no استفاده میکنیم تا تعاملی بودن فرایند انتقال فایل به سرور رو بطور کامل حذف کنیم (چون در پایپ لاین تسک های تعاملی بطور کامل جاب را قفل و پایپ لاین را fail میکنن)\u003C/p>\u003Cp>در این مثال برای جلوگیری از interactive prompt از \u003Ccode>StrictHostKeyChecking=no\u003C/code> استفاده شده، اما این گزینه از نظر امنیتی ایده‌آل نیست، چون بررسی معمول host key را غیرفعال می‌کند. در محیط production بهتر است host key سرور مقصد در \u003Ccode>known_hosts\u003C/code> Runner ثبت و اعتبارسنجی شود.\u003C/p>\u003Cp>فلگ -i هم برای پاس دادن مسیر ssh key برای اتصال مستقیم بدون نیاز به پسورد هست که در مقاله \u003Ca href=\"https://dornadevops.com/blog/devops/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%88-%D8%AA%D8%B2%D8%B1%DB%8C%D9%82-ssh-key-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D9%BE%D9%84%D8%A7%DB%8C%D9%86%D9%87%D8%A7%DB%8C-cicd-%DA%AF%DB%8C%D8%AA%D9%84%D8%A8/\">نحوه اضافه کردن SSH KEY به پایپ لاین\u003C/a> نکات انجام دادن این کار رو توضیح دادیم\u003C/p>\u003Cp>بعد از این کار فرایند انتقال فایل های بروز شده پروژه به سرور انجام میشه و ما به مرحله بعد یعنی اجرای دستورات بیلد و دیپلوی میرسیم\u003Cbr>تو این مرحله هم در ابتدا به مسیری که فایل tar پروژه رو ارسال کرده بودیم میریم و بعد با دستور tar اون رو از حالت فشرده شده درمیاریم. بعد از اون با دستورات docker بررسی میکنیم که اگر ایمیج یا کانتینری از نوع و نام کانتینر مورد نظرمون در حال اجرا هست اول stop و سپس remove بشه تا تداخلی برای اجرای دوباره نسخه جدیدتر اون وجود نداشته باشه\u003Cbr>و بعد از متغیر هایی که توی rule ها ساخته و مقدار دهی میشن با توجه به شرایطی که رخ داده ایمیج مورد نظرمون رو با اسم و روی پورت مشخص شده بالا میاریم.\u003C/p>\u003Cp>این روش برای ساده نگه داشتن سناریوی آموزشی انتخاب شده و برای deploymentهای production در مقیاس بزرگ، استفاده از Container Registry و pull کردن image روی سرور معمولاً معماری مناسب‌تری است.\u003C/p>\u003Cp>مواظب کوتیشن‌هایتان در SSH باشید\u003C/p>\u003Cp>دستور SSH عمداً داخل \u003Cstrong>دابل‌کوتیشن\u003C/strong> قرار گرفته است. با سینگل‌کوتیشن، \u003Ccode>$BRANCH\u003C/code> و \u003Ccode>$DEPLOY_PORT\u003C/code> به‌صورت تحت‌اللفظی به سرور راه دور فرستاده می‌شدند — که هیچ‌خبری از این متغیرها ندارد — و به رشته خالی باز می‌شدند. دابل‌کوتیشن به شل \u003Ci>رانر\u003C/i> اجازه می‌دهد مقادیر را \u003Ci>قبل\u003C/i> از سفر دستور روی SSH جایگذاری کند.\u003C/p>\u003Chr>\u003Ch2>یک پایپ‌لاین برای همه برنچ‌ها\u003C/h2>\u003Cp>در ساختاری که تا اینجا دیدیم یک تله نگهداری پنهان است: \u003Ccode>.gitlab-ci.yml\u003C/code> \u003Ci>داخل هر برنچ\u003C/i> زندگی می‌کند. اگر باگی در پایپ‌لاین روی \u003Ccode>dev\u003C/code> درست کنید، باید یادتان باشد آن فیکس را به \u003Ccode>prod\u003C/code> هم مرج کنید، وگرنه دو برنچ کم‌کم به سمت اجرای اتوماسیون‌های متفاوت منحرف می‌شوند.\u003C/p>\u003Cp>راه‌حل: منطق واقعی پایپ‌لاین را یک جا متمرکز کنید و \u003Ccode>.gitlab-ci.yml\u003C/code> هر برنچ را به یک اشاره‌گر نازک تبدیل کنید:\u003C/p>\u003Cpre>\u003Ccode class=\"language-plaintext\"># .gitlab-ci.yml on dev, prod, and any other branch\r\ninclude:\r\n  - project: $CI_PROJECT_PATH # 'your-group/your-project'\r\n    ref: main\r\n    file: '/ci/pipeline.yml'\r\n\u003C/code>\u003C/pre>\u003Cp>حالا منطق پایپ‌لاین دقیقاً در یک فایل زندگی می‌کند (\u003Ccode>ci/pipeline.yml\u003C/code> روی \u003Ccode>main\u003C/code>) و هر برنچ، در اجرای بعدی‌اش، تغییرات را خودکار می‌گیرد.\u003C/p>\u003Ch2>جمع‌بندی\u003C/h2>\u003Cp>در این مقاله یک سناریوی ساده اما واقعی از طراحی CI/CD با GitLab را پیاده‌سازی کردیم؛ از اجرای تست‌ها در یک محیط Docker گرفته تا استفاده از \u003Ccode>rules\u003C/code> برای کنترل نحوه اجرای Jobها و در نهایت انتقال و استقرار نسخه جدید روی سرور با SSH و Docker.\u003C/p>\u003Cp>هدف اصلی این بود که علاوه بر نوشتن دستورات Pipeline، با بخشی از تصمیم‌های مهم در طراحی آن هم آشنا شویم؛ مثل محدود کردن Jobهای حساس، مدیریت متغیرها، توجه به امنیت اتصال SSH و در نظر گرفتن مشکلاتی که ممکن است هنگام Deployment رخ دهد.\u003C/p>\u003Cp>این سناریو نقطه شروعی برای Pipelineهای پیچیده‌تر است و در پروژه‌های واقعی می‌توان آن را با مفاهیمی مانند \u003Ccode>artifacts\u003C/code>، \u003Ccode>cache\u003C/code>، Container Registry و روش‌های پیشرفته‌تر Deployment توسعه داد.\u003C/p>","devops","دواپس","https://api.dornadevops.com/media/articles/category/images/devops.png",{"name":210,"avatar":8,"firstName":8,"lastName":8},"شهیار کمالی",30,"https://api.dornadevops.com/media/articles/images/ChatGPT_Image_Sep_5_2026_06_22_11_AM.png",[214,215,216,217],"GitLab","GitOps","gitlab runner","pipeline",[219,221,223,225],{"name":220,"name_en":214},"گیت‌لب",{"name":222,"name_en":215},"گیت‌اپس (GitOps)",{"name":224,"name_en":216},"گیت لب رانر",{"name":226,"name_en":217},"پایپ لاین",{"articles":228,"count":230,"next":564,"previous":564},[229,238,248,258,268,276,289,300,312,322,332,344,354,365,375,384,396,408,420,429,438,447,456,464,473,484,492,501,509,518,526,537,546,555],{"id":230,"title":203,"slug":231,"excerpt":204,"content":204,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":232,"publishedAt":235,"readTime":211,"image":212,"tags":236,"tagsFa":237,"views":105},34,"gitlab-cicd-pipeline-design",{"name":210,"avatar":8,"firstName":233,"lastName":234},"شهیار","کمالی","1405-06-14",[],[],{"id":239,"title":240,"slug":241,"excerpt":242,"content":242,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":243,"publishedAt":244,"readTime":135,"image":245,"tags":246,"tagsFa":247,"views":105},33,"راه‌اندازی رجیستری خصوصی داکر با Nexus Repository Manager","local-docker-registery-setup-on-nexus","وقتی یک تیم چند نفره روی چند پروژه کار می‌کنه، هر  docker pull یعنی دانلود مجدد از اینترنت: هم کند، هم مصرف پهنای باند، هم گیر کردن روی محدودیت‌های شبکه و rate limit داکرهاب. از طرف دیگه ایمیج‌هایی که خودمون می‌سازیم باید جایی نگه‌داری بشن که تحت کنترل ما باشه.\r\n\r\nدر این مقاله سه ریپوی داکر در نکسوس می‌سازیم و به هم وصل می‌کنیم:\r\n\r\n- یک proxy که واسط و کش داکرهاب می‌شه\r\n- یک hosted که رجیستری خصوصی ایمیج‌های خودمونه\r\n- یک group که هر دو رو زیر یک آدرس واحد جمع می‌کنه",{"name":210,"avatar":8,"firstName":233,"lastName":234},"1405-05-27","https://api.dornadevops.com/media/articles/images/B8-ESdR4WB-CTxJzTk1HInyVV9k-NwlpdjXXSRamUPh4twb2SQ.png",[],[],{"id":249,"title":250,"slug":251,"excerpt":252,"content":252,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":253,"publishedAt":244,"readTime":254,"image":255,"tags":256,"tagsFa":257,"views":105},32,"نحوه راه اندازی nexus repository manager","how-to-install-nexus-repository-manager","وقتی روی یک سرور چند تا پروژه داریم یا یک تیم چند نفره روی یک محصول کار می‌کنه، هر بار دانلود شدن پکیج‌ها و ایمیج‌ها از اینترنت هم وقت می‌گیره هم پهنای باند مصرف می‌کنه؛ بعضی وقت‌ها هم به خاطر محدودیت‌های شبکه یا تحریم‌ها اصلاً به رجیستری‌های اصلی مثل Docker Hub دسترسی نداریم. برای حل این مشکل، بهترین گزینه راه‌اندازی یک ریپازیتوری منیجر داخلیه؛ سیستمی که هم می‌تونه واسط بین ما و رجیستری‌های عمومی باشه (پروکسی و کش) و هم ریپوی خصوصی خودمون برای ایمیج‌ها و پکیج‌هایی باشه که خودمون ساختیم.\r\n\r\nدر این مقاله قدم به قدم Nexus Repository Manager رو روی یک سرور اوبونتو راه‌اندازی می‌کنیم؛ از استخراج فایل نصب و ساخت کاربر اختصاصی و سرویس systemd گرفته تا اولین ورود به رابط وب، گرفتن پسورد ادمین و آشنایی با محیط نکوس رو باهم پیش میبریم",{"name":210,"avatar":8,"firstName":233,"lastName":234},6,"https://api.dornadevops.com/media/articles/images/ChatGPT_Image_Aug_18_2026_04_59_49_AM.png",[],[],{"id":259,"title":260,"slug":261,"excerpt":262,"content":262,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":263,"publishedAt":244,"readTime":264,"image":265,"tags":266,"tagsFa":267,"views":105},31,"نحوه فعال کردن https  و مدیریت سرتیفیکیت دامنه با nginx","how-to-enable-https-with-nginx","بیشتر آموزش‌های فعال‌سازی HTTPS روی Nginx به شما می‌گویند دستور certbot --nginx -d example.com را اجرا کنید و تمام! این روش کار می‌کند اما اولین باری که چیزی خراب شود، گم می‌شوید؛ چون هیچ‌وقت نفهمیده‌اید آن دستور در واقع چه کاری انجام داده است.\r\n\r\nاین مقاله مسیر متفاوتی را طی می‌کند. ابتدا می‌فهمیم پشت صحنه چه می‌گذرد، بعد با دستورهای خام Certbot (بدون افزونه Nginx) گواهی می‌گیریم و آن را خودمان به کانفیگ Nginx وصل می‌کنیم. فقط بعد از این مراحل، سراغ آن یک دستور جادویی می‌رویم که همه کارها را خودکار می‌کند و در آن لحظه دقیقاً می‌دانید چه کاری برایتان انجام می‌دهد.",{"name":210,"avatar":8,"firstName":233,"lastName":234},20,"https://api.dornadevops.com/media/articles/images/ChatGPT_Image_Aug_18_2026_05_17_10_AM.png",[],[],{"id":211,"title":269,"slug":270,"excerpt":271,"content":271,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":272,"publishedAt":244,"readTime":53,"image":273,"tags":274,"tagsFa":275,"views":105},"راه اندازی ریورس پروکسی در nginx","reverse-proxy-nginx-setup","فرض کنید می‌خواهیم چندین سرویس مختلف را روی یک سرور واحد و از روی پورت عادی 80 سرو کنیم. مشکلی که به آن برمی‌خوریم این است که نمی‌شود چندین سرویس روی یک پورت یکسان پاسخگو باشند و قطعاً به ارور مشغول بودن آن پورت (port already in use) برمی‌خوریم. در این مقاله به آموزش نحوه استفاده از راه حل وب سرور nginx برای این مشکل به اسم reverse proxy میپردازیم و نگاهی کلی به اینکه چطور nginx رو کانفیگ کنیم و ساختارش چطوریه میندازیم",{"name":210,"avatar":8,"firstName":233,"lastName":234},"https://api.dornadevops.com/media/articles/images/ChatGPT_Image_Aug_18_2026_05_05_00_AM.png",[],[],{"id":277,"title":278,"slug":279,"excerpt":280,"content":280,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":281,"publishedAt":285,"readTime":264,"image":286,"tags":287,"tagsFa":288,"views":105},29,"طراحی سیستم‌های Highly Available چیست؟ راهنمای کامل معماری‌های در دسترس‌پذیر","highly-available-system-design-guide-2026","طراحی سیستم‌های Highly Available یعنی ساخت معماری‌هایی که در برابر خرابی‌های روزمره، outage و failover مقاوم باشند. در این مقاله HA را عمیق بررسی می‌کنیم.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"الیاس پوررجب","الیاس","پوررجب","1405-02-26","https://api.dornadevops.com/media/articles/images/highly-available-system-design-2026.jpg.png",[],[],{"id":290,"title":291,"slug":292,"excerpt":293,"content":293,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":294,"publishedAt":295,"readTime":296,"image":297,"tags":298,"tagsFa":299,"views":105},28,"SRE چیست؟ راهنمای کامل Site Reliability Engineering در سیستم‌های مدرن","sre-site-reliability-engineering-guide-2026","SRE یا Site Reliability Engineering رویکردی مهندسی برای ساخت و نگهداری سیستم‌های قابل‌اعتماد، مقیاس‌پذیر و پایدار است. در این مقاله SRE را کامل بررسی می‌کنیم.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-25",18,"https://api.dornadevops.com/media/articles/images/sre-site-reliability-engineering-2026.jpg.png",[],[],{"id":301,"title":302,"slug":303,"excerpt":304,"content":304,"categoryId":71,"categorySlug":132,"categoryTitle":305,"categoryImage":306,"author":307,"publishedAt":295,"readTime":308,"image":309,"tags":310,"tagsFa":311,"views":105},27,"SLA چیست؟ راهنمای کامل Service Level Agreement در خدمات ابری","what-is-sla-cloud-service-level-agreement-2026","SLA یا Service Level Agreement قرارداد سطح خدمت در cloud است که uptime، service credit، scope و مسئولیت‌ها را مشخص می‌کند. در این مقاله SLA را کامل بررسی می‌کنیم.","امنیت","https://api.dornadevops.com/media/articles/category/images/security.jpeg",{"name":282,"avatar":8,"firstName":283,"lastName":284},15,"https://api.dornadevops.com/media/articles/images/sla-cloud-service-level-agreement-2026.jpg.png",[],[],{"id":313,"title":314,"slug":315,"excerpt":316,"content":316,"categoryId":71,"categorySlug":132,"categoryTitle":305,"categoryImage":306,"author":317,"publishedAt":318,"readTime":264,"image":319,"tags":320,"tagsFa":321,"views":105},26,"Network Firewall چیست؟ معرفی کامل فایروال شبکه و بهترین فایروال‌های جهان در ۲۰۲۶","what-is-network-firewall-best-firewalls-2026","Network Firewall لایه‌ای کلیدی برای کنترل ترافیک بین شبکه‌های قابل‌اعتماد و غیرقابل‌اعتماد است. در این مقاله، فایروال شبکه را عمیق بررسی می‌کنیم و بهترین گزینه‌های جهان را معرفی می‌کنیم.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-24","https://api.dornadevops.com/media/articles/images/network-firewall-best-firewalls-2026.jpg.png",[],[],{"id":323,"title":324,"slug":325,"excerpt":326,"content":326,"categoryId":71,"categorySlug":132,"categoryTitle":305,"categoryImage":306,"author":327,"publishedAt":318,"readTime":328,"image":329,"tags":330,"tagsFa":331,"views":105},25,"WAF چیست؟ معرفی کامل Web Application Firewall و بهترین WAFهای جهان","what-is-waf-best-waf-2026","WAF یا Web Application Firewall لایه‌ای امنیتی برای محافظت از وب‌اپلیکیشن‌ها در برابر حملات HTTP و HTTPS است. در این مقاله، WAF را کامل بررسی می‌کنیم و بهترین WAFهای جهان را معرفی می‌کنیم.",{"name":282,"avatar":8,"firstName":283,"lastName":284},17,"https://api.dornadevops.com/media/articles/images/what-is-waf-web-application-firewall-best-waf-2026.jpg.png",[],[],{"id":333,"title":334,"slug":335,"excerpt":336,"content":336,"categoryId":80,"categorySlug":337,"categoryTitle":338,"categoryImage":339,"author":340,"publishedAt":318,"readTime":135,"image":341,"tags":342,"tagsFa":343,"views":105},24,"گارد قرمز چیست؟ راهکار حرفه‌ای برای انسداد درخواست‌های خارجی وردپرس و افزایش سرعت پیشخوان","red-guard-wordpress-external-requests","افزونه گارد قرمز برای انسداد درخواست‌های خارجی وردپرس و افزایش سرعت پیشخوان سایت","wordpress","وردپرس","https://api.dornadevops.com/media/articles/category/images/wordpress.jpeg",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/red-guard-wordpress-external-requests-2026.jpg.png",[],[],{"id":345,"title":346,"slug":347,"excerpt":348,"content":348,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":349,"publishedAt":318,"readTime":350,"image":351,"tags":352,"tagsFa":353,"views":105},23,"GitLab چیست؟ ستون فقرات DevOps و CI/CD مدرن برای تیم‌های ایرانی","gitlab-devops-ci-cd-platform-iran","GitLab یک پلتفرم کامل DevOps برای مدیریت repository، CI/CD، Container Registry و Platform Engineering است که با زیرساخت داخلی، سرعت و پایداری بیشتری برای تیم‌های ایرانی فراهم می‌کند.",{"name":282,"avatar":8,"firstName":283,"lastName":284},14,"https://api.dornadevops.com/media/articles/images/gitlab-devops-platform-cloudnative-ci-cd-iran.jpg.png",[],[],{"id":355,"title":356,"slug":357,"excerpt":358,"content":358,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":359,"publishedAt":360,"readTime":361,"image":362,"tags":363,"tagsFa":364,"views":105},22,"آینده DevOps در عصر هوش مصنوعی ۲۰۲۶","future-of-devops-ai-agentic-2026","آینده DevOps به سمت AI-Native Delivery، agentic workflows، observability هوشمند و عملیات نیمه‌خودمختار مبتنی بر AI و Platform Engineering حرکت می‌کند.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-22",16,"https://api.dornadevops.com/media/articles/images/future-devops-ai-agentic-cloud-native-2026.jpg.png",[],[],{"id":366,"title":367,"slug":368,"excerpt":369,"content":369,"categoryId":71,"categorySlug":132,"categoryTitle":305,"categoryImage":306,"author":370,"publishedAt":371,"readTime":296,"image":372,"tags":373,"tagsFa":374,"views":105},21,"OS Hardening چیست؟ راهنمای جامع امن‌سازی سیستم‌عامل در ۲۰۲۶","os-hardening-guide-2026","OS Hardening مجموعه‌ای از تکنیک‌های چندلایه برای کاهش سطح حمله، محدودسازی دسترسی‌ها و مقاوم‌سازی سیستم‌عامل در برابر نفوذ است.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-18","https://api.dornadevops.com/media/articles/images/os-hardening-linux-security-cloud-native-2026.jpg.png",[],[],{"id":264,"title":376,"slug":377,"excerpt":378,"content":378,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":379,"publishedAt":380,"readTime":355,"image":381,"tags":382,"tagsFa":383,"views":105},"Prometheus و Grafana چیست؟ راهنمای کامل Observability در Cloud-Native","prometheus-grafana-observability-cloud-native","Prometheus و Grafana ستون‌های اصلی Observability هستند که متریک‌ها را جمع می‌کنند، تحلیل می‌کنند و به داشبوردهای عملیاتی و هشدارهای قابل‌اقدام تبدیل می‌کنند.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-16","https://api.dornadevops.com/media/articles/images/prometheus-grafana-observability-cloud-native-2026.jpg.png",[],[],{"id":385,"title":386,"slug":387,"excerpt":388,"content":388,"categoryId":254,"categorySlug":389,"categoryTitle":390,"categoryImage":391,"author":392,"publishedAt":380,"readTime":264,"image":393,"tags":394,"tagsFa":395,"views":105},19,"cPanel چیست؟ راهنمای کامل مدیریت سرور و هاست","cpanel-server-hosting-management-guide","cPanel همه‌چیز مدیریت هاست و سرور لینوکسی را در یک داشبورد ساده و قدرتمند جمع می‌کند؛ از سایت و ایمیل تا امنیت و اتوماسیون.","cpanel","سیپنل","https://api.dornadevops.com/media/articles/category/images/cpanel.png",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/cpanel-hosting-control-panel-dashboard-2026_vzAoNcZ.jpg.png",[],[],{"id":296,"title":397,"slug":398,"excerpt":399,"content":399,"categoryId":98,"categorySlug":400,"categoryTitle":401,"categoryImage":402,"author":403,"publishedAt":404,"readTime":328,"image":405,"tags":406,"tagsFa":407,"views":105},"DefectDojo چیست؟ راهنمای کامل مدیریت آسیب‌پذیری در DevSecOps","defectdojo-vulnerability-management-devsecops","DefectDojo گزارش‌های امنیتی پراکنده را به یک مرکز فرماندهی واحد تبدیل می‌کند تا آسیب‌پذیری‌ها سریع‌تر، دقیق‌تر و قابل‌ردیابی‌تر مدیریت شوند.","devsecops","DevSecOps","https://api.dornadevops.com/media/articles/category/images/devsecops.jpeg",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-13","https://api.dornadevops.com/media/articles/images/defectdojo-vulnerability-management-devsecops-2026.jpg.png",[],[],{"id":328,"title":409,"slug":410,"excerpt":411,"content":411,"categoryId":71,"categorySlug":132,"categoryTitle":305,"categoryImage":306,"author":412,"publishedAt":416,"readTime":5,"image":417,"tags":418,"tagsFa":419,"views":105},"آسیب‌پذیری بسیار مهم در cPanel – هشدار امنیتی درباره CVE‑2026‑41940","cpanel-cve-2026-41940-security-alert","با انتشار آسیب‌پذیری CVE‑2026‑41940 برای cPanel، سرورهایی که هنوز روی نسخه‌های قدیمی‌تر از آخرین نسخه امن هستند در معرض تهدید جدی قرار گرفته‌اند. این آسیب‌پذیری می‌تواند امنیت کامل سرویس را به خطر بیندازد.",{"name":413,"avatar":8,"firstName":414,"lastName":415},"درنا ادمین","درنا","ادمین","1405-02-12","https://api.dornadevops.com/media/articles/images/cpanel-vuln.png",[],[],{"id":361,"title":421,"slug":422,"excerpt":423,"content":423,"categoryId":98,"categorySlug":400,"categoryTitle":401,"categoryImage":402,"author":424,"publishedAt":425,"readTime":144,"image":426,"tags":427,"tagsFa":428,"views":105},"GitLeaks چیست؟ ابزار شناسایی Secrets در Git","what-is-gitleaks-sast-secret-detection","GitLeaks ابزار متن‌باز برای شناسایی رمزها و API Keyهای لو رفته در Git است که قبل از انتشار، جلوی نشت اطلاعات حساس را می‌گیرد.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-09","https://api.dornadevops.com/media/articles/images/gitleaks-git-secrets-scanner-security.jpg.png",[],[],{"id":308,"title":430,"slug":431,"excerpt":432,"content":432,"categoryId":98,"categorySlug":400,"categoryTitle":401,"categoryImage":402,"author":433,"publishedAt":434,"readTime":12,"image":435,"tags":436,"tagsFa":437,"views":105},"Semgrep چیست؟ ابزار سریع SAST برای امنیت کد و DevSecOps","semgrep-sast-devsecops","ابزار Semgrep با اسکن سریع کد، باگ‌ها، آسیب‌پذیری‌ها و secrets را قبل از اجرا پیدا می‌کند و امنیت را وارد جریان توسعه می‌کند.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-07","https://api.dornadevops.com/media/articles/images/semgrep-sast-code-security-devsecops.jpg.png",[],[],{"id":350,"title":439,"slug":440,"excerpt":441,"content":441,"categoryId":98,"categorySlug":400,"categoryTitle":401,"categoryImage":402,"author":442,"publishedAt":443,"readTime":264,"image":444,"tags":445,"tagsFa":446,"views":105},"DevSecOps در ۲۰۲۶؛ تزریق امنیت به CI/CD و کلود","devsecops-2026-security-in-ci-cd-cloud","چطور امنیت را از ابتدا وارد CI/CD و زیرساخت ابری کنیم بدون اینکه سرعت توسعه قربانی شود؟",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-02","https://api.dornadevops.com/media/articles/images/devsecops-security-ci-cd-cloud-2026_hnouteW.png",[],[],{"id":448,"title":449,"slug":450,"excerpt":451,"content":451,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":452,"publishedAt":443,"readTime":296,"image":453,"tags":454,"tagsFa":455,"views":105},13,"CI/CD در ۲۰۲۶؛ از صفر تا دیپلوی بدون قطعی","ci-cd-2026-zero-downtime-deployment","از پایه تا حرفه‌ای یاد بگیرید چطور بدون قطعی روی سرور ابری دیپلوی کنید.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/ci-cd-zero-downtime-cloud-deployment.png",[],[],{"id":135,"title":457,"slug":458,"excerpt":459,"content":459,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":460,"publishedAt":443,"readTime":361,"image":461,"tags":462,"tagsFa":463,"views":105},"ابزارهای DevOps در ۲۰۲۶؛ معرفی کامل و کاربردی","devops-tools-2026-complete-guide","بهترین ابزارهای DevOps را بشناسید و بفهمید هرکدام دقیقاً کجا استفاده می‌شوند.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/devops-tools-list-2026-cloud.png",[],[],{"id":144,"title":465,"slug":466,"excerpt":467,"content":467,"categoryId":53,"categorySlug":206,"categoryTitle":207,"categoryImage":208,"author":468,"publishedAt":469,"readTime":296,"image":470,"tags":471,"tagsFa":472,"views":105},"DevOps چیست؟ راهنمای کامل از صفر تا حرفه‌ای (۲۰۲۶)","what-is-devops-complete-guide-2026","از تعریف تا ابزارها و مسیر یادگیری DevOps را یک‌جا و حرفه‌ای یاد بگیرید.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-02-01","https://api.dornadevops.com/media/articles/images/what-is-devops-cloud-architecture-2026.png",[],[],{"id":12,"title":474,"slug":475,"excerpt":476,"content":476,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":480,"publishedAt":469,"readTime":12,"image":481,"tags":482,"tagsFa":483,"views":105},"تغییر دامنه در DirectAdmin؛ سریع و بدون دردسر","change-domain-directadmin-guide","دامنه سایت را در DirectAdmin بدون خطا و از دست رفتن اطلاعات تغییر دهید.","directadmin","دایرکت ادمین","https://api.dornadevops.com/media/articles/category/images/directadmin.jpg",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/directadmin-change-domain-tutorial.jpg",[],[],{"id":80,"title":485,"slug":486,"excerpt":487,"content":487,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":488,"publishedAt":469,"readTime":12,"image":489,"tags":490,"tagsFa":491,"views":105},"نصب SSL رایگان در DirectAdmin؛ امن‌سازی فوری سایت","install-free-ssl-directadmin","در چند دقیقه SSL رایگان نصب کنید و امنیت سایت را تضمین کنید.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/directadmin-free-ssl-install.jpg",[],[],{"id":71,"title":493,"slug":494,"excerpt":495,"content":495,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":496,"publishedAt":497,"readTime":144,"image":498,"tags":499,"tagsFa":500,"views":105},"ساخت DNS اختصاصی برای دامنه؛ راهنمای کامل","create-custom-dns-domain-guide","یاد بگیرید DNS اختصاصی بسازید و کنترل کامل دامنه را در دست بگیرید.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-01-31","https://api.dornadevops.com/media/articles/images/custom-dns-setup-domain.jpg",[],[],{"id":98,"title":502,"slug":503,"excerpt":504,"content":504,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":505,"publishedAt":497,"readTime":361,"image":506,"tags":507,"tagsFa":508,"views":105},"آموزش کامل و قدم‌ به‌ قدم بازگردانی بکاپ در دایرکت ادمین","restore-backup-directadmin-guide","چطور در کمترین زمان سایت را از بکاپ برگردانیم؟",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/directadmin-backup-restore.jpg",[],[],{"id":254,"title":510,"slug":511,"excerpt":512,"content":512,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":513,"publishedAt":514,"readTime":135,"image":515,"tags":516,"tagsFa":517,"views":105},"تغییر دامنه در وردپرس؛ قدم‌به‌قدم و بدون خطا","change-domain-wordpress-step-by-step","تغییر نام، بدون تغییر سرنوشت ، دامنه وردپرس را بدون خراب شدن سایت تغییر دهید.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-01-30","https://api.dornadevops.com/media/articles/images/wordpress-domain-change-guide.jpg",[],[],{"id":53,"title":519,"slug":520,"excerpt":521,"content":521,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":522,"publishedAt":514,"readTime":135,"image":523,"tags":524,"tagsFa":525,"views":105},"بکاپ‌گیری حرفه‌ای در DirectAdmin (Admin Level)","directadmin-admin-backup-guide","چطور از کل سرور بکاپ بگیریم و در بحران نجاتش دهیم؟",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/directadmin-admin-level-backup.jpg",[],[],{"id":62,"title":527,"slug":528,"excerpt":529,"content":529,"categoryId":5,"categorySlug":530,"categoryTitle":531,"categoryImage":532,"author":533,"publishedAt":514,"readTime":448,"image":534,"tags":535,"tagsFa":536,"views":105},"Portainer چیست؟ مدیریت حرفه‌ای Docker و Kubernetes","what-is-portainer-docker-management","Docker و Kubernetes را بدون دردسر و گرافیکی مدیریت کنید.","docker","داکر","https://api.dornadevops.com/media/articles/category/images/Screenshot_from_2026-03-06_15-05-14.png",{"name":282,"avatar":8,"firstName":283,"lastName":284},"https://api.dornadevops.com/media/articles/images/portainer-docker-kubernetes-ui.png",[],[],{"id":89,"title":538,"slug":539,"excerpt":540,"content":540,"categoryId":5,"categorySlug":530,"categoryTitle":531,"categoryImage":532,"author":541,"publishedAt":542,"readTime":12,"image":543,"tags":544,"tagsFa":545,"views":105},"۷ اشتباه مرگبار در Docker که باید همین امروز اصلاح کنید","docker-mistakes-developers","اشتباهاتی که پروژه‌ات را نابود می‌کنند و چطور ازشان جلوگیری کنی.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1405-01-29","https://api.dornadevops.com/media/articles/images/docker-common-mistakes.png",[],[],{"id":38,"title":547,"slug":548,"excerpt":549,"content":549,"categoryId":62,"categorySlug":477,"categoryTitle":478,"categoryImage":479,"author":550,"publishedAt":551,"readTime":12,"image":552,"tags":553,"tagsFa":554,"views":105},"بکاپ‌گیری در DirectAdmin؛ آموزش کامل و ساده(بیمه عمر سایت شما!)","directadmin-backup-complete-guide","با چند کلیک از سایتت بکاپ بگیر و خیالت را راحت کن.",{"name":282,"avatar":8,"firstName":283,"lastName":284},"1404-12-15","https://api.dornadevops.com/media/articles/images/directadmin-backup-guide.jpg",[],[],{"id":5,"title":556,"slug":557,"excerpt":558,"content":558,"categoryId":5,"categorySlug":530,"categoryTitle":531,"categoryImage":532,"author":559,"publishedAt":560,"readTime":5,"image":561,"tags":562,"tagsFa":563,"views":105},"نصب Docker بدون تحریم","install-docker-in-iran","نصب آفلاین Docker مخصوص سرورهای داخل ایران",{"name":413,"avatar":8,"firstName":414,"lastName":415},"1404-11-30","https://api.dornadevops.com/media/articles/images/install-docker-iran.png",[],[],null,1789378051836]