<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حمیدرضا حسین‌خانی</title>
        <link>https://virgool.io/feed/@hosseinkhani</link>
        <description>در این بلاگ، نوشتارهای آموزشی و همین‌طور تجربه‌های شخصی حمیدرضا حسین‌خانی، پژوهشگر، مشاور و مدرس هوش مصنوعی و معمار پلتفرم‌های داده‌ای به‌اشتراک گذاشته می‌شود.</description>
        <language>fa</language>
        <pubDate>2026-07-06 16:46:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/47232/avatar/K63eRT.jpg?height=120&amp;width=120</url>
            <title>حمیدرضا حسین‌خانی</title>
            <link>https://virgool.io/@hosseinkhani</link>
        </image>

                    <item>
                <title>چرا اسکرام (Scrum) مزخرف است!</title>
                <link>https://virgool.io/@hosseinkhani/%DA%86%D8%B1%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%D8%A7%D9%85-scrum-%D9%85%D8%B2%D8%AE%D8%B1%D9%81-%D8%A7%D8%B3%D8%AA-ncawpu0xjvpv</link>
                <description>امروز سر کلاس مهندسی کامپیوتر داشتم در مورد فرآیند‌های توسعه‌ی نرم‌افزار و متدولوژی‌های محبوب این روز‌ها صحبت می‌کردم که به بحث داغ اسکرام (Scrum) رسیدیم. وسط بحث بودیم که یکی از دانشجو‌هام گفت:این که خیلی مزخرفه!با اینکه برای دادن چنین فیدبکی خیلی زود بود و احتمالا هنوز اصل مطلب رو نگرفته بود اما من رو یاد چند سال پیش خودم انداخت. سال ۹۲ بود که من به عنوان مهندس کامپیوتر (Android Developer) وارد شرکت تدبیرگستران شدم و برای اولین بار واژه‌ی اسکرام به گوشم خورد و اولین فیدبکم همین بود: چقد مزخرف!تا قبل از اون من فقط با RUP کار کرده بودم، یه متدولوژی نسبتا قدیمی که این روزها دیگه کمتر کسی ازش حرفی به میون میاره. توی متدولوژی RUP، طراحیِ مهندسی و همینطور داکیومنتیشن اهمیت ویژه‌ای داشتند و من خیلی روی مهارت طراحیِ مهندسی و داکیومنتیشن خودم کار کرده بودم. اما اسکرام (و بطور کلی متدولوژی‌های Agile) اهمیتی برای این موضوع قائل نبودند و درست کارکردن نرم‌افزار در لحظه رو مهم‌تر از داکیومنت کردن آن برای نگه‌داری و توسعه‌ در آینده می‌دیدند. اگر چه بعدها متوجه دلیل این رویکرد شدم اما در آن زمان حس خوبی به آن نداشتم. یک سال بعد، شرکت دیجی‌کالا (که هنوز بسیار جوان بود و تبدیل به غول اینترنتی ایران نشده بود) متوجه پتانسیل نهفته در اپلیکیشن‌های موبایل شد و تصمیم به توسعه‌ی اپلیکیشن اندروید در کنار وب‌سایتش گرفت و برای من یک Job Offer فرستاد. زندگی کاری من در دیجی‌کالا متحول شد. پس از مدتی من سرپرست تیم برنامه‌نویسی موبایل (Head of Mobile Development) بودم که شرکت سرمایه‌گذار دیجی‌کالا (سرآوا)، از سهراب سلیمی، بنیانگزار Scrum Academy دعوت کرد که یک ورکشاپ آموزشی چندروزه برای سرپرستان شرکت‌های زیرمجموعه (دیجی‌کالا و کافه‌بازار و ANetwork و ...) برگزار کند. در آن ورکشاپ، من تازه فهمیدم اسکرام چیست و متوجه شدم ما و بیشتر مجموعه‌های دیگه با برداشت‌های سطحی خودمون از اسکرام فقط یک پیاده‌سازی اشتباه از آن را دنبال می‌کنیم که نه تنها خوب نبود بلکه به نظر من حتی بدتر از بی‌فرآیندی بود.اگر فکر می‌کنید شما اسکرام رو به‌درستی پیاده‌سازی کرده اید موارد زیر رو بررسی کنید:- تا به حال شده یک فیچر رو پیاده‌سازی کنید و در انتها، کارفرما نظر خود و نیازمندی قبلی را تغییر دهد؟ اگر ازین موضوع آزرده شدید و می‌خواستید بگید الان دیگه به راحتی نمیشه اینطور که میخوای تغییرش داد، یعنی اصلا شما Agile نیستید چه برسه به اسکرام. چون Agile بودن فقط یک معنی دارد و آن هم توانایی واکنش سریع نسبت به تغییرات در نیازمندی است.- اگر در تیم کسی رو دارید (معمولا Product Owner) که به جز اولویت‌بندی کار‌ها، آتوریتی بیشتری دارد و تا حدی رییس شما به حساب می‌آید، اسکرام را اشتباه پیاده‌سازی کرده اید. در اسکرام ساختار تیم کاملا فلت است و هیچ‌کدام از نقش‌ها بالاتر از دیگری نیستند.- اگر در جلسه‌های استندآپ (Daily Scrum) به کسی گزارش می‌دهید، احتمالا اسکرام را اشتباه پیاده‌سازی کرده اید چون جلسه استندآپ، یک mini-plan برای کارهای روز و هماهنگی وابستگی‌های مرتبط به آن‌ها است نه جلسه‌ی گزارش دهی.- اگر در جلسه Sprint Review مشتریان و ذی‌نفعان حضور ندارند و شما فقط به مدیرتان دمو می‌کنید، اسکرام رو اشتباه پیاده‌سازی کردید چون جلسه‌ی Sprint Review فرصتی برای گرفتن فیدبک مشتری در سریعترین زمان ممکن است.- اگر یک Backlog تمیز و Groom شده ندارید و در ابتدای اسپرینت برای اولین بار با نیازمندی‌ها روبرو می‌شوید، اسکرام رو اشتباه پیاده‌سازی کرده اید. داشتن یک بک‌لاگ گروم شده جزو پیش‌نیاز‌های اولیه‌ی اسکرام است.خوب اگه تا اینجای کار به این نتیجه رسیده‌اید که کلا دارید اشتباه می‌زنید، جای نگرانی نیست. این پست رو مطالعه کنید تا بتونید فرآیند‌هاتون رو اصلاح کنید.خلاصه از زمان آن ورکشاپ تا پیارسال، من هم از طرفداران Scrum بودم و هرجا نقصی می‌دیدم فرضم بر این بود که اسکرام مشکلی نداره و احتمالا پیاده‌سازی ما ایراد داره. اما طی دو سال گذشته فرصت‌هایی پیش اومد که بیشتر درگیر فکر کردن به فرآیند‌ها و تحقیق در مورد اونها بشم و الان مجددا نظرم اینه که: اسکرام واقعا مزخرفه!احتمالا الان با نظر من موافق نیستید اما بیاین یکم واقع بینانه و صادقانه چند مسئله‌ی مهم رو با هم مرور کنیم.مسئله اول:اسکرام یک timebox ثابت (معمولا ۲ هفته‌ای یا ۴ هفته ای) به اسم Sprint دارد که (خیلی خوشحال!) فرض می‌کند قبل از شروع هر اسپرینت، کار‌های آن اسپرینت در قالب User Story هایی برنامه‌ریزی (Plan) شده اند و در طول مدت اسپرینت این برنامه‌ریزی به هیچ‌وجه تغییر نمی‌کند.درسته که از نظر تئوری این موضوع بسیار مطلوب و مورد پسند تیم است و به تیم اجازه‌ی تمرکز کردن بر روی کارها را می‌دهد، اما در واقعیت هیچ‌وقت این اتفاق نمی‌افتد و نباید هم انتظار داشت که بیفتد! همیشه تسک‌های از قبل برنامه‌ریزی نشده (Ad-hoc) و غیرقابل اجتناب وارد تیم می‌شود. سیستم‌ها بطور ناگهانی دچار خطاهایی می‌شوند، باگ‌های Critical بطور ناگهانی سر از سیستم در می‌آورند و مدیران و مالکان کسب و کار، همیشه نیازمندی‌های فورس‌ماژوری را raise می‌کنند که انجام آنها از پایندی به متدولوژی به مراتب با اهمیت‌تر است و البته که منظور از Agility هم توانایی پذیرش به موقع این تغییرات است!برای غلبه بر این مسئله، معمولا موقع برنامه‌ریزی، روی ۷۰ درصد ظرفیت تیم حساب باز می‌کنیم و ۳۰ درصد ظرفیت افراد رو برای کارهای برنامه‌ریزی نشده و Ad-hoc خالی نگه می‌داریم. بنابراین اگر کار ad-hoc پیش نیاید، عملا ۳۰ درصد ظرفیت تیم در هر Sprint هدر می‌رود و اگر کار Ad-hoc پیش بیاید هم با اینکه قابل انجام است و زحمت و انرژی زیادی از تیم می‌گیرد،‌ اما انجام این کار‌ها استوری پوینت نمیسوزاند و در اندازه گیری سرعت و ظرفیت دلیوری تیم، Velocity و محاسبه‌ی نیروی انسانی مورد نیاز تیم، که هدف اصلی ثابت گرفتن time-box بوده، حساب نمی‌شوند. پس این راه حل با اینکه ظاهرا جواب می‌دهد اما در عمل چیزی از مزخرف بودن اسکرام کم نمی‌کند و البته که این منعطف نبودن نسبت به نیازهای لحظه‌ای در تناقض آشکار با تعریف Agile است.مسئله دوم:در اسکرام، فرض ما بر این است که هر User Story باید بتواند طی یک اسپرینت طراحی، پیاده‌سازی، تست و تحویل شود. اگر یک User Story امکان اتمام در یک اسپرینت را نداشته باشد فرض می‌کنیم که در واقع یک Epic است و هنوز کاملا شکسته نشده. اما در واقعیت این موضوع به سایز time-box هم وابسته است. اینکه اسپرینت‌های شما یک هفته ای باشند یا ۱ ماهه، باعث می‌شود یک نیازمندی Story تلقی شود یا Epic! این یعنی در واقعیت همیشه Story هایی داریم که از منظر بیزنسی و محصول، تا جای ممکن شکسته شده اند و اگر آن‌ها را ریزتر کنیم وارد جزییات فنی می‌شویم، با این حال طراحی، توسعه، تست و تحویل آن‌ها بیشتر از یک اسپرینت طول می‌کشد. مطمئنم که همه ما تجربه Done نشدن واقعی Story ها در طول اسپرینت رو داریم. شاید الان به راحتی و خیلی خوشحال اون رو به اسپرینت بعد منتقل می‌کنید اما این خودش در تناقض با اصول اولیه‌ی اسکرام است و Scope اسپرینت را به هم می‌زند.مسئله سوم:در روزگاران پیش از Agile از متدولوژی‌های آبشاری (Waterfall) استفاده می‌شد. به این صورت که:- ابتدا یک جلسه‌ی مصاحبه با مشتری گذاشته می‌شد و نیازمندی‌های دقیق او گرفته می‌شد.- با تحلیل نیازمندی‌ها سیستم مورد نیاز مهندسی می‌شد.- واسط کاربری طراحی میشد.- ساختار داده ای و معماری طراحی میشد.- سیستم از روی مستندات مهندسی، پیاده‌سازی (کد) میشد.- سیستم تست میشد.- سیستم به مشتری تحویل داده میشد- و مشتری میگفت این چیه دیگه؟! من اینو نخواسته بودم!اینجا نه تقصیر برنامه‌نویس بود نه تقصیر مشتری. طبیعی است که برنامه نویس برداشت خودش رو از مصاحبه اول داشته و البته مشتری هم در طول این مدت نیازمندی خود را بهتر شناخته و ایده خود را پرورش داده و خودش هم حرف های روز اول خود را قبول نداشت. پس تقصیر چه کسی است؟ تقصیر فرآیند.وقتی برنامه‌نویس یک بار ابتدای کار مشتری رو میدید و یک بار در انتهای کار پروژه را به او تحویل میداد وقوع این کانفلیکت بسیار طبیعی بود. راه‌حل، متدولوژی های Iterative بود که در آن طی دوره‌های زمانی ثابت، تکه تکه نیازمندی از مشتری گرفته شده، تحلیل شده، پیاده‌سازی شده و تحویل میگردد. به این صورت در ابتدا و انتهای هر Iteration با مشتری در تعامل بودیم و مشکل حل میشد.حالا یک سوال:چقدر برایتان پیش آمده که UI Designer مدت زیادی را صرف طراحی یک UI کند و طرح کامل را به برنامه‌نویس تحویل دهد و برنامه‌نویس به او بگوید: &quot;این بخش اصلا قابل پیاده‌سازی نیست&quot;؟!این موضوع که شروع یک دلخوری در تیم است، بطور معمول در تیم‌هایی که من دیده ام اتفاق می‌افتد. گاهی واقعا با توجه به ساختار دیتابیس‌ها یا ساختار API ها یا مسائل مربوط به پرفورمنس یا محدودیت در فریم‌ورک‌های استفاده شده، آن طرح قابلیت پیاده‌سازی در آن شرایط را ندارد. نتیجه این‌ می‌شود که دیزاینر یک طرح دیزاین میکند، برنامه‌نویس یک چیز دیگر را کد می‌کند! و این شروع یک سری اتفاقات بد است.اینجا مقصر کیست؟! برنامه‌نویس یا دیزاینر؟!هیچ‌کدام. باز هم مقصر فرآیند است. اگر چنین کانفلیکتی در تیم مشاهده کردید، فرآیند شما کاملا Waterfall است و بویی از Agile نبرده است.حالا بیایم سر اصل مطلب. اسکرام در زمینه همکاری افرادی که کارشون پیش‌نیاز همدیگه است بسیار ناتوانه. در اسکرام فرض می‌شود که یک تیم، شامل همه‌ی تخصص‌های مورد نیازش می‌شود. یعنی اسکرام فرض میکند شما در یک تیم، دیزاینر دارید، تستر دارید، برنامه‌نویس فرانت دارید، برنامه‌نویس بک دارید، نیروی DevOps دارید، دیتاساینتیست دارید و ... یعنی در تیم هم دیزاینز دارید و هم دولوپر و هم تستر. هر User Story هم که باید تماما در یک اسپرینت انجام شود. نمی‌توان بخشی از آن را در یک Sprint و بقیه را در Sprint دیگر انجام داد. به عبارت دیگر برای یک User Story باید Sub-task های مربوط به دیزاین و دولوپ و تست ساخته شوند و همگی در یک اسپرینت انجام شوند. اما اسپرینت شروع می‌شود و برنامه نویس بیکار و منتظر طراح است. طراحی هم کار سلیقه ای و زمان‌بری است و برنامه‌نویس نمی‌داند چه زمانی طرح به دستش میرسد. پس نصف زمان خود در اسپرینت را از دست داده و وقتی طرح به دستش برسد نمی‌تواند آن را تکمیل کند و باید Story به اسپرینت بعد منتقل شود و اسکوپ آن خراب می‌شود. تستر هم در طول این مدت کلا بیکار است!لطفا توجه کنید که نگید خوب UI یک اسپرینت جلو‌تر طرح را آماده میکند. چون این یعنی User Story در عمل طی دو اسپرینت Done می‌شود نه یک اسپرینت. حالا یا باید تستر هم یک اسپرینت بعد تست کند که این یعنی هر استوری سه اسپرینت طول میکشد و یا در روزهای آخر همان اسپرینت که این هم یعنی تستر عمده زمان اسپرینت رو بیکار است.راه حلی که برای این موضوع استفاده می‌شود این است که UI Designer رو از تیم اسکرام خارج می‌کنند (تناقض با self-organizing بودن تیم) و طراحی UI رو جزو فرآیند Backlog Refinement (که قبل تر بهش Grooming میگفتیم) در نظر میگیرند. یعنی قبل از اینکه یه User Story برای انجام توسط تیم پلن شه، باید طرح UI آن به عنوان پیش‌نیاز آماده‌شده باشه. این یعنی برنامه‌نویس در جلسه‌ی پلنینگ برای اولین بار UI را می‌بیند و مشکلات تازه شروع می‌شوند چون این فرآیند Waterfall است. اینجاست که راه‌حل‌هایی مثل Lean UX و Agile UX مطرح می‌شوند که باز هم با اینکه مشکلات رو کم میکنند اما چیزی از مزخرف بودن خود اسکرام کم نمی‌کنند.در مورد دیتاساینتیست‌ها و تحلیل‌گر‌های داده هم قضیه همین است. نوع کاری آن‌ها با توسعه محصول متفاوت است و نمی‌توان انتظار تخمین صحیح یا تحویل increment در هر اسپرینت را از آنها داشت. معمولا تیم‌های دیتاساینس خارج از تیم اسکرام و از متدولوژی‌هایی مثل CRISP-DM استفاده می‌کنند که مجددا این موضوع با self-organizing بودن تیم اسکرام در تناقض است.مسئله چهارم:برنامه‌نویسی بیش از هرچیزی به تمرکز نیاز دارد. تا به‌حال هیچ برنامه‌ی خوبی در یک محیط شلوغ و پر از interruption نوشته نشده است. اما اسکرام برپایه‌ی تعامل شدید افراد ایجاد شده و آن را مهم‌تر از فرآیند‌ها و ابزار‌ها می‌داند. در صورتی که برنامه‌نویس‌ها تمایل دارند روی کارخود متمرکز باشند و از ابزار‌‌ها و فرآیند‌ها برای پیشبرد کار‌ها استفاده کنند. در اسکرام، زمان زیادی از افراد در جلسات می‌گذرد. جلسات Daily Scrum و Sprint Planning و ‌Sprint Review و Retrospective و گاها Backlog Refinement زمان زیادی از افراد را می‌گیرد. با اینکه اسکرام تاکید دارد که جلسات استنداپ بیشتر از ۱۵ دقیقه نشوند اما همه تجربه کار با افراد حراف در تیم را داریم و می‌دانیم در عمل چه اتفاقاتی می‌افتد و چه بخشی از زمانمان می‌تواند هدر برود. ازین رو جلسات اسکرام برای کسی که کاری برای انجام دادن دارد و می‌خواهد روی کارش تمرکز کند بسیار مزخرف اند.مسئله پنجم:مسئله پنجم هیولایی به نام Product Owner است. من سال‌ها در این نقش کار کرده ام و اصلا به آن افتخار نمی‌کنم. در اسکرام فرض بر این است که هر کسی در تیم نقشی را بر عهده دارد و ارزش و جایگاه همه‌ی نقش‌ها یکسان است. اما فقط یک نامگذاری اشتباه، باعث شده که Product Owner ها خود را مالک محصول، مالک تیم و مالک زمین و آسمان بدونن. در تئوری، برای اینکه تیم بتواند روی کارش متمرکز باشد و مدام توسط افراد خارج از تیم Interrupt نشود، از یکی از نقش های برابر تیم (PO) به عنوان نقطه تماس با تیم استفاده می‌شود ولی خیلی مشاهده میشه که در عمل این کار باعث Bottleneck شدن اون شخص و ایزوله شدن تیم و دیده نشدن تلاش اعضای تیم از بیرون میشه و اون شخص چه ضمنی چه بطور صریح از داخل تیم به عنوان رییس تیم پذیرفته میشه. در صورتی که همه‌ی نقش‌ها در تیم جایگاه یکسان دارند. UI Designer مسیول طراحی UI، برنامه‌نویس فرانت مسئول پیاده‌سازی UI و PO مسئول refine کردن بک لاگ است. فقط همین. PO نقطه تماس تیم اسکرام با ذینفعان خارج از تیم و مشتریان است، نیازمندی آن‌ها را جمع آوری کرده و در بک لاگ درج می‌کند. سپس به کمک اعضای دیگر تیم میزان بزرگی نیازمندی ها را در آورده و به Story ها میشکند و بر اساس اولویت های کسب و کار مرتب می‌کند.در واقع PO مسیول تمیز بودن و مرتب بودن بک لاگ براساس نیازهای کسب و کار و مشتریان است.اما متاسفانه در عمل بسیار دیده میشه که این افراد به جای تمرکز روی بک لاگ و ارتباط با ذی‌نفعان خارجی، تمرکز خود را روی مدیریت داخلی تیم می‌گذارند که این موضوع چند مشکل به وجود می‌آورد:زمانی برای ارتباط با مشتریان و ذی نفعان و بررسی رقبا و ترسیم چشم انداز برای محصول باقی نمی‌ماند چون PO مشغول مدیریت تیم است! بنابراین چشم انداز روشنی برای ادامه کار وجود ندارد و احتمالا تیم از رقبا عقب میفتد.افراد تیم زیر مدیریت مستقیم PO قرار میگیرند و مانند کارگر‌‌های روزمزد فقط تسک‌ها را گرفته و انجام می‌دهند. معمولا خلاقیت در این افراد کشته شده و عملکرد تیم ضعیف می‌شود.کسی موقع جذب از PO انتظار برنامه‌نویسی نداشته چون وظایف و مهارت‌های او طبق تعریف، متفاوت اند. بنابراین معمولا یک خط کد هم نزده و هیچ‌وقت نمی‌تواند یک تیم برنامه‌نویسی را رهبری کند. برنامه‌نویسان تیم معمولا کسی را به عنوان رهبر خود می‌پذیرند که از آنها بیشتر و بهتر کد زده باشد نه کسی که احتمالا در نصب نرم‌افزار‌ها هم نیاز به کمک دارد.یک PO در بهترین حالت ممکن است یک Boss باشد و اگر خودش مهندس نباشد احتمالا نمی‌تواند یک Leader باشدبرای حل این ضعف اسکرام، معمولا یک نقش اضافه به نام Engineering Manager یا Tech Lead یا Team Lead به تیم اضافه می‌کنند تا برنامه‌نویسان بتوانند او را به عنوان رهبر خود بپذیرند. اما از آنجا که اولویت‌ها و بک لاگ همچنان توسط PO مدیریت می‌شود، حضور این نقش مصداق بارز حضور دو آشپز در آشپزخانه است که خروجی آن یا یک محصول شور است یا یک محصول بی نمک. برنامه‌نویسان هم این بار به جای یک نفر باید به دو نفر گزارش پس بدهند و معمولا این موضوع بسیار براشون آزاردهنده می‌شود. البته راه حل های دیگری نیز مانند خارج کردن PO از تیم development و استفاده از Product Manager به جای آن و قرار گرفتن Tech Lead بین این دو هم مطرح شده و من هم خیلی تجربه این کار رو در تیم‌های مختلف کوچک و بزرگ مثل دیجی‌کالا، اسنپ، بامیلو، اسنپ‌فود، اینپین و ... دارم اما حتی اگر این راه حل ها مشکلات رو حل کنه باز هم اسکرام نیست و تغییر کرده. پس چیزی از مزخرف بودن اسکرام کم نمی‌شود.مسئله ششم:ترکیب دو فرهنگ Agile و DevOps یکی از قشنگ‌ترین و مفیدترین کارهایی است که در حوزه‌ی توسعه و استقرار نرم‌افزار‌ها استفاده می‌شود. در این راستا پیاده‌سازی Continuous Deployment نقش کلیدی دارد. به این صورت که هر نیازمندی در یک پایپلاین منظم به ترتیب: گروم می‌شود -&gt; پلن می‌شود -&gt; طراحی می‌شود -&gt; پیاده‌سازی می‌شود -&gt; (به صورت خودکار) تست می‌شود -&gt; (به صورت خودکار) دیپلوی می‌شود -&gt; مانیتور می‌شود.یعنی هر User Story به محض تکمیل روی یک برنچ جدید تست می‌شود و همزمان با مرج شدن با برنچ اصلی، به صورت خودکار دیپلوی می‌شود.این سطح از اتومایسون و پیوستگی در اسکرام امکان‌پذیر نیست. زیرا در اسکرام همه‌ی User Story ها در انتهای اسپرینت جمع‌آوری، ریلیز و Done می‌شوند.فکر می‌کنم این شش مسئله برای اثبات اینکه چرا اسکرام مزخرف است، کافی باشد. اگر با این توضیحات قانع نشدید یا توجیهی برای این موارد دارید خوشحال می‌شم نظرتون رو بشنوم شاید من قانع بشم.و اما راه حل چیست؟!متدولوژی‌‌های دیگر مثل Kanban و XP و TDD و ... محبوبیت کمتری نسبت به اسکرام دارند. همینطور هر کدام از آن‌ها نیز معایبی را دارند و البته مناسب انوع مختلف پروژه‌ها و تیم‌ها اند. با این حال من شخصا استفاده از Kanban به ویژه وقتی از بعضی مفاهیم خوب اسکرام در آن استفاده می‌شود (Kanplan یا Scrumban) را ترجیح می‌دهم. زیرا:- نقش‌های اضافی مثل Product Owner و Scrum Master در آن وجود ندارد و برابری نقش‌ها در آن بیشتر به چشم میخورد. پس استرس افراد کمتر و خلاقیتشون بیشتر است.- برخلاف اسکرام که نیاز به آموزش و همینطور یک مربی تمام‌وقت (Scrum Master) در کنار تیم دارد، مفاهیم Kanban بسیار ساده است بطوری که ابتدا در بغالی‌ها استفاده می‌شده بعد وارد صنعت نرم‌افزار شده.- جلسه‌ها و تشریفات اضافی و وقت‌گیر در آن وجود ندارد. اما انقدر انعطاف دارد که بتوان از جلسات daily و On-Demand Planning و short Kaizen event در صورت نیاز استفاده کرد.- یک time-box ثابت و محدود وجود ندارد و کارها در یک pipeline انجام می‌شوند. کارهای UI می‌توانند به راحتی قبل از توسعه و کارهای تست بعد از توسعه انجام شوند.- کارهای مربوط به دیتا و زیرساخت و ... به راحتی در یک بورد با بقیه کارها مدیریت می‌شوند و هر کدام ددلاین‌های متفاوت دارند و حتی می‌توانند Estimate نشده باشند.- اولویت‌های بک لاگ در هر لحظه قابل تغییر اند و این انعطاف باعث Agility بیشتر می‌شود.- دیگر نگران بزرگ بودن استوری‌ها و نرسیدنشان به انتهای اسپرینت و انتقال به اسپرینت بعد نیستیم.- کار‌های فورس و ad-hoc بدون هدر رفت بخشی از زمان تیم، به راحتی به لیست کار‌ها اضافه میشوند و به عنوان کار انجام شده تلقی می‌شوند.- تسک‌ها به صورت مداوم تحویل می‌شوند و برخلاف اسکرام می‌توان از مفاهیمی مثل Continuous Deployment استفاده کرد.- باتل‌نک‌های تیم به وضوح با یک نگاه به بورد برای همه‌‌ی افراد واضح است و نیازی به جلسات retro نیست.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Fri, 12 Nov 2021 21:12:03 +0330</pubDate>
            </item>
                    <item>
                <title>نصب و راه‌اندازی NGINX</title>
                <link>https://virgool.io/@hosseinkhani/%D9%86%D8%B5%D8%A8-%D9%88-%D8%B1%D8%A7%D9%87%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-nginx-drbvh7rf8zkr</link>
                <description>مقدمهنرم‌افزار Nginx (بخوانید اِنجین اِکس) در واقع یک نرم‌افزار Web server است که می‌تواند به عنوان Reverse proxy یا Load balancer یا Web cache نیز مورد استفاده قرار گیرد.- تعریف Web server :Web server یا HTTP server نرم افزاری است که بر روی یک سرور سخت‌افزاری نصب شده، Request ها را در بستری مثل HTTP از Client ها دریافت کرده و به آنها پاسخ می‌دهد. این پاسخ ها یا به صورت Static از قبل در مسیری روی سرور ذخیره شده و یا به صورت Dynamic توسط یک Web Application ساخته شده و به سمت Client ها ارسال می‌شوند. مثلا تصاویر، ویدیو ها یا فایل های CSS و Javascript و ... می‌توانند به صورت Static روی سرور ذخیره شده و توسط Web server به Client ارسال شوند. اما اطلاعاتی مثل محصولات خریداری شده توسط کاربر، دانشجویان برتر ترم جاری، آگهی های منقضی شده و ... باید به صورت لحظه ای و Dynamic از دیتابیس ها و ... جمع آوری و تجمیع شده و در قالب یک پاسخ مناسب برای Client ها ارسال شوند.- تعریف Reverse proxy: یک Proxy server در حالت عادی، یک سرور واسط میان یک Client و سایر سرور ها است. این سرور واسط، جلوی همه درخواست های یک Client قرار گرفته، آنها را دریافت کرده و به جای او به سرور های مقصد ارسال می‌کند. تحریم شکن ها و فیلترشکن های قدیمی تر در واقع یک Proxy server بودند که همه درخواست های کاربر را گرفته و آنها را به جای او به سرور های مورد نظرش ارسال کرده و پاسخ دریافتی را به کاربر بر می گرداندند. (فیلترشکن های امروزی به جای Proxy server از VPN استفاده می‌کنند). اما Reverse proxy برعکس Proxy server معمولی است. این نوع از پراکسی به جای دریافت همه درخواست های یک Client و ارسال آنها به سرور های مختلف (Forward proxy)، درخواست های همه Client ها را دریافت کرده و به یک سرور خاص ارسال می‌کند (Reverse Proxy).- تعریف Load balancer: با افزایش تعداد Request های وارد شده به یک سرور، منابع بیشتری از آن سرور اشغال می‌شود (Load روی سرور افزایش می‌یابد). با افزایش Load روی سرور، عملکرد آن تحت تاثیر قرار گرفته و  پاسخ‌دهی به درخواست ها با کندی روبرو می‌شود. در این صورت، سرور های فعلی جوابگوی نیاز ما نیستند و باید سرور ها را Scale کنیم. ممکن است اولین ایده ای که برای Scale کردن سرور ها به ذهن برسد افزایش قدرت پردازنده و حافظه RAM باشد. به این روش Vertical Scaling می‌گوییم. اما معمولا ایده بهتر استفاده از Server Farm (چند سرور متوسط به جای یک سرور قوی) است که به روش Horizontal Scaling معروف است. در این صورت Load balancer با قرار گرفتن در جلوی ورودی Server Farm، درخواست های وارد شده را دریافت و آنها را بین چند سرور مختلف با عملکرد یکسان توزیع می‌کند.- تعریف Web cache: معمولا سرو کردن محتوای Static توسط Web server ها بسیار ساده تر و سریعتر از محتوای Dynamic صورت می‌گیرد. برای ساختن محتوای Dynamic معمولا کوئری های نسبتا زمان‌بری به Database ها زده می‌شود و یا الگوریتم های نسبتا پیچیده ای اجرا می‌شوند. بنابراین واضح است که آماده شدن چنین محتوایی نه تنها کندتر از محتوای Static صورت می‌گیرد، بلکه منابع سخت افزاری (RAM و CPU) بیشتری را از سرور اشغال می‌کند. Web cache یا HTTP cache محتوای Dynamic تولید شده برای Request های پرتکرار را به صورت Static در سرور Cache کرده و برای درخواست های بعدی در صورت امکان از آنها استفاده می‌کند. بنابراین پاسخ درخواست های پرتکرار، بسیار سریعتر از حالت عادی داده می‌شود و همچنین بار (Load) وارد شده به سرور نیز بطور چشمگیری کاهش می‌یابد.با اینکه بیشترین سهم از بازار Web server ها در حال حاضر (۲۰۱۹) در دست Apache HTTP Server است، با این حال Nginx به علت عملکرد بهتر در مواجهه با منابع محدود و همینطور scale پذیری بیشتر، در حال ربودن گوی سبقت از Apache است. البته Web server های دیگری مثل Microsoft IIS و LiteSpeed هم در رده های سوم و چهارم قراردارند که وقت شما را با پرداختن به آنها نمیگیریم ;)یکی از تفاوت های Nginx با Apache HTTP Server در این است که Apache ماژول هایی دارد که به کمک آنها قادر است محتوای Dynamic (از طریق اسکریپت های PHP یا Python یا ...) را خودش پردازش و تولید کند، اما Nginx برای اینکه سبک تر و سریع تر باشد روی وظیفه اصلی خودش تمرکز کرده و ساختن محتوای Dynamic را به نرم‌افزار های مخصوص این کار مثل php-fpm برای PHP یا uWSGI برای Python می‌سپارد.یگی دیگر از تفاوت های Apache HTTP Server و Nginx در این است که Apache هنگام سرو محتوای Static می‌تواند از هر Directory، یک فایل به نام htaccess. شامل تنظیمات Apache برای آن دایرکتوری را بخواند و تنظیمات خود را برای آن دایرکتوری Override کند. Override کردن تنظیمات به ازای هر دایرکتوری باعث پیچیدگی در مدیریت تنظیمات می‌شود و همینطور به علت در دسترس بودن، امنیت پایین تری دارد، به همین دلیل Nginx در کل چنین قابلیتی را ارایه نمی‌دهد.اگر قصد مهاجرت از Apache HTTP Server به Nginx را دارید، می‌توانید از راهنمای این لینک استفاده کنید.نصب Nginx روی Ubuntuپکیج Nginx روی مخازن پیشفرض Ubuntu وجود دارد. بنابراین اجرای دستورات زیر آخرین نسخه از Nginx و پکیج های وابسته به آن را روی سیستم عامل Ubuntu نصب می‌کند.$ sudo apt update 
$ sudo apt install nginxسرویس Nginx پس از نصب در Ubuntu به صورت خودکار اجرا می‌شود. دستور زیر وضعیت این سرویس را نمایش می‌دهد.$ sudo systemctl status nginxاگر Nginx با موفقیت نصب شده باشد، پس از اجرای دستور بالا با خروجی ای شبیه به تصویر زیر مواجه خواهید شد که نشان می‌دهد این سرویس فعال و در حال اجرا روی سیستم است.چراغ سبز نشان دهنده فعال بودن سرویس است.در صورت نیاز به متوقف کردن سرویس Nginx می‌توانید از دستور زیر استفاده کنید:$ sudo systemctl stop nginxبرای راه اندازی این سرویس وقتی که در حالت توقف است، از دستور زیر استفاده می‌شود:$ sudo systemctl start nginxزمانی که تنظیمات Nginx تغییر می‌کند، برای اعمال تغییرات می‌توانید این سرویس را Restart کنید. این کار معادل Stop و سپس Start کردن سرویس است:$ sudo systemctl restart nginxزمانی که Nginx را Restart می‌کنید، همه درخواست هایی که در حال پردازش بوده اند قطع (Drop) شده و تا زمان کامل شدن فرآیندِ اجرای مجددِ سرویس، هیچ درخواستی پاسخ داده نمی‌شود. برای اینکه بدون Down شدن سایت یا سرویس های آن بتوانیم تغییرات Nginx را اعمال کنیم، می‌توان به جای Restart از Reload استفاده کرد. در این صورت درخواست هایی که در حال اجرا هستند با تنظیمات قدیم و درخواست های جدید با تنظیمات جدید پاسخ داده می‌شوند.$ sudo systemctl reload nginxسرویس Nginx پس از نصب در Ubuntu به صورت پیش‌فرض Enable است. به این معنی که هر بار که سیستم عامل (کامپیوتری که Nginx روی آن نصب شده) Restart شود، این سرویس به صورت خودکار اجرا می‌شود. در صورت نیاز به Disable کردن این سرویس می‌توان از دستور زیر استفاده کرد:$ sudo systemctl disable nginxو همینطور برای Enable کردن آن در صورت Disable بودن، از دستور زیر استفاده می‌شود:$ sudo systemctl enable nginxبررسی صحت عملکرد Nginxحال که Nginx را نصب کرده و وضعیت این سرویس را بررسی کردید می‌توانید عملکرد آن را تست کنید. Nginx به صورت پیش‌فرض محتوای Static موجود در آدرس var/www/html/ را که فعلا فقط یک فایل HTML است، سرو می‌کند. بنابراین با وارد کردن آدرس IP سرور خود در مرورگر وب باید این صفحه را دریافت کنید که نشان دهنده کارکرد صحیح  Nginx است.صفحه ‌Landing پیشفرض برای بررسی صحت عملکرد Nginxاگر با وارد کردن آدرس IP سرور در مرورگر، صفحه Landing بالا را مشاهده نکردید، ممکن است Firewall نصب شده روی سرور، اجازه دسترسی به سرور از طریق پورت HTTP (پورت ۸۰) را نمی‌دهد. بنابراین پس از چک کردن درستی آدرس IP و همینطور بررسی وضعیت سرویس، از باز بودن پورت ۸۰ روی سرور نیز مطمین شوید.# check Firewall status:$ sudo ufw status# List the registered application profiles for Firewall, Nginx should have registered 3 profiles:# &#x27;Nginx HTTP&#x27; --&gt; This profile opens only port 80 (normal, unencrypted web traffic)# &#x27;Nginx HTTPS&#x27; --&gt;  This profile opens only port 443 (TLS/SSL encrypted traffic)# &#x27;Nginx Full&#x27; --&gt; This profile opens both port 80 and 443$ sudo ufw app list# Enable the most restrictive profile$ sudo ufw allow &#x27;Nginx HTTP&#x27;# Check Firewall status again to verify the change$ sudo ufw statusتنظیمات Nginxحال که Nginx به درستی نصب و اجرا شده و در حال سرو کردن سایت Static پیشفرض است، می‌توان تنظیمات آن را تغییر داد.تمامی فایل های مرتبط با تنظیمات Nginx در آدرس etc/nginx/ در سرور قرار دارند. فایل nginx.conf در این آدرس، شامل تنظیمات اصلی Nginx است. در زمان اجرای Nginx، تنظیمات موجود در این فایل بر روی Nginx اعمال می‌شوند.اگر این فایل را باز کنید مشاهده خواهید کرد که ساختار کلی آن به شکل زیر است:user www-data;
worker_processes auto;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
}

http {

    # Basic Settings
    keepalive_timeout 65;
    server_names_hash_bucket_size 64;
    include /etc/nginx/mime.types;
    
    # SSL Settings
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    
    # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    
    # Gzip Settings
    gzip on;
    
    # Virtual Host Configs
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
        
}
        
mail {

    server {
        ...
    }
    
}همانطور که می‌بینید، ساختار این فایل به صورت یک سلسله مراتب از بلاک (Block) ها است. برای مثال بلاکِ  events، بلاکِ http، بلاکِ mail و ... اما قبل از شروع شدن بلاک ها، تعدادی دستورالعمل (دایرکتیو) کلی (مثلا ;user www-data و ...) وجود دارند که تنظیمات خیلی کلی و عمومی Nginx را مشخص می‌کنند. برای مثال، Nginx در واقع یک پراسس اصلی (Master Process) در سیستم عامل دارد که فقط مسئولیت خواندن، ارزیابی و اعمال تنظیمات و همینطور مدیریت پراسس های کارگر (Worker Processes) را به عهده دارد. در واقع درخواست هایی که به سمت Nginx می‌آیند، توسط پراسس اصلی پردازش نمی‌شوند، بلکه تعدادی (معمولا به تعداد هسته های پردازشگر کامپیوتر) پراسس کارگر (Worker Process) که به وسیله پراسس اصلی ایجاد شده اند، به صورت همزمان، مسیولیت پردازش درخواست ها را به عهده می‌گیرند. دایرکتیو ;worker_processes auto به Nginx می‌فهماند که به تعداد هسته های پردازنده، Worker Process ایجاد کند.برای یافتن تعداد هسته های پردازشی در یک سیستم لینوکسی می‌توانید از دستور زیر در ترمینال استفاده کنید:$ grep processor /proc/cpuinfo | wc -lاین Process ها باید توسط یک User در سیستم عامل اجرا شوند. کاربر www-data در سیستم عامل Ubuntu برای این منظور در نظر گرفته شده و دایرکتیو ;user www-data این کاربر را به Nginx معرفی می‌کند.دایرکتیو  ;worker_connections 768 در داخل بلاک events حداکثر تعداد اتصال (Connection) به هر Worker Process را مشخص می‌کند. بنابراین اگر سرور شما ۴ پراسس کارگر داشته باشد که هر کدام از آنها در هر لحظه مجاز به پردازش ۷۶۸ اتصال باشند، این سرور در هر لحظه می‌تواند ۳۰۷۲=۷۶۸*۴ اتصال را پاسخگو باشد.لازم به ذکر است که تعداد worker_connections نمی‌تواند از حداکثر تعداد ممکن برای فایل های باز در سیستم عامل تجاوز کند. در صورت نیاز باید این مقدار را نیز در تنظیمات سیستم عامل تعییر دهید.تنظیمات کلی Nginx مثل تنظیمات مربوط به SSL، تنظیمات مربوط به Log درخواست ها و خطاهای پیش آمده، تنظیمات مربوط به فشرده سازی پاسخ ها به کمک Gzip و ... در بلاک http قرار می‌گیرند.معمولا داخل بلاک http، یک یا چند بلاک server وجود دارد و البته خود بلاک server می‌تواند شامل یک یا چند بلاک location باشد:http {
    ...
    server {
        location {
        ...
        }
    }
    ...
}بلاک server معمولا شامل تنظیمات مختص به Web server مانند نام سرور (مثلا www.example.com)، پروتکل ارتباطی (HTTP/HTTPS)، آدرس محتوای استاتیکی که باید سرو شود و ... است و بلاک location شامل تنظیمات مربوط به Sub-directory ها (مثلا www.example.com/blog یا www.example.com/landing یا ...) است.اگر فایل nginx.conf در مسیر etc/nginx/ را باز کرده باشید احتمالا متوجه شده اید که برای جلوگیری از شلوغی و ناخوانا شدن تنظیمات و همینطور مدیریت بهتر آن، بخش هایی از تنظیمات مثل بلاک های server، درون فایل های جداگانه در مسیر هایی از etc/nginx/ نوشته شده و در فایل nginx.conf با دستور include به آنها اشاره شده است. Nginx هنگام اجرا، تنظیمات موجود در آن فایل ها را نیز به فایل اصلی (nginx.conf) اضافه کرده و سپس آن را می‌خواند و تنظیمات را اعمال میکند.بلاک server برای سایت پیش فرض Nginx که پیشتر به آن اشاره شد، درون فایلی به نام default در آدرس etc/nginx/sites-enabled/ قرار دارد که با دستور ;*/include /etc/nginx/sites-enabled در بلاک http از فایل nginx.conf به آن اضافه می‌شود. بنابراین با ویرایش فایل default در مسیر مذکور برای اعمال تنظیماتی مثل نام سایت خود (مثلا www.example.com) و همینطور تغییر محتوای Static موجود در آدرس var/www/html/ به محتوای دلخواه سایت خود، می‌توانید سایت خود را توسط Nginx سرو کنید.توجه کنید که سرویس Nginx در هنگام اجرا شدن، تنظیمات را از فایل nginx.conf می‌خواند و این تنظیمات را تا اجرای بعدی نگه می‌دارد. بنابراین پس از اعمال هرگونه تغییری در فایل های تنظیمات باید سرویس Nginx را Restart یا Reload کنید. در غیر اینصورت تغییرات شما روی Nginx اعمال نمی‌شود.همینطور برای اطمینان از عدم وجود خطای تایپی (Syntax Error) در تنظیمات Nginx میتوانید از دستور sudo nginx -t در ترمینال استفاده کنید. این دستور، فایل های تنظیمات (nginx.conf و سایر فایل هایی که include شده اند) را از نظر املایی (Syntax) بررسی کرده و در صورت وجود اشکال، شما را مطلع می‌کند.افزودن Server Block (یا Virtual Host)اگر قرار باشد که فقط یک سایت روی سرور فعال باشد، با تغییر تنظیمات مربوط به سایت پیشفرض (محتوای Static موجود در مسیر var/www/html/ و فایل default موجود در مسیر etc/nginx/sites-enabled/) و Restart کردن سرویس Nginx کار تمام است اما معمولا می‌خواهیم که چندین سایت را روی یک سرور میزبانی (Host) کنیم. برای این منظور باید از مفهمومی به نام Virtual Host کمک بگیریم. Virtual Host ها در Nginx به کمک بلاک های server ساخته می‌شوند. در واقع هر بلاک server درون بلاک http معرف یک Virtual Host است که می‌تواند یک سایت جداگانه را میزبانی کند.عبارت Virtual Host بیشتر برای Apache HTTP Server به کار می‌رود و در Nginx عبارت معادل آن Server Block است.بنابراین باید به ازای همه سایت هایی که قرار است روی سرور میزبانی شوند، Server Block ایجاد کنیم. بلاک های server را می‌توانیم در فایل nginx.conf و داخل بلاک http تعریف کنیم، اما برای جداسازی و مدیریت بهتر فایل های تنظیمات، بهتر است هر Server Block را داخل یک فایل تنظیمات جداگانه قرار داده و در فایل nginx.conf با دستور include به آن اشاره کنیم.برای این منظور Nginx هنگام نصب، دو دایرکتوری به نام های sites-available و sites-enabled در مسیر etc/nginx/ ایجاد می‌کند. فایل های تنظیمات مربوط به تمامی Server Block هایی که روی این سرور فعال اند (یا قرار است در آینده فعال شوند) درون دایرکتوری sites-available قرار می‌گیرند. این دایرکتوری حکم یک آرشیو را دارد و تنظیمات موجود در آن، هرگز به nginx.conf اضافه نمی‌شوند. اما اگر مجددا به تنظیمات درون فایل nginx.conf نگاه کنید متوجه خواهید شد که در انتهای بلاک http، تمام فایل های موجود در دایرکتوری sites-enabled به این فایل include شده اند. (با دستور ;*/include /etc/nginx/sites-enabled )بنابراین اگر قرار است یک سایت (Server Block) فعال باشد و توسط Nginx پاسخ‌دهی شود، باید فایل حاوی بلاک server مربوط به آن داخل دایرکتوری sites-enabled نیز کپی شود. کپی کردن و نگه داشتن دو رونوشت یکسان از یک فایل اصلا ایده جالبی نیست زیرا یکسان نگه داشتن آنها هنگام تغییرات، کار بسیار سختی است. بنابراین ایده بهتر این است که فایل تنظیمات را داخل دایرکتوری sites-available ذخیره کرده و در دایرکتوری sites-enabled با دستور زیر یک میانبر (Symbolic Link) به آن تعریف کنیم:$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/با اجرای دستور بالا یک Symbolic Link از فایل example.com در داخل دایرکتوری sites-enabled ایجاد می‌شود. در واقع مثل این خواهد بود که فایل example.com در دایرکتوری sites-enabled نیز وجود دارد. بنابراین بار بعدی که سرویس Nginx اجرا می‌شود، محتوای فایل example.com هم به nginx.conf اضافه خواهد شد.پس تا اینجای کار فهمیدیم که تنظیمات کلی و مشترک بین همه سایت ها را درون فایل nginx.conf نوشته و به ازای همه سایت هایی که قرار است روی سرور میزبانی شوند، یک فایل تنظیمات به نام خودشان (مثلا example.com) در مسیر etc/nginx/sites-available/ ساخته و یک Symbolic Link به آنها در مسیر etc/nginx/sites-enabled/ ایجاد می‌کنیم. سپس به کمک دستور sudo nginx -t وجود Syntax Error در فایل های تنظیمات را بررسی کرده و در صورت نیاز آنها را اصلاح می‌کنیم. در نهایت برای اعمال تنظیمات جدید، سرویس Nginx باید Restart یا Reload شود.هر Server Block معرف یک سایت مجزا است که محتوای Static یا Dynamic را سرو می‌کند. به ازای همه سایت هایی که محتوای Static سرو می‌کنند، یک دایرکتوری در مسیر var/www/ به نام خود سایت (مثلا example.com) ساخته و محتوای Static مربوط به آن سایت را در این دایرکتوری نگه می‌داریم. دقت کنید که باید در بلاک server مربوطه در مقابل دستور root این مسیر را معرفی کنیم.بهتر است که فایل تنظیمات و محتوای مربوط یه سایت پیشفرض Nginx را حذف نکنید تا در صورتی که درخواست ارسال شده به سرور با هیچکدام از Server Block ها همخوانی نداشت، خطایی رخ ندهد و سایت دیفالت سرو شود.شخصی سازی تنظیمات در Server Blockحال که با کلیات راه اندازی و تنظیمات Nginx آشنا شدید، لازم است کمی به جزییات دستورات (Directive های) موجود در بلاک server بپردازیم.اگر فایل تنظیمات Server Block پیش فرض را باز کنید با ساختاری شبیه به زیر مواجه خواهید شد. این فایل همیشه می‌تواند به عنوان یک مثال مرجع مورد استفاده قرار گیرد.server {

    listen 80;
    server_name example.com www.example.com;
    
    root /var/www/example.com;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    location /download/ {
        alias /usr/share/download/;
        autoindex on;
    }
    
}اینکه یک درخواست هنگام وارد شدن به Nginx بر اساس کدام Server Block پاسخ‌دهی شود، به دایرکتیو های listen و server_name در Server Block ها بستگی دارد. اگر درخواست وارد شده با این دایرکتیو ها در یکی از Server Block ها همخوانی داشت، توسط آن سایت (Server Block) پاسخ‌دهی می‌شود، در غیر اینصورت سایت (Server Block) پیشفرض، کار پاسخ‌دهی را انجام می‌دهد. برای مثال بلاک server در فایل تنظیمات بالا، به درخواست های وارد شده به پورت ۸۰ (پورت HTTP) گوش میکند و اگر نام سرور در درخواست ها example.com و یا www.example.com باشد، کار پاسخ‌دهی به آن را به عهده می‌گیرد.دقت کنید که www.example.com یک Subdomain از example.com است و هر کدام از Subdomain ها در واقع سایت های مستقل از هم هستند بنابراین اگر می‌خواهید هر دوی آنها توسط یک Server Block پاسخ‌دهی شوند، باید نام هر دوی آنها را در مقابل دایرکتیو server_name اضافه کنید.همانطور که گفتیم www.example.com و example.com در واقع دو سایت مجزا به حساب می‌آیند. بنابراین برای خراب نشدن SEO سایت و همینطور برای اینکه سرویس هایی مثل Google Analytics  یا Google Crawler و ... با دو سایت مختلف مواجه نباشند بهتر است یکی از آنها (مثلا www.example.com) را به عنوان سایت اصلی خود در نظر گرفته و دیگری را به آن Redirect کنید.وقتی چندین نام در مقابل دایرکتیو server_name قرار می‌گیرد، احتمال به وجود آمدن خطای زیر وجود دارد. could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32برای جلوگیری از این خطای احتمالی باید میزان حافظه لازم برای ذخیره‌سازی رشته Hash شده ی نام ها را زیاد کنیم. برای این منظور دایرکتیو زیر را در بلاک http در فایل nginx.conf اضافه کنید.server_names_hash_bucket_size 64;اگر قرار است که Server Block محتوای Static سرو کند، باید محل قرار گیری آن محتوا را مقابل دایرکتیو root بیان کنیم. دایرکتیو index نیز به نقطه ورود به محتوا (فایلی که باید سرو شود) اشاره دارد. دایرکتیو location مربوط به تنظیمات Sub directory ها است. در مثال بالا، دو Sub directory (/ و /download/) تعریف شده اند که بررسی عملکرد آنها را به خود شما واگذار می‌کنیم.اما اگر قرار است که Server Block محتوای Dynamic تولید شده توسط یک Web Application را سرو کند،‌ باید به عنوان یک Reverse Proxy برای آن Web Application تنظیم شود.بلاک location برای پراکسی کردن درخواست ها به uWSGI (هندلر پایتون) چیزی شبیه به زیر است:location / {
    include uwsgi_params;
    uwsgi_pass unix:/home/hamidreza/python-proj/myproject.sock;
}برای اطلاعات بیشتر در رابطه با پراکسی کردن درخواست های Nginx به uWSGI برای تولید محتوای Dynamic توسط اپلیکیشن نوشته شده به زبان Python به این مقاله مراجعه کنید.بلاک location برای پراکسی کردن درخواست ها به php-fpm (هندلر PHP) چیزی شبیه به زیر است:location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php7-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
} برای اطلاعات بیشتر در رابطه با پراکسی کردن درخواست های Nginx به php-fpm برای تولید محتوای Dynamic توسط اپلیکیشن نوشته شده به زبان PHP به این مقاله مراجعه کنید.عیب‌یابی سیستم با بررسی Log درخواست هاتمامی درخواست های وارد شده به Nginx در فایلی به نام access.log در مسیر var/log/nginx/ و تمامی خطاهای رخ داده شده هنگام پاسخ‌دهی به درخواست ها در فایل دیگری به نام error.log در همان مسیر ذخیره می‌شوند که می‌توان از آنها برای عیب‌یابی های احتمالی و ... استفاده کرد.این فایل ها و مسیر ها توسط دایرکتیو های access_log و error_log در بلاک http از فایل nginx.conf تعریف شده اند و شما در صورت نیاز می‌توانید به ازای هر سایت مجزا، فایل های جداگانه ای را در Server Block مربوط به آنها تعریف کنید. مثلا ممکن است بخواهید Log های سایت admin.example.com را به جای فایل های تعریف شده در nginx.conf در فایل های admin.example.com.access.log و admin.example.com.error.log ذخیره کنید. برای این منظور می‌توانید دایرکتیو های زیر را به Server Block مربوطه اضافه کنید:access_log /path/to/log main;
error_log /path/to/log error; فشرده‌سازی پاسخ های HTTP به کمک gzipگاهی پاسخ هایی که Client ها از Web Server دریافت می‌کنند بسیار حجیم اند. مثلا تصاویر با رزولوشن بالا، فونت ها، فایل های JavaScript و CSS و ... که پهنای باند زیادی را اشغال کرده و پاسخ‌دهی را با کندی روبرو می‌کنند. این کندی می‌تواند تجربه کاربری بدی را برای سایت شما رقم بزند و همینطور SEO سایت را تحت تاثیر قرار دهد. در چنین شرایطی می‌توان پاسخ را در سرور، توسط ابزار هایی مثل gzip (مخفف GNU Zip که در تمامی توزیع های لینوکس به صورت پیشفرض وجود دارد) فشرده (Compress) کرد، اطلاعات فشرده شده و کم حجم تر را با سرعت بیشتر توسط کلاینت (مرورگر وب یا اپلیکیشن موبایل) دانلود کرد و سپس آن را از حالت فشرده خارج نمود. جدا از افزایش سرعت دانلود اطلاعات باید این نکته را در نظر داشت که عملیات فشرده سازی (Compression) روی سرور و بازیابی (Decompression) روی Client عملیات بسیار زمان بری اند که به ویژه برای Client هایی که توان پردازشی پایینی دارند ممکن است سرعت کلی پاسخ‌دهی را کمتر کنند. بنابراین بهتر است اولا پاسخ های پرتکرار پس از یک بار فشرده سازی، روی سرور Cache شوند تا دفعات بعد بدون نیاز به پردازش اضافی و به صورت کاملا Static سرو شوند. ثانیا اگر بیشتر کلاینت های مخاطب شما توان پردازشی پایینی دارند شاید فشرده سازی برای آنها ایده خوبی نباشد. قابلیت فشرده‌سازی اطلاعات توسط gzip به صورت پیشفرض در Nginx پشتیبانی ‌می‌شود و ممکن است از قبل در فایل nginx.conf فعال شده باشد. اما به هر حال شما می‌توانید آن را برای یک Server Block مشخص، فعال و شخصی سازی کنید.توجه کنید که اگر Client از این قابلیت (بازیابی پاسخ های فشرده شده به کمک gzip) پشتیبانی کند، هدر Accept-Encoding: gzip, deflate را همراه با درخواست خود به سرور ارسال می‌کند و سرور پاسخ فشرده شده را به او بر می‌گرداند. در غیر اینصورت نسخه اصلی و فشرده نشده از اطلاعات برای او ارسال می‌شود. با بررسی هدر Content-Encoding: gzip در پاسخ دریافت شده می‌توان متوجه شد که اطلاعات دریافتی توسط gzip فشرده شده اند.برای فعال کردن gzip در یک سایت، موارد زیر را به Server Block مربوط به آن اضافه می‌کنیم.server {
    listen 80;
    server_name example.com www.example.com;

    gzip on;
    gzip_comp_level    5;
    gzip_min_length    256;
    gzip_proxied       any;
    gzip_vary          on;

    gzip_types
    application/atom+xml
    application/javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rss+xml
    application/vnd.geo+json
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    font/opentype
    image/bmp
    image/svg+xml
    image/x-icon
    text/cache-manifest
    text/css
    text/plain
    text/vcard
    text/vnd.rim.location.xloc
    text/vtt
    text/x-component
    text/x-cross-domain-policy;
    # text/html is always compressed by gzip module
    
}اولین دایرکتیو اضافه شده، ;gzip on است که قابلیت فشرده سازی توسط gzip را در Nginx فعال می‌کند. دومین دایرکتیو (;gzip_comp _level 5)، سطح فشرده سازی اطلاعات را مشخص می‌کند. سطح فشرده سازی اطلاعات، یک عدد بین ۱ تا ۹ است. هر چه این عدد بیشتر باشد پاسخ ها به میزان بیشتری فشرده شده و طبیعتاً زمان لازم برای فشرده سازی و بازیابی آنها نیز افزایش می‌یابد. سطح ۵، میزان فشرده سازی خوبی (نزدیک به ۷۵ درصد برای بیشتر فایل های ASCII) را با صرف میزان منابع قابل قبول ارایه می‌دهد. سطح فشرده سازی ۹ بسیار کندتر و با اشغال بخش زیادی از منابع سیستم انجام می‌شود ولی حجم پاسخ فشرده شده با آن، تفاوت چشمگیری با سطح ۵ ندارد. دایرکتیو سوم (;gzip_min_length 256) حداقل سایز پاسخ برای فشرده شدن را از مقدار پیشفرض ۲۰ بایت به ۲۵۶ بایت افزایش می‌دهد و پاسخ های کوچکتر از این مقدار را فشرده نمی‌کند. فایل های کوچکتر از ۲۵۶ بایت به راحتی و با سرعت دانلود می‌شوند و صرف انرژی برای فشرده تر کردن آنها معمولا نه تنها تاثیر چشمگیری ندارد بلکه در مواردی ممکن است حتی حجم پاسخ Compress شده از پاسخ اصلی بیشتر هم شود. دایرکتیو چهارم (;gzip_proxied any) باعث می‌شود که پاسخ درخواست هایی که مثلا توسط CDN ها (مثل ابر آروان) پراکسی شده اند نیز فشرده شوند. دایرکتیو پنجم (;gzip_vary on) به پراکسی ها (مثلا CDN آروان) می‌گوید که هر دو نسخه فشرده شده و فشرده نشده از پاسخ ها را کش کنند و با توجه به هدر Accept-Encoding در درخواست کاربران، نسخه مناسب را به آنها برگردانند. در غیر اینصورت ممکن است نسخه gzip شده برای کلاینتی که از آن پشتیبانی نمی‌کند ارسال شود. دایرکتیو آخر (;..... gzip_types) به Nginx می‌گوید که چه نوع فایل هایی را فشرده کند. همانطور که می‌بینید در جلوی این دایرکتیو، ۲۴ عدد از Media Type های معروف شامل تصاویر، فونت ها، فایل های JSON و ... درج شده اند که بسته به نیاز خود می‌توانید آنها را کم و زیاد کنید.فشرده‌سازی پاسخ ها توسط gzip علاوه بر کاهش پهای باند مصرفی و افزایش سرعت، باعث کاهش سربار SSL نیز می‌شود. در واقع با این روش، تعداد رفت و برگشت‌های اطلاعات در طول فرآیند SSL Handshake کاهش پیدا می‌کند.کش کردن پاسخ ها در سمت کلاینتپاسخ بعضی از درخواست ها در طول زمان خیلی کم تغییر می‌کند. مثلا درخواست دانلود لوگوی شرکت، درخواست دانلود فونت متن های سایت،  درخواست دانلود تصاویر ثابت صفحه اول، درخواست دانلود متن یک پست ثبت شده در وبلاگ و ... معمولا در طول ماه ها پاسخ ثابتی را بر می گردانند. چنین پاسخ هایی را می‌توان سمت Client (مثلا روی مرورگر وب کاربر) Cache کرد و علاوه بر افزایش سرعت بارگزاری، تعداد درخواست های اضافی به سرور را نیز کاهش داد. برای این کار باید یک Header خاص به پاسخ هایی که قرار است Cache شوند اضافه شده و مدت زمان معتبر بودن آن پاسخ در Cache کلاینت را مشخص کند.این کار می‌تواند با افزودن یک بلاک location در داخل بلاک server (زیر تنظیمات gzip) به صورت زیر انجام شود.location ~*  \.(jpg|jpeg|png|gif|ico|css|js|pdf)$ {
    expires 7d;
}بلاک بالا، باعث Cache شدن همه فایل های jpg و jpeg و png و gif و ico و css و js و pdf به مدت یک هفته در کلاینت می‌شود. برای محتوایی که به ندرت دچار تغییرات می‌شوند (مثل پست های ثبت شده در وبلاگ) می‌توانید زمان بیشتری (مثلا یک ماه) را برای Cache شدن اطلاعات در نظر بگیرید.فعال‌سازی HTTPSتبادل اطلاعات با پروتکل HTTP در حالت کلی امنیت پایینی دارد و به راحتی در یک شبکه قابل شنود است. با این حال می‌توان این پروتکل را توسط پروتکل امنیتی TLS رمزنگاری کرد. در اینصورت به این پروتکل که امنیت بالاتری دارد، HTTP over TLS و یا HTTPS گفته می‌شود.در گذشته به جای پروتکل TLS از پروتکل SSL استفاده می‌شد. در واقع TLS نسل جدید و جایگزین پروتکل SSL است. به همین دلیل ممکن است از هر کدام از نام های SSL و TLS و TLS/SSL برای اشاره به این پروتکل استفاده شود.رمزنگاری اطلاعات رد و بدل شده بین Server و Client ها در HTTPS، توسط مکانیزم های رمزنگاری متقارن (استفاده از Private Key و Public Key) انجام می‌شود. در این حالت، کلید خصوصی، یک SSL Key است که باید در یک مکان امن و خصوصی در سرور قرار گیرد و کلید عمومی، یک SSL Certificate است که روی سرور قرار گرفته و برای همه Client ها ارسال می‌شود. Client ها از این Certificate برای دو منظور استفاده می‌کنند: رمز کردن اطلاعات به صورتی که فقط سرور دارنده SSL Key معادل، قادر به رمزگشایی آنها باشد.احراز هویت و مالکیت سایت مربوطه.تولید SSL Key و SSL Certificate به راحتی و توسط ابزار OpenSSL توسط هر کسی امکان پذیر است. به چنین گواهینامه ای که توسط خود شما صادر (امضا) شده باشد، Self-signed SSL Certificate گفته می‌شود که می‌تواند اتصال بین Server شما با Client ها را امن کند اما Client ها با چنین گواهینامه ای قادر به احراز هویت سایت شما نیستند. در واقع Client ها (مثلا مرورگر های وب) فقط به گواهینامه هایی که توسط شرکت های قانونی (Certificate Authority) امضا شده باشند اعتماد کرده و هویت سایت را احراز می‌کنند. بنابراین برای اینکه کاربران هنگام بازکردن سایت شما در مرورگر، با اخطار زیر روبرو نشوند باید گواهینامه SSL شما توسط یک CA معتبر و قابل اعتماد مثل IdenTrust یا Comodo صادر (امضا) شده باشد. به چنین گواهینامه ای CA-Signed SSL Certificate یا Trusted Certificate گفته می‌شود.اخطاری که در صورت استفاده از گواهینامه Self-signed دریافت خواهید کرد. کاربر برای باز کردن سایت شما مجبور به کلیک بر روی گزینه Proceed to ..... (unsafe) است.گواهینامه های CA-Signed، خود در سه نوع DV و OV و EV صادر شده و به فروش می‌رسند که از نظر رمزنگاری تفاوتی با یکدیگر ندارند اما از نظر احراز هویت و مالکیت سایت، OV قوی تر از DV و EV قوی تر از OV است. DV مرسوم ترین نوع گواهینامه است که مالکیت دامنه (Domain) سایت شما را احراز می‌کند. دو نوع دیگر نیاز به ارسال و بررسی مدارک شرکت دارند و حتی مالکیت کسب و کار و حساب بانکی شما را نیز احراز می‌کنند.گواهینامه های DV یا Domain Validated در واقع دامنه یک سایت را احراز هویت می‌کنند. بنابراین به ازای هر سایت باید یک گواهینامه مستقل گرفت. پیشتر گفتیم که Subdomain های یک سایت، خود، سایت های مستقلی به حساب می‌آیند پس به ازای هر Subdomain (مثلا mail.example.com یا blog.example.com) نیاز به یک گواهینامه مستقل داریم. از آنجا که معمولا هر کدام از این Subdomain ها به سرویس های متفاوتی روی سرور های مختلف اشاره می‌کنند، وجود گواهینامه های متفاوت، امنیت این سرور ها را افزایش می‌دهد. زیرا در صورت لو رفتن SSL Key مربوط به blog.example.com، امنیت سرویس mail.example.com به خطر نمی‌افتد.با این حال گاهی مجبوریم که به ازای Subdomain های مختلف از یک گواهینامه واحد استفاده کنیم. مثلا فرض کنید هر کاربر در سایت شما یک صفحه مستقل با آدرس username.example.com دارد. در این صورت نمی‌توان به ازای هر کاربر جدید در سیستم، یک گواهینامه جدید خرید و از آن نگه داری کرد. در چنین حالتی از نوع خاصی از گواهینامه ها به نام Wildcard SSL Certificate استفاده می‌شود که به ازای همه Subdomain ها معتبر است.توجه کنید که استفاده از یک Wildcard SSL Certificate برای همه سرور ها ممکن است امنیت سیستم های شما را به خطر بیندازد.در گذشته ای نه چندان دور، صدور گواهینامه TLS/SSL توسط یک CA قابل اعتماد، بسیار گران قیمت و خارج از توان پرداختی بیشتر استارتاپ ها بود اما در سال های اخیر، یک CA معتبر به نام Lets Encrypt شروع به صدور و و امضای گواهینامه های CA-Signed رایگان از نوع DV کرده است. گواهینامه های صادر شده توسط Let&#x27;s Encrypt تاریخ انقضای سه ماهه (۹۰ روزه) دارند که در هر زمان می‌توان آنها را تمدید (Renew) کرد.برای فعال‌سازی HTTPS برای یک سایت باید تغییراتی را در Server Block مربوط به آن اعمال کرد. اولین تغییر مربوط به پورتی است که Server Block باید به درخواست های ارسال شده به آن گوش کند. همانطور که می‌دانید درخواست های HTTP به پورت ۸۰ سرور ارسال می‌شوند اما درخواست های HTTPS به پورت ۴۴۳. بنابراین اولین تغییر در Server Block به صورت زیر است:server {
    listen 443 ssl;    # It was listen 80;
    listen [::]:443 ssl;    # It was listen [::]:80;
    ...
}نکته: توجه کنید که پورت ۴۴۳ توسط Firewall شما مسدود نشده باشد. در صورت مسدود بودن توسط UFW می‌توانید با دستور sudo ufw allow &#x27;Nginx Full&#x27; این پورت را باز کنید.به عنوان تغییرات بعدی، باید آدرس فایل های SSL Certificate و SSL Key را توسط دایرکتیو های ssl_certificate و ssl_certificate_key به Server Block معرفی کرده و همینطور با تنظیمات مربوط به الگوریتم های رمزنگاری (Cipher Suite ها) امنیت HTTPS را بهتر کنیم. با این حال برای شلوغ نشدن فایل مربوط به Server Block و اینکه بتوان از تنظیمات SSL برای Server Block های دیگر هم استفاده کرد، این تنظیمات را در فایل های تنظیمات جداگانه در آدرس etc/nginx/snippets/ نوشته و در Server Block های مربوطه include می‌کنیم. دایرکتوری snippets در هنگام نصب Nginx برای جداسای فایل های تنظیمات و استفاده از آنها در بلاک های مختلف ایجاد می‌شود. بنابراین به آدرس etc/nginx/snippets/ رفته و دو فایل به نام های ssl-cert.conf و ssl-params.conf بسازید. در فایل ssl-cert.conf آدرس فایل های SSL Certificate و SSL Key را در مقابل دایرکتیو های ssl_certificate و ssl_certificate_key وارد کنید.ssl_certificate /etc/ssl/certs/ssl-certificate.crt;
ssl_certificate_key /etc/ssl/private/ssl-key.key;در فایل ssl-params.conf تنظیمات مربوط به Cipher Suite ها را از تنظیمات موجود در سایت https://cipherli.st کپی کنید. این تنظیمات که در واقع شامل امن ترین، قوی ترین و به‌روز ترین Cipher Suite های ممکن برای SSL اند، توسط یک هکر مشهور به نام Remy van Elst تهیه و نگه‌داری می‌شود و در صورت استفاده، امتیاز سایت شما را در SSL Labs به +A می‌رساند.ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
resolver_timeout 5s; 
add_header Strict-Transport-Security &amp;quotmax-age=63072000; includeSubDomains; preload&amp;quot
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection &amp;quot1; mode=block&amp;quotدر خط سوم، آدرس یک فایل (dhparam.pem) مقابل دایرکتیو ssl_dhparam درج شده. این فایل در واقع یک گروه Diffie-Hellman قوی است که آشنایی با آن را به مخاطب واگذار می‌کنیم. به هر حال، برای تولید این فایل می‌توان از ابزار OpenSSL استفاده کرد:$ sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096در خط چهارم از تنظیمات بالا تنها از دو Cipher Suite امن به نام های EECDH+AESGCM و EDH+AESGCM استفاده شده اما اگر Client های مخاطب شما قدیمی اند (مثلا Android های قبل از نسخه ۴.۴)، ممکن است از این الگوریتم ها پشتیبانی نکنند. در این صورت باید از تنظیمات و Cipher Suite های قدیمی تر که در سایت ذکر شده اند استفاده کنید.در خط یازدهم از تنظیمات بالا، باید آدرس IP یک سرویس DNS دلخواه را برای Upstream کردن درخواست ها درج کنید که می‌توانید از سرویس Google استفاده کنید. برای این کار به جای $DNS-IP-1 از 8.8.8.8 و به جای DNS-IP-2$ از 8.8.4.4 استفاده کنید.پیشنهاد می‌شود که خط سیزدهم که هدر Strict-Transport-Security را تنظیم می‌کند، فعلا کامنت کنید تا ابتدا مفهوم HSTS به ویژه حالت preload آن را کاملا درک کرده و بعداً آن را فعال کنید زیرا در صورت اشتباه ممکن است سایت شما برای مدت طولانی برای بعضی از کاربران غیر قابل دسترس شود.حال باید این دو فایل تنظیمات جداگانه را در Server Block مربوطه include کنید:server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/ssl-cert.conf;
    include snippets/ssl-params.conf;
    . . .
}با اعمال این تنظیمات، بار بعد که Nginx لود شود باید قادر به پاسخگویی به درخواست های HTTPS باشد. آن را تست کنید و اگر مشکلی وجود نداشت، می‌توانید تمام درخواست های HTTP (وارد شده روی پورت ۸۰) را به پورت ۴۴۳ منتقل (Redirect) کرده و به صورت امن به آنها پاسخ دهید. برای این کار باید یک Server Block دیگر برای درخواست های HTTP (پورت ۸۰) ایجاد کنیم زیرا Server Block قبلی را برای پاسخگویی به درخواست های HTTPS (پورت ۴۴۳) تغییر داده ایم. Server Block مربوط به HTTP به صورت زیر تعریف می‌شود:server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    return 301 https://$server_name$request_uri;
}در این صورت درخواست هایی که به www.example.com می‌فرستیم، در ابتدا به صورت http://www.example.com ارسال شده و Server Block مربوط به HTTP، آدرس جدید (https://www.example.com) را همراه با کد 301 به عنوان پاسخ بر می‌گرداند. مرورگر پاسخ را گرفته و از روی کد ۳۰۱ متوجه میشود که ریدایرکت اتفاق افتاده، بنابراین محتوای هدر Location در پاسخ، شامل آدرس جدید را خوانده و یک درخواست دیگر به سمت https://www.example.com ارسال می‌کند. توجه کنید که پاسخ با کد ۳۰۱ به عنوان Permanent Redirect توسط Client شناخته شده و دیگر هرگز از سمت Client درخواستی به آدرس قدیمی ارسال نمی‌شود و به جای آن از آدرس جدید استفاده خواهد شد. اگر در مورد این Redirect مطمین نیستید و یا به هر دلیل ممکن است بخواهید بعداً آن را تغییر دهید، بهتر است از کد ۳۰۲ استفاده کنید که Client آن را به عنوان Temporary Redirect شناسایی کرده و هر بار، توسط دو درخواست،‌ عملیات Redirect را انجام دهد.واضح است که در این صورت برای دریافت محتوای سایت دو بار درخواست ارسال می‌شود (یک بار به صورت HTTP و بار دیگر به صورت HTTPS). برای جلوگیری از ارسال درخواست اضافه، با استفاده از قابلیت HSTS می‌توان Client را مجبور کرد که از ابتدا درخواست را به صورت HTTPS ارسال کند. فعال‌سازی قابلیت HSTS با افزودن یک هدر (Strict-Transport-Security) به پاسخ یکی از درخواست های HTTPS انجام می‌شود. Client به محض مشاهده این Header در پاسخ یک درخواست HTTPS، نام سایت را (به مدت مشخص شده در Header) در لیست HSTS خود ذخیره می‌کند و از این به بعد تمام درخواست ها به سایت را به صورت HTTPS ارسال می‌کند.توجه کنید که اگر Client مخاطب شما به هر دلیل از TLS پشتیبانی نکند یا اعتبار گواهینامه TLS شما به هر دلیل از بین رفته باشد، احتمالا دسترسی به سایت شما ممکن نیست. حتی اگر بعدا قابلیت HSTS را غیر فعال کنید، باز هم تا مدت طولانی دسترسی کاربر به سایت با مشکل مواجه خواهد بود.برای اضافه کردن این Header به تمام پاسخ ها در همه Subdomain ها بهتر است دایرکتیو زیر را به جای Server Block در بلاک http از فایل nginx.conf اضافه کنید.add_header Strict-Transport-Security &amp;quotmax-age=63072000; includeSubDomains; preload&amp;quotاین Header به مرورگر می‌فهماند که تا دو سال آینده (۶۳۰۷۲۰۰۰ ثانیه دیگر) همه درخواست ها به سایت و Subdomain های آن را در بستر HTTPS ارسال کند.حتی با فعال بودن قابلیت HSTS، برای اولین درخواستی که از سمت Client به سایت ارسال می‌شود، احتمال حمله از نوع Downgrade Attack و دور زدن HSTS وجود دارد به همین دلیل مرورگر های وب، یک لیست از سایت ها با قابلیت HSTS را با عنوان HSTS Pre-load list درون پکیج خود دارند. البته که نگه‌داری از نام همه سایت های وب برای مرورگر ها امکان پذیر نیست اما فعلا می‌توانید برای این موضوع ثبت نام کنید.در آخر لازم به ذکر است، صدور و استفاده از Certificate امضا شده توسط Let&#x27;s Encrypt بسیار ساده تر است و دردسر های بالا را ندارد. زیرا این CA یک ابزار نرم‌افزاری به نام Certbot تولید کرده که تمامی این فرآیند ها و همینطور فرآیند تمدید گواهینامه را به صورت خودکار انجام می‌دهد. برای آشنایی با روش تولید و استفاده از این گواهینامه به این لینک مراجعه کنید.پشتیبانی از درخواست های ارسال شده با پروتکل HTTP/2درخواست هایی که از سمت Client ها (مرورگر وب کاربر، اپلیکیشن موبایل و ...) به Server ارسال می‌شوند، برپایه پروتکل HTTP اند. زمانی که اولین نسخه عمومی از این پروتکل (HTTP1.1) معرفی شد، بیشتر صفحات وب فقط شامل یک فایل HTML بودند که CSS ها نیز درون آن inline می‌شد. بنابراین در آن زمان با تعداد کمی Request، سایت بطور کامل توسط Client دریافت می‌شد. پروتکل HTTP1.1 این درخواست ها را در یک صف (Queue) قرار می‌داد و آنها را به ترتیب به Server ارسال می‌کرد. اما برای لود شدن سایت های امروزی، صد ها Request به سمت Server ارسال می‌شود و استفاده از صف برای ارسال ترتیبی درخواست ها، باعث کندی در بارگزاری صفحات می‌شود. کامپیوتر های امروزی برای انجام پردازش های موازی بهینه شده اند و نسخه جدید پروتکل HTTP یعنی HTTP/2 (یا به اختصار h2) نیز از این قابلیت بهره برده و درخواست ها را به صورت همزمان به سرور ارسال می‌کند. این همزمانی، به ویژه وقتی که تعداد درخواست های لازم برای بارگزاری کامل صفحه زیاد اند، باعث افزایش کلی در سرعت بارگزاری صفحه می‌شود.همینطور HTTP/2 اطلاعات ارسال شده در Header درخواست ها را فشرده (Compress) می‌کند و اطلاعات را به جای متن به صورت Binary ارسال می‌کند که اینها خود در کاهش حجم داده های ارسالی و در نتیجه سرعت نهایی بارگزاری تاثیری به سزایی دارند.نکته: به دلایل امنیتی، بیشتر مرورگر ها امکان ارسال درخواست های HTTP/2 به سرور هایی که ارتباط امن (HTTPS) برقرار نمی‌کنند را نمی‌دهند. بنابراین برای اینکه سایت شما از HTTP/2 پشیبانی کند باید حتما از گواهینامه SSL استفاده کنید و تمام ترافیک پورت ۸۰ را به پورت ۴۴۳ ریدایرکت (Redirect) کنید.همینطور باید از یک کلید DHE یا Ephemeral Diffie-Hellman با اندازه ۲۰۴۸ بیت (یا بالاتر) در تنظیمات Nginx استفاده کنید که پیشتر، روش تولید و استفاده از آن توضیح داده شد.بنابراین تا اینجای کار، دو Server Block، یکی برای پاسخ‌گویی به درخواست های HTTP و دیگری برای پاسخ‌گویی به درخواست های HTTPS داریم. بلاک مربوط به HTTP درخواست ها را به صورت HTTP1.1 دریافت می‌کند (پیشتر گفته شد که اکثر مرورگر های وب، به دلایل امنیتی، درخواست های HTTP/2 را فقط به سرور های HTTPS ارسال می‌کنند). سپس این بلاک، یک پاسخ با کد ۳۰۱ شامل یک آدرس HTTPS برای کاربر فرستاده و مرورگر وب کاربر، درخواست جدیدی را به Server Block مربوط به HTTPS ارسال می‌کند. برای اینکه این درخواست (در صورت پشتیبانی Client) به صورت HTTP/2 ارسال شود، باید Server Block مربوط به HTTPS به صورت زیر تغییر کند:server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
}همینطور باید توجه کرد که بعضی از Cipher Suite ها برای رمزنگاری پروتکل HTTP/2 به اندازه کافی امن نیستند و در صورت وجود باید حذف شوند.در صورتی که تنظیمات SSL شما توسط نرم‌افزار Certbot انجام شده، فایل تنظیماتی با آدرس etc/letsencrypt/options-ssl-nginx.conf/ در Server Block مربوطه include شده که شامل Cipher Suite های ممکن است. ویرایش این فایل، فرآیند به روز رسانی Certbot را دچار مشکل می‌کند. بنابراین به جای ویرایش این فایل، آن را Comment کرده و به جای آن Cipher Suite های امن تر را توسط دایرکتیو ssl_ciphers معرفی کنید.server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
   # include /etc/letsencrypt/options-ssl-nginx.conf; 
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
}با اعمال تغییرات بالا و راه‌اندازی مجدد Nginx، درخواست کاربران در صورت امکان به صورت HTTP/2 ارسال خواهد شد. برای بررسی این موضوع می‌توانید با استفاده از ابزار curl درخواستی را به سرور ارسال کرده و ورژن پروتکل و همینطور Header های پاسخ (مثلا Strict-Transport-Security و ...) را بررسی کنید.در تصویر بالا، اولین درخواست با پروتکل HTTP1.1 به سرور HTTP (یعنی http://snapp.ir) ارسال شده و با پاسخ ۳۰۱ (Permanent Redirect) مواجه شده است. سپس مرورگر آدرس جدید را از هدر Location در پاسخ دریافت شده خوانده و درخواست جدیدی را با پروتکل HTTP/2 به سرور HTTPS (یعنی https://snapp.ir) ارسال کرده است. همانطور که مشاهده می‌کنید، این بار سرور پاسخ صحیح (با کد ۲۰۰) را به همراه هدر Strict-Transport-Security برای ۶ ماه، به کاربر ارسال کرده است.برای آشنایی با HTTP/3 میتوانید از این لینک و یا این لینک استفاده کنید.استفاده از Nginx به عنوان Cache Serverبرای استفاده از Nginx به عنوان Cache Server می‌توانید از لینک زیر کمک بگیرید.https://www.nginx.com/blog/nginx-caching-guide/روش جایگزین برای HTTP Cache استفاده از پکیج Varnish است. </description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Mon, 16 Dec 2019 17:26:13 +0330</pubDate>
            </item>
                    <item>
                <title>شبکه خصوصی مجازی (VPN) چیست؟!</title>
                <link>https://virgool.io/@hosseinkhani/%D8%B4%D8%A8%DA%A9%D9%87-%D8%AE%D8%B5%D9%88%D8%B5%DB%8C-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-vpn-%DA%86%DB%8C%D8%B3%D8%AA-rku2wjqqjbw2</link>
                <description>این روز ها بیشتر افراد برای غلبه بر محدودیت هایی مثل تحریم، فیلترینگ و ... در اینترنت از VPN ها استفاده می‌کنند. اما آیا واقعا VPN (شبکه خصوصی مجازی) فقط یک فیلترشکن است؟!قطعا اینطور نیست. به همین دلیل در این پست میخواهیم تا حدی با مفهوم شبکه خصوصی مجازی (Virtual Private Network) و کاربرد های آن در شبکه های کامپیوتری آشنا شویم.در ابتدا لازم است با دو مفهوم شبکه های خصوصی (Private Network) و شبکه های عمومی (Public Network) آشنا شویم.زمانی که شما سیستم های کامپیوتری داخل منزل یا دفتر کارتان را به صورت LAN به هم متصل می‌کنید در واقع یک شبکه خصوصی (Private Network) ایجاد کرده اید. سیستم های داخل شبکه خصوصی می‌توانند به راحتی همدیگر را دیده و با هم ارتباط برقرار کنند اما این سیستم ها از بیرون شبکه خصوصی شما (مثلا از طریق اینترنت) قابل دستیابی نیستند. سیستم های کامپیوتری داخل یک شبکه خصوصی می‌توانند هر IP Address دلخواه شما (مثلا 192.168.0.1) را داشته باشند زیرا این IP Address ها فقط داخل شبکه خصوصی شما تعریف شده اند و خارج از شبکه خصوصی شما معنی ندارند. به این IP Address ها Private IP Address گفته می‌شود.اما شبکه عمومی (Public Network) به سیستم های متعلق به شما محدود نمی‌شود. در واقع شبکه جهانی اینترنت اصلی ترین شبکه عمومی است. سیستم های متصل به اینترنت باید IP Address یکتای مختص به خود را داشته باشند که توسط RIR به آنها فروخته شده است. این IP Address ها کاملا یکتا و عمومی اند. منظور از آدرس آی پی عمومی (Public IP Address) این است که این IP Address در اینترنت تعریف شده و از طریق آن می‌توان به سیستم مورد نظر دسترسی مستقیم داشت.بعضی از افراد فعال در حوزه IT به اشتباه از عبارت Valid IP Address به جای Public IP Address استفاده می‌کنند. لازم است بدانید که Valid IP Address مفهوم دیگری است و ربطی به Private/Public IP Address ندارد.برای آشنایی با IP Address و روش یافتن آن می‌توانید مقاله مرتبط با IP Address را مطالعه فرمایید.حال که با مفهوم شبکه ی خصوصی و شبکه ی عمومی آشنا شدید، لازم است بدانید که گاهی لازم است از خارج از یک شبکه خصوصی و از طریق یک شبکه عمومی (مثل اینترنت) به سیستم های داخل شبکه خصوصی دسترسی داشته باشید. مثلا فرض کنید که می‌خواهید از خانه به فکس شرکت و یا فایل های به اشتراک گذاشته شده در شبکه داخلی شرکت دسترسی داشته باشید. یا فرض کنید که می خواهید از خارج از دانشگاه، به اسناد و پایان نامه های موجود در شبکه داخلی دانشگاه دسترسی پیدا کنید. یا فرض کنید که فایروال نصب شده روی سرور سایت شما جوری تنظیم شده است که تنها از داخل شرکت اجازه دسترسی به سرور را میدهد و شما نیاز دارید که از بیرون شرکت به آن دسترسی پیدا کنید.برای اتصال به یک شبکه خصوصی از راه دور و از طریق یک شبکه عمومی لازم است یک شبکه خصوصی مجازی (VPN) ایجاد کنید. این اتصال از طریق یک تونل رمزنگاری شده بین کلاینت VPN و شبکه خصوصی شما صورت میپذیرد. شما با وارد کردن یک نام کاربری و کلمه عبور و یا وارد کردن یک Certificate در نرم افزار کلاینت VPN می توانید یک تونل امن به شبکه خصوصی مورد نظرتان باز کنید.تونل امن ایجاد شده بین کاربر و شبکه خصوصی دور از آناطلاعات رد و بدل شده از طریق این تونل رمز می‌شوند بنابراین هکر ها و سایر افراد و سازمان های غیر مجاز، قادر به مشاهده اطلاعات رد و بدل شده بین شما و شبکه خصوصیتان نیستند.همانطور که پیشتر گفته شد، شما از طریق VPN به تمام منابع موجود در شبکه خصوصیتان مثل پرینتر، دوربین، سرور و ... دسترسی دارید. اتصال اینترنت هم می‌تواند یکی از این منابع باشد. به عبارت دیگر اگر شبکه خصوصی شما به اینترنت متصل باشد، با اتصال به شبکه خصوصیتان از طریق VPN می‌توانید از اینترنت متصل به آن استفاده کنید.کاربرد های شبکه خصوصی مجازیاتصال به شبکه خصوصی داخل شرکت از راه دور و استفاده از منابع آن. برای مثال ارسال فکس با دستگاه موجود در شرکت از راه دور یا مشاهده دوربین های امنیتی شرکت از منزل.اتصال به سایت ها و سرویس هایی که توسط دولت ها و ... تحریم یا سانسور شده و یا به محدوده جغرافیایی خاصی سرویس می‌دهند. برای این منظور باید یک شبکه خصوصی متصل به اینترنت در آن محدوده جغرافیایی ایجاد کرد و توسط VPN از راه دور به آن شبکه وصل شوید.افزایش امنیت اتصال به اینترنت های عمومی مثل اینترنت موجود در هتل ها. در این صورت شما با استفاده از VPN یک تونل امن با شبکه خصوصی خودتان ایجاد می‌کنید که اطلاعات رد و بدل شده (حتی با http) را رمز کنید. در این صورت هکر ها، هتل و ... به راحتی قادر به مشاهده اطلاعات رد و بدل شده شما نخواهند بود.نکاتی که هنگام استفاده از VPN باید در نظر گرفتاتصال به اینترنت از طریق اتصال به شبکه خصوصی، به خاطر رمزنگاری و طولانی تر شدن مسیر ارسال داده ها، کند تر از حالت عادی است.در رابطه با اتصال به شبکه های خصوصی ای که متعلق به خود شما نیست، محتاط باشید. ممکن است اطلاعات و تاریخچه وب گردی شما توسط سازندگان آن VPN قابل مشاهده باشند.استفاده از VPN های عمومی مثل Hotspot Shield یا 1.1.1.1 برای دور زدن تحریم یا سانسور، در بعضی از کشور ها منع قانونی دارد. مثلا در چین تنها مجاز به استفاده از VPN های مورد تایید دولت هستید. در ایران منع قانونی مشخصی در رابطه با استفاده از VPN در حالت عادی وجود ندارد اما عبور از فیلترینگ برای مقاصد خاصی ممکن است جرم تلقی شود.برای ایجاد یک شبکه خصوصی مجازی پروتکل های مختلفی از جمله PPTP و L2TP  و OpenVPN و IKEv2/IPSec و Wireguard... وجود دارند که هر کدام مزایا و معایب و کاربرد های خود را دارند. با این حال WireGuard نسبت به بقیه جدیدتر، سبک تر، امن تر و سریع تر است. به همین دلیل Linus Torvalds (خالق linux) آن را در هسته جدید Linux (نسخه 5.6) به صورت پیشفرض قرار داده است.برای راه اندازی یک VPN با پروتکل WireGuard میتوانید از اسکریپت های موجود در اینجا استفاده کنید.برای این کار یک سرور Linux (ترجیها Ubuntu) با حداقل منابع (یک هسته پردازشی و 1GB حافظه کافی است) آماده کرده و دستورات زیر را به ترتیب در آن وارد کنید.$ wget -O - https://github.com/xei/wireguard-setup-scripts/archive/master.tar.gz | tar xz
$ cd wireguard-setup-scripts-master
$ sudo ./setup-wireguard-server.shسرور VPN شما آماده است و می‌توانید با دستور زیر برای هر Client فایل تنظیمات بسازید.sudo ./create-new-peer.sh hamidreza-pcسپس با توجه به سیستم عامل Client، نرم‌افزار مخصوص WireGuard را نصب کرده و با استفاده از فایل تنظیماتی که در مرحله قبل ساخته اید و در مسیر /etc/wireguard/peers/  ذخیره شده است،  به VPN متصل شوید.دانلود نرم افزار کلاینت Windowsدانلود نرم افزار کلاینت macOSدانلود نرم افزار کلاینت Linuxدانلود نرم افزار کلاینت Androidدانلود نرم افزار کلاینت iOSلینک های دیگر:راه اندازی شبکه خصوصی مجازی از نوع OpenVPN بر روی میکروتیک</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Mon, 25 Nov 2019 14:38:37 +0330</pubDate>
            </item>
                    <item>
                <title>پیدا کردن آدرس IP سرور</title>
                <link>https://virgool.io/@hosseinkhani/%D9%BE%DB%8C%D8%AF%D8%A7-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A2%D8%AF%D8%B1%D8%B3-ip-%D8%B3%D8%B1%D9%88%D8%B1-zzacfahbct7z</link>
                <description>مقدمههمانطور که می‌دانید، همه Node ها در اینترنت (سرور ها، کامپیوتر ها، موبایل ها و ...) با یک آدرس یکتا (IP Address) شناسایی می‌شوند. این آدرس در واقع یک رشته صفر و یک به طول ۳۲ بیت (۴ بخش ۸ بیتی) است که برای سادگی در نمایش، هر ۸ بیت آن توسط یک عدد دسیمال از ۰ تا ۲۵۵ نمایش داده می شود.به عنوان مثال،‌ آدرس IP گوگل 216.58.208.78 است و اگر شما این آدرس را در مرورگر وب خود وارد کنید، به سایت Google متصل خواهید شد.با یک آدرس ۳۲ بیتی می‌توان ۲ به توان ۳۲ آدرس مختلف ایجاد کرد بنابراین نسخه ۳۲ بیتی این آدرس قادر است 4,294,967,296 دستگاه مختلف را در اینترنت آدرس‌دهی کند. واضح است که در عصر اینترنت اشیا که همه دستگاه ها از لپ‌تاپ و موبایل تا ساعت و عینک و تلویزیون و یخچال و ... به اینترنت متصل اند و نیاز به یک آدرس IP دارند، ۴.۳ میلیارد آدرس، بسیار کم است. بنابراین در سال ۱۹۹۸ نسخه ششم از این آدرس (IPv6) معرفی شد که یک آدرس ۱۲۸ بیتی است و می‌تواند ۲ به توان ۱۲۸ (340282366920938463463374607431768211456) دستگاه مختلف را آدرس دهی کند :)آدرس IPv6 شامل ۸ قسمت ۱۶ بیتی است که هر قسمت را به صورت Hexadecimal (مبنای ۱۶) توسط چهار حرف نمایش می‌دهند.یافتن آدرس IP در ترمینال لینوکسبا اجرای فرمان زیر در ترمینال لینوکس، اطلاعات بسیار کاملی از آدرس های IP خود در شبکه خواهید دید:$ ip addrاگر سرور شما با کارت شبکه سیمی به اینترنت متصل باشد ممکن است بتوانید با اجرای دستور زیر فقط آدرس IP عمومی خود را در شبکه مشاهده کنید:ip addr show eth0 | grep inet | awk &#039;{ print $2; }&#039; | sed &#039;s/\/.*$//&#039;روش دیگر برای مشاهده آدرس IP عمومی سرور در اینترنت، استفاده از وبسایت icanhazip.com است. برای این منظور، دستور زیر را در ترمینال سرور وارد کنید تا Public IP Address سرور را مشاهده کنید:curl -4 icanhazip.comمنظور از آدرس IP عمومی، آدرس IP ای است که دستگاه شما با آن در اینترنت قابل دستیابی است. بعضی ها به اشتباه به آدرس IP عمومی، Valid IP هم می‌گویند که البته اصطلاح اشتباهی است چون Valid IP با Public IP تفاوت دارد.برای آشنایی بیشتر با Public IP Address و Private IP Address می‌توانید مقاله آشنایی با VPN را مطالعه کنید.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Thu, 03 Oct 2019 01:13:54 +0330</pubDate>
            </item>
                    <item>
                <title>اتصال به سرور به کمک SSH</title>
                <link>https://virgool.io/@hosseinkhani/%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-ssh-yqsjd5iwnf8a</link>
                <description>مقدمهمعمولا سرور ها از لحاظ جفرافیایی دور از دسترس ما اند مثلا ممکن است در یک Data Center در کشوری دیگر مستقر شده باشند،‌ بنابراین نصب سرویس های مختلف و اعمال تنظیمات بر روی آنها عموما از راه دور انجام می‌شود. اتصال به سرور از راه دور در سالهای اول با استفاده از پروتکل ها و ابزارهای ساده ای مثل Telnet صورت می گرفت. این روش ها اطلاعات رد و بدل شده را رمز نمی‌کردند و به همین دلیل از امنیت بسیار پایینی برخوردار بودند. این روز ها مرسوم ترین و امن ترین روش اتصال به سرور از راه دور، استفاده از پروتکل SSH است.پروتکل SSH با رمزنگاری محتوای رد و بدل شده در شبکه (مثل Password و ...) از آنها در مقابل خوانده شدن  توسط افراد غیر مجاز در شبکه محافظت می‌کند. اگر چه اسناد افشا شده توسط Edward Snowden در سال ۲۰۱۳ نشان داد که این پروتکل آنقدر ها هم امن نیست و آژانس امنیت ملی آمریکا بارها توانسته اطلاعات رمز شده در این پروتکل را رمزگشایی کند.پروتکل SSH امنیت محتوای رد و بدل شده در یک شبکه ناامن مثل اینترنت را تامین می‌کند.معمولا سرویسی به نام ssh (در سیستم عامل های مبتنی بر Debian مثل Ubuntu) یا sshd (در سیستم عامل های مبتنی بر Redhat مثل CentOS) روی سرور فعال و در حال گوش کردن به پورت ۲۲ است. با نصب یک SSH Client مانند OpenSSH یا PuTTY روی کامپیوتر شخصی می‌توان از راه دور به سرویس مذکور روی سرور وصل شد و کنترل سرور را در دست گرفت.پکیج نرم‌افزاری OpenSSH به صورت پیش‌فرض بر روی سیستم عامل های MacOS و Linux نصب شده است. اما اگر سیستم عامل کامپیوتر شخصی شما Windows است می‌توانید نرم افزار PuTTY را دانلود و نصب کنید تا از راه دور به سرور خود SSH کنید.پکیج نرم‌افزاری OpenSSH شامل چندین ابزار کاربردی مثل scp و sftp و ssh و ssh-keygen و ... است که جلوتر به معرفی بعضی از آنها خواهیم پرداخت.اتصال به سرور با استفاده از Username و Passwordهمانطور که پیشتر گفته شد، پکیج نرم‌افزاری OpenSSH به صورت پیشفرض در بیشتر سیستم عامل ها نصب شده است. بنابراین کافی است وارد یک شبیه‌ساز ترمینال در کامپیوتر شخصی خود (مثلا iTerm2 در MacOS یا Tilix در Linux) شده و دستور ssh USER_NAME@HOST را وارد کرده و کلید Enter را بزنید. دقت کنید که به جای HOST، آدرس IP یا Domain سرور و به جای USER_NAME نام یک کاربر تعریف شده روی سرور را وارد کنید.بار اولی که قصد SSH کردن به یک سرور خاص را دارید، احتمالا با پیغام زیر مواجه خواهید شد که می‌گوید این سرور برای کامپیوتر شما ناشناخته است.The authenticity of host &#x27;203.0.113.1 (203.0.113.1)&#x27; can&#x27;t be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)?با تایپ کردن yes و زدن کلید Enter روی کیبورد، سرور مذکور به لیست Host های شناخته شده در کامپیوتر شما (به آدرس ssh/known_hosts./~) اضافه شده و در دفعات بعد با این پیام مواجه نخواهید شد. سپس کلمه عبور کاربر از شما پرسیده می شود که در صورت درست وارد کردن آن، یک Terminal Session متصل به سرور برای آن کاربر باز می‌شود و می‌توانید هر کاری که کاربر تعریف شده روی سرور مجاز به انجام آن است را از طریق این ترمینال انجام دهید.اتصال به سرور با استفاده از Username و Password به هیچ عنوان روش خوبی نیست و سرور شما را در معرض حمله Brute-force قرار می‌دهد. در واقع اگر این روش اتصال روی سرور شما فعال باشد، هکر ها با تولید و امتحان تعداد زیادی رمز عبور به صورت خودکار، سعی در ورود به سرور شما خواهند کرد.روش جایگزین، استفاده از SSH Key برای اتصال به سرور است.اتصال به سرور با استفاده از SSH Keyدر این روش اتصال، به جای Username و Password از کلید خصوصی (Private Key) و کلید عمومی (Public Key) تولید شده توسط الگوریتم رمزنگاری RSA استفاده می‌شود.در روش رمزنگاری RSA، برای رمز کردن اطلاعات و ارسال آنها در شبکه، یک جفت کلید (دو کلید)، یکی برای رمزنگاری (Encryption Key) و دیگری برای رمزگشایی (Decryption Key) ساخته می‌شوند. اگر داده ای با یک Encryption Key خاص رمز شده باشد، فقط و فقط با Decryption Key معادل آن رمزگشایی می‌شود. بنابراین اگر سیستمی به نام Alice بخواهد پیامی را به سیستمی به نام Bob بفرستد، باید Encryption Key مربوط به Bob را داشته باشد و پیام را با آن رمز کند و برای Bob بفرستد. با فرض اینکه Decryption Key متعلق به Bob را هیچ کس جز خودش ندارد، می‌توان مطمین بود که فقط Bob می‌تواند پیام را رمزگشایی کند. بنابراین Decryption Key یک کلید خصوصی (Private Key) است و هیچ کس جز مالک اصلی آن نباید آن را داشته باشد اما Encryption Key توسط سایر فرستندگان برای رمز کردن داده ها استفاده می‌شود و از این رو یک کلید عمومی (Public Key) است که می‌توان آن را به راحتی در اختیار بقیه قرار داد.برای داشتن یک ارتباط امن در اتصال یک Client به یک Server،‌ لازم است هر دو ی آنها یک جفت کلید خصوصی و عمومی داشته باشند و کلید عمومی خود را برای رمزنگاری در اختیار یکدیگر قرار دهند و از کلید خصوصی خود نهایت محافظت را داشته باشند. نرم افزار OpenSSH به صورت خودکار از Server کلید عمومی را میپرسد اما کلید عمومی Client باید توسط خود شما به Server داده شود.نرم افزار SSH Client به صورت خودکار کلید عمومی (کلید سبز) را از سرور میگیرد و پیام خود را با آن رمز می‌کند و در شبکه اینترنت با پروتکل SSH منتقل می‌کند. سرور می‌تواند پیام رمز شده را با کلید خصوصی خود باز کند.کلید خصوصی و عمومی متعلق به سرور (ID متعلق به سرور)، هنگام ساختن User روی سرور ایجاد شده اند و در مسیر /ssh./~ به ترتیب با نام های id_rsa و id_rsa.pub ذخیره شده اند. برای ساختن جفت کلید RSA روی کامپیوتر شخصی خود (Client) می‌توانید از ابزار ssh-keygen در مجموعه نرم‌افزاری OpenSSH استفاده کنید. برای این منظور دستور زیر را در ترمینال اجرا کنید:$ ssh-keygenاجرای این دستور، یک جفت کلید ۲۰۴۸ بیتی (ID متعلق به کلاینت) در مسیر /ssh./~  به نام های id_rsa و id_rsa.pub می‌سازد که برای بیشتر امور به اندازه کافی امن است اما برای اطمینان بیشتر می‌توان از یک کلید بزرگتر (مثلا ۴۰۹۶ بیتی) استفاده کرد:$ ssh-keygen -t rsa -b 4096 -C &amp;quotyour_email@example.com&amp;quotلازم به ذکر است که مسیر ذخیره شدن ID در هنگام ساخته شدن آن از شما پرسیده می‌شود که با زدن کلید Enter روی کیبورد مقدار پیشفرض آن (/ssh./~) در نظر گرفته می‌شود. همینطور هنگام ساخته شدن ID، یک Passphrase از شما پرسیده می‌شود که می‌توانید آن را خالی بگذارید اما به شدت توصیه می‌کنیم که یک رمز عبور قوی برای این بخش وارد کنید. وارد کردن رمز عبور در این قسمت باعث می‌شود تا در صورت لو رفتن Private Key مربوط به کامپیوتر شما کسی نتواند به راحتی از آن سواستفاده کند.پس از ساخته شدن ID توسط ابزار ssh-keygen یک Randomart (شبیه تصویر) برای سهولت در بررسی چشمی ایجاد می‌شود.حال که جفت کلید مربوط به کلاینت ساخته شده، باید کلید عمومی آن را به سرور بدهیم. برای این منظور فایل ssh/id_rsa.pub./~ روی کلاینت که شامل کلید عمومی است را باز کرده و محتوای آن (که با ssh-rsa AAAA شروع می‌شود) را در انتهای فایل ssh/authorized_keys./~ روی سرور کپی می‌کنیم. اگر فایل ssh/authorized_keys./~ روی سرور وجود نداشت می‌توانید با دستورات زیر آن را بسازید:mkdir -p ~/.ssh &amp;&amp; touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh &amp;&amp; chmod 600 ~/.ssh/authorized_keysالبته که ابزاری به نام ssh-copy-id در پکیج نرم‌افزاری OpenSSH وجود دارد که کار انتقال کلید عمومی به سرور را به صورت خودکار انجام می‌دهد و می‌توانید برای سادگی از آن بر روی کامپیوتر خود استفاده کنید:ssh-copy-id USER_NAME@HOSTبه جای HOST از IP یا Domain سرور و به جای USER_NAME از نام یک کاربر مجاز بر روی سرور استفاده کنید. واضح است که پس از اجرای دستور بالا، رمز عبور کاربر سرور پرسیده می‌شود بنابراین قابلیت اتصال به سرور با نام کاربری و رمز عبور باید هنگام استفاده از این ابزار فعال باشد. در صورت وارد کردن رمز عبور صحیح، کلید عمومی کامپیوتر به سرور منتقل می‌شود و ازین پس می‌توانید به راحتی و بدون وارد کردن رمز عبور به سرور متصل شوید.غیر فعال کردن قابلیت اتصال به سرور با استفاده از Username و Passwordدر بالا گفتیم که فعال بودن این روش اتصال، امنیت سرور را به خطر می اندازد. از طرفی هنگام استفاده از ابزار ssh-copy-id برای انتقال کلید عمومی به سرور، نیاز به فعال بودن این قابلیت داریم. بنابراین پس از انتقال کلید عمومی و اطمینان از اینکه اتصال به سرور با استفاده از SSH Key به درستی کار می‌کند، بهتر است  قابلیت اتصال به سرور با استفاده از Username و Password را غیر فعال کنیم. برای این منظور فایل etc/ssh/sshd_config/ را به کمک یک Text Editor مانند vim ویرایش کنید:در صفحه باز شده، خط PasswordAuthentication را یافته و با پاک کردن کاراکتر # آن را از حالت Comment خارج کرده و عبارت no را مقابل آن درج کنید. سپس تغییرات را ذخیره کرده و از محیط vim خارج شوید. (wq:)از نظر امنیتی بهتر است ورود به سرور با کاربر root غیر فعال باشد بنابراین پیشنهاد می‌شود خط PermitRootLogin را نیز در فایل مذکور یافته و عبارت no را در مقابل آن درج کنید تا ورود با کاربر root نیز در همین جا غیر فعال شود.پس از اعمال تغییرات مذکور، لازم است تا سرویس ssh (یا sshd) مجددا راه اندازی شود:$ sudo systemctl restart sshاگر همه مراحل بالا را درست طی کرده باشید با اجرای دستور ssh USERNAME@HOST روی کامپیوتر خود، بدون رمز عبور به سرور متصل می‌شوید و البته با اجرای این دستور روی کامپیوتر های دیگر (به دلیل عدم تعریف کلید عمومی و غیر فعال بودن ورود به کمک رمز عبور) اتصال امکان پذیر نخواهد بود.اگر تعداد زیادی سرور و کاربر دارید و به خاطر سپردن IP و Username همه آنها برای شما سخت است می‌توانید نام های ساده تری را به آنها اختصاص دهید. برای این کار فایل ssh/config./~ را ساخته و محتوایی شبیه به محتوای زیر را به آن اضافه کنید:Host production1
    HostName 172.217.169.238
    User hamidrezaحال به جای دستور ssh hamidreza@172.217.169.238 می‌توانید از دستور ssh production1 استفاده کنید.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Tue, 24 Sep 2019 23:06:07 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت دامنه های ir. و com.</title>
                <link>https://virgool.io/@hosseinkhani/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%AF%D8%A7%D9%85%D9%86%D9%87-ir-%D9%88-com-pp7bcijmfvtc</link>
                <description>مقدمه ای بر DNSهمانطور که می‌دانید، همه Node ها در اینترنت (سرور ها، کامپیوتر ها، موبایل ها و ...) با یک آدرس یکتا (IP Address) شناسایی می‌شوند. این آدرس در واقع یک رشته صفر و یک به طول ۳۲ بیت (۴ بخش ۸ بیتی) است که برای سادگی در نمایش، هر ۸ بیت آن توسط یک عدد دسیمال از ۰ تا ۲۵۵ نمایش داده می شود.به عنوان مثال،‌ آدرس IP گوگل 216.58.208.78 است و اگر شما این آدرس را در مرورگر وب خود وارد کنید، به سایت Google متصل خواهید شد. اما واضح است که به خاطر سپردن IP Address سایت ها کار سختی است بنابراین هر سایت یک نام دامنه (Domain name) را از فروشندگان نام دامنه (Domain Name Registrar) می‌خرد و به جای IP Address به کاربران خود معرفی می‌کند. قطعا به خاطر سپردن google.com  به عنوان نام دامنه بسیار ساده تر از به خاطر سپردن 216.58.208.78 است. حال موضوع اینجاست که شما به عنوان کاربر شرکت گوگل، نام دامنه آن (google.com) را دارید نه IP Address آن را، با این حال برای اتصال به آن نیاز به IP Address است. پس سرویس هایی به نام سامانه نام دامنه (DNS) در اینترنت وجود دارند که مانند یک دیکشنری عمل کرده و Domain Name ها را به IP Address متناظر با آنها ترجمه (Resolve) می‌کنند.سامانه نام دامنه همانند یک دیکشنری Domain Name را به IP Address متناظر آن ترجمه می‌کند.بنابراین زمانی که شما نام دامنه را در مرورگر وب خود وارد می‌کنید، این مرورگر به صورت خودکار نام دامنه وارد شده را به یکی از DNS های موجود در اینترنت فرستاده و IP Address متناظر با آن را دریافت کرده و با آن ارتباط برقرار می‌کند.برای دریافت اطلاعات بیشتر در مورد DNS اینجا کلیک کنید.سامانه DNS در واقع یک پایگاه داده متمرکز نیست و در اینترنت توزیع شده است. به عبارت دیگر درخواست ترجمه نام دامنه به آدرس IP معمولا بین چند DNS دست به دست شده تا در نهایت آدرس IP پیدا می‌شود. برای مدیریت بهتر این پایگاه داده توزیع شده، از بخش سمت راست نام دامنه (com و ir و ...) موسوم به TLD استفاده می‌شود. در واقع اولین DNS ای که درخواست ترجمه را می‌گیرد (Root Name Server) به TLD دامنه نگاه کرده و بر اساس آن، درخواست ترجمه را به DNS مربوطه می‌فرستد. برای مثال با دیدن ir میداند که این دامنه متعلق به ایران است و درخواست ترجمه را به DNS های مربوط به ایران می‌فرستد.تفاوت های بین دامنه های ir و comهمانطور که گفته شد دامنه هایی که TLD آنها ir است مخصوص ایران اند و برای resolve شدن به DNS های ایران ارسال می‌شوند. بنابراین اگر کاربران سایت شما در ایران هستند (به علت نزدیکی جغرافیایی با DNS ها) سرعت بالاتری را هنگام ترجمه نام دامنه به IP Address نسبت به com و ... تجربه می‌کنند. البته که این امر برای کاربران خارجی و بین المللی به مراتب کند تر از دامنه های com و ... انجام می‌شود. دامنه هایی که TLD آنها com یا net یا org یا ... هستند مربوط به کشور خاصی نیستند و DNS های خود را دارند. به این نوع TLD ها که عمومیت بیشتری در سطح بین المللی دارند، gTLD گفته می‌شود.اگر اکثر کاربران شما از ایران هستند استفاده از دامنه های ir به علت مشخص تر بودن کشور مخاطب نسبت به com و ...، باعث بهبود SEO می‌شود. البته که با روش هایی مثل درج کشور هدف در Google Web Master می‌توان این مشکل را در دامنه های com نیز حل کرد.اگر قصد تبلیغات در رسانه های ملی مثل صدا و سیما را دارید باید بدانید که محدودیت هایی برای استفاده از دامنه های غیر از ir وجود دارد و احتمالا مجبورید از دامنه های ir استفاده کنید.دامنه های ir در داخل کشور به صورت حقوقی برای شما ثبت می‌شوند و در صورت دزدیده شدن یا رزرو (Park) شدن توسط افراد سودجو، به راحتی و با مراجعه به پژوهشکده دانش های بنیادین در نیاوران تهران قادر خواهید بود آن را پس بگیرید.در صورت استفاده از دامنه های ir احتمال مواجه شدن با محدودیت های تحریمی هنگام استفاده از بعضی سرویس ها وجود دارد. برای مثال اگر می‌خواهید از Google Ads استفاده کنید، حتما دامنه ای غیر از ir را در آن ثبت کنید.برای ثبت دامنه های ir می توانید به سایت مرکز ثبت دامنه کشوری ایران (IRNIC) مراجعه کنید.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Sun, 15 Sep 2019 22:29:48 +0430</pubDate>
            </item>
                    <item>
                <title>پهنای باند اختصاصی بخریم یا اینترنت سازمانی</title>
                <link>https://virgool.io/@hosseinkhani/%D9%BE%D9%87%D9%86%D8%A7%DB%8C-%D8%A8%D8%A7%D9%86%D8%AF-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B5%DB%8C-%D8%A8%D8%AE%D8%B1%DB%8C%D9%85-%DB%8C%D8%A7-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%B3%D8%A7%D8%B2%D9%85%D8%A7%D9%86%DB%8C-nj0meal0vmkk</link>
                <description>مقدمهیکی از اولین سوالاتی که برای بیشتر تیم ها در ابتدای مسیر راه‌اندازی استارتاپشان به وجود می‌آید این است که چه اینترنتی را برای دفتر کارشان تهیه کنند. پاسخ این سوال برای روز های اول ممکن است Hotspot کردن موبایل یا مودم های سیار LTE باشد اما به زودی نیاز به یک سرویس اینترنت جدی تر حس می‌شود. در این میان بعضی ها به سرویس های اینترنت سازمانی (از طریق +ADSL2 یا TD-LTE یا ...) و بعضی نیز به پهنای باند اختصاصی (Dedicated Broadband) روی می‌آورند. اگر چه برای همه نمی‌توان یک نسخه واحد را پیچید اما در این پست سعی می‌کنم مقایسه ای بر این دو سرویس داشته باشم تا با آگاهی بیشتری نسبت به خرید محصول متناسب با نیاز خود اقدام کنید.اینترنت سازمانیاین سرویس بسیار شبیه به سرویس اینترنت خانگی است اما معمولا محدودیت پهنای باند (سرعت) آن بالا تر است (مثلا تا ۵۰ مگابیت بر ثانیه).حجم مصرفی (دیتای دانلود شده) در این سرویس ها معمولا نامحدود است اما ممکن است هزینه حجم مصرفی جداگانه حساب شود.ارتباط با ISP در این سرویس می‌تواند از طریق +ADSL2 یا Wi-Max یا TD-LTE یا ... باشد که این روز ها محبوب ترین روش، استفاده از TD-LTE با مودم خارجی (نصب در فضای باز مثل پشت بام) است.در این سرویس، یک پهنای باند مشخص بین تعدادی از کاربران ISP به اشتراک گذاشته می‌شود بنابراین سرعت اینترنت در ساعات مختلف شبانه روز بسته به مصرف سایر کاربران،‌ متغیر است و در ساعات اوج مصرف به حداقل خود می‌رسد.این سرویس اصطلاحاً نامتقارن (Asymmetric) است. به عبارت دیگر سرعت Upload به مراتب از سرعت Download کمتر است.آدرس IP شما در هر بار اتصال به این سرویس تغییر می‌کند و شما همیشه یک آدرس IP ثابت ندارید.هزینه استفاده از این سرویس در مقایسه با پهنای باند اختصاصی، به مراتب کمتر است. (البته دقت کنید که در کل هزینه اینترنت در ایران از میانگین سایر کشور ها بیشتر است)پهنای باند اختصاصیدر این سرویس، پهنای باند، انحصارا در اختیار شما است. بنابراین سرعت اینترنت در طول شبانه روز ثابت و بدون نوسان است.سرعت اینترنت در این سرویس می‌تواند تا چندین گیگابیت بر ثانیه باشد.این سرویس اصطلاحا متقارن (Symmetric) است. به عبارت دیگر سرعت Upload و Download در این سرویس یکسان است.ارتباط با ISP در این سرویس میتواند از طریق آنتن PtP یا فیبر نوری یا ... باشد.حجم مصرفی (دیتای دانلود شده) در این سرویس نامحدود است.آدرس IP شما در هر بار اتصال به این سرویس ثابت است. در واقع یک یا چند آدرس IP ثابت، بسته به نیاز، توسط ISP به شما منتسب می‌شود.از پهنای باند اختصاصی می‌توان برای برقراری هرگونه شبکه مثل Internet یا Intranet یا ... در داخل و خارج سازمان استفاده کرد و فقط مختص اینترنت نیست.هزینه استفاده از این سرویس در مقایسه با سرویس اینترنت سازمانی به مراتب بیشتر است.نتیجهاگر:نیاز به یک شبکه پایدار بین شعب مختلف سازمان دارید...قرار است افرادی از راه دور به شبکه داخلی شما وصل شده و کار های خود را انجام دهند...سرور هایی در شرکت دارید که باید از بیرون شرکت و در بستر اینترنت دیده شوند...بک‌آپ هایی به صورت منظم از سرور های شما گرفته شده و لازم است در زمان کوتاهی توسط این شبکه Restore شوند...فایل های بسیار حجیم در شبکه به اشتراک گذاشته می‌شوند...تلفن اینترنتی (NGN) دارید...از شبکه شما برای کنفرانس های ویدیویی استفاده می‌شود...لازم است پهنای باند اختصاصی خود را داشته باشید. در غیر اینصورت، ممکن است استفاده از سرویس های اینترنت سازمانی با هزینه بسیار کمتر جوابگوی نیاز های شما باشد.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Sun, 15 Sep 2019 19:29:20 +0430</pubDate>
            </item>
                    <item>
                <title>متصل کردن Gitlab به Jira</title>
                <link>https://virgool.io/@hosseinkhani/%D9%85%D8%AA%D8%B5%D9%84-%DA%A9%D8%B1%D8%AF%D9%86-gitlab-%D8%A8%D9%87-jira-xrokttzxuq7v</link>
                <description>مقدمهاین روز ها، Gitlab یکی از اصلی ترین ابزار هایی است که بیشتر برنامه‌نویس ها و متخصصان حوزه نرم‌افزار با آن سر و کار دارند. Gitlab در واقع مجموعه ای کامل از ابزار های توسعه محصول، از برنامه‌ریزی تا استقرار را شامل می‌شود.با استفاده از Gitlab Issue Tracker می‌توان issue ها (کارهایی که برای بهبود محصول لازم است مثل پیاده‌سازی قابلیت های جدید یا رفع باگ ها) را برنامه‌ریزی و پیگیری کرد. معروف ترین رقیب Gitlab Issue Tracker نرم افزار Jira است که بسیاری از افراد فعال در حوزه مدیریت پروژه های نرم افزاری آن را ترجیح می‌دهند.با استفاده از Gitlab Version Control می‌توان سورس‌کد نرم‌افزار ها را مدیریت کرد. معروف ترین رقیب Gitlab Version Control، سایت Github است که اخیراً کاربران ایرانی را تحریم کرده و به همین دلیل، شرکت ها استفاده از Gitlab Version Control را ترجیح می‌دهند.با استفاده از Gitlab CI/CD می‌توان فرآیندهای Build و Test و Deploy نرم‌افزار ها را خودکار‌سازی کرد. معروف ترین رقیب Gitlab CI/CD نرم‌افزار Jenkins است که محبوب ترین ابزار در حوزه CI/CD محسوب می‌شود.مجموعه نرم‌افزار Gitlab در واقع تمام ابزار های لازم برای توسعه نرم‌افزار در قالب متدولوژی های توسعه‌ چابک (Agile Software Development) با فرهنگ DevOps را در قالب یک اکوسیستم یکپارچه ارایه داده است. با این حال، بسیاری از تیم های توسعه نرم‌افزار ترجیح می‌دهند که تنها از بخشی از این اکوسیستم گسترده بهره برده و برای سایر بخش ها از نرم‌افزار های دیگر استفاده کنند. یکی از مرسوم ترین این ترکیب ها، استفاده از نرم‌افزار Jira به عنوان Issue Tracker به همراه Gitlab Version Control است.به لطف انعطاف پذیری بالای Gitlab می‌توان Gitlab Version Control را به نرم‌افزار Jira متصل کرد و از مزایای هر دو به صورت یکپارچه بهره برد.گاهی محصولات شما در یک Git Repository واحد ذخیره نمی‌شوند. مثلا ممکن است محصول شما یک پلتفرم تاکسی اینترنتی باشد که به رانندگان و مسافران در یک اپلیکیشن واحد سرویس می‌دهد. شما در واقع از نظر بیزنس دو محصول دارید. محصول رانندگان و محصول مسافران و این دو، issue ها و نیازمندی های خود را دارند که می‌توان در دو پروژه مستقل Jira آنها را مدیریت کرد. اما سورس کد های شما در قالب پنج پروژه مستقل در Gitlab ذخیره می‌شوند. برای مثال این پنج پروژه عبارتند از: Android Application و iOS Application و Web App و Backend و Admin Dashboard.در چنین شرایطی، Gitlab Issue Tracker به شما اجازه مدیریت Issue ها در قالب دو محصول رانندگان و مسافران را نمی‌دهد و شما را مجبور می‌کند هر Git Repository را به عنوان یک پروژه در نظر بگیرید. حال فرض کنید میخواهید یک قابلیت جدید برای مسافران اضافه کنید تا بتوانند مکان های پر تردد خود را ذخیره کنند. Issue مربوط به این قابلیت در کدام پروژه باید ردگیری شود؟!با اتصال Gitlab به Jira میتوان دو محصول رانندگان و مسافران را در Jira ایجاد کرد و Product Owner می‌تواند بدون درگیر شدن با مسایل فنی، Issue های هر کدام را به طور مستقل از طریق Jira پیگیری کند. برنامه‌نویسان Task های مربوط به هر Issue را در داخل یکی از پنج پروژه ی Gitlab انجام می‌دهند و با Commit کردن کد ها در Git، وضعیت Issue ها در Jira به صورت خودکار به روز می‌شود.اتصال Gitlab به Jira به برنامه‌نویسان اجازه می‌دهد که هنگام Commit کردن کد‌های مربوط به یک Issue بتوانند به کارت مربوط به آن Issue در Jira، یک Comment و یا Worklog اضافه کنند و یا با Merge شدن Branch ها به صورت خودکار وضعیت Issue مربوط به آن در Jira را به Done تغییر دهند.این یکپارچگی برای برنامه‌نویسان و البته مدیران پروژه بسیار ارزشمند است زیرا نیاز برنامه‌نویس به مراجعه به Jira برای افزودن Comment و Worklog و تغییر وضعیت Issue ها را به حداقل می‌رساند و از طرفی باعث می‌شود که وضعیت ها و Worklog های Jira همیشه به روز باشند.یکی از گله هایی که همیشه Product Owner ها از برنامه‌نویسان دارند این است که به جای وارد کردن Worklog ها به صورت پیوسته و در طول اسپرینت، همه آنها را یک جا در انتهای اسپرینت وارد می‌کنند که این موضوع نه تنها باعث فراموشی زمان واقعی صرف شده برای یک Issue می‌شود بلکه تحلیل زمان در طول اسپرینت را برای Product Owner ناممکن می‌سازد.دومین گله ای که همیشه Product Owner ها از برنامه‌نویسان دارند، مربوط به آپدیت نکردن وضعیت Issue ها در نرم‌افزار Issue Tracker است.حق با چه کسی است؟! طبیعتا هر دو! آپدیت بودن وضعیت Issue ها و Worklog ها لازمه کار Product Owner است اما قطعا برنامه‌نویسان کار های مهمتری برای انجام دارند، پس بهتر است به جای آزار خود و دیگران، تا جای ممکن این فرآیند ها را خودکار کنیم.تنظیمات مربوط به Jira۱. با اکانت Administrator وارد Jira شوید.۲. از منوی تنظیمات Jira (چرخ‌دنده بالا سمت راست) گزینه User Management را انتخاب کنید.۳. در صورت نیاز، مجددا پسورد Administrator را وارد کنید.۴. با کلیک بر روی دکمه Create User یک کاربر به نام gitlab ساخته و پسورد آن را در جایی یادداشت کنید. این کاربر به نرم افزار Gitlab اجازه می‌دهد تا بتواند بر روی Issue های Jira تغییراتی را اعمال کند. بنابراین در مرحله بعد به این کاربر اجازه نوشتن روی همه پروژه های Jira را خواهیم داد.۵. در سمت چپ صفحه بر روی Groups کلیک کنید. در سمت راست با وارد کردن نام gitlab-developers و فشردن دکمه Add Group یک گروه جدید با این نام ایجاد کنید.گروه gitlab-developers به لیست گروه ها در پایین صفحه اضافه می ‌‌‌‌شود.۶. با کلیک کردن بر روی گزینه Edit members در روبروی آن، وارد صفحه افزودن کاربر به این گروه می‌شویم تا کاربری که ساخته ایم را به آن اضافه کنیم.۷. در بخش Add members to selected groups نام کاربری که ساخته بودید (gitlab) را وارد کرده و بر روی دکمه Add selected users کلیک کنید. در ستون دوم می‌توانید ببینید که کاربر gitlab به گروه gitlab-developers اضافه شده است.۸. برای اینکه Gitlab بتواند روی Issue ها، Comment و ... بگذارد، لازم است که به گروه gitlab-developers دسترسی نوشتن (Write) روی همه پروژه های Jira را بدهیم. برای این کار از منوی تنظیمات Jira (چرخ‌دنده بالا سمت راست) گزینه Issues را انتخاب کنید.۹. در سمت چپ صفحه روی گزینه Permission Schemes کلیک کرده و در سمت راست، دکمه Add Permission Scheme را بزنید.۱۰. در صفحه بعد یک نام به Permission Scheme داده و بر روی Add کلیک کنید.با کلیک بر روی دکمه Add به صفحه قبل بازگشته و میبینید که Permission Scheme ای که ساختید به لیست اضافه شده است.۱۱. بر روی گزینه Permissions مقابل Permission Scheme اضافه شده کلیک کنید.۱۲. در صفحه باز شده بر روی گزینه Edit در بخش Administer Projects کلیک کنید.۱۳. در دیالوگ باز شده گزینه Group را از قسمت Granted to انتخاب کرده، سپس گروهی که ساخته بودید (gitlab-developers) را از منوی زیر آن انتخاب کنید و بر روی دکمه Grant کلیک کنید.حال کاربر gitlab عضو گروه gitlab-developers است و اعضای این گروه اجازه نوشتن روی همه پروژه ها را دارند.تنظیمات مربوط به Gitlab۱. با اکانت Administrator وارد Gitlab شوید.۲. از نوار منوی بالای صفحه بر روی علامت آچار (Admin Area) کلیک کنید.۳. در سمت چپ صفحه ی باز شده بر روی Service Templates و در سمت راست صفحه بر روی سرویس Jira کلیک کنید.۴. در صفحه باز شده، با کلیک بر روی گزینه Active سرویس Jira را فعال کنید. (توجه کنید که گزینه های Commit و Merge request نیز فعال باشند)۵. در بخش Web URL، آدرس اینترنتی Jira (مثلا http://jira.school.ai) را وارد کنید.۶. بخش Jira API URL را خالی بگذارید.۶. نام کاربری و کلمه عبوری که برای Gitlab در Jira ساختید را در بخش های Username و Password وارد کنید.۷. در بخش Transition IDs باید ID های مربوط به Transition های تعریف شده در Jira را به ترتیب وارد کرده و با کاما (,) از هم جدا کنید. در غیر اینصورت Gitlab نمی‌تواند وضعیت Issue ها در Jira را تغییر دهد. Transition ها در واقع همان وضعیت ها در Issue ها اند. (مثلا To-Do یا In Progress  یا Done)برای پیدا کردن Transition ID های Jira می‌توانید از API زیر استفاده کنید. با باز کردن آدرس زیر در مرورگر وب و بررسی پاسخ آن متوجه Transition ID ها در Jira خواهید شد.https://jira.school.ai/rest/api/2/issue/DRIVER_232/transitionsلازم است در آدرس بالا، http://jira.school.ai را به آدرس اینترنتی Jira و DRIVER-232 را به شناسه یکی از  Issue های موجود در Jira که در وضعیت Open قرار دارد تغییر دهید.در آخر بر روی دکمه Save کلیک کنید.حال که Gitlab به Jira متصل شده، باید لینک آن در منوی سمت چپ پروژه ها و در زیر بخش Issues قابل دسترس باشد.۸. حال که از Jira استفاده می کنید در صورت تمایل می‌توانید Issue Tracker خود Gitlab را غیر فعال کنید. برای این کار از منوی سمت چپ پروژه وارد بخش Setting و سپس General شوید و از بخش Visibility, project features, permissions گزینه Issues را غیر فعال کنید.تغییر وضعیت Issue ها در Jira با Commit کردن در Gitlabبه کمک مفهوم Smart Commit در Jira می‌توان بدون استفاده از دشبورد Jira  و تنها با Commit کردن کد ها در Gitlab، روی Issue ها، Comment و Worklog گذاشت و یا وضعیت آنها را هنگام Merge شدن برنچ ها تغییر داد.فرم کلی Message در Smart Commit به صورت زیر است:&lt;ignored text&gt; &lt;ISSUE_KEY&gt; &lt;ignored text&gt; #&lt;COMMAND&gt; &lt;optional COMMAND_ARGUMENTS&gt;به جای توضیحات بیشتر، مثال های زیر را در نظر بگیرید:JRA-34 #comment develop favorite places feature.این Smart Commit بر روی Issue با  شناسه JRA-34 یک Comment ثبت می‌کند.JRA-34 #time 1d 2h 30m develop favorite places feature.این Smart Commit بر روی Issue با شناسه JRA-34 یک Worklog به اندازه یک روز و دو ساعت و سی دقیقه به همراه یک Comment ثبت می‌کند.JRA-34 #comment develop favorite places feature. #time 2h 5m #resolveاین Smart Commit بر روی Issue با شناسه JRA-34 یک Comment و یک Worklog ثبت کرده و وضعیت آن را به Resolved تغییر می‌دهد.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Fri, 06 Sep 2019 19:10:06 +0430</pubDate>
            </item>
                    <item>
                <title>نصب و راه اندازی نرم‌افزار Jira</title>
                <link>https://virgool.io/@hosseinkhani/%D9%86%D8%B5%D8%A8-%D9%88-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D9%86%D8%B1%D9%85%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-jira-qam6itsqota1</link>
                <description>مقدمههر جا صحبت از مدیریت پروژه‌های نرم‌افزاری و ابزار‌های مرتبط با آن به میان می‌آید، بی شک Jira یکی از  اصلی ترین ابزارهای مورد بحث است. این نرم‌‌افزار که توسط شرکت Atlassian توسعه داده شده، در سازمان های بزرگی مثل ناسا، توییتر، اسکایپ و ... بطور وسیع مورد استفاده قرار گرفته است.در مبحث مدیریت پروژه‌های نرم‌افزاری، به کوچکترین واحد کاری که برای بهبود و توسعه یک محصول باید انجام شود، یک issue می‌گویند. یک issue می‌تواند یک قابلیت (Feature) جدید در نرم‌افزار، یک ایراد (Bug) یا هر نوع کار قابل انجام برای بهبود و توسعه سیستم باشد. Jira در واقع یک ابزار برای تعریف و پیگیری issue ها یا به عبارتی یک Issue Tracking System است که به مدیران پروژه کمک می‌کند issue ها را تعریف و اولویت‌بندی کرده و به افراد مختلف در تیم بسپارند، همینطور پیشرفت آنها را طی فرآیند‌های استانداردی مثل Scrum و Kanban پیگیری کنند. از طرف دیگر Jira می‌تواند به ابزارهای مدیریت سورس کد مثل Gitlab یا Bitbucket متصل شده و issue ها را به کد‌های مربوط به آنها در پروژه لینک کند.نرم‌افزار Jira رقبای دیگری مثل YouTrack، Gitlab Issue Tracker، ‌PivotalTracker، Redmine، Bugzilla و ... نیز دارد که هر کدام نقاط قوت و ضعف خود را دارند.نرم‌افزار Jira در قالب سه بسته نرم‌افزاری مختلف به فروش می‌رسد که بسته به نیاز می‌توان یکی از آنها را خریداری کرد:پکیج Jira Core شامل امکانات پایه برای مدیریت پروژه های بیزنسی (غیر نرم‌افزاری) است.پکیج Jira Software علاوه بر امکانات Jira Core شامل امکانات مربوط به مدیریت پروژه‌های نرم‌افزاری در قالب متدولوژی هایی مثل Scrum است.پکیج Jira Service Desk علاوه بر امکانات Jira Core و Jira Software قابلیت های مربوط به پشتیبانی و امور مشتریان را نیز شامل می‌شود.قیمت لایسنس نرم‌افزار Jira برای استارتاپ‌های کوچک (حداکثر ۱۰ نفر) ماهیانه ۱۰ دلار است که پیشنهاد می‌کنیم در صورت امکان آن را خریداری کنید اما برای شرکت‌های بزرگتر این هزینه به مراتب بیشتر است و با در نظر گرفتن مسایل مربوط به تحریم‌ها و نرخ ارز و ... متاسفانه چاره ای به جز کرک کردن این نرم‌افزار وجود ندارد.در این نوشتار به آموزش نصب و البته کرک کردن پکیج Jira Software نسخه ۸.۱.۰ (۶۴ بیتی) بر روی یک سرور Ubuntu خواهیم پرداخت.نیازمندی‌هاقبل از هر چیز، به یک کامپیوتر سرور که توسط اعضای تیم قابل دسترس باشد نیاز داریم. این سرور می‌تواند یک لپ‌تاپ روشن در شبکه داخلی شرکت و یا یک VPS در طرف دیگر سیاره زمین باشد. البته واضح است که روشن گذاشتن یک سیستم در شرکت به عنوان سرور Jira نه تنها مقرون به صرفه نیست،‌ بلکه امنیت لازم را هم ندارد و هر لحظه ممکن است اطلاعات مربوط به پروژه‌ها را از دست بدهیم. از طرف دیگر کرک کردن لایسنس Jira روی سرور‌های خارجی نیز ممکن است به دلیل نقض قوانین کپی‌رایت عواقبی را برای سرور و حتی شرکت در پی داشته باشد. بنابراین احتمالا بهترین گزینه استفاده از یک VPS داخل کشور (یا مثلا ابرک های آروان) است. پیشنهاد می‌شود برای این سرور، یک یا دو هسته پردازشی، حداقل ۴ گیگابایت حافظه RAM و حداقل ۲۰ گیگابایت حافظه دیسک در نظر بگیرید. (برای اطلاعات بیشتر و دقیق‌تر اینجا کلیک کنید.) سیستم عامل نصب شده روی این سرور اهمیت خاصی ندارد، با این حال فرض ما در این نوشتار نسخه 64 بیتی Ubuntu است.برای نصب Jira بر روی سیستم عامل Windows اینجا کلیک کنید.نصب Databaseطبیعی است که Jira برای نگه‌داری issue ها نیاز به یک Database دارد. برای این منظور می‌توان از انواع دیتابیس های رابطه‌ای مثل Microsoft SQL Server، mySQL و ... استفاده کرد. اما پیشنهاد ما استفاده از PostgreSQL است. بنابراین پس از آماده سازی سرور و اتصال به آن با SSH، به سراغ نصب PostgreSQL می‌رویم.ابتدا با اجرای دستور زیر، لیست پکیج‌های موجود در مخازن اوبونتو و ورژن های آنها را آپدیت می‌کنیم:$ sudo apt-get updateسپس با اجرای دستور زیر آخرین نسخه از PostgreSQL را نصب می‌کنیم:$ sudo apt-get install postgresql postgresql-contribپس از اتمام مراحل نصب، اجرای دستور زیر باعث می‌شود که PostgreSQL به عنوان یک سرویس در اوبونتو شناخته شده و هربار که سرور بوت شد به صورت خودکار اجرا شود:$ sudo update-rc.d postgresql enableدقت کنید که دستور بالا برای اجرا شدن PostgreSQL در هنگام بوت شدن های بعدی است. پس برای اجرای آن در همین لحظه، دستور زیر را اجرا کنید:$ sudo service postgresql startتنظیمات Databaseحال که سرویس PostgreSQL در حال اجرا روی سرور است، باید بتوان با اجرای دستور psql به کنسول مربوط به این دیتابیس وصل شد و با دیتابیس کارکرد. اما اگر دستور psql را اجرا کنید احتمالا با پیغام خطای psql: FATAL:  role &quot;YOUR_USER_NAME&quot; does not exist مواجه خواهید شد. دلیل این مشکل این است که کاربری که با آن در سرور لاگین کرده اید اجازه دسترسی به دیتابیس و تغییر آن را ندارد. در واقع، PostgreSQL برای بالا بردن امنیت از مفهومی به عنوان Role استفاده می‌کند و اگر شما می‌خواهید به دیتابیس متصل شده و تغییری در آن ایجاد کنید باید یک Role به نام کاربری که با آن لاگین کرده اید در PostgreSQL داشته باشید و واضح است که این Role برای کاربر شما از قبل تعریف نشده است. با این حال، PostgreSQL هنگام نصب، یک کاربر به نام postgres در سرور ساخته و یک Role به همین نام نیز برای آن ایجاد می‌کند. پس می‌توانید با کاربر postgres به سرور لاگین کرده و با اجرای دستور psql به دیتابیس وصل شوید:$ sudo su - postgres
$ psqlبا اجرای دستور psql کنسول PostgreSQL باز شده و می‌توانید با دیتابیس ارتباط برقرار  کنید. مثلا با دستور l\ می‌توانید لیست دیتابیس‌های موجود در PostgreSQL را ببینید و یا با دستور du\ می‌توانید لیست Role ها را مشاهده کنید. همینطور با دستور q\ می‌توانید از کنسول مربوط به PostgreSQL خارج شده و به ترمینال سرور خود بازگردید (اما فعلا از کنسول PostgreSQL خارج نشوید).توجه کنید کسی که قرار است در نهایت به PostgreSQL وصل شود و از آن استفاده کند، نرم افزار Jira است. جلوتر خواهیم دید که این نرم افزار هنگام نصب، یک کاربر بر روی سرور ما خواهد ساخت پس باید یک Role برای آن کاربر در PostgreSQL ایجاد کنیم تا بتواند به دیتابیس وصل شود. اجرای دستور زیر در کنسول PostgreSQL یک Role به نام jiradbuser و با کلمه عبور p@ssW0rd در PostgreSQL ایجاد می‌کند. توجه کنید که این نام و کلمه عبور آن را در جای امنی یادداشت کنید زیرا جلوتر در تنظیمات Jira به آن نیاز خواهید داشت.postgres=# CREATE USER jiradbuser WITH PASSWORD &#039;p@ssW0rd&#039;;در کنسول PostgreSQL با اجرای دستور زیر یک دیتابیس جدید به نام jiradb ایجاد خواهیم کرد که نرم‌افزار Jira از آن برای ذخیره‌سازی issue ها استفاده کند:postgres=# CREATE DATABASE jiradb WITH ENCODING &#039;UNICODE&#039; LC_COLLATE &#039;C&#039; LC_CTYPE &#039;C&#039; TEMPLATE template0;حال برای اینکه کاربر jiradbuser بتواند از دیتابیس ساخته شده استفاده کند نیازمند مجوز‌های مربوطه است که با اجرای دستور زیر در کنسول PostgreSQL به این مجوز ها دست پیدا خواهد کرد:postgres=# GRANT ALL PRIVILEGES ON DATABASE jiradb TO jiradbuser;تا اینجای کار، شما PostgreSQL را به عنوان یک سرویس فعال روی سرور نصب کرده اید و روی آن دیتابیس و کاربر برای نرم‌افزار Jira ساخته اید. کار ما در اینجا با PostgreSQL تمام شده پس با اجرای دستور q\ از کنسول PostgreSQL خارج شوید.دقت کنید که چون قبلا با کاربر postgres به سرور لاگین کرده بودیم، با خروج از کنسول PostgreSQL به ترمینال این کاربر بازخواهیم گشت. بنابراین با اجرای دستور زیر از حساب کاربری postgres خارج شده و به حساب کاربری خود برگردید:$ logoutنصب نرم‌افزار Jiraدر زمان نوشتن این مقاله (تابستان ۹۸)، آخرین نسخه از پکیج  Jira Software که کرک شده، نسخه ۸.۱.۰ است، بنابراین با اجرای دستور زیر در ترمینال سرور، این نسخه را از سایت رسمی آن دانلود می‌کنیم.$ wget https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-8.1.0-x64.binبرای اجرای این فایل نصب، لازم است به آن مجوز اجرایی بدهیم:$ chmod a+x atlassian-jira-software-8.1.0-x64.binحال با اجرای دستور زیر، شروع به نصب نرم‌افزار Jira می‌کنیم:$ sudo ./atlassian-jira-software-8.1.0-x64.binدر هنگام نصب Jira، هشت سوال از شما پرسیده می‌شود که می‌توانید به آنها پاسخ داده و یا (به جز آخرین سوال) با زدن کلید Enter برای هر سوال از پاسخ پیش‌فرض استفاده کنید. سوالاتی که در این مرحله پرسیده می‌شودند عبارتند از:سوال اولThis will install JIRA Software 8.1.0 on your computer.OK [o, Enter], Cancel [c]با زدن کلید Enter یا زدن کلید o و سپس Enter نصب برنامه آغاز می‌شود.سوال دومChoose the appropriate installation or upgrade option.Please choose one of the following:Express Install (use default settings) [1], Custom Install (recommended for advanced users) [2, Enter], Upgrade an existing JIRA installation [3]با زدن کلید Enter یا زدن کلید ۲ و سپس Enter گزینه نصب سفارشی انتخاب می‌شود که به شما اجازه ‌می‌دهد محل نصب و ... را تغییر دهید.سوال سومWhere should JIRA Software be installed?[/opt/atlassian/jira]با زدن کلید Enter نرم‌افزار در مسیر پیشفرض (/opt/atlassian/jira) نصب می‌شود. در صورت لزوم می‌توانید این مسیر را تغییر داده و سپس Enter را بزنید.سوال چهارمDefault location for JIRA Software data[/var/atlassian/application-data/jira]با زدن کلید Enter داده های نرم‌افزار مثل فایل های ضمیمه issue ها، در مسیر پیشفرض (/opt/atlassian/jira) دخیره می‌شوند. در صورت لزوم می‌توانید این مسیر را تغییر داده و سپس Enter را بزنید.سوال پنجمConfigure which ports JIRA Software will use.JIRA requires two TCP ports that are not being used by any otherapplications on this machine. The HTTP port is where you will access JIRAthrough your browser. The Control port is used to startup and shutdown JIRA.Use default ports (HTTP: 8080, Control: 8005) - Recommended [1, Enter], Set custom value for HTTP and Control ports [2]با زدن کلید Enter پورت ۸۰۸۰ برای اتصال کاربران به سرویس Jira از طریق Web Browser در نظر گرفته می‌شود. اگر این پورت قبلا توسط نرم‌افزار دیگری اشغال شده است، می‌توانید آن را تغییر داده و سپس Enter بزنید.ممکن است این پورت توسط Firewall نصب شده روی سرور شما مسدود شده باشد که در این صورت لازم است در تنظیمات مربوط به Firewall آن را باز کنید. این سایت به شما کمک می‌کند تا بررسی کنید که پورت ۸۰۸۰ (یا هر پورت دیگری) در سرور شما باز است یا خیر.سوال ششمJIRA can be run in the background.You may choose to run JIRA as a service, which means it will startautomatically whenever the computer restarts.Install JIRA as Service?Yes [y, Enter], No [n]با زدن کلید Enter و یا زدن کلید y و بعد Enter، نرم‌افزار Jira به عنوان یک سرویس در اوبونتو شناخته شده و هربار که سرور بوت شد به صورت خودکار اجرا می‌شود.سوال هفتمDetails on where JIRA Software will be installed and the settings that will be used.Installation Directory: /opt/atlassian/jira Home Directory: /var/atlassian/application-data/jira HTTP Port: 8080 RMI Port: 8005 Install as service: Yes Install [i, Enter], Exit [e]با زدن کلید Enter و یا کلید i و بعد Enter، صحت اطلاعات بالا را تایید کرده و نصب آغاز می‌شود. ممکن است این مرحله چند دقیقه ای به طول بیانجامد.سوال هشتم (مهم) Installation of JIRA Software 8.1.0 is completeStart JIRA Software 8.1.0 now?Yes [y, Enter], No [n]در این مرحله، نصب Jira پایان یافته و از شما سوال می‌شود که آیا مایلید این نرم‌افزار اجرا شود؟! دقت کنید که اگر می‌خواهید این نرم‌افزار را کرک کنید،‌ حتما با فشردن کلید n و سپس Enter جلوی اجرا شدن برنامه در این مرحله را بگیرید.کرک کردن نرم‌افزار Jiraکرک کردن نرم‌افزار Jira فرآیندی سه مرحله ای است:۱. در مرحله اول باید یکی از فایل های Jira به نام atlassian-extras-3.2.jar را با یک فایل دستکاری شده جایگزین کنیم.۲. مرحله دوم،‌ وارد کردن شماره سریال جعلی برای Jira Software در هنگام بالا آمدن Jira برای اولین بار است.۳. مرحله سوم، وارد کردن شماره سریال جعلی برای Jira Core در تنظیمات پنل Jira است.برای انجام مرحله اول کرک، دستور زیر را در ترمینال سرور اجرا کنید. این دستور فایل atlassian-extras-3.2.jar را از مسیر نصب Jira پاک کرده و فایل دستکاری شده را دانلود و جایگزین آن می‌کند. توجه کنید که در این مرحله نباید سرویس Jira در حال اجرا باشد.$ sudo rm -f /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/atlassian-extras-3.2.jar ; sudo wget http://bayanbox.ir/download/875654641841270819/atlassian-extras-3.2.jar -P /opt/atlassian/jira/atlassian-jira/WEB-INF/lib/توجه کنید که تا اینجای کار فقط یکی از سه مرحله کرک کردن نرم‌افزار Jira انجام شده و دو مرحله دیگر را کمی جلوتر انجام خواهیم داد.کرک کردن پلاگین‌های افزودنی به Jiraبا خرید Plugin ها و افزودن آنها به Jira می‌توان امکانات تکمیلی ویژه ای مثل نمودار گانت، نمودار نقشه راه، اتصال به InvisionApp، ارتباط با Slack و تلگرام و ... را به این نرم‌افزار اضافه کرد. برای اینکه بتوانید Plugin های غیر رایگان را نیز در آینده کرک کنید، لازم است همین الان و قبل از اولین اجرای سرویس Jira دستور زیر را در ترمینال سرور اجرا کنید:$ sudo rm -f /opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/atlassian-universal-plugin-manager-plugin-4.0.1.jar ; sudo wget http://bayanbox.ir/download/1902644824753031905/atlassian-universal-plugin-manager-plugin-4.0.1.jar -P /opt/atlassian/jira/atlassian-jira/WEB-INF/atlassian-bundled-plugins/کرک کردن Plugin ها در Jira یک فرآیند دو مرحله ای است. مرحله بالا فایل atlassian-universal-plugin-manager-plugin-4.0.1.jar را با یک فایل دستکاری شده جایگزین می‌کند. مرحله دوم استفاده از یک Key Generator برای تولید کردن شماره سریال جعلی و استفاده از آن شماره سریال در هنگام نصب پلاگین مورد نظر است.اجرای سرویس Jiraاگر تا این مرحله پیش آمده اید، نرم‌افزار Jira را نصب کرده و احتمالا مرحله اول از فرآیند کرک کردن آن را انجام داده اید. حال می‌توانید با اجرای دستور زیر این سرویس را برای اولین بار اجرا کنید:$ sudo service jira startباز کردن Dashboard و انجام تنظیمات اولیهحال با استفاده از یکی از کامپیوتر های متصل به شبکه، وارد یک مرورگر وب (مثلا Google Chrome) شده و در نوار آدرس، آدرس IP سروری که Jira را روی آن نصب کردید به همراه شماره پورتی که هنگام نصب به Jira اختصاص داده اید را وارد کنید:آدرس IP و Port با دونقطه از هم جدا می‌شوندبا زدن کلید Enter، صفحه تنظیمات اولیه Jira باز می‌شود. اگر این صفحه باز نشد، اول مطمین شوید کامپیوتر شما و سرور در یک شبکه قرار دارند (برای این کار می‌توانید سرور را از کامپیوتر خود Ping کنید) و اگر مشکل از شبکه نبود، احتمالا Firewall نصب شده روی سرور، پورت مورد استفاده ی Jira را مسدود کرده است. برای اطمینان می‌توانید باز بودن پورت روی سرور را با استفاده از این سایت بررسی کنید. اگر مطمین شدید که پورت استفاده شده بسته است می‌توانید از دستورات زیر در سرور برای باز کردن آن استفاده کنید:$ iptables -A INPUT -m state --state NEW -p tcp --dport 8080 -j ACCEPT
$ /etc/init.d/iptables restartدر صفحه تنظیمات اولیه (تصویر زیر) دو گزینه وجود دارد. گزینه دوم (I&#x27;ll set it up myself) را انتخاب کرده و روی دکمه Next کلیک کنید.گزینه اول برای تست و دمو کردن امکانات Jira است. ترجیها آن را انتخاب نکنید.صفحه دوم (تصویر زیر) مربوط به تنظیمات Database است. گزینه دوم (My Own Database) را انتخاب کرده، مشخصات Database که قبلا برای این منظور روی سرور نصب کردیم را وارد و بعد روی Next کلیک کنید.نوع دیتابیس را PostgreSQL انتخاب کنید.در فیلد Hostname آدرس سروری که دیتابیس روی آن نصب شده را وارد کنید. از آنجا که ما PostgreSQL را روی همان سروری که Jira نصب شده، نصب کرده ایم از localhost به عنوان آدرس سرور دیتابیس استفاده کردیم.پورت پیشفرض برای اتصال به PostgreSQL پورت شماره 5432 است که آن را در فیلد Port وارد می‌کنیم.نام دیتابیسی که برای Jira ساختیم jiradb بود. آن را در فیلد Database وارد می‌کنیم.نام کاربری و کلمه عبوری که برای اتصال Jira به PostgreSQL ساخته بودیم را نیز وارد می‌کنیم.در فیلد Schema هم یک نام (در اینجا public) به شماتیک دیتابیس میدهیم.مشخصات دیتابیسی که برای Jira ساخته اید را در این فرم وارد کرده و بر روی Test Connection کلیک کنید، اگر اطلاعات صحیح بود و Jira توانست به Database وصل شود، بر روی Next کلیک کنید. این مرحله ممکن است طول بکشد پس شکیبا باشید و صفحه را Refresh نکنید.در صفحه سوم (تصویر زیر) مقابل Application Title نام شرکت یا برند خود را وارد کنید، مد Private را انتخاب کرده و آدرس وبی که برای Jira در نظر گرفته اید را وارد کنید. اگر دامین خاصی را برای Jira در نظر نگرفته اید می‌توانید آن را به حالت پیشفرض (IP:PORT) رها کرده و روی دکمه Next کلیک کنید، اما اگر قرار است از یک دامنه مثلا jira.your-domain.com استفاده کنید، آنرا در این بخش وارد کنید.از Base URL برای ساختن لینک ها و آدرس issue ها در Jira استفاده خواهد شد.در مرحله بعد (تصویر پایین) باید شماره سریالی که برای Jira خریده اید را وارد کنید. دقت کنید که اگر میخواهید Jira را کرک کنید از شماره سریال زیر استفاده کنید (دومین مرحله از فرآیند کرک کردن نرم‌افزار):AAABmQ0ODAoPeJyFU9FOq0AQfecrSHymAa5V22QTDXAjBqiBauLjSqft3sDuZna32r+X0jairtzHPefMzJmdmYu/yNyc7t3g2g2u5uHNfDp10zJeuqEfzJwIgWomeEw1kAPi+VMvuHYiwTWtdUFbIC1sV2wb/Lma3W5ayppJLdqzIMk7gCgjpUB9i1QLRXkvWOCGcqb67KQcEBXgDjCNSX4ZL7x7v8i82f1d7GWp/+JUSWHFHw3WW6rgu8/CtK+Ai/WTAlTk0nf+MaQTOypRrEytJ4eHp8Rav1GEn9quI66BU15D8i4Z7k81Q/9QM/SdjNXA1S9kDKpGJvuuH7pCbnUqdPRQaYoakKxpo2DM1lfhBgH4VkgJOOl+ne2AaDSnBD8Ae8ahbJgPum5RIlPDFFbQntcq5aYtRQORMFwTLxiL/y49fe9yL6Ffv2iR50kZpXfZF9sjsr7Y/3i7mZGo89hXrB9uUiyT8rFMq8Rmy6IauvqNHjVlCWqOzHO3ugcmPJvsritLY+uBmdfPBe3nlexoY45n2i/bB3IidwkwLAIUYwdtWez2k7o6gccl3hU6CQpb4P4CFCQfFJDwdEBH3h7YcMhS5z+pKtUoX02jnشماره سریال خریداری شده را وارد کنیددر صفحه پنجم (تصویر زیر) یک اکانت برای مدیر Jira خواهید ساخت. از این اکانت برای نصب پلاگین ها و ایجاد حساب برای بقیه کاربران استفاده می‌شود پس آن را در جای امنی نگه دارید.ساخت اکانت مدیر Jira صفحه ششم(تصویر زیر) مربوط به تنظیمات ایمیل است. این تنظیمات به Jira اجازه می‌دهد که تغییر وضعیت issue ها را از طریق ایمیل به کاربران اطلاع دهد. اگر فعلا تمایلی به داشتن این ویژگی ندارید می‌توانید گزینه later را انتخاب کنید.در صفحه هفتم (تصویر زیر) می‌توانید زبان Jira را انتخاب کنید. (دنبال فارسی نگردید!)در هشتمین صفحه می‌توانید یک Avatar برای حساب کاربریتان (حساب کاربری مدیر) انتخاب کنید تا سایر همکاران به راحتی شما را بشناسند.بهتر است از عکس واقعی خودتان به عنوان آواتار استفاده کنید تا دیگران بتوانند شما را از بقیه تشخیص دهندبا کلیک بر روی دکمه Next کار شما پایان یافته و در صفحه بعد (تصویر پایین) می‌توانید یک پروژه در Jira ایجاد و مدیریت کنید. پس از آن می‌توانید برای سایر افراد تیم نیز حساب کاربری بسازید.با کلیک بر روی گزینه Create a new project می‌توانید یک پروژه جدید بسازید مرحله سوم کرک کردن برنامهدر این مرحله باید یک شماره سریال جعلی را در تنظیمات دشبورد برای Jira Core وارد کنیم.از منوی بالای دشبورد، تصویر چرخ‌دنده و سپس گزینه Application را انتخاب کنید.در پایین صفحه و زیر بخش Jira Core بر روی گزینه Paste licence کلیک کنید.شماره سریال زیر را وارد کرده و بر روی دکنه Update licence کلیک کنید.AAABlA0ODAoPeJyFU1FvgjAQfudXkOwZA8xpXNJkC7DIAmjQLdljhzftAm1zbc3890PUDAdsj/2+7+6+693dPCGzU3qwvantTe796b03s+M8XNu+682sAIFqJnhINZAj4rh3jje1AsE1LXRGKyAV7DZs591OZg/birJyVIjqIojSGiDKSClQPyDVQlHeCBa4pZypJjvJW8QKcA8YhyQdhwtn7maJM5s/hk4Su2/WKsp68aXBYkcV/PaZmeodcPHxogAVGbvWJ0M66kclio0p9Oj4cAqB0NXV3XANnPICoi/J8HCu57vHer5rJawArgbIEFSBTDYdP9dF7KAucqq90hQ1IPmgpYIhO9eiLQLwnZAScFT/NNsD0WjOwR2gm60taeeCukOUyFQ7vBfs5uyVcVPlooRAGK6J4w3F/padv3J9kNCsWbBI0ygP4sfkyu4fsqbQf3zXyB8Rl/FuWDPEKFtH+TKPV1GfpR5V29EQPWioJ6A8Ma/1eh4Z/2Kwvp4kDnsPyLz/LGEzo2hPS3M6w2axvgFmA2j4MCwCFBCT4uP9e8oYXy5+HvDKHZYt500iAhR5IbI2yXNPJc7Z6kehf1nS49e5hg==X02jjحال باید مشخصات مربوط به شماره سریال ظاهر شود. در این صورت کار تمام است :)توجه: در صورت استفاده از کرک مذکور، حداکثر میتوان ۴۰ کاربر همزمان در Jira ساخت و داشتن بیشتر از این تعداد کاربر به صورت همزمان امکان پذیر نیست.توجه: در صورت استفاده از کرک، به هیچ وجه نرم‌افزار Jira یا پلاگین به نام Universal Plugin Manager را به‌روزرسانی نکنید. در غیر اینصورت باید مراحل کرک را از ابتدا انجام دهید.سوالات متداول:۱. نرم‌افزار Key Geneator برای پلاگین های Jira را از کجا دانلود کنیم؟پاسخ: نمی‌دانم. اگر لینک مفیدی پیدا کردید، در کامنت ها قرار دهید.۲. برای اینکه به جای IP و Port با یک نام دامنه مثل jira.your-site.com به Jira متصل شویم باید چکار کنیم؟پاسخ: یک A Record روی DNS برای اشاره به سرور Jira اضافه کنید. یک HTTP Server مثل Nginx روی سرور نصب کنید و پورت ۸۰ (HTTP) یا ۴۴۳ (HTTPS) آنرا توسط یک Server Block به پورت ۸۰۸۰ (پورت سرویس Jira) پراکسی کنید. نمونه فایل تنظیمات Server Block برای Jira را می‌توانید در اینجا مشاهده کنید. سپس فایل تنظیمات Apache Tomcat را نیز مطابق این لینک تغییر دهید تا متوجه حضور Nginx باشد. حال می‌توانید سایر پورت ها از جمله 8080 را توسط Firewall مسدود و پورت ۸۰ یا ۴۴۳ را باز کنید.۳. چگونه از اطلاعات Jira بک آپ بگیریم؟پاسخ: اطلاعات Jira در دو بخش ذخیره می‌شوند. issue ها و user ها و ... در دیتابیس ذخیره می‌شوند که برای بک‌آپ گیری می‌توان از روش های مرسوم برای بک‌آپ گیری از دیتابیس مثل pg_dump استفاده کرد و یا از منوی تنظیمات Jira، یک بک‌آپ به شکل فایل XML گرفت. بخش دوم از اطلاعات Jira مثل فایل هایی که به issue ها ضمیمه شده اند،‌ در دایرکتوری Data ذخیره می‌شوند که برای بک‌آپ گیری از آنها باید یک Cron Job نوشت و آنها را در جایی کپی کرد.۴. چطور میشه از تقویم خورشیدی استفاده کرد؟یک Custom Field Type برای تاریخ خورشیدی بسازید و از یک تقویم خورشیدی جاوا اسکریپتی استفاده کنید. (نیاز به دانش برنامه نویسی Java و Javascript دارید)۵. چطور می‌توان Gitlab را به Jira متصل کرد؟به این پست مراجعه کنید.۶. با هر بار راه اندازی مجدد (Reboot) سرور، Jira به صورت خودکار اجرا نمی‌شود و نیاز به اجرای دستی است. چطور Jira را به عنوان یک سرویس، هنگام بوت راه‌اندازی کنم؟این فایل را دانلود و در مسیر /lib/systemd/system/ کپی کنید. سپس با دستور systemctl enable jira.service سرویس را فعال کنید.</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Sat, 10 Aug 2019 01:27:13 +0430</pubDate>
            </item>
                    <item>
                <title>اگه دنبال کاری، این پست رو بخون...</title>
                <link>https://virgool.io/@hosseinkhani/%D8%A7%DA%AF%D9%87-%D8%AF%D9%86%D8%A8%D8%A7%D9%84-%DA%A9%D8%A7%D8%B1%DB%8C-%D8%A7%DB%8C%D9%86-%D9%BE%D8%B3%D8%AA-%D8%B1%D9%88-%D8%A8%D8%AE%D9%88%D9%86-eh74arn6cdgq</link>
                <description>کار نیست اگر هم باشه پارتی میخواد...همه جا سابقه کار می‌خوان...کار از کجا پیدا کنم...فردا مصاحبه دارم...میخوام قرارداد ببندم میترسم سرم کلاه بره...این شرکته ازم سفته میخواد...میگه قرارداد هامون وزارت کاریه...دیگه خسته شدم، میخوام استعفا بدم...من طی ده سال اخیر در بسیاری از شرکت های بزرگ و کوچک ایران کار کرده ام. از استارتاپ های سه چهار نفره، تا سازمان های بزرگ ۳۰۰۰ نفره. شرکت های خوش نام و البته شرکت های بدنام، پیشنهاد کار زیاد داشتم، درخواست کار هم زیاد دادم. مصاحبه زیاد شدم و مصاحبه هم زیاد کردم، قرارداد خوب و عالی بستم، کلاه هم سرم زیاد رفته، استعفا دادم، ترک کار کردم، اخراج شدم، تعدیل شدم، ارتقا هم زیاد گرفتم. همه این ها رو تجربه کردم اما دوست دارم که شما فقط بخش های خوبش رو تجربه کنید پس طی این پست میخوام تجربه های منفی ام رو هم با شما به اشتراک بذارم.من اگرده سال پیش این تجربه ها را داشتم، برای شرکت نادکو بدون اینکه بیمه ام کنه کار نمی‌کردم. با شرکت تدبیرگستران دیر قرارداد نمیبستم، بهشون سفته نمیدادم و اولین ماهی که حقوق ها به تعویق افتاد استعفا میدادم تا میتوانستم شش ماه حقوق معوقه ام را بگیرم. به آموزشگاه لایتک دانشگاه شریف اعتماد نمیکردم و  قرارداد میبستم تا الان دنبال حق التدریس دوسال پیشم نمیدویدم. قراردادم با شرکت اسنپ رو از روز اول ازشون میگرفتم که بعد از هشت ماه پولم رو بدون رد شدن بیمه نگیرم. و بعد از تعطیلی بامیلوی عزیزم در کمتر از ۳۰ روز برای دریافت بیمه بیکاری اقدام میکردم که چند ماه بدون حقوق و بیمه نمونم.سابقه کار نداری...درسته که توی خیلی از آگهی های شغلی می‌نویسند: &quot;حداقل n سال سابقه&quot; اما شما زیاد جدی نگیرید. چند روز پیش یک آگهی شغلی برای پوزیشن Machine Learning Engineer دیدم که حداقل ۵ سال سابقه کار میخواست برای چیزی که هنوز هم در ایران به عنوان شغل وجود ندارد. اتفاقا احتمال جذب افراد کم سابقه خیلی بیشتر از افراد با سابقه است. در واقع وقتی تجربه شما بالا میره و توی کارتون شناخته می‌شید، دیگه نیازی به اثبات کردن خودتون ندارید و این چیزیه که افراد کم سابقه رو نسبت به افراد با سابقه برتر می‌کنه. چون اونها مصمم اند که خودشون رو اثبات کنند. از طرفی افراد با سابقه حقوق های درخواستی به مراتب بالاتری دارند و این هم دلیل دیگری برای برتری افراد تازه کار است چون آنها جوان اند و جویای نام، در ابتدای راه اند و حاضر اند با مبالغ کمتر کار بیشتری را انجام دهند. همه کارفرما ها این موضوع را می‌دانند به همین خاطر خیلی نگران سابقه کاری نداشته‌تان نباشید. خود من شش هفت سال پیش روزی نبود که پیشنهاد کار دریافت نکنم اما الان که سابقه کاریم قوی شده باور کنید یه نفر هم بهم زنگ نمیزنه :)))در واقع شرکت های خوب دنبال سابقه کار نیستند، بلکه به دنبال رزومه کاری و افراد با انگیزه اند. پس به فکر یک رزومه کاری خوب باشید که انگیزه شما رو نشون بده. قبل از هر چیز، فیلدی که میخواهید در آن کار کنید را دقیقا مشخص کنید و آنرا به خوبی یاد بگیرید. دوران کتاب و آموزشگاه هم گذشته. اینترنت و کورس های ویدیویی و البته عزم راسخ تنها آموزشگاه های معتبر روی زمین اند. بعد از یادگیری با چند نمونه کار شخصی برای خودت میتونی رزومه خوبی بسازی و البته برای مصاحبه آماده شی. مثلا توی زمینه شغلی من (کامپیوتر)، گیت هاب افراد سابقه آنهاست نه سالهای کاریشون.از کجا کار پیدا کنم...دو جمله‌ی کلیشه ای رو مخ هست که مدام میشنویم: &quot;توی ایران کار نیست...&quot; و &quot;کار تو ایران پارتی میخواد...&quot;اوکی اگه میتونی بری کالیفرنیا کارکنی که حرفی نیست دمت گرم زودتر برو! اما اگه شرایطش رو نداری واقعیت رو بپذیر و بدون که اتفاقا کارفرما ها هم این جمله رو مخ رو دارند: &quot;توی ایران نیروی کار درست و حسابی نیست...&quot;. با اینکه هر دو گروه اشتباه می‌کنند اما من با کارفرما ها موافق تر ام. نیروی کار مناسب به نسبت موقعیت های کاری موجود، بسیار بسیار کم است. پس اگر نیروی کار خوبی هستید حتما می‌توانید موقعیت شغلی خوبی پیدا کنید. پارتی بازی هم توی همه‌ی دنیا وجود داره. در واقع برای پیدا کردن کار اسمش پارتی بازی نیست، شبکه سازیه. فرض کنید من یه جا کار می‌کنم که دنبال یک مهندس برق می‌گردند. از من می‌پرسند مهندس برق خوب نمیشناسی؟ و من هم از بین دوستانم مهندسان برقی رو که میشناسم و کارشون رو قبول دارم معرفی می‌کنم برای مصاحبه که ممکن است قبول شوند یا خیر. در واقه من در شبکه‌ی دوستان و آشنایانم دنبال فرد مناسب برای معرفی میگردم. پس بهتره توی محل کار، دوستان، فامیل، شبکه های اجتماعی و ... حواستون به شبکه سازی و شناسوندن خودتون به بقیه باشه.سایت هایی مثل Linkedin، جابینجا، ایران تلنت و ... جاهایی هستند که می‌تونید آگهی های شغلی رو مشاهده کرده و برای آنها رزومه بفرستید. تنها نکته ای که باید به آن توجه کنید وجود دو عبارت &quot;روحیه‌ی استارتاپی&quot; و &quot;شرکت خارجی&quot; اند. منظور از روحیه استارتاپی اینه که از پول خبری نیست و رسما سر کارید. میخوایم دور هم جمع شیم چند ماه یه پروژه انجام بدیم و بریم خونمون. شرکت های خارجی هم درست وقتی همه دوست دارند برن خارج کار کنند احتمالا نمیان ایران. پس با دیدن عباراتی مثل شرکت سوییسی، شرکت اتریشی و ... خودتون رو توی اروپا نبینید. این شرکت ها معمولا یه نفر (یه دوست) رو دارند که برای تحصیل یا ... رفته خارج و شماره تلفن و آدرس اون رو میزنن توی سایت. کافیه با اون شماره تماس بگیرید و می‌بینید که احتمالا شرکتی اونور خط نیست.دقت کنید که داشتن یک رزومه واحد و فرستادن اون برای همه، اصلا ایده خوبی نیست. بهتره رزومه شما برای جایی که دارید رزومه میفرستید سفارشی شده باشه. مثلا خود من زمانی برای پوزیشن شغلی Data Scientist اپلای کردم و چون رزومه ای که فرستادم علاوه بر Data Science در بخش توسعه اپلیکیشن های اندرویدی بسیار پر و قوی بود، کارفرما من رو به علت نامرتبط بودن تجربیات ریجکت کرد و یکی از شاگردانم در حوزه Data Science رو با اینکه سابقه و رزومه کمتری نسبت به من در آن حوزه داشت استخدام کرد چون در رزومه ایشون فقط Data Science هر چند اندک وجود داشت.مصاحبه...وقت شناس باشید و برای مصاحبه حتما سر وقت در محل حاضر شوید. زود رسیدن هم به اندازه دیر رسیدن تاثیر منفی دارد.تمیز و پاکیزه وارد جلسه مصاحبه شوید. ممکن است اتاق مصاحبه شما کوچک و بدون تهویه باشد و در گرمای تابستان با عجله به آنجا رسیده باشید. تمام این شرایط را پیش بینی کنید و البته لطفا قبل از مصاحبه با اسپری دوش نگیرید چون اگه من باشم حتما ریجت میشید ;)بعضی از شرکت ها قبل از شروع مصاحبه، یک فرم بلند و بالا به شما می‌دهند تا آن را پر کنید. توجه کنید که این کار اصلا حرفه ای نیست برای همین زیاد ذهنتون رو درگیر اون نکنید. به هر حال احتمالا آن فرم جزیی از فرآیند استخدام آن شرکت است و شما مجبورید آن را سیاه کنید اما جدا توجه کنید که اطلاعاتی مثل کد ملی، روز دقیق تولد، نام و شغل پدر، نام و شغل همسر، دین، آدرس دقیق و شماره تلفن ثابت منزل، معرفی افراد برای تماس ضروری، حقوق و حتی دلیل جدایی از شرکت های قبلی و ...  جزیی از حریم شخصی شما اند و اصلا ربطی به مصاحبه شما ندارند و دلیلی ندارد که برای مصاحبه ای که نتیجه آن فعلا مشخص نیست آنها را پر کنید. نمونه های زیادی از سو استفاده از اطلاعات شخصی اتفاق افتاده است.گوشی موبایل شما حتما سایلنت باشد. بیرون آوردن گوشی موبایل حتی برای دیدن ساعت را هم ممنوع کنید. من تجربه مصاحبه با فردی رو دارم که در جلسه مصاحبه به تماس تلفنی اش پاسخ هم داد! اگر برای کاری که برایش مصاحبه میشوید اهمیتی قائل نیستید وقت خود را برای مصاحبه نگذارید.پاسخ سوال ها رو با صدای بلند (یا خیلی آرام) ندهید و سعی کنید استرس خود را جوری مدیریت کنید که روی لحن کلام شما تاثیر نگذارد.لازم نیست سریعا جواب هر سوالی که پرسیده میشود را بدهید. قبل از هر چیز با تکرار سوال از زبان خودتان مطمین شوید که سوال را درست فهمیده اید، سپس در مورد بخش های گنگ آن سوال بپرسید و همه چیز را روشن کنید و لطفا قبل از جواب دادن فکر کنید (اشکالی ندارد این فکر کردن با صدای بلند اتفاق بیفتد) و نهایتا از پاسخ نمیدونم نترسید. قرار نیست شما همه چیز را بدانید و هر کسی می‌تواند سوالی بپرسد که دیگری نمی داند. پس دستپاچه نشوید. خیلی وقت ها فرد مصاحبه کننده سوالی را می‌پرسد که خودش هم پاسخ آن را نمیداند، در واقع در چنین شرایطی، روشن سازی مساله و روش فکر کردن شما مهم است نه خود پاسخ.مصاحبه یک جلسه دو طرفه است و شما نیز باید پس از مصاحبه تصمیم بگیرید. پس فقط پاسخ دهنده نباشید و در انتها شما نیز سوالات خود مثل ساعت کاری، اضافه کار، حقوق و مزایا و پاداش، ساختار تیم، هدف پروژه و ... را بپرسید. اگر کارفرما پاسخ درستی به این سوالات نمیدهد این شما هستید که او را ریجکت می‌کنید.قرارداد...در صورت امکان، قبل از شروع کار، پیش نویس قرارداد را از کارفرما خواسته و آنرا بطور کامل مطالعه کنید. در این صورت در روز بستن قرارداد همه بند های قرارداد برای شما روشن است، توافقات لازم انجام شده و وقت شما و کارفرما تلف نمیشود. همینطور اگر متن قرارداد تماماً برای شما قابل فهم نیست وقت کافی دارید تا آن را به یک وکیل، مشاور و یا فرد مطلع نشان دهید.هرگز هیچ برگه ای رو (نه فقط قرارداد) بدون خواندن و اشراف کامل به موضوع آن امضا نکنید. امضای شما می‌تواند مسئولیت های قانونی زیادی به همراه داشته باشد. شخصی را می‌شناسم که به او پیشنهاد مدیرعاملی شرکت شد و با امضای چند برگه که نشان میداد ایشون مدیرعامل و رییس هیات مدیره هستند، تمامی بدهی های شرکت گردن ایشون افتاد! همینطور شخص دیگری که فکر میکرد تنها حقی که شرکت باید هنگام استعفا به او بپردازد حقوق ماهیانه اش است، هنگام استعفا با امضای برگه ای که نشان می‌داد تمام مطالبات وی پرداخت شده نتوانست سنوات، عیدی و پاداش پایان خدمت خود را دریافت کند.حتما از اولین روز کاری قرارداد ببندید. من شخصا سه تجربه‌ی بد در رابطه با به تعویق افتادن امضای قرارداد دارم. در شرکت تدبیرگستران، بستن قرارداد من به خاطر پیگیری نکردن دو ماه طول کشید و کارفرما با این بهانه که آن دو ماه آزمایشی بوده و شما کارآموز بودی، واقعا برای آن دو ماه به من حقوق نداد و بیمه رد نکرد. تجربه دوم در آموزشگاه لایتک وابسته به دانشگاه صنعتی شریف بود که من با اعتماد به نام دانشگاه شریف امضای قرارداد رو پیگیری نکردم و زمانی که همکاری ام را خاتمه دادم به طور ناگهانی دیگر تسویه حساب دوره هایی که تدریس کرده بودم انجام نشد و چون قرارداد نداشتم بعد از گذشت دو سال هنوز موفق به دریافت حق التدریس دو سال پیش نشده ام! سومین تجربه به شرکت اسنپ بر میگردد. مدت همکاری من با این مجموعه فقط دو ماه بود اما چون قراردادم رو دیر (بعد از آن دو ماه) بستم این شرکت نتوانست (یا شاید نخواست) بیمه آن دو ماه را برای من رد کند.نام حقوقی کارفرما و البته شما، تاریخ دقیق شروع و پایان قرارداد، مسئولیت کاری مشخص شما، ساعت کاری، اضافه کار، حقوق و سایر پرداختی ها باید در قرارداد به روشنی بیان شده باشند.قرارداد باید شامل دو نسخه یکسان باشد که به امضای طرفین (و مهر کارفرما) رسیده باشد. یک نسخه نزد کارفرما و نسخه دیگر در اختیار شما قرار می‌گیرد.در مورد مبلغ حقوق درج شده در قرارداد دقت کنید. مبلغ درج شده در قرارداد اصطلاحا Growth است یعنی ماهانه هزینه بیمه و البته مالیات از آن کسر می‌شود. به مبلغی که نهایتا پس از کسورات به شما پرداخت می‌شود، اصطلاحا Net می‌گویند. پس هنگام توافقات اولیه دقت کنید که اگر می‌خواهید مثلا ماهیانه ۱۰ میلیون تومان به حساب شما واریز شود، درخواست ۱۰ میلیون تومان Net (خالص) کنید و مبلغ درج شده در قرارداد باید بیش از این مبلغ (شامل بیمه و مالیات) باشد.اما متاسفانه خیلی از کارفرما های ایرانی دو دفتری اند. یعنی برای اینکه مبلغ کمتری به اداره بیمه و اداره مالیات پرداخت کنند، با شما قراردادِ به قول خودشان وزارت کاری می‌بندند. این یعنی در قرارداد شما به جای حقوق واقعیتان، حداقل حقوق مجاز یک کارگر طبق قوانین وزارت کار (یک میلیون و پانصد و هفده هزارتومان در سال ۹۸!) را می‌نویسند که میزان مالیات و بیمه آن به مراتب کمتر است. دقت کنید تا جایی که می‌توانید (میدانم که گاهی به علت نبود موقعیت شغلی بهتر مجبوریم) زیر بار این موضوع نروید چون به مرور زمان مشکلاتی را برای شما ایجاد می‌کند. مثلا:- هنگامی که شما ازدواج می‌کنید، اداره بیمه موظف است مبلغی معادل با میانگین حقوق دریافتی شما طی دو سال اخیر (که کارفرما بر اساس آن برای شما بیمه رد کرده)، را به عنوان هدیه ازدواج به شما بپردازد.- هنگامی که شما برخلاف میل شخصی (مثلا عدم تمدید قرارداد توسط کارفرما پس از اتمام قرارداد یا تعدیل نیرو یا تعطیلی شرکت) بیکار می‌شوید، اداره بیمه موظف است تا زمانی که شما مجددا شاغل شوید، علاوه بر بیمه کردن شما، ماهیانه ۵۵ درصد از آخرین حقوق اعلامی شما را نیز به عنوان بیمه بیکاری بپردازد.-  افرادِ از کار افتاده (دور از جون همه) مشمول مستمری و بیمه ازکارافتادگی بر اساس میزان حقوق اعلام شده خواهند بود.- حقوق بازنشستگی هم بر اساس میانگین حقوق اعلام شده به بیمه محاسبه می‌شود. ممکن است فکر کنید که &quot;اووووف کو تا بازنشستگی&quot; اما افراد خیلی زیادی هستند که با کمتر از سی سال سابقه (مثلا پنج شش سال) بازنشسته شده اند و حقوق آنها بر اساس آن پنج شش سال محاسبه می‌شود.- مستمری بازماندگان (همسر، فرزند یا والدین تحت تکفل) پس از فوت بیمه شده نیز بر اساس میزان حقوق اعلام شده به بیمه طی دو سال آخر عمر وی، محاسبه می‌شود.- نکته ای که اکثر افراد نمیدانند این است که کارفرما به هیچ عنوان مجاز به اخراج شما قبل از اتمام قرارداد نیست. در صورتی که خطایی از شما سر زده باشد یا خسارتی به کارفرما وارد کرده باشید، کارفرما با داشتن مدرک می‌تواند از شما شکایت کند اما اخراج نه! پس اگر به هر دلیل، قبل از اتمام قرارداد، کارفرما از ادامه همکاری شما جلوگیری کرد، بدون فوت وقت به اداره کار، تعاون و رفاه اجتماعی مراجعه کرده و از او شکایت کنید. در اینصورت کارفرما موظف است یا شما را به کار قبلی خود برگرداند و یا تا پایان قرارداد حقوق و مزایا و بیمه شما را تمام و کمال پرداخت کند. و در انتهای قرارداد نیز باید به شما نامه ی عدم نیاز بدهد که در صورت تمایل (باز بدون فوت وقت) بتوانید برای بیمه بیکاری اقدام کنید. حال تصور کنید حقوق توافقی شما ۱۰ میلیون بوده ولی در قرارداد ۱.۵ میلیون درج شده است. کارفرما در واقع طی دو ماه اول کل حقوق شما را پرداخت کرده... (البته راه های قانونی برای اثبات این حق وجود داره که بسیار زمان بر و سخت تره)- و خیلی موارد دیگر که من هم نمیدانم...توجه: هر کاری که با اداره بیمه یا وزارت کار دارید، مثل هدیه ازدواج، بیمه بیکاری، شکایت از کارفرما برای اخراج قبل از اتمام قرارداد و ... فقط ۳۰ روز زمان دارد و بعد از آن عمرا چیزی بهتون نمیدن. هر اتفاقی که افتاد (اخراج، ازدواج، تعدیل و ...) فرداش اداره بیمه و وزارت کار باشید.بعضی از کارفرما ها همراه با قرارداد از شما سفته (یا حتی چک) جهت تضمین حسن انجام کار و یا عدم افشای اطلاعات می‌گیرند. این کار با اینکه اخلاقاً درست نیست و بر پایه‌ی بی اعتمادی طرفین به هم است، اما متاسفانه غیرقانونی هم نیست. به همین علت در صورت قبول این شرط باید بسیار دقیق و حساب شده عمل کنید.- ترجیها سفته بدهید نه چک.- سفته حتما باید پشت نویسی شود. پشت آن بنویسید: &quot;این سفته در تاریخ ... جهت ضمانت حسن انجام کار ضمیمه قرارداد به شماره ... شده است. و امضا کنید.- (خیلی مهم) از رو و پشت سفته حتما کپی گرفته و آن کپی را به کارفرما داده تا امضا کرده و به شما برگرداند. این رسید سفته شما است پس از آن به خوبی مراقبت کنید.- در متن قرارداد حتما ذکر شود که سفته به شماره .... ضمیمه این قرارداد شده و در پایان همکاری به شخص برگردانده می‌شود.- اگر نکات بالا را رعایت کنید، کارفرما موظف است پس از پایان قرارداد، سفته را به شما برگرداند و اگر این کار را نکرد به راحتی می‌توانید به جرم خیانت در امانت از او شکایت کنید. اما در صورتی که این نکات رعایت نشود ممکن است کارفرما از سفته شما به صورت قانونی یا حتی غیر قانونی سو استفاده کرده و یا هنگام اخراج، شما را مجبور کند که به وزارت کار شکایت نکنید. من خودم به خاطر بی تجربگی، پس از گذشت پنج سال از قطع همکاری هنوز موفق به پس گرفتن سفته (و البته حق و حقوقم) از شرکت تدبیرگستران نشده ام.اولین روز کاری...نظر همکاران شما در موردتان معمولا در همان روز های اول ورود شما به مجموعه جدید شکل می‌گیرد. پس در این روز های حساس باید خیلی محتاط باشید. حتما پاکیزه، خوش لباس، خوش برخورد، باهوش و مودب باشید. وسایل خود را مرتب و تمیز نگه دارید. راس ساعت وارد و راس ساعت خارج شوید. به هیچ وجه سعی نکنید با اضافه کاری و حضور زیاد در محل کار، خود را مصمم و با انگیزه نشان دهید. چون این موضوع نه تنها شما را بی نظم نشان می‌دهد بلکه در نظر سایر همکاران متملقانه و در نظر بعضی مدیران وظیفه تلقی می‌شود و به مرور مشکلاتی را به وجود می آورد. به همه به یک اندازه احترام بگذارید (نه فقط به مدیرتان!). در بحث های کاری شرکت کرده و تلاش کنید مشکل را حل کنید اما از شرکت در بحث های غیر کاری تا حد ممکن بپرهیزید. ممکن است در مورد وظیفه ای که در روز های اول به شما داده می‌شود هیچ دیدی نداشته باشید، این موضوع طبیعی است پس مضطرب نشوید و ضعف نشان ندهید، شما حتما با تمرکز می‌توانید آن کار را با کیفیت خوب انجام دهید و این حس بد به زودی برطرف خواهد شد. نکته آخر اینکه در محل کار با همه دوست باشید اما نه رفیق. حتما با همه افراد یک مرز و حریم مشخص نگه دارید تا احترام متقابل شما در محل کار حفظ شود (بعدا به مرور زمان خارج از محیط کار رفیق هم خواهید شد)آخرین روز کاری...تغییر شغل ممکن است بسیار ناخوشایند و یا با نگرانی همراه باشد با این حال شما قرار نیست همه عمر خود را یک جا کار کنید. هر لحظه که حس کردید دچار روزمرگی شده اید و در کارتان چیز جدیدی یاد نمیگیرید، پیشرفت شغلی ندارید، یا حس کردید میزان حقوق شما کمتر از حق واقعیتان است و پیشنهاد های مالی بهتری دارید، هر زمان که حقوق شما بیش از یک ماه به تعویق افتاد، یا حس کردید احترام شما در محیط کار حفظ نمی‌شود و یا از همه مهمتر حس کردید که استرس ناشی از کار شما و یا ساعات کاریتان به زندگی شخصی شما صدمه میزند، شک نکنید! تغییر شغل شروعی برای یک جهش رو به جلو برای شما خواهد بود. یک نامه استعفا به همراه تشکر آماده کرده و برای مدیر خود ایمیل کنید (حتما مدیر منابع انسانی و ایمیل شخصی خودتان را نیز در بخش CC ایمیل قرار دهید). طبق قانون، شما موظف اید که یک ماه قبل از ترک کار، موضوع را در قالب استعفا به کارفرما اعلام کنید. پس نمیتوانید از فردای استعفا ترک کار کنید! در استعفای خود بنویسید که تا ۳۰ روز دیگر در خدمت کارفرما هستید، تمامی کار های باز و در حال انجام را خاتمه داده و در صورت نیاز دانش لازم را به نیروی کار جدید منتقل خواهید کرد. نهایتا اگر کارفرما این استعفا را نپذیرد و به اداره بیمه، ترک کار شما حین خدمت را اعلام کند میتوانید به ایمیل استعفایی که خودتان نیز در آن CC بوده اید استناد کنید. با اینکه در اکثر موارد، قطع همکاری برای طرفین به علت نابالغی هایی که وجود دارد خوشایند نیست، سعی کنید پل های پشت سر را خراب نکنید و یک خداحافظی دوستانه داشته باشید. زمین کاملا گرده و حتما دوباره در جایی همدیگر را خواهید دید. (دیدم که میگم :دی) از طرفی ممکن است افرادی از محل کار جدید شما با محل کار قبلی تماس رسمی یا غیر رسمی گرفته و در مورد شما سوال کنند. با اینکه این کار اصلا حرفه ای نیست ولی خیلی جاها وجود دارد و بهتر است دید بدی نسبت به شما منتقل نشود.اگر قطع همکاری شما به علت اخراج قبل از پایان قرارداد است، فقط ۳۰ روز فرصت دارید تا مراتب را به اطلاع وزارت کار برسانید. پس بدون معطلی به همراه کارت شناسایی، قرارداد کار و دفترچه بیمه به اداره کار رفته و از کارفرما شکایت کنید. بسیاری از کارفرما ها با سرکار گذاشتن افراد و وعده های دروغ سعی در رد شدن موعد ۳۰ روزه می‌کنند که در این شرایط شما قادر به گرفتن حق و حقوقتان نیستید. پس اگر اخراج شدید نگران پل های پشت سر نباشید چون قبلا خراب شده اند و سریعتر شکایت کنید. در این صورت کارفرما موظف است تا پایان قرارداد، شما را بیمه کند، حقوق ماهیانه تان را بپردازد و در پایان قرارداد نیز سنوات، عیدی و پاداش پایان خدمت شما را تسویه کرده و یک نامه عدم نیاز به شما بدهد که در کمتر از ۳۰ روز بتوانید برای دریافت بیمه بیکاری اقدام کنید. نکته دیگر اینکه ممکن است کارفرما از شما بخواهد که استعفا دهید و فکر کنید که &quot;بهتر از اینه که اخراج شم...&quot; اما دقت کنید که در این صورت شما با دست خودتان همه حقوقتان را بخشیده اید پس کسی که باید از اخراج بترسد کارفرما است نه شما.اگر قطع همکاری شما به علت تعطیلی شرکت یا تعدیل نیرو است، معمولا کارفرما حقوق شما را تا پایان قرارداد می‌پردازد یا به نحوی با شما توافق می‌کند در غیر اینصورت نیز همچنان ۳۰ روز بیشتر برای مراجعه به وزارت کار وقت ندارید. فراموش نکنید که از کارفرما نامه‌ی عدم نیاز گرفته و در کمتر از ۳۰ روز برای بیمه بیکاری اقدام کنید. چون معلوم نیست چه زمانی کار مناسب پیدا کنید. این اشتباهی بود که خود من به علت بی تجربگی پس از تعطیلی شرکت بامیلو کردم و به علت تعطیلات نوروز بعد از گذشت ۳۰ روز مراجعه کردم و تا پیدا شدن کار مناسب، بیمه و مستمری رو از دست دادم. جالبه بدونید خیلی وقت ها استفاده از بیمه بیکاری به نفع شما است تا اینکه یک کار تمام وقت جدید با حقوق کمتر از بیمه بیکاری را بپذیرید!امیدوارم با این نوشتار توانسته باشم تجربه ام رو به شما منتقل کنم تا مسیر شغلی مطمئنی رو برای خودتان به وجود آورید و ضررهایی که من دادم را ندهید...</description>
                <category>حمیدرضا حسین‌خانی</category>
                <author>حمیدرضا حسین‌خانی</author>
                <pubDate>Thu, 16 May 2019 18:29:21 +0430</pubDate>
            </item>
            </channel>
</rss>