<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>بابک خوش‌نویس نویسنده در بلاگ هم‌روش</title>
	<atom:link href="https://hamravesh.com/blog/author/babak-khoshnevis/feed/" rel="self" type="application/rss+xml" />
	<link>https://hamravesh.com/blog/author/babak-khoshnevis/</link>
	<description>بلاگ رسمی هم‌روش</description>
	<lastBuildDate>Sat, 02 May 2026 11:54:44 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://hamravesh.com/blog/wp-content/uploads/2026/05/cropped-typeGeneral-32x32.png</url>
	<title>بابک خوش‌نویس نویسنده در بلاگ هم‌روش</title>
	<link>https://hamravesh.com/blog/author/babak-khoshnevis/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DNS Record چیست؟ آشنایی با ساختار و انواع رکوردها</title>
		<link>https://hamravesh.com/blog/what-is-dns-record/</link>
					<comments>https://hamravesh.com/blog/what-is-dns-record/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Wed, 08 Apr 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[شبکه]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2866</guid>

					<description><![CDATA[<p>اگر تا به حال بعد از تغییر هاست، با این مشکل مواجه شده‌اید که سایت باز نمی‌شود یا ایمیل‌ها به مقصد نمی‌رسند، احتمال زیادی وجود دارد که مشکل از تنظیمات DNS باشد. در چنین شرایطی، معمولاً این سؤال مطرح می‌شود که رکورد دی ان اس چیست و چه نقشی در این اختلال‌ها دارد. بسیاری از [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-dns-record/">DNS Record چیست؟ آشنایی با ساختار و انواع رکوردها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>اگر تا به حال بعد از تغییر هاست، با این مشکل مواجه شده‌اید که سایت باز نمی‌شود یا ایمیل‌ها به مقصد نمی‌رسند، احتمال زیادی وجود دارد که مشکل از تنظیمات DNS باشد. در چنین شرایطی، معمولاً این سؤال مطرح می‌شود که رکورد دی ان اس چیست و چه نقشی در این اختلال‌ها دارد. بسیاری از مشکلاتی که ظاهرا به سرور یا سایت مربوط هستند، از تنظیمات DNS و به‌طور خاص رکورد DNS ناشی می‌شوند. این رکوردها مشخص می‌کنند که هر درخواست اینترنتی، از اتصال دامنه به هاست گرفته تا راه‌اندازی ایمیل و حتی تأیید مالکیت دامنه، باید دقیقاً به کجا هدایت شود. در این مطلب بررسی می‌کنیم که رکورد دی ان اس چیست، چه انواعی دارد و هرکدام دقیقاً در چه سناریویی استفاده می‌شوند.</p>



<h2 class="wp-block-heading" id="h-رکورد-دی-ان-اس-چیست">رکورد دی ان اس چیست؟</h2>



<p>رکورد DNS مشخص می‌کند هر دامنه یا زیردامنه باید به کدام سرور یا سرویس متصل شود. این هدایت توسط سرورهای DNS انجام می‌شود؛ سرورهایی که نام دامنه را به آدرس IP ترجمه می‌کنند. به عبارت دیگر، رکوردهای DNS مثل <strong>نقشه راه یا دستورالعمل‌های کوچک</strong> عمل کرده و مشخص می‌کنند درخواست‌های اینترنتی شما (چه برای باز کردن یک ‌وب‌سایت، ارسال ایمیل یا دسترسی به یک سرویس دیگر) چگونه باید به مقصد صحیح برسند. برای نمونه:</p>



<ul class="wp-block-list">
<li>رکورد <strong>A</strong>، دامنه‌ای مثل example.com را به یک آدرس IPv4 متصل می‌کند؛ یعنی مشخص می‌کند سایت دقیقاً روی کدام سرور قرار دارد</li>



<li>رکورد <strong>CNAME</strong> زمانی استفاده می‌شود که بخواهید یک زیردامنه را به یک سرویس دیگر متصل کنید؛ مثلاً وقتی blog.example.com را به یک پلتفرم دیگر مثل سرویس‌های سایت‌ساز یا CDN وصل می‌کنید</li>



<li>رکورد <strong>MX</strong> تعیین می‌کند که ایمیل‌های دامنه شما به کدام سرور ایمیل ارسال شوند؛ مثلاً اگر از آدرس mail.example.com به‌عنوان سرور ایمیل استفاده کنید، این رکورد مشخص می‌کند که پیام‌ها به همین زیردامنه هدایت شوند</li>
</ul>



<p>در عمل، هر دامنه معمولاً چندین رکورد DNS مختلف دارد که هرکدام مسئول بخش خاصی از ارتباطات آن هستند. این رکوردها در کنار هم مشخص می‌کنند که ترافیک وب، ایمیل و سایر سرویس‌ها چگونه و به کجا هدایت شوند.</p>



<h2 class="wp-block-heading" id="h-رکوردهای-dns-چگونه-کار-می-کنند">رکوردهای DNS چگونه کار می‌کنند؟</h2>



<p>هر بار که شما آدرس یک وب‌سایت (یا به طور دقیق‌تر یک دامنه) را در مرورگر وارد می‌کنید یا ایمیلی ارسال می‌کنید، یک پرسش DNS (یا DNS query) آغاز می‌شود که مشخص می‌کند درخواست شما به کدام سرور هدایت شود. این مسیر شامل سرورهای محلی، سرورهای بالادستی (Root و TLD) و در نهایت Authoritative DNS server است؛ جایی که رکوردهای DNS نگهداری می‌شوند و تصمیم نهایی گرفته می‌شود.</p>



<p>برای مثال، وقتی سایت example.com را باز می‌شود، رکورد <strong>A</strong> مشخص می‌کند مرورگر به کدام IP وصل شود و رکورد <strong>MX</strong> تعیین می‌کند ایمیل‌های دامنه به کدام سرور ارسال شوند. این سرور ایمیل معمولاً با یک نام دامنه مشخص می‌شود (مثلاً <code>mail.example.com</code>). سپس DNS این نام سرور را به IP ترجمه می‌کند.</p>



<p>برای توضیح کامل و مرحله‌به‌مرحله فرایند جستجوی DNS و DNS Resolve می‌توانید مطلب «<a href="https://hamravesh.com/blog/what-is-dns" target="_blank" rel="noreferrer noopener">DNS چیست؟</a>» مطالعه کنید.</p>



<h2 class="wp-block-heading" id="h-ساختار-رکورد-dns">ساختار رکورد DNS</h2>



<p>هر رکورد DNS شامل چند بخش اصلی است که مشخص می‌کنند دامنه یا زیردامنه چگونه هدایت شود. این بخش‌ها عبارت‌اند از:</p>



<ol class="wp-block-list">
<li><strong>نام (Name):</strong> نام دامنه یا زیردامنه که رکورد مربوط به آن تعریف شده است؛ به عنوان مثال <code>example.com</code> یا <code>mail.example.com</code></li>



<li><strong>نوع رکورد (Type):</strong> نوع رکورد را مشخص می‌کند، مثل A ،CNAME ،MX و … که نشان می‌دهد بخش داده‌ها چگونه باید تفسیر شود</li>



<li><strong>داده‌ها (Data):</strong> اطلاعات واقعی رکورد، مثل یک آدرس IP برای رکورد A یا یک زیردامنه برای رکورد CNAME</li>



<li><strong>زمان بقا (TTL – Time to Live):</strong> مدت زمانی که پاسخ رکورد می‌تواند در کش ذخیره شود (بر حسب ثانیه)</li>



<li><strong>کلاس (Class):</strong> معمولاً مقدار آن <code>IN</code> است و نشان‌دهنده کلاس پروتکل اینترنت است</li>
</ol>



<p>به بیان ساده، این فیلدها مثل یک فرم اطلاعاتی عمل می‌کنند که هر رکورد DNS برای هدایت دقیق ترافیک نیاز دارد. وقتی هر رکورد با این ساختار پر می‌شود، سرورها می‌توانند با دقت مسیر ترافیک وب، ایمیل و سایر سرویس‌ها را مشخص کنند.</p>



<h2 class="wp-block-heading" id="h-رایج-ترین-انواع-رکورد-دی-ان-اس-چیست">رایج‌ترین انواع رکورد دی ان اس چیست؟</h2>



<p>در این بخش به معرفی رایج‌ترین انواع رکورد DNS می‌پردازیم و توضیح می‌دهیم هر کدام چه کاری انجام می‌دهند.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh.what_.is_.dns-record-02-1024x576.webp" alt="رایج‌ترین انواع رکورد دی ان اس چیست؟" class="wp-image-4724" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh.what_.is_.dns-record-02-1024x576.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh.what_.is_.dns-record-02-300x169.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh.what_.is_.dns-record-02-768x432.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh.what_.is_.dns-record-02-120x67.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh.what_.is_.dns-record-02.webp 1201w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li><strong>A record:</strong> این رکورد یک نام دامنه را به یک آدرس IPv4 متصل می‌کند. به عنوان مثال، example.com ممکن است به 192.168.1.1 اشاره کند.</li>



<li><strong>AAAA record:</strong> مشابه رکورد A است، اما برای آدرس‌های IPv6 استفاده می‌شود</li>



<li><strong>CNAME record:</strong> این رکورد یک نام دامنه یا زیردامنه را به دامنه‌ای دیگر هدایت می‌کند؛ بدون اینکه IP ارائه دهد. مثال: <code>blog.example.com</code> به <code>example.net</code> اشاره کند</li>



<li><strong>MX record:</strong> این رکورد مشخص می‌کند ایمیل‌های دامنه به کدام سرور ارسال شوند. مثلا هدایت به <code>mail.example.com</code></li>



<li><strong>TXT record:</strong> این رکورد اجازه می‌دهد متن دلخواهی برای دامنه ذخیره شود. اغلب برای امنیت ایمیل و تایید مالکیت دامنه استفاده می‌شود</li>



<li><strong>NS record:</strong> مشخص می‌کند کدام سرورها مسئول یک دامنه هستند</li>



<li><strong>SOA record:</strong> رکورد SOA اطلاعات مدیریتی اصلی دامنه، مثل سرور اولیه و ایمیل مدیر دامنه را نگه می‌دارد</li>



<li><strong>SRV record:</strong> این رکورد یک سرویس خاص را با پورت مشخص می‌کند</li>



<li><strong>PTR record:</strong> برای جستجوهای معکوس استفاده می‌شود و IP را به نام دامنه نگاشت می‌کند</li>
</ul>



<p>با استفاده از این رکوردها، می‌توانید تنظیمات مختلفی را برای دامنه خود اعمال کنید و خدمات گوناگونی را ارائه دهید. هر کدام از این رکوردها وظایف و کاربردهای خاص خود را دارند که برای مدیریت دامنه‌ها ضروری هستند.</p>



<h2 class="wp-block-heading" id="h-رکوردهای-دی-ان-اس-با-کاربرد-کمتر">رکوردهای دی ان اس با کاربرد کمتر</h2>



<p>علاوه بر رکوردهای رایج، رکوردهای دیگری با کاربردهای خاص وجود دارند.</p>



<ul class="wp-block-list">
<li><strong>AFSDB record:</strong> برای سیستم فایل اندرو (Andrew File System | AFS) استفاده می‌شود و مسیر دسترسی به سایر سلول‌های AFS را مشخص می‌کند</li>



<li><strong>APL record:</strong> رکورد «لیست پیشوند آدرس» که محدوده‌های آدرس IP را مشخص می‌کند (نوعی رکورد آزمایشی)</li>



<li><strong>CAA record:</strong> رکورد «مجوز مرجع صدور گواهینامه» که مشخص می‌کند کدام مرجع می‌تواند برای دامنه گواهی‌نامه صادر کند</li>



<li><strong>رکورد DNSKEY:</strong> رکورد «کلید DNS» که حاوی کلیدی عمومی برای تأیید امضای DNSSEC است</li>



<li><strong>کورد CDNSKEY:</strong> یک کپی نسخه فرزند رکورد DNSKEY برای انتقال به والد است</li>



<li><strong>رکورد CERT:</strong> رکورد «گواهینامه» که گواهینامه‌های کلید عمومی را ذخیره می‌کند</li>



<li><strong>رکورد HIP:</strong> این رکورد از «پروتکل شناسایی میزبان» (Host identity protocol) استفاده می‌کند که روشی برای جدا کردن نقش‌های آدرس IP است</li>



<li><strong>رکورد IPSECKEY:</strong> رکوردی که با پروتکل IPSEC کار می‌کند</li>



<li><strong>رکورد LOC:</strong> رکورد موقعیت (Location) که اطلاعات جغرافیایی یک دامنه را به صورت مختصات طول و عرض جغرافیایی ذخیره می‌کند</li>



<li><strong>رکورد NSEC:</strong> رکورد «Next Secure Record» که بخشی از DNSSEC است، برای اثبات عدم وجود یک رکورد منبع DNS درخواستی استفاده می‌شود</li>



<li><strong>رکورد RRSIG:</strong> رکورد «امضای رکورد منبع» (Resource Record Signature) که امضای دیجیتالی را برای تأیید رکوردها مطابق با DNSSEC ذخیره می‌کند</li>



<li><strong>رکورد دی ان اس RP:</strong> رکورد «شخص مسئول» (Responsible Person) که آدرس ایمیل شخص مسئول دامنه را ذخیره می‌کند</li>



<li><strong>رکورد SSHFP:</strong> این رکورد «اثر انگشت کلید عمومی SSH» را ذخیره می‌کند</li>
</ul>



<p>با وجود اینکه اکثر این رکوردها کمتر استفاده می‌شوند اما آشنایی با آن‌ها به شما کمک می‌کند درک بهتری از عملکرد و امکانات رکورد DNS داشته باشید و در صورت نیاز بتوانید از آن‌ها استفاده کنید.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>در این مطلب بررسی کردیم که رکورد دی ان اس چیست و چه نقشی در هدایت ترافیک اینترنتی دارد. رکورد DNS مشخص می‌کنند هر دامنه یا زیردامنه باید به چه مقصدی (چه یک وب‌سایت یا یک سرویس ایمیل یا هر سرویس دیگری) متصل شود. همچنین با ساختار رکورد DNS شامل نام دامنه، نوع رکورد، داده‌ها، TTL و کلاس آشنا شدیم و به توضیح رایج‌ترین رکوردها از جمله A ،CNAME ،MX و TXT و همچنین رکوردهای کم کاربردتر پرداختیم.</p>



<p></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-dns-record/">DNS Record چیست؟ آشنایی با ساختار و انواع رکوردها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-dns-record/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>گیت‌هاب اکشن (GitHub Actions) چیست؟</title>
		<link>https://hamravesh.com/blog/%da%af%db%8c%d8%aa%d9%87%d8%a7%d8%a8-%d8%a7%da%a9%d8%b4%d9%86-github-actions-%da%86%db%8c%d8%b3%d8%aa%d8%9f/</link>
					<comments>https://hamravesh.com/blog/%da%af%db%8c%d8%aa%d9%87%d8%a7%d8%a8-%d8%a7%da%a9%d8%b4%d9%86-github-actions-%da%86%db%8c%d8%b3%d8%aa%d8%9f/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 10:09:10 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4126</guid>

					<description><![CDATA[<p>در دنیای توسعه نرم‌افزار، اتوماسیون نقشی کلیدی را ایفا می‌کند. گیت‌هاب اکشن (GitHub Actions) یکی از ابزارهای قدرتمند در این زمینه است که به شما کمک می‌کند تا فرآیندهای توسعه نرم‌افزار خود را به طور خودکار انجام دهید. در این مطلب، به بررسی جامع گیت‌هاب اکشن می‌پردازیم و به شما نشان می‌دهیم که چگونه می‌توانید [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/%da%af%db%8c%d8%aa%d9%87%d8%a7%d8%a8-%d8%a7%da%a9%d8%b4%d9%86-github-actions-%da%86%db%8c%d8%b3%d8%aa%d8%9f/">گیت‌هاب اکشن (GitHub Actions) چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>در دنیای توسعه نرم‌افزار، اتوماسیون نقشی کلیدی را ایفا می‌کند. گیت‌هاب اکشن (GitHub Actions) یکی از ابزارهای قدرتمند در این زمینه است که به شما کمک می‌کند تا فرآیندهای توسعه نرم‌افزار خود را به طور خودکار انجام دهید. در این مطلب، به بررسی جامع گیت‌هاب اکشن می‌پردازیم و به شما نشان می‌دهیم که چگونه می‌توانید از آن در پروژه‌های خود بهره ببرید.</p>



<h2 class="wp-block-heading" id="h-گیت-هاب-اکشن-چیست">گیت‌هاب اکشن چیست؟</h2>



<p>گیت‌هاب اکشن پلتفرم <a href="https://hamravesh.com/blog/what-is-ci-cd/">CI/CD</a> است که به شما امکان می‌دهد تا فرآیندهای ساخت، تست و انتشار نرم‌افزار را خودکار کنید. این پلتفرم به شما اجازه می‌دهد تا کدهای دلخواه خود را بر روی مخزنی خاص و در زمان وقوع رویدادی مشخص اجرا کنید. گیت‌هاب اکشن از کدهای بسته‌بندی شده در <a href="https://hamravesh.com/blog/what-is-docker/">داکر</a> <a href="https://hamravesh.com/blog/what-is-container/">کانتینرها</a> استفاده می‌کند که روی سرورهای گیت‌هاب اجرا می‌شوند. این ابزار با تمامی زبان‌های برنامه‌نویسی سازگار است و می‌توانید آن را بر روی ابرهای عمومی و سرورهای محلی اجرا کنید. به‌طور خلاصه، <a href="https://docs.hamravesh.com/darkube/ci-cd/github-actions/">GitHub Actions</a> به شما کمک می‌کند تا:</p>



<ul class="wp-block-list">
<li>فرآیند ساخت، تست و استقرار نرم‌افزار را خودکار کنید.</li>



<li>کارهای تکراری را بدون نیاز به دخالت دستی انجام دهید.</li>



<li>فرآیندهای کاری خود را بر اساس رویدادهای مختلف در مخزن خود راه‌اندازی کنید.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img decoding="async" width="300" height="300" src="https://hamravesh.com/blog/wp-content/uploads/2024/12/image-300x300.png" alt="گیت‌هاب اکشن" class="wp-image-4137" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/12/image-300x300.png 300w, https://hamravesh.com/blog/wp-content/uploads/2024/12/image-1024x1024.png 1024w, https://hamravesh.com/blog/wp-content/uploads/2024/12/image-150x150.png 150w, https://hamravesh.com/blog/wp-content/uploads/2024/12/image-768x768.png 768w, https://hamravesh.com/blog/wp-content/uploads/2024/12/image-250x250.png 250w, https://hamravesh.com/blog/wp-content/uploads/2024/12/image-100x100.png 100w, https://hamravesh.com/blog/wp-content/uploads/2024/12/image.png 1280w" sizes="(max-width: 300px) 100vw, 300px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-معماری-و-مفاهیم-کلیدی-گیت-هاب-اکشن">معماری و مفاهیم کلیدی گیت‌هاب اکشن</h2>



<p>برای درک بهتر گیت‌هاب اکشن، لازم است با مفاهیم و اصطلاحات کلیدی آن آشنا شوید:</p>



<ul class="wp-block-list">
<li><strong>Workflow </strong>(گردش کار): یک فرآیند خودکار است که شامل یک یا چند job است. گردش کارها با استفاده از فایل‌های YAML پیکربندی می‌شوند و می‌توانند بر اساس رویدادهای مختلف، به صورت دستی یا زمان‌بندی شده اجرا شوند. فایل‌های گردش کار در دایرکتوری .github/workflows هر مخزن قرار می‌گیرند.</li>



<li><strong>Event</strong> (رویداد): یک فعالیت خاص در مخزن است که باعث راه‌اندازی یک گردش کار می‌شود. رویدادها می‌توانند شامل ایجاد یک pull request، باز کردن یک issue یا push کردن یک commit باشند. همچنین می‌توان گردش کارها را بر اساس زمان‌بندی یا به صورت دستی فعال کرد.</li>



<li><strong>Job</strong> (کار): مجموعه‌ای از مراحل در یک گردش کار است که روی یک runner اجرا می‌شود. هر job شامل یک یا چند step است که می‌توانند یک اسکریپت از پیش تعیین شده یا یک action باشند.</li>



<li><strong>Action</strong> (عمل): یک برنامه سفارشی برای گیت‌هاب اکشن است که یک کار پیچیده اما تکراری را انجام می‌دهد. Actionها به شما کمک می‌کنند تا از نوشتن کدهای تکراری در گردش کار خود اجتناب کنید.</li>



<li><strong>Runner</strong> (اجرا کننده): ماشینی است که اپلیکیشن گیت‌هاب اکشن روی آن نصب شده و منتظر دریافت job برای اجرا است. runnerها می‌توانند توسط <a href="https://hamravesh.com/blog/what-is-github/">گیت‌هاب</a> میزبانی شوند یا می‌توانند runnerهای شخصی باشند.</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایای-استفاده-از-گیت-هاب-اکشن">مزایای استفاده از گیت‌هاب اکشن</h2>



<p>استفاده از گیت‌هاب اکشن مزایای زیادی برای تیم‌های توسعه نرم‌افزار دارد که از جمله آن‌ها می‌توان به موارد زیر اشاره کرد:</p>



<ul class="wp-block-list">
<li><strong>اتوماسیون فرآیندها</strong>: گیت‌هاب اکشن به شما اجازه می‌دهد تا فرآیندهای تکراری ساخت، تست و استقرار نرم‌افزار رو خودکار کنید. این کار باعث صرفه‌جویی در زمان و کاهش احتمال خطا می‌شود.</li>



<li><strong>افزایش سرعت توسعه</strong>: با اتوماسیون فرآیندها، تیم‌های توسعه می‌توانند سریع‌تر کد بنویسند و نرم‌افزار را به بازار عرضه کنند.</li>



<li><strong>بهبود کیفیت کد</strong>: با اجرای خودکار تست‌ها، می‌توانید مطمئن شوید که کدهای شما از کیفیت بالایی برخوردارند و می‌توانید مشکلات را سریع‌تر پیدا کنید.</li>



<li><strong>استقرار مداوم</strong>: گیت‌هاب اکشنز به شما اجازه می‌دهد تا به صورت مداوم نرم‌افزار خود رو استقرار و تغییرات را به سرعت در دسترس کاربران قرار دهید.</li>



<li><strong>انعطاف پذیری بالا</strong>: گیت‌هاب اکشنز با پشتیبانی از زبان‌های برنامه‌نویسی مختلف و امکان استفاده از Actionهای سفارشی، انعطاف پذیری بالایی را در اختیار شما قرار می‌دهد.</li>
</ul>



<h2 class="wp-block-heading" id="h-نحوه-ایجاد-یک-گردش-کار-در-گیت-هاب-اکشن">نحوه ایجاد یک گردش کار در گیت‌هاب اکشن</h2>



<p>برای ایجاد یک گردش کار در گیت‌هاب اکشن، مراحل زیر را دنبال کنید:</p>



<ul class="wp-block-list">
<li>در مخزن خود، یک دایرکتوری به نام .github/workflows ایجاد کنید.</li>



<li>در این دایرکتوری، یک فایل YAML با نام دلخواه (مثلاً demo-github-actions-workflow.yml) ایجاد کنید.</li>



<li>کد YAML را در فایل خود کپی کنید.</li>



<li>فایل را commit و push کنید.</li>
</ul>



<p>کد YAML:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>name: Demo GitHub Actions Workflow
on: &#91;push&#93;
jobs:
  Discover-GitHub-Actions-Workflows:
    runs-on: ubuntu-latest
    steps:
      - name: Echo event
        run: echo "${{ github.event_name }} event automatically triggered this job."
      - name: Echo runner OS
        run: echo " A ${{ runner.os }} server hosted by GitHub has this job running"
      - name: Echo repository details
        run: echo "Details of your repository: repo-name: ${{ github.repository }} and branch name is${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Echo clone message
        run: echo "The runner has cloned your ${{ github.repository }} repository."
      - name: Echo test message
        run: echo "The workflow can now test your code with the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - name: Echo Job Status
        run: echo " This job has a ${{ job.status }} status."</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Demo GitHub Actions Workflow</span></span>
<span class="line"><span style="color: #6CB6FF">on</span><span style="color: #ADBAC7">: &#91;</span><span style="color: #96D0FF">push</span><span style="color: #ADBAC7">&#93;</span></span>
<span class="line"><span style="color: #8DDB8C">jobs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">Discover-GitHub-Actions-Workflows</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">runs-on</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">ubuntu-latest</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">steps</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Echo event</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">echo &quot;${{ github.event_name }} event automatically triggered this job.&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Echo runner OS</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">echo &quot; A ${{ runner.os }} server hosted by GitHub has this job running&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Echo repository details</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #8DDB8C">echo &quot;Details of your repository</span><span style="color: #ADBAC7">: </span><span style="color: #8DDB8C">repo-name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">${{ github.repository }} and branch name is${{ github.ref }} and your repository is ${{ github.repository }}.&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Checkout code</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">uses</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">actions/checkout@v3</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Echo clone message</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">echo &quot;The runner has cloned your ${{ github.repository }} repository.&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Echo test message</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">echo &quot;The workflow can now test your code with the runner.&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">List files in the repository</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #F47067">|</span></span>
<span class="line"><span style="color: #96D0FF">          ls ${{ github.workspace }}</span></span>
<span class="line"><span style="color: #ADBAC7">      - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Echo Job Status</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">echo &quot; This job has a ${{ job.status }} status.&quot;</span></span></code></pre></div>



<p>پس از انجام این مراحل، هر بار که یک push به مخزن خود انجام دهید، این گردش کار اجرا خواهد شد.</p>



<h3 class="wp-block-heading" id="h-مشاهده-نتایج-گردش-کار">مشاهده نتایج گردش کار</h3>



<p>برای دیدن نتایج اجرای گردش کار، مراحل زیر را دنبال کنید:</p>



<ul class="wp-block-list">
<li>به صفحه اصلی مخزن خود بروید و روی تب Actions کلیک کنید.</li>



<li>در سایدبار سمت چپ، گردش کار خود را انتخاب کنید (مثلاً Demo-GitHub-Actions-Workflow).</li>



<li>در لیست نمایش داده شده، اجرای مورد نظر را انتخاب کنید (مثلاً Create demo-github-actions-workflow.yml).</li>



<li>در سایدبار سمت چپ، job مورد نظر خود را انتخاب کنید (مثلاً Discover-GitHub-Actions-Workflows).</li>



<li>لاگ‌های مربوط به هر مرحله از گردش کار را مشاهده کنید.</li>
</ul>



<h2 class="wp-block-heading" id="h-نمونه-هایی-از-کاربردهای-گیت-هاب-اکشن">نمونه‌هایی از کاربردهای گیت‌هاب اکشن</h2>



<p>گیت‌هاب اکشن می‌تواند برای انجام کارهای مختلفی مورد استفاده قرار گیرد، از جمله:</p>



<ul class="wp-block-list">
<li><strong>Continuous Integration </strong>(<strong>CI</strong>): ساخت و تست خودکار کدها پس از هر push یا pull request.</li>



<li><strong>Continuous Deployment </strong>(<strong>CD</strong>): انتشار خودکار نرم‌افزار پس از عبور از تست‌ها.</li>



<li><strong>اتوماسیون وظایف تکراری</strong>: انجام خودکار کارهایی مانند اضافه کردن label به issueها یا بستن issueهای غیرفعال.</li>
</ul>



<p>در ادامه به برخی از کاربردهای رایج گیت‌هاب اکشنز در پروژه‌ها اشاره می‌کنیم:</p>



<ul class="wp-block-list">
<li><strong>Eslint</strong>: بررسی و گزارش خطاهای جاوااسکریپت.</li>



<li><strong>Test &amp; Coveralls</strong>: اجرای تست‌های خودکار و گزارش پوشش تست.</li>



<li><strong>Npm Publish</strong>: انتشار پکیج‌های npm به‌صورت خودکار.</li>



<li><strong>Release</strong>: ایجاد نسخه جدید از پروژه و انتشار آن در گیت‌هاب.</li>
</ul>



<h3 class="wp-block-heading" id="h-مثال-eslint-workflow">مثال: Eslint Workflow</h3>



<p>در اینجا یک مثال از یک workflow برای اجرای ESLint آورده شده است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>name: ESLint Check
on: push
jobs:
    eslint:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v2
            - name: Use Node.js
              uses: actions/setup-node@v2
              with:
                node-version: "14.x"
            - name: Install Dependencies
              run: npm install
            - name: Run ESLint
              run: npm run eslint
            concurrency:
              group: eslint-check-${{ github.event.pull_request.number || github.ref }}
              cancel-in-progress: true</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">ESLint Check</span></span>
<span class="line"><span style="color: #6CB6FF">on</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">push</span></span>
<span class="line"><span style="color: #8DDB8C">jobs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    </span><span style="color: #8DDB8C">eslint</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">runs-on</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">ubuntu-latest</span></span>
<span class="line"><span style="color: #ADBAC7">        </span><span style="color: #8DDB8C">steps</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">            - </span><span style="color: #8DDB8C">uses</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">actions/checkout@v2</span></span>
<span class="line"><span style="color: #ADBAC7">            - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Use Node.js</span></span>
<span class="line"><span style="color: #ADBAC7">              </span><span style="color: #8DDB8C">uses</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">actions/setup-node@v2</span></span>
<span class="line"><span style="color: #ADBAC7">              </span><span style="color: #8DDB8C">with</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">                </span><span style="color: #8DDB8C">node-version</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">&quot;14.x&quot;</span></span>
<span class="line"><span style="color: #ADBAC7">            - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Install Dependencies</span></span>
<span class="line"><span style="color: #ADBAC7">              </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">npm install</span></span>
<span class="line"><span style="color: #ADBAC7">            - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Run ESLint</span></span>
<span class="line"><span style="color: #ADBAC7">              </span><span style="color: #8DDB8C">run</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">npm run eslint</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">concurrency</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">              </span><span style="color: #8DDB8C">group</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">eslint-check-${{ github.event.pull_request.number || github.ref }}</span></span>
<span class="line"><span style="color: #ADBAC7">              </span><span style="color: #8DDB8C">cancel-in-progress</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">true</span></span></code></pre></div>



<p>این workflow هر بار که کدی به مخزن push شود، اجرا می‌شود، کدهای جاوااسکریپت را بررسی می‌کند و در صورت وجود خطا، آن‌ها را گزارش می‌دهد.</p>



<h2 class="wp-block-heading" id="h-نکات-مهم-در-استفاده-از-گیت-هاب-اکشن">نکات مهم در استفاده از گیت‌هاب اکشن</h2>



<p>برای استفاده بهینه از گیت‌هاب اکشن، به نکات زیر توجه کنید:</p>



<ul class="wp-block-list">
<li><strong>Actionهای کمینه</strong>: سعی کنید اکشن‌ها را تا حد امکان ساده و کمینه نگه دارید تا زمان اجرای آن‌ها کاهش یابد.</li>



<li><strong>اجتناب از دانلودهای غیرضروری</strong>: از دانلود وابستگی‌ها (dependencies) به صورت غیرضروری خودداری کنید و از مکانیزم کش گیت‌هاب استفاده کنید.</li>



<li><strong>عدم هاردکد کردن secretها</strong>: از هاردکد کردن secretها در گردش کارها خودداری کنید و از قسمت secretهای مخزن استفاده کنید.</li>



<li><strong>ذخیره اطلاعات نویسنده action</strong>: در metadata مربوط به action، اطلاعات نویسنده را ذخیره کنید تا مسئولیت هر action مشخص باشد.</li>
</ul>



<h2 class="wp-block-heading" id="h-گیت-هاب-اکشن-در-دارکوب">گیت‌هاب اکشن در دارکوب</h2>



<p>در دارکوب، ما از گیت‌هاب اکشنز برای خودکار کردن بسیاری از فرآیندهای توسعه نرم‌افزار استفاده می‌کنیم. از جمله این فرآیندها می‌توان به تست خودکار کد، بررسی کیفیت کد، انتشار پکیج‌ها و استقرار اپلیکیشن‌ها اشاره کرد. با استفاده از گیت‌هاب اکشنز، می‌توانیم سرعت توسعه نرم‌افزار را افزایش بدهیم و کیفیت کدها را هم بهبود بخشیم. برای آشنایی بیشتر با نحوه استفاده از گیت‌هاب اکشنز در دارکوب، می‌توانید به مستندات هم‌روش مراجعه کنید:</p>



<ul class="wp-block-list">
<li><a href="https://docs.hamravesh.com/darkube/ci-cd/github-actions/">راهنمای استفاده از Github Actions</a></li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>گیت‌هاب اکشن یک ابزار قدرتمند است که به شما امکان می‌دهد تا فرآیندهای توسعه نرم‌افزار خود را به طور کامل خودکار کنید. با استفاده از این ابزار، می‌توانید سرعت و کیفیت توسعه نرم‌افزار خود را به‌طور چشمگیری افزایش دهید. در این مطلب، به بررسی مفاهیم کلیدی، نحوه ایجاد گردش کار و نمونه‌هایی از کاربردهای گیت‌هاب اکشنز پرداختیم. امیدواریم این مطلب برای شما مفید بوده باشد.</p>
<p>The post <a href="https://hamravesh.com/blog/%da%af%db%8c%d8%aa%d9%87%d8%a7%d8%a8-%d8%a7%da%a9%d8%b4%d9%86-github-actions-%da%86%db%8c%d8%b3%d8%aa%d8%9f/">گیت‌هاب اکشن (GitHub Actions) چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/%da%af%db%8c%d8%aa%d9%87%d8%a7%d8%a8-%d8%a7%da%a9%d8%b4%d9%86-github-actions-%da%86%db%8c%d8%b3%d8%aa%d8%9f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>مشاهده‌پذیری (observability) چیست؟</title>
		<link>https://hamravesh.com/blog/what-is-observability/</link>
					<comments>https://hamravesh.com/blog/what-is-observability/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 14:05:57 +0000</pubDate>
				<category><![CDATA[مشاهده‌پذیری]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4160</guid>

					<description><![CDATA[<p>امروزه، با گسترش فناوری‌های ابری و معماری‌های پیچیده نرم‌افزاری، نظارت بر عملکرد سیستم‌ها به چالشی بزرگ برای تیم‌های IT و دواپس تبدیل شده است. دیگر نمی‌توان صرفا با ابزارهای سنتی مانیتورینگ به درک کاملی از وضعیت سیستم دست یافت. اینجاست که مفهوم مشاهده‌پذیری یا Observability وارد میدان می‌شود. اما مشاهده‌پذیری دقیقاً چیست و چه تفاوتی [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-observability/">مشاهده‌پذیری (observability) چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>امروزه، با گسترش فناوری‌های ابری و معماری‌های پیچیده نرم‌افزاری، نظارت بر عملکرد سیستم‌ها به چالشی بزرگ برای تیم‌های IT و دواپس تبدیل شده است. دیگر نمی‌توان صرفا با ابزارهای سنتی مانیتورینگ به درک کاملی از وضعیت سیستم دست یافت. اینجاست که مفهوم مشاهده‌پذیری یا Observability وارد میدان می‌شود. اما مشاهده‌پذیری دقیقاً چیست و چه تفاوتی با مانیتورینگ دارد؟ در این مقاله، به این سوالات پاسخ خواهیم داد و به بررسی اهمیت و مزایای آن می‌پردازیم.</p>



<h2 class="wp-block-heading" id="h-مشاهده-پذیری-چیست">مشاهده‌پذیری چیست؟</h2>



<p>به زبان ساده، مشاهده‌پذیری به معنای توانایی اندازه‌گیری وضعیت داخلی یک سیستم با بررسی خروجی‌های آن است. به‌عبارت دیگر، اگر بتوان با استفاده از داده‌هایی که از سیستم خارج می‌شوند (مانند لاگ‌ها، متریک‌ها و تریس‌ها) وضعیت فعلی آن را تخمین زد، آن سیستم «مشاهده‌پذیر» است. این مفهوم ریشه در نظریه کنترل دارد، اما امروزه کاربرد گسترده‌ای در بهبود عملکرد سیستم‌های IT پیدا کرده است.</p>



<p>مشاهده‌پذیری به شما اجازه می‌دهد تا پرسش‌هایی مانند «چرا X خراب شده است؟» یا «علت تاخیر در حال حاضر چیست؟» را بپرسید و پاسخ‌های دقیقی دریافت کنید. این ویژگی در محیط‌های ابری و سیستم‌های توزیع‌شده که دارای اجزای بسیار زیادی هستند، بسیار حیاتی است.</p>



<h2 class="wp-block-heading" id="h-تفاوت-مانیتورینگ-و-مشاهده-پذیری">تفاوت مانیتورینگ و مشاهده‌پذیری</h2>



<p>در نگاه اول، شاید تصور کنید که مشاهده‌پذیری همان مانیتورینگ است، اما این ۲ مفهوم تفاوت‌های کلیدی دارند. مانیتورینگ به معنای نظارت بر عملکرد سیستم در طول زمان است. در مانیتورینگ، شما از قبل مشخص می‌کنید که چه چیزهایی را باید تحت نظر داشته باشید و داشبوردهایی را برای هشدار در مورد مشکلات احتمالی ایجاد می‌کنید. این روش برای سیستم‌های ساده‌تر مناسب است، اما در محیط‌های ابری و پویا که مشکلات غیرمنتظره رخ می‌دهند، کارایی خود را از دست می‌دهد.</p>



<p>در مقابل، مشاهده‌پذیری به شما اجازه می‌دهد تا با بررسی داده‌های سیستم، مشکلات ناشناخته را کشف و علت ریشه‌ای آن‌ها را پیدا کنید. به عبارت دیگر، شما نیازی ندارید از قبل بدانید چه مشکلاتی ممکن است به وجود بیایند، بلکه با بررسی داده‌ها می‌توانید به سوالات جدید پاسخ دهید. مشاهده‌پذیری از داده‌ها و بینش‌هایی که مانیتورینگ تولید می‌کند برای ایجاد درک جامعی از سیستم استفاده می‌کند.</p>



<p>به‌طور خلاصه، مانیتورینگ یک عمل است و مشاهده‌پذیری یک ویژگی به‌حساب می‌آید. مانیتورینگ برای «مشکلات شناخته شده» مناسب است، در حالی که مشاهده‌پذیری برای «مشکلات ناشناخته» طراحی شده است.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="793" height="495" src="https://hamravesh.com/blog/wp-content/uploads/2025/01/image-1.png" alt="تفاوت مانیتورینگ و مشاهده‌پذیری" class="wp-image-4162" style="width:auto;height:450px" srcset="https://hamravesh.com/blog/wp-content/uploads/2025/01/image-1.png 793w, https://hamravesh.com/blog/wp-content/uploads/2025/01/image-1-300x187.png 300w, https://hamravesh.com/blog/wp-content/uploads/2025/01/image-1-768x479.png 768w" sizes="(max-width: 793px) 100vw, 793px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-چرا-مشاهده-پذیری-مهم-است">چرا مشاهده‌پذیری مهم است؟</h2>



<p>مشاهده‌پذیری در توسعه نرم‌افزار بسیار مهم است، زیرا کنترل بیشتری بر سیستم‌های پیچیده به شما می‌دهد. سیستم‌های توزیع‌شده بخش‌های متحرک بیشتری دارند، بنابراین تعداد و انواع خرابی‌هایی که می‌توانند رخ دهند نیز بیشتر است. علاوه بر این، سیستم‌های توزیع‌شده به‌طور مداوم به‌روز می‌شوند و هر تغییر می‌تواند یک نوع خرابی جدید ایجاد کند.</p>



<p>در محیط‌های پیچیده و توزیع شده، درک مشکل فعلی بسیار چالش برانگیز است، زیرا «ناشناخته‌های ناشناخته» بیشتری تولید می‌کند. از آنجایی که مانیتورینگ به «شناخته‌های ناشناخته» نیاز دارد، اغلب در این محیط‌های پیچیده به اندازه کافی به مشکلات رسیدگی نمی‌کند.</p>



<p>مشاهده‌پذیری برای غیرقابل پیش‌بینی بودن سیستم‌های توزیع شده مناسب‌تر است، عمدتاً به این دلیل که به شما امکان می‌دهد در هنگام بروز مشکلات، سوالاتی در مورد رفتار سیستم خود بپرسید.</p>



<h2 class="wp-block-heading" id="h-ستون-های-اصلی-مشاهده-پذیری-چیست">ستون‌های اصلی مشاهده‌پذیری چیست؟</h2>



<p>مشاهده‌پذیری بر پایه ۳ نوع داده اصلی استوار است که به آن‌ها «سه ستون مشاهده‌پذیری» گفته می‌شود:</p>



<ul class="wp-block-list">
<li><strong>لاگ‌ها </strong>(<strong>Logs</strong>): لاگ‌ها، ثبت‌کننده‌ی متنی رویدادهایی هستند که در سیستم رخ می‌دهند. هر لاگ شامل یک مُهر زمان (timestamp) و اطلاعات مربوط به رویداد است.</li>



<li><strong>متریک‌ها </strong>(<strong>Metrics</strong>): متریک‌ها، مقادیر عددی هستند که در طول زمان اندازه‌گیری می‌شوند و معیارهایی مانند CPU، حافظه، یا زمان پاسخ‌دهی را نشان می‌دهند.</li>



<li><strong>تریس‌ها </strong>(<strong>Traces</strong>): تریس‌ها، مسیر درخواست را از ابتدا تا انتها در سیستمی توزیع‌شده دنبال می‌کنند. هر تریس شامل «اسپن‌ها» (Span) است که اطلاعات مربوط به هر عملیات انجام شده در طول مسیر را نشان می‌دهند.</li>
</ul>



<p>برای دستیابی به مشاهده‌پذیری واقعی، باید این ۳ ستون را با هم ادغام کرد و از آن‌ها به صورت مجزا استفاده نکرد. این کار به شما کمک می‌کند تا نه تنها زمان وقوع مشکلات را متوجه شوید، بلکه علت وقوع آن‌ها را نیز درک کنید.</p>



<h2 class="wp-block-heading" id="h-مزایای-مشاهده-پذیری">مزایای مشاهده‌پذیری</h2>



<p>مشاهده‌پذیری مزایای متعددی را برای تیم‌های توسعه و کسب‌وکار به همراه دارد:</p>



<ul class="wp-block-list">
<li><strong>دید بهتر</strong>: مشاهده‌پذیری دید کاملی از سیستم‌های توزیع‌شده به شما می‌دهد و به شما کمک می‌کند تا بفهمید چه سرویس‌هایی در حال اجرا هستند، عملکرد برنامه‌ها چگونه است و چه تغییراتی در سیستم رخ داده است.</li>



<li><strong>هشداردهی بهتر</strong>: با استفاده از مشاهده‌پذیری، می‌توانید مشکلات را سریع‌تر کشف و رفع کنید و با دید عمیق‌تر، تغییرات سیستم را بررسی کرده و در صورت نیاز، مشکلات را رفع کنید.</li>



<li><strong>بهبود گردش کار</strong>: مشاهده‌پذیری به توسعه‌دهندگان اجازه می‌دهد تا مسیر یک درخواست را به‌صورت سرتاسری ببینند و با اطلاعات متنی مرتبط با مشکل، فرآیند بررسی و رفع اشکال را بهینه‌سازی کنند.</li>



<li><strong>صرفه‌جویی در زمان</strong>: با مشاهده‌پذیری، اطلاعات به‌راحتی در دسترس است و دیگر نیازی به پیگیری اطلاعات از منابع مختلف نیست.</li>



<li><strong>افزایش سرعت توسعه</strong>: مشاهده‌پذیری با کارآمدتر کردن مانیتورینگ و عیب‌یابی، زمان توسعه را کاهش می‌دهد و به مهندسان این امکان را می‌دهد تا بر روی نوآوری‌ها تمرکز کنند.</li>



<li><strong>بهبود تجربه کاربری</strong>: با کمک داده‌های مربوط به تجربه کاربر (User Experience)، می توانید مشکلات را پیش از اینکه کاربر آن‌ها را ببیند حل کنید.</li>
</ul>



<h2 class="wp-block-heading" id="h-چالش-های-مشاهده-پذیری-چیست">چالش‌های مشاهده‌پذیری چیست؟</h2>



<p>در کنار مزایا، مشاهده‌پذیری چالش‌هایی نیز دارد:</p>



<ul class="wp-block-list">
<li><strong>حجم زیاد داده</strong>: سیستم‌های ابری حجم بسیار زیادی از داده را تولید می‌کنند که تفسیر و تحلیل آن‌ها دشوار است.</li>



<li><strong>سیلوهای داده</strong>: وجود ابزارهای مانیتورینگ مختلف و منابع داده پراکنده، درک وابستگی‌های بین سیستم‌ها را دشوار می‌کند.</li>



<li><strong>ابزارهای متعدد</strong>: استفاده از ابزارهای متعدد برای جمع‌آوری داده‌ها و مشاهده‌پذیری، فرآیند عیب‌یابی را پیچیده و زمان‌بر می‌کند.</li>



<li><strong>عدم امکان پیش‌بینی مشکلات</strong>: در محیط‌های پویا و پیچیده، پیش‌بینی انواع مشکلات غیرممکن است و نیاز به ابزاری برای تحلیل مشکلات ناشناخته داریم.</li>
</ul>



<h2 class="wp-block-heading" id="h-راهکارهای-عملی-برای-مشاهده-پذیری">راهکارهای عملی برای مشاهده‌پذیری</h2>



<p>برای مقابله با چالش‌های مشاهده‌پذیری، باید به نکات زیر توجه کرد:</p>



<ul class="wp-block-list">
<li><strong>استفاده از ابزارهای یکپارچه</strong>: استفاده از پلتفرمی یکپارچه که تمامی داده‌ها را از منابع مختلف جمع‌آوری می‌کند و امکان تحلیل آن‌ها را فراهم می‌کند، ضروری است.</li>



<li><strong>به کارگیری هوش مصنوعی</strong>: استفاده از هوش مصنوعی برای تحلیل خودکار داده‌ها، شناسایی الگوهای غیرعادی و تشخیص علت ریشه‌ای مشکلات، بسیار کارآمد است.</li>



<li><strong>خودکارسازی فرآیندها</strong>: خودکارسازی جمع‌آوری داده‌ها، کشف وابستگی‌ها و ایجاد نقشه‌های توپولوژی، به شما کمک می‌کند تا از حجم بالای کارها کاسته و بر روی نوآوری تمرکز کنید.</li>



<li><strong>توجه به تجربه کاربر</strong>: در کنار لاگ‌ها، متریک‌ها و تریس‌ها، باید داده‌های مربوط به تجربه کاربر را نیز جمع‌آوری و تحلیل کرد تا درک کاملی از عملکرد سیستم به دست آورید.</li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>مشاهده‌پذیری، فراتر از مانیتورینگ سنتی است و دید عمیق‌تری از عملکرد سیستم‌ها در اختیار شما قرار می‌دهد. با استفاده از مشاهده‌پذیری، می‌توانید مشکلات را سریع‌تر شناسایی و رفع کنید، عملکرد برنامه‌ها را بهبود دهید و در نهایت، تجربه کاربری بهتری را ارائه دهید. در دنیای پیچیده امروز، مشاهده‌پذیری به یک ضرورت برای سازمان‌هایی تبدیل شده است که به دنبال پایداری، امنیت و نوآوری هستند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-observability/">مشاهده‌پذیری (observability) چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-observability/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>سنتری (sentry) چیست؟</title>
		<link>https://hamravesh.com/blog/what-is-sentry/</link>
					<comments>https://hamravesh.com/blog/what-is-sentry/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 12:36:37 +0000</pubDate>
				<category><![CDATA[مشاهده‌پذیری]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4121</guid>

					<description><![CDATA[<p>سنتری پلتفرمی جامع برای شناسایی، عیب‌یابی و رفع خطاهای نرم‌افزاری است که به تیم‌های توسعه کمک می‌کند تا مشکلات را به سرعت و پیش از آنکه به کاربران نهایی آسیب برسانند، حل کنند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-sentry/">سنتری (sentry) چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>در دنیای پرتلاطم توسعه نرم‌افزار، بروز خطاها امری اجتناب‌ناپذیر است. این خطاها، چه کوچک و چه بزرگ، می‌توانند تأثیرات مخربی بر تجربه کاربری و اعتبار یک محصول نرم‌افزاری داشته باشند. اینجاست که ابزارهای مدیریت خطا و پایش بلادرنگ به کمک توسعه‌دهندگان می‌آیند. یکی از قدرتمندترین این ابزارها، «سنتری» (Sentry) است. در این مطلب، ابتدا شرح می‌دهیم که سنتری (sentry) چیست و سپس به بررسی عمیق‌تر ویژگی‌ها، مزایا، کاربردها و نحوه کارکرد سنتری خواهیم پرداخت.</p>



<h2 class="wp-block-heading" id="h-سنتری-sentry-چیست">سنتری (sentry) چیست؟</h2>



<p>سنتری پلتفرمی جامع برای شناسایی، عیب‌یابی و رفع خطاهای نرم‌افزاری است که به تیم‌های توسعه کمک می‌کند تا مشکلات را به سرعت و پیش از آنکه به کاربران نهایی آسیب برسانند، حل کنند. این ابزار با فراهم آوردن دیدی دقیق و بلادرنگ از خطاهای رخ‌داده در برنامه، امکان واکنش سریع و مؤثر را فراهم می‌سازد.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="737" height="450" src="https://hamravesh.com/blog/wp-content/uploads/2024/12/What-is-Sentry.png" alt="سنتری (sentry)" class="wp-image-4123" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/12/What-is-Sentry.png 737w, https://hamravesh.com/blog/wp-content/uploads/2024/12/What-is-Sentry-300x183.png 300w" sizes="auto, (max-width: 737px) 100vw, 737px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-سنتری-چگونه-کار-می-کند">سنتری چگونه کار می‌کند؟</h2>



<p>سنتری، پلتفرم متن‌بازی است که به‌منظور ردیابی، مدیریت و اصلاح خطاهای موجود در برنامه‌های کاربردی طراحی شده است. این پلتفرم با استفاده از مجموعه‌ای از «گیرنده‌ها» (capturers)، که در داخل کد برنامه ادغام می‌شوند، اطلاعات مربوط به خطاها و استثناهای رخ‌داده را جمع‌آوری می‌کند. این گیرنده‌ها، اطلاعات دقیق خطاها را به سرور سنتری ارسال می‌کنند، جایی که داده‌ها ذخیره شده و در یک رابط کاربری وب بصری به نمایش درمی‌آیند. این فرآیند به توسعه‌دهندگان اجازه می‌دهد تا به سرعت خطاهای رخ‌داده را مشاهده کرده و با استفاده از اطلاعات دقیق فراهم‌شده، برای رفع آن‌ها اقدام کنند.</p>



<p>یکی از جنبه‌های مهم سنتری، پشتیبانی آن از طیف گسترده‌ای از زبان‌های برنامه‌نویسی و فریم‌ورک‌ها است. سنتری می‌تواند در برنامه‌های نوشته‌شده با پایتون، جاوا اسکریپت، روبی، جاوا و بسیاری دیگر از زبان‌ها و فریم‌ورک‌ها استفاده شود. این سازگاری بالا به توسعه‌دهندگان امکان می‌دهد تا از سنتری در پروژه‌های مختلف خود، صرف نظر از تکنولوژی‌های به‌کاررفته، بهره ببرند.</p>



<h2 class="wp-block-heading" id="h-ویژگی-های-کلیدی-سنتری">ویژگی‌های کلیدی سنتری</h2>



<p>سنتری با مجموعه‌ای از ویژگی‌های قدرتمند خود، به توسعه‌دهندگان در مدیریت بهتر خطاها و بهبود کیفیت نرم‌افزار کمک می‌کند. در اینجا به برخی از کلیدی‌ترین ویژگی‌های سنتری اشاره می‌کنیم:</p>



<ul class="wp-block-list">
<li><strong>ردیابی خودکار خطا </strong>(<strong>Error Tracking</strong>): سنتری به طور خودکار خطاهای موجود در برنامه را شناسایی کرده و اطلاعات جامعی از جمله «گزارش خطای پشته» (stack trace)، «فضای کاربر» (user context) و متغیرهای محلی را ارائه می‌دهد. این اطلاعات به توسعه‌دهندگان کمک می‌کند تا به سرعت علت اصلی خطا را تشخیص داده و آن را رفع کنند.</li>



<li><strong>تجمیع هوشمند رویدادها </strong>(<strong>Event Aggregation</strong>): سنتری به‌طور خودکار خطاهای مشابه را در یک مسئله واحد جمع‌آوری می‌کند. این ویژگی به توسعه‌دهندگان کمک می‌کند تا الگوهای تکرار خطاها را شناسایی کرده و به جای رفع تک‌تک خطاها، به حل ریشه‌ای مشکل بپردازند.</li>



<li><strong>پیگیری مسائل </strong>(<strong>Issue Tracking</strong>): سنتری به تیم‌های توسعه این امکان را می‌دهد تا مسائل مربوط به خطاها را پیگیری کرده و آن‌ها را برای رفع به اعضای مختلف تیم ارجاع دهند. این ویژگی، فرآیند رفع خطا را بهینه‌سازی کرده و از گم شدن مسائل جلوگیری می‌کند.</li>



<li><strong>هشدار بلادرنگ </strong>(<strong>Real-time Alerts</strong>): سنتری هنگام تشخیص خطاهای جدید، هشدارهای بلادرنگ ارسال می‌کند. این هشدارها به توسعه‌دهندگان امکان می‌دهد تا به سرعت نسبت به مشکلات واکنش نشان داده و از تأثیرات منفی آن‌ها بر کاربران جلوگیری کنند.</li>



<li><strong>پایش عملکرد </strong>(<strong>Performance Monitoring</strong>): علاوه بر ردیابی خطاها، سنتری امکان پایش عملکرد برنامه را نیز فراهم می‌کند. این ویژگی به تیم‌های توسعه کمک می‌کند تا عملیات کُند و پرمصرف را شناسایی کرده و برای بهینه‌سازی عملکرد برنامه اقدام کنند.</li>



<li><strong>ردیابی نسخه‌ها </strong>(<strong>Release Tracking</strong>): سنتری به توسعه‌دهندگان اجازه می‌دهد تا نسخه‌های مختلف نرم‌افزار را ردیابی کرده و خطاها را به نسخه‌های خاص مرتبط کنند. این قابلیت به تیم‌ها کمک می‌کند تا بفهمند که آیا خطایی خاص در نسخه‌ای خاص رخ داده است یا خیر.</li>



<li><strong>گزارش‌گیری جامع</strong>: سنتری با ارائه گزارش‌های جامع و دقیق، به تیم‌ها امکان می‌دهد تا الگوهای خطاهای رخ‌داده را شناسایی کرده و بر اساس داده‌های واقعی، تصمیم‌گیری کنند.</li>



<li><strong>قابلیت سفارشی‌سازی</strong>: سنتری به توسعه‌دهندگان این امکان را می‌دهد تا تنظیمات و هشدارهای خود را بر اساس نیازهای خاص پروژه سفارشی‌سازی کنند.</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایای-استفاده-از-سنتری-چیست">مزایای استفاده از سنتری چیست؟</h2>



<p>استفاده از سنتری مزایای متعددی برای تیم‌های توسعه نرم‌افزار به همراه دارد. برخی از این مزایا در ادامه فهرست شده‌اند:</p>



<ul class="wp-block-list">
<li><strong>تشخیص زودهنگام خطاها</strong>: سنتری با ارائه نمای بلادرنگ از خطاها، به تیم‌ها کمک می‌کند تا مشکلات را پیش از تأثیرگذاری بر کاربران نهایی شناسایی کنند.</li>



<li><strong>کاهش زمان رفع خطا</strong>: با ارائه اطلاعات دقیق و جامع در مورد خطاها، سنتری به توسعه‌دهندگان کمک می‌کند تا علت اصلی مشکلات را به سرعت پیدا کرده و در نتیجه، زمان رفع خطاها را به‌طور چشمگیری کاهش دهند.</li>



<li><strong>بهبود کیفیت نرم‌افزار</strong>: با ردیابی و رفع مداوم خطاها، سنتری به تیم‌ها کمک می‌کند تا نرم‌افزارهای پایدارتر و باکیفیت‌تری را ارائه دهند.</li>



<li><strong>افزایش رضایت کاربران</strong>: با کاهش تعداد خطاها و بهبود عملکرد برنامه، سنتری به‌طور غیرمستقیم به افزایش رضایت کاربران کمک می‌کند.</li>



<li><strong>صرفه‌جویی در زمان و هزینه</strong>: با تشخیص سریع خطاها و کاهش زمان رفع آن‌ها، سنتری به تیم‌ها کمک می‌کند تا در زمان و هزینه‌های خود صرفه‌جویی کنند.</li>



<li><strong>بهبود همکاری تیمی</strong>: با ارائه ابزارهایی برای پیگیری و ارجاع مسائل، سنتری به بهبود همکاری و هماهنگی بین اعضای تیم توسعه کمک می‌کند.</li>
</ul>



<h2 class="wp-block-heading" id="h-کاربردهای-سنتری-چیست">کاربردهای سنتری چیست؟</h2>



<p>سنتری ابزاری همه‌کاره است که می‌تواند در موقعیت‌های مختلفی در فرآیند توسعه نرم‌افزار به کار گرفته شود. برخی از کاربردهای کلیدی سنتری در ادامه آمده‌اند:</p>



<ul class="wp-block-list">
<li><strong>پایش محیط عملیاتی </strong>(<strong>Production Monitoring</strong>): سنتری به تیم‌های توسعه کمک می‌کند تا خطاهای رخ‌داده در محیط عملیاتی را به‌صورت بلادرنگ پایش کرده و به سرعت نسبت به آن‌ها واکنش نشان دهند. این امر به حفظ پایداری و دسترس‌پذیری نرم‌افزار کمک می‌کند.</li>



<li><strong>عیب‌یابی در مراحل تست </strong>(<strong>Debugging in Testing Stages</strong>): سنتری می‌تواند به‌عنوان ابزاری کارآمد برای عیب‌یابی در مراحل تست نرم‌افزار مورد استفاده قرار گیرد. با استفاده از سنتری، تیم‌های تست می‌توانند خطاهای موجود در نرم‌افزار را شناسایی کرده و اطلاعات دقیقی از آن‌ها به تیم‌های توسعه منتقل کنند.</li>



<li><strong>تجزیه و تحلیل عملکرد </strong>(<strong>Performance Analysis</strong>): سنتری با جمع‌آوری اطلاعات مربوط به عملکرد برنامه، به تیم‌ها کمک می‌کند تا گلوگاه‌های عملکردی را شناسایی کرده و برای بهبود کارایی برنامه اقدام کنند.</li>



<li><strong>یکپارچگی با ابزارهای توسعه </strong>(<strong>Integration with Development Tools</strong>): سنتری به‌راحتی با ابزارهای مختلف توسعه نرم‌افزار مانند سیستم‌های کنترل نسخه (Git)، خدمات پیگیری مسئله (<a href="https://hamravesh.com/blog/what-is-jira/">Jira</a>) و پلتفرم‌های <a href="https://hamravesh.com/blog/what-is-ci-cd/">CI/CD</a> یکپارچه می‌شود. این یکپارچگی به تیم‌ها کمک می‌کند تا فرآیند رفع خطا را بهینه کرده و بهره‌وری خود را افزایش دهند.</li>



<li><strong>ردیابی خطاهای مکرر </strong>(<strong>Tracking Recurring Errors</strong>): سنتری با استفاده از گروه‌بندی هوشمند خطاها، به تیم‌ها کمک می‌کند تا خطاهای مکرر را شناسایی کرده و به‌طور مؤثرتری با آن‌ها مقابله کنند. این قابلیت به تیم‌ها امکان می‌دهد تا به جای رفع تک‌تک خطاها، به حل ریشه‌ای مشکل بپردازند.</li>
</ul>



<h2 class="wp-block-heading" id="h-چند-مثال-از-کاربرد-سنتری">چند مثال از کاربرد سنتری</h2>



<p>برای روشن‌تر شدن نحوه استفاده از سنتری، چند مثال عملی را در نظر می‌گیریم:</p>



<ul class="wp-block-list">
<li><strong>شناسایی خطاها در برنامه وب پایتون</strong>: فرض کنید برنامه وب پایتونی دارید که دچار خطا شده است. با استفاده از سنتری، می‌توانید به سرعت علت اصلی خطا، از جمله stack trace و user context را شناسایی کنید. همچنین می‌توانید خطاها را در طول زمان پیگیری کنید و الگوهای تکرار آن‌ها را تشخیص دهید.</li>



<li><strong>عیب‌یابی مشکلات عملکرد در برنامه جاوا اسکریپتی</strong>: فرض کنید برنامه‌ای جاوا اسکریپتی دارید که به کندی اجرا می‌شود. با استفاده از سنتری، می‌توانید عملیات کُند و پرمصرف را شناسایی کنید و برای بهینه‌سازی عملکرد برنامه اقدام‌های لازم را انجام دهید.</li>



<li><strong>رفع خطاها در یک برنامه روبی آن ریلز</strong>: فرض کنید برنامه روبی آن ریلزی دارید که دچار خطا شده است. با استفاده از سنتری، می‌توانید مسئله را پیگیری کنید و آن را به یکی از اعضای تیم برای رفع ارجاع دهید. همچنین می‌توانید خطا را با یک نسخه خاص از برنامه مرتبط کنید تا مشخص شود خطا در چه زمانی بروز پیدا کرده است.</li>
</ul>



<h2 class="wp-block-heading" id="h-سرویس-سنتری-sentry-هم-روش">سرویس سنتری (Sentry) هم‌روش</h2>



<p>هم‌روش سنتری را به‌صورت سرویس ارائه می‌دهد. با استفاده از سرویس سنتری هم‌روش بار راه‌اندازی و نگه‌داری از این ابزار از روی دوش تیم فنی شما برداشته می‌شود. </p>



<h3 class="wp-block-heading" id="h-مزایای-سرویس-سنتری-هم-روش">مزایای سرویس سنتری هم‌روش</h3>



<p>سرویس سنتری هم‌روش مزایای زیادی برای تیم‌های فنی دارد. برای مثال به دو مورد از این مزایا در اینجا اشاره می‌کنیم:</p>



<h4 class="wp-block-heading" id="h-نگه-داری-و-پشتیبانی">نگه‌داری و پشتیبانی</h4>



<p>هم‌روش همواره در حال به‌روزرسانی، بررسی عملکرد سرویس و پشتیبان‌گیری از اطلاعات کاربران سرویس Sentry است. همچنین هم‌روش با سیستم مانیتورینگ خود، تلاش می‌کند تا تجربه‌ی خوبی در uptime و سطوح مختلف SLA ارائه دهد.</p>



<h4 class="wp-block-heading" id="h-قیمت-مناسب-با-قابلیت-ارتقاء-پلن">قیمت مناسب با قابلیت ارتقاء پلن</h4>



<p>قیمت مناسب سرویس Sentry ارائه‌شده در هم‌روش نسبت به sentry.io و Sentryهای Self-hosted، این امکان را می‌دهد تا تعداد بیشتری از eventها را دریافت کرده و به حل مشکلات بپردازید. با انتخاب هر یک از پلن‌ها، در آینده این امکان را خواهید داشت که پلن خود را بدون از دست دادن اطلاعات قبلی، ارتقا داده و هزینه‌های خود را کمینه نگه‌دارید.</p>



<p>برای آشنایی بیشتر با سرویس سنتری هم‌روش می‌توانید به صفحه <a href="https://hamravesh.com/sentry">سرویس سنتری هم‌روش</a> مراجعه کنید. </p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>سنتری به عنوان ابزاری قدرتمند برای مدیریت خطا و پایش بلادرنگ نرم‌افزارها، نقش مهمی در بهبود کیفیت و پایداری برنامه‌های کاربردی ایفا می‌کند. این ابزار با ارائه ویژگی‌های متنوعی همچون ردیابی خودکار خطا، تجمیع رویدادها، پیگیری مسائل، هشدار بلادرنگ و پایش عملکرد، به تیم‌های توسعه کمک می‌کند تا به سرعت و به‌طور مؤثر با مشکلات نرم‌افزاری مقابله کنند. با استفاده از سنتری، توسعه‌دهندگان می‌توانند نرم‌افزارهای پایدارتر، باکیفیت‌تر و با تجربه کاربری بهتری ارائه دهند.</p>



<p>سنتری نه تنها ابزاری برای تشخیص و رفع خطاها است، بلکه به عنوان پلتفرمی جامع، به تیم‌های توسعه کمک می‌کند تا به صورت فعالانه به مشکلات پاسخ دهند، از بروز مشکلات جدی‌تر جلوگیری کنند و در نهایت، نرم‌افزارهایی با کیفیت بالا و رضایت مشتری بیشتر تولید کنند. اگر به دنبال ابزاری هستید که به شما در مدیریت خطاهای نرم‌افزاری و بهبود عملکرد برنامه‌هایتان کمک کند، سنتری گزینه‌ای بی‌نظیر است.</p>



<p>با توجه به نیازهای خاص پروژه خود، می‌توانید از سنتری برای پایش خطاهای برنامه، عیب‌یابی سریع مشکلات و بهینه‌سازی عملکرد نرم‌افزار خود استفاده کنید. به یاد داشته باشید که استفاده از ابزارهایی مانند سنتری، نه تنها به بهبود کیفیت نرم‌افزار شما کمک می‌کند، بلکه در نهایت باعث صرفه‌جویی در زمان و هزینه‌های توسعه نیز خواهد شد.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-sentry/">سنتری (sentry) چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-sentry/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pgHero چیست؟</title>
		<link>https://hamravesh.com/blog/what-is-pghero/</link>
					<comments>https://hamravesh.com/blog/what-is-pghero/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Sat, 15 Feb 2025 07:20:17 +0000</pubDate>
				<category><![CDATA[دیتابیس]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4152</guid>

					<description><![CDATA[<p>pghero ابزاری است که امکان مشاهده و رصد عملکرد دیتابیس‌تان را از طریق داشبورد گرافیکی فراهم می‌کند</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-pghero/">pgHero چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>در دنیای مدیریت پایگاه داده‌ها، ابزارهای متعددی وجود دارند که به ما در بهینه‌سازی و نظارت بر عملکرد دیتابیس‌ها کمک می‌کنند. یکی از این ابزارها که به‌طور خاص برای <a href="https://hamravesh.com/blog/what-is-postgresql/" target="_blank" rel="noreferrer noopener">PostgreSQL</a> طراحی شده، pgHero نام دارد. اما pgHero دقیقاً چیست و چه کاربردی دارد؟ در این مطلب، به‌طور کامل به این سوال پاسخ خواهیم داد و با این ابزار قدرتمند بیشتر آشنا خواهیم شد.</p>



<h2 class="wp-block-heading" id="h-pghero-چیست">pgHero چیست؟</h2>



<p>pgHero ابزاری وب-محور است که به شما کمک می‌کند تا عملکرد پایگاه داده پستگره خود را به‌صورت لحظه‌ای مانیتور کرده و بهینه‌سازی کنید. این ابزار با ارائه داشبوردی گرافیکی و کاربرپسند، اطلاعات مفیدی را درباره وضعیت کلی دیتابیس، کوئری‌های در حال اجرا، فضاهای مصرفی، اتصالات و بسیاری موارد دیگر در اختیار شما قرار می‌دهد. pgHero به شما کمک می‌کند تا به‌سادگی مشکلات عملکردی را شناسایی کرده و برای رفع آن‌ها اقدام کنید.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" src="https://docs.hamravesh.com/img/hamDoc/dbaas/postgres/pghero-page.png" alt="pgHero چیست؟"/></figure>
</div>


<h2 class="wp-block-heading" id="h-چرا-pghero-مهم-است">چرا pgHero مهم است؟</h2>



<p>پستگره به‌طور پیش‌فرض اطلاعات بسیار زیادی در مورد عملکرد خود در جداول سیستمی ذخیره می‌کند. اما این اطلاعات به‌صورت خام و غیرقابل فهم هستند. pgHero این اطلاعات را به‌صورت بصری و قابل فهم ارائه می‌دهد و به شما اجازه می‌دهد تا به‌سرعت وضعیت دیتابیس خود را ارزیابی کنید. این قابلیت به‌ویژه در مواقعی که با حجم زیادی از داده‌ها و درخواست‌های کاربران مواجه هستید، بسیار کارآمد است.</p>



<h2 class="wp-block-heading" id="h-قابلیت-های-کلیدی-pghero-چیست">قابلیت‌های کلیدی pgHero چیست؟</h2>



<p>pgHero دارای ویژگی‌های مختلفی است که به شما در بهبود عملکرد پستگره کمک می‌کند. برخی از این قابلیت‌ها عبارتند از:</p>



<ul class="wp-block-list">
<li><strong>داشبورد نمای کلی </strong>(<strong>Overview</strong>): این بخش یک نمای کلی از وضعیت دیتابیس را نمایش می‌دهد، از جمله اتصالات، کوئری‌های طولانی، وضعیت Vacuum، شاخص‌های نامعتبر یا تکراری و کوئری‌های کُند. وضعیت‌های مختلف با رنگ‌های متفاوت نمایش داده می‌شوند (سبز یعنی خوب، غیر سبز یعنی نیاز به توجه دارد).</li>



<li><strong>کوئری‌ها </strong>(<strong>Queries</strong>): در این بخش، زمان اجرای دستورات مختلف را مشاهده می‌کنید و می‌توانید کوئری‌های کند را شناسایی کنید.</li>



<li><strong>فضا </strong>(<strong>Space</strong>): این قسمت نشان می‌دهد که کدام جداول و شاخص‌ها بیشترین حافظه را مصرف می‌کنند. این اطلاعات برای بهینه‌سازی فضای دیتابیس بسیار مفید است.</li>



<li><strong>اتصالات </strong>(<strong>Connections</strong>): این بخش اطلاعاتی در مورد منشاء اتصالات به دیتابیس را نمایش می‌دهد.</li>



<li><strong>Live Queries</strong>: در این قسمت می‌توانید کوئری‌هایی که در حال اجرا هستند را مشاهده کرده و در صورت لزوم، آن‌ها را متوقف کنید.</li>



<li><strong>نگهداری </strong>(<strong>Maintenance</strong>): این بخش زمان آخرین عملیات Vacuum و Analyze را گزارش می‌دهد. این عملیات برای حفظ عملکرد دیتابیس ضروری هستند.</li>



<li><strong>Explain</strong>: با استفاده از این قابلیت، می‌توانید نحوه اجرای کوئری‌ها را به‌صورت تفصیلی بررسی کنید و نقاط ضعف آن‌ها را شناسایی کنید.</li>



<li><strong>شناسایی کوئری‌های طولانی</strong>: pgHero به شما کمک می‌کند تا کوئری‌هایی که زمان زیادی برای اجرا نیاز دارند را شناسایی کرده و با ارائه اطلاعاتی مانند طرح اجرا و معیارهای کوئری، به شما در بهبود عملکرد آن‌ها کمک می‌کند.</li>



<li><strong>توصیه‌های شاخص‌گذاری</strong>: pgHero با تجزیه و تحلیل الگوهای کوئری، توصیه‌هایی برای استفاده بهینه از شاخص‌ها ارائه می‌دهد. شاخص‌ها نقش بسیار مهمی در افزایش سرعت کوئری‌ها دارند.</li>



<li><strong>تجزیه و تحلیل طرح اجرا</strong>: با استفاده از قابلیت Explain، می‌توانید طرح اجرای کوئری‌ها را به‌صورت گرافیکی مشاهده کرده و مشکلات احتمالی را تشخیص دهید.</li>



<li><strong>نمایش معیارهای عملکرد</strong>: pgHero معیارهای مختلف عملکرد دیتابیس را به‌صورت نمودار و گزارش نمایش می‌دهد. این اطلاعات به شما کمک می‌کند تا به‌صورت فعالانه عملکرد دیتابیس را مدیریت کنید.</li>



<li><strong>تاریخچه عملکرد</strong>: امکان پیکربندی برای جمع‌آوری آمار و داده‌های عملکرد در بازه‌های زمانی ۵ دقیقه و روزانه وجود دارد.</li>
</ul>



<h2 class="wp-block-heading" id="h-نصب-و-راه-اندازی-pghero-با-داکر">نصب و راه‌اندازی pgHero با داکر</h2>



<p>یکی از ساده‌ترین روش‌های نصب و راه‌اندازی pgHero استفاده از Docker است. داکر به شما اجازه می‌دهد تا pgHero را در یک محیط ایزوله و مستقل اجرا کنید. برای این کار، مراحل زیر را دنبال کنید:</p>



<ul class="wp-block-list">
<li>ابتدا، Docker را نصب کنید (اگر Docker را نصب ندارید، به وبسایت Docker مراجعه کنید).</li>



<li>سپس، دستور زیر را در ترمینال یا خط فرمان خود اجرا کنید (در این دستور، باید مقادیر زیر را با مقادیر مربوط به دیتابیس خود جایگزین کنید):
<ul class="wp-block-list">
<li><code>postgres://user:password@hostname:5432/dbname</code>: این رشته اتصال به دیتابیس PostgreSQL شماست.</li>



<li><code><strong>-p 8080:8080</strong></code>: این پورت ۸۰۸۰ را در کامپیوتر شما به پورت ۸۰۸۰ در کانتینر Docker متصل می‌کند.</li>



<li><code>ankane/pghero</code> نام ایمیج داکر برای pgHero است.</li>
</ul>
</li>



<li>پس از اجرای دستور، pgHero در آدرس <code>http://localhost:8080</code> در دسترس خواهد بود.</li>



<li>اگر pgHero نتواند به دیتابیس شما متصل شود، ممکن است با یک سری خطاها مواجه شوید. در این صورت، اتصال دیتابیس خود را بررسی کنید.</li>



<li>اگر دیتابیس شما تازه ایجاد شده باشد، ممکن است لازم باشد قابلیت Query Stats را فعال کنید.</li>
</ul>



<h2 class="wp-block-heading" id="h-نکات-مهم-در-استفاده-از-pghero">نکات مهم در استفاده از pgHero</h2>



<ul class="wp-block-list">
<li>pgHero نباید در محیط توسعه استفاده شود و بهتر است برای جمع‌آوری آمار و ارقام از محیط production استفاده کنید.</li>



<li>pgHero برای گزارش خطا در هنگام اتصال ناموفق به دیتابیس، عملکرد خوبی ندارد و ممکن است فقط یک سری traceback از پشته Ruby را در ترمینال نمایش دهد.</li>



<li>می‌توانید pgHero را به‌گونه‌ای پیکربندی کنید که تاریخچه کوئری‌ها و آمارهای فضایی را نیز جمع‌آوری کند. این کار به شما اجازه می‌دهد تا تغییرات عملکرد دیتابیس را در طول زمان مشاهده کنید.</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایا-و-معایب-pghero">مزایا و معایب pgHero</h2>



<ul class="wp-block-list">
<li><strong>مزایای pgHero</strong>:
<ul class="wp-block-list">
<li><strong>رابط کاربری ساده و کاربرپسند</strong>: استفاده از این ابزار بسیار آسان است.</li>



<li><strong>ارائه اطلاعات جامع</strong>: اطلاعات کاملی در مورد عملکرد دیتابیس ارائه می‌دهد.</li>



<li><strong>قابلیت نصب آسان</strong>: نصب و راه‌اندازی آن با Docker بسیار ساده است.</li>



<li><strong>بهینه‌سازی عملکرد</strong>: به شما در شناسایی و رفع مشکلات عملکردی کمک می‌کند.</li>



<li><strong>توصیه‌های مفید</strong>: توصیه‌هایی برای بهینه‌سازی شاخص‌ها و کوئری‌ها ارائه می‌دهد.</li>



<li><strong>مانیتورینگ لحظه‌ای</strong>: امکان مشاهده عملکرد دیتابیس به‌صورت لحظه‌ای را فراهم می‌کند.</li>



<li><strong>ابزار رایگان و متن‌باز</strong>: برای استفاده از آن نیاز به پرداخت هزینه ندارید.</li>
</ul>
</li>



<li><strong>معایب</strong>:
<ul class="wp-block-list">
<li><strong>عدم گزارش‌دهی مناسب خطا در اتصال</strong>: در صورت بروز مشکل در اتصال به دیتابیس، گزارش خطای مناسبی ارائه نمی‌دهد.</li>



<li><strong>نیاز به Docker برای نصب آسان</strong>: اگر با Docker آشنایی نداشته باشید، ممکن است نصب آن کمی دشوار باشد.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading" id="h-استفاده-از-pghero-در-سرویس-دیتابیس-هم-روش">استفاده از pgHero در سرویس دیتابیس هم‌روش</h2>



<p>در بخش پایانی این مطلب، باید به نحوه استفاده از pgHero در سرویس دیتابیس هم‌روش اشاره کنیم. برای این کار، می‌توانید از مستندات هم‌روش به آدرس زیر استفاده کنید:</p>



<ul class="wp-block-list">
<li><a href="https://docs.hamravesh.com/dbaas/postgres/pghero/"><strong>استفاده از افزونه‌ی Pg Hero | مستندات هم‌روش</strong></a></li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>pgHero یک ابزار قدرتمند و ضروری برای هر کسی است که با دیتابیس پستگره کار می‌کند. این ابزار با ارائه اطلاعات بصری و کاربردی، به شما کمک می‌کند تا عملکرد دیتابیس خود را بهینه کرده و مشکلات احتمالی را به سرعت شناسایی کنید. با استفاده از pgHero می‌توانید از عملکرد بهتر و پایدارتر دیتابیس خود اطمینان حاصل کنید.</p>



<p></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-pghero/">pgHero چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-pghero/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>pgbouncer چیست و چه کمکی به بهبود عملکرد دیتابیس‌تان می‌کند؟</title>
		<link>https://hamravesh.com/blog/what-is-pgbouncer/</link>
					<comments>https://hamravesh.com/blog/what-is-pgbouncer/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Sun, 09 Feb 2025 10:12:45 +0000</pubDate>
				<category><![CDATA[دیتابیس]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=4164</guid>

					<description><![CDATA[<p>امروزه، دیتابیس‌ها نقش حیاتی در عملکرد اپلیکیشن‌ها و وب‌سایت‌ها ایفا می‌کنند. هر چه تعداد کاربران و درخواست‌ها افزایش یابد، فشار بیشتری روی دیتابیس وارد می‌شود. یکی از راه‌های مقابله با این چالش، استفاده از connection pooling است. در این مقاله، به بررسی PgBouncer، ابزار قدرتمند connection pooler برای PostgreSQL می‌پردازیم و می‌بینیم چگونه می‌تواند به [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-pgbouncer/">pgbouncer چیست و چه کمکی به بهبود عملکرد دیتابیس‌تان می‌کند؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>امروزه، <a href="https://hamravesh.com/blog/what-is-database/">دیتابیس‌ها</a> نقش حیاتی در عملکرد اپلیکیشن‌ها و وب‌سایت‌ها ایفا می‌کنند. هر چه تعداد کاربران و درخواست‌ها افزایش یابد، فشار بیشتری روی دیتابیس وارد می‌شود. یکی از راه‌های مقابله با این چالش، استفاده از <a href="https://docs.hamravesh.com/dbaas/postgres/connection-pool/">connection pooling</a> است. در این مقاله، به بررسی PgBouncer، ابزار قدرتمند connection pooler برای PostgreSQL می‌پردازیم و می‌بینیم چگونه می‌تواند به بهبود عملکرد دیتابیس شما کمک کند.</p>



<h2 class="wp-block-heading" id="h-دیتابیس-postgresql-چگونه-کار-می-کند">دیتابیس PostgreSQL چگونه کار می‌کند؟</h2>



<p>در حالت عادی، <a href="https://hamravesh.com/blog/what-is-postgresql/">PostgreSQL</a> برای هر اتصال کلاینت یک پروسه جدید ایجاد می‌کند. این پروسه‌ها که معمولاً backend نامیده می‌شوند، مسئول رسیدگی به درخواست‌های کلاینت هستند. اگرچه این معماری پایداری و ایزولاسیون خوبی ارائه می‌دهد، اما ایجاد پروسه‌های متعدد برای هر اتصال، به‌خصوص در مواقعی که اتصالات کوتاه‌مدت هستند، می‌تواند منابع سیستم را به شدت مصرف کند. </p>



<p>تصور کنید وب‌سایتی با تعداد زیادی کاربر دارید که هر بار که صفحه‌ای را باز می‌کنند، اتصالی جدید به دیتابیس ایجاد می‌شود. این امر می‌تواند منجر به کاهش سرعت و افزایش بار روی سرور دیتابیس شود. این معماری به نام مدل Client-Server شناخته می‌شود و به دلیل محدودیت‌های منابع CPU و حافظه سرور، مقیاس‌پذیری مناسبی ندارد.</p>



<h2 class="wp-block-heading" id="h-connection-pooling-چیست">Connection Pooling چیست؟</h2>



<p>Connection pooling راه‌حلی برای مشکل ایجاد اتصالات متعدد است. با استفاده از این تکنیک، کلاینت‌ها به جای اتصال مستقیم به دیتابیس، به یک پروکسی سرور متصل می‌شوند. این پروکسی سرور مجموعه‌ای از اتصالات پایدار به دیتابیس را حفظ می‌کند و درخواست‌های کلاینت‌ها را بین آن‌ها توزیع می‌کند. بدین ترتیب، هزینه‌های مربوط به ایجاد و حذف اتصالات مکرر کاهش یافته و عملکرد دیتابیس بهبود می‌یابد. در واقع کلاینت‌ها به یک پروکسی متصل می‌شوند و این پروکسی اتصالات را به دیتابیس مدیریت می‌کند.</p>



<h2 class="wp-block-heading" id="h-pgbouncer-چیست">PgBouncer چیست؟</h2>



<p>PgBouncer یک connection pooler سبُک و متن‌باز برای PostgreSQL است که به‌عنوان پروکسی بین کلاینت‌ها و دیتابیس عمل می‌کند. PgBouncer اتصالات را برای هر ترکیب کاربر و دیتابیس نگهداری می‌کند و آن‌ها را به اتصالات ورودی جدید اختصاص می‌دهد. هنگامی که اتصال کلاینت بسته می‌شود، اتصال مجدداً به pool برمی‌گردد. این ابزار از پروتکل‌های TCP و Unix domain sockets برای ارتباط با کلاینت‌ها پشتیبانی می‌کند. همچنین، PgBouncer می‌تواند روی نود کلاینت، سرور دیتابیس یا به عنوان خوشه‌ای مستقل پیاده‌سازی شود.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="985" height="489" src="https://hamravesh.com/blog/wp-content/uploads/2025/01/image-2.png" alt="PgBouncer چیست؟" class="wp-image-4166" srcset="https://hamravesh.com/blog/wp-content/uploads/2025/01/image-2.png 985w, https://hamravesh.com/blog/wp-content/uploads/2025/01/image-2-300x149.png 300w, https://hamravesh.com/blog/wp-content/uploads/2025/01/image-2-768x381.png 768w" sizes="auto, (max-width: 985px) 100vw, 985px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-مزایای-استفاده-از-pgbouncer">مزایای استفاده از PgBouncer</h2>



<p>استفاده از PgBouncer مزایای متعددی دارد:</p>



<ul class="wp-block-list">
<li><strong>کاهش بار روی دیتابیس</strong>: با مدیریت اتصالات، PgBouncer از ایجاد اتصالات زیاد و مکرر به دیتابیس جلوگیری می‌کند و در نتیجه بار روی سرور دیتابیس کاهش پیدا می‌کند.</li>



<li><strong>بهبود زمان پاسخگویی</strong>: با استفاده از یک pool از اتصالات آماده، زمان پاسخگویی به درخواست‌ها کاهش می‌یابد و اپلیکیشن‌ها سریع‌تر عمل می‌کنند.</li>



<li><strong>مقیاس‌پذیری بهتر</strong>: PgBouncer به دیتابیس اجازه می‌دهد تا تعداد بیشتری از اتصالات کلاینت‌ها را بدون افزایش فشار روی منابع سرور مدیریت کند.</li>



<li><strong>کارایی بالاتر</strong>: با کاهش سربار ایجاد و حذف اتصالات، عملکرد کلی سیستم بهبود می‌یابد.</li>
</ul>



<h2 class="wp-block-heading" id="h-نصب-و-پیکربندی-pgbouncer">نصب و پیکربندی PgBouncer</h2>



<p>نصب PgBouncer بسیار آسان است. شما می‌توانید آن را با استفاده از دستورات زیر در سیستم عامل‌های مختلف نصب کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># RedHat/CentOS/..
sudo yum install pgbouncer

# Debian/Ubuntu/..
sudo apt-get install pgbouncer</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #768390"># RedHat/CentOS/..</span></span>
<span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">yum</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pgbouncer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #768390"># Debian/Ubuntu/..</span></span>
<span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">apt-get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pgbouncer</span></span></code></pre></div>



<p>PgBouncer بر اساس یک فایل پیکربندی اصلی کار می‌کند که معمولاً در مسیر /etc/pgbouncer/pgbouncer.ini قرار دارد. در این فایل، شما می‌توانید تنظیمات مربوط به اتصالات دیتابیس، کاربران مجاز و سایر پارامترها را پیکربندی کنید. در فایل pgbouncer.ini، موارد زیر را تنظیم کنید:</p>



<ul class="wp-block-list">
<li><strong>بخش databases</strong>: مشخص کردن مشخصات اتصال به دیتابیس PostgreSQL، مانند host، port و نام دیتابیس.</li>



<li><strong>بخش pgbouncer</strong>: تنظیم پارامترهایی مانند listen_addr (آدرس IP که PgBouncer به آن گوش می‌دهد)، listen_port (شماره پورتی که PgBouncer به آن گوش می‌دهد)، auth_file (فایل حاوی نام کاربری و رمز عبور کاربران مجاز) و admin_users (کاربران ادمین).</li>



<li><strong>تنظیمات مربوط به نحوه مدیریت pool‌ها</strong>: مانند pool_mode که تعیین می‌کند اتصال چه زمانی به pool برگردانده شود.</li>



<li><strong>تنظیم محدودیت اتصال</strong>: مانند max_client_conn که تعداد کل کلاینت‌هایی که می‌توانند به PgBouncer متصل شوند را مشخص می‌کند.</li>



<li><strong>تنظیمات احراز هویت</strong>: مانند auth_type که تعیین می‌کند چگونه کاربران احراز هویت شوند.</li>



<li><strong>تعیین کاربرهای ادمین</strong>: در بخش admin_users می‌توان کاربرهایی را مشخص کرد که اجازه تغییر تنظیمات PgBouncer را دارند.</li>



<li><strong>فایل userlist.txt</strong>: در این فایل، نام کاربری و هش رمز عبور کاربران مجاز برای اتصال به PgBouncer را ذخیره می‌کنید. برای ایجاد هش رمز عبور می‌توانید از دستورات مربوط به سیستم عامل استفاده کنید.</li>
</ul>



<p>پس از پیکربندی PgBouncer، می‌توانید آن را به‌عنوان یک سرویس systemd راه‌اندازی کنید یا به‌صورت دستی اجرا کنید. برای اعمال تغییرات در تنظیمات، می‌توانید از دستور sudo service pgbouncer restart استفاده کنید.</p>



<h2 class="wp-block-heading" id="h-نحوه-اتصال-به-دیتابیس-از-طریق-pgbouncer">نحوه اتصال به دیتابیس از طریق PgBouncer</h2>



<p>پس از نصب و پیکربندی PgBouncer، کلاینت‌ها به جای اتصال مستقیم به پورت پیش‌فرض PostgreSQL (5432)، به پورت PgBouncer (معمولاً 6432) متصل می‌شوند. به عنوان مثال، برای اتصال با استفاده از psql:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>psql -U your_username -p 6432 -h your_host your_database</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">psql</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-U</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">your_username</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-p</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">6432</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-h</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">your_host</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">your_database</span></span></code></pre></div>



<p>PgBouncer اتصالات را به pool دیتابیس هدایت می‌کند و درخواست‌های شما را اجرا می‌کند.</p>



<h2 class="wp-block-heading" id="h-مدیریت-و-مانیتورینگ-pgbouncer">مدیریت و مانیتورینگ PgBouncer</h2>



<p>PgBouncer امکانات مدیریتی و مانیتورینگ متعددی را ارائه می‌دهد. کاربران ادمین می‌توانند به یک دیتابیس مجازی به نام «pgbouncer» متصل شده و دستورات مختلفی را برای کنترل سرور و مشاهده آمار صادر کنند. برخی از این دستورات عبارتند از:</p>



<ul class="wp-block-list">
<li><strong>RELOAD</strong>: بارگیری مجدد تنظیمات PgBouncer</li>



<li><strong>DISABLE db1</strong>: غیرفعال کردن دیتابیس db1</li>



<li><strong>ENABLE db1</strong>: فعال کردن دیتابیس db1</li>



<li><strong>SHOW FDS</strong>: نمایش فایل دسکریپتورهای باز</li>



<li><strong>SHOW POOLS</strong>: نمایش آمار مربوط به poolها</li>



<li><strong>مشاهده آمار مربوط به هر دیتابیس</strong>: شامل زمان اجرای کوئری‌ها و زمان انتظار کلاینت‌ها.</li>



<li>م<strong>شاهده آمار مربوط به هر pool</strong>: شامل تعداد کلاینت‌های فعال و منتظر و تعداد اتصالات سرور فعال و غیرفعال.</li>
</ul>



<p>این امکانات به شما کمک می‌کنند تا عملکرد PgBouncer را مانیتور کرده و در صورت لزوم تغییراتی اعمال کنید.</p>



<h2 class="wp-block-heading" id="h-تست-عملکرد-pgbouncer">تست عملکرد PgBouncer</h2>



<p>برای مقایسه عملکرد دیتابیس با و بدون PgBouncer، می‌توانید از ابزار pgbench استفاده کنید. این ابزار به شما امکان می‌دهد تا تعداد زیادی کلاینت را شبیه‌سازی کرده و عملکرد دیتابیس را تحت بار زیاد بررسی کنید.</p>



<p>نتایج تست نشان می‌دهد که استفاده از PgBouncer باعث کاهش میانگین زمان پاسخگویی و افزایش تعداد تراکنش‌های در ثانیه می‌شود. در واقع، زمانی که تعداد کلاینت‌ها زیاد است و سرور دیتابیس نمی‌تواند همه آن‌ها را مدیریت کند، PgBouncer می‌تواند به‌خوبی به مدیریت اتصالات کمک کند و جلوی بروز خطا را بگیرد. همچنین، PgBouncer می‌تواند سربار مربوط به ایجاد اتصالات جدید را کاهش دهد و در نتیجه عملکرد کلی سیستم را بهبود بخشد.</p>



<h2 class="wp-block-heading" id="h-سناریوهای-پیاده-سازی-pgbouncer">سناریوهای پیاده‌سازی PgBouncer</h2>



<p>PgBouncer را می‌توان در سناریوهای مختلفی پیاده‌سازی کرد:</p>



<ul class="wp-block-list">
<li><strong>روی node سرور دیتابیس</strong>: در این حالت، PgBouncer روی همان سروری نصب می‌شود که PostgreSQL نصب شده است. کلاینت‌ها به جای اتصال مستقیم به پورت PostgreSQL، به پورت PgBouncer متصل می‌شوند.</li>



<li><strong>روی نود کلاینت</strong>: در این حالت، PgBouncer روی هر نود کلاینت نصب می‌شود. به عنوان مثال، هر نود وب که با PHP کار می کند می‌تواند به یک PgBouncer محلی متصل شود.</li>



<li><strong>به‌عنوان یک خوشه مستقل</strong>: در این حالت، مجموعه‌ای از نودهای PgBouncer مستقل در یک خوشه قرار می‌گیرند و با یک load balancer مانند HAProxy در دسترس قرار می‌گیرند. این روش بیشترین انعطاف پذیری را دارد ولی پیچیدگی بیشتری نیز دارد.</li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>PgBouncer ابزاری قدرتمند و کارآمد برای connection pooling در PostgreSQL است. با استفاده از این ابزار، می‌توانید بار روی سرور دیتابیس خود را کاهش داده و عملکرد اپلیکیشن‌هایتان را بهبود ببخشید. نصب و پیکربندی PgBouncer بسیار ساده است و مزایای متعددی را به همراه دارد. اگر شما نیز با مشکل اتصالات زیاد به دیتابیس PostgreSQL مواجه هستید، حتماً استفاده از PgBouncer را در نظر بگیرید.</p>



<p>با استفاده از امکانات مانیتورینگ PgBouncer می‌توانید عملکرد آن را به‌طور مداوم بررسی کنید و از تاثیر مثبت آن بر عملکرد اپلیکیشن خود اطمینان حاصل کنید. همان‌طور که دیدید، این ابزار برای هر پروژه‌ای که از PostgreSQL استفاده می‌کند مفید است و می‌تواند کمک شایانی به بهبود کارایی دیتابیس و در نتیجه کارایی نرم افزار شما بکند.<br></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-pgbouncer/">pgbouncer چیست و چه کمکی به بهبود عملکرد دیتابیس‌تان می‌کند؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-pgbouncer/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes Secrets چیست؟ – به زبان ساده</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-secrets/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-secrets/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Sat, 04 Jan 2025 14:48:48 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2498</guid>

					<description><![CDATA[<p> Kubernetes Secret جایی است که اطلاعات حساس مانند کلیدها، رمزهای عبور و توکن‌ها در کوبرنتیز نگه‌داری می‌شود. در این نوشته Kubernetes Secrets به بررسی مفهوم آن‌ها، انواع Kubernetes Secrets، نحوه ایجاد آن‌ها و موارد بیشتر می‌پردازیم.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-secrets/">Kubernetes Secrets چیست؟ – به زبان ساده</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>در اکوسیستم کوبرنتیز، Kubernetes Secret شیئی است که اطلاعات حساس مانند کلیدها، رمزهای عبور و توکن‌ها را در خود نگه‌داری می‌کند. در این نوشته Kubernetes Secrets به بررسی مفهوم آن‌ها، انواع Kubernetes Secrets، نحوه ایجاد آن‌ها و موارد بیشتر می‌پردازیم.</p>



<h2 class="wp-block-heading" id="h-kubernetes-secrets-چیست">Kubernetes Secrets چیست؟</h2>



<p>همان‌طور که در ابتدای این مطلب بیان شد، در اکوسیستم کوبرنتیز، Kubernetes Secret شیئی است که اطلاعات حساس مانند کلیدها، رمزهای عبور و توکن‌ها را در خود نگه‌داری می‌کند. به‌جای قرار دادن مستقیم این داده‌ها در یک پاد یا دیپلویمنت، ذخیره اطلاعاتی که می‌خواهید امن نگه‌داری شوند در یک Secret، باعث می‌شود سطح حمله کاهش یابد و شانس تغییر این اطلاعات حیاتی در چرخه عمر توسعه نرم‌افزار کمتر شود.</p>



<p>Kubernetes Secrets برای نگه‌داری امن اطلاعات حساس مانند رمزهای عبور، توکن‌ها و گواهینامه‌ها به کار می‌روند. دیپلویمنت‌ها، پادها و سایر منابع Kubernetes که به این اطلاعات حساس نیاز دارند، می‌توانند از Secrets استفاده کنند. همه ما به کسی یا چیزی نیاز داریم که رازهای ما را امن نگه دارد، در این مورد، این نقش برعهده Kubernetes است. شیءهای Secret جزئی از «Kubernetes v1 API» هستند و با استفاده از مانیفست زیر می‌توان آن‌ها را ایجاد کرد:</p>



<pre class="wp-block-code"><code>apiVersion: v1

kind: Secret

metadata:

 name: file-credential

data:

 .secret-file: dmFsdWUtMg0KDQo=</code></pre>



<p>وقتی یک Secret ایجاد شد، باید در پاد خود به آن Secret ارجاع دهید. فایل کانفیگ زیر به پاد مربوطه دسترسی به Kubernetes Secret ایجاد شده در مانیفست بالا را می‌دهد:</p>



<pre class="wp-block-code"><code>apiVersion: v1


kind: Pod


metadata:


 name: secret-files-pod


spec:


 volumes:


   - name: secret-volume


     secret:


       secretName: file-secret


 containers:


   - name: dotfile-test-container


     image: registry.k8s.io/busybox


     command:


       - ls


       - "-l"


       - "/etc/secret-volume"


     volumeMounts:


       - name: secret-volume


         readOnly: true


         mountPath: "/etc/secret-volume"</code></pre>



<p>در این مثال، فایل Secrets مربوطه در مسیر <code>/etc/secret-volume</code> در سیستم فایل قرار می‌گیرد تا برنامه بتواند به آن دسترسی داشته باشد. (در تعریف volume mount، شما مشخص می‌کنید که مسیر فایل کجا خواهد بود.)</p>



<h2 class="wp-block-heading" id="h-چطور-از-kubernetes-secrets-استفاده-کنیم">چطور از Kubernetes Secrets استفاده کنیم؟</h2>



<p>به روش‌های مختلفی می‌توان از Secretها در یک کلاستر کوبرنتیز استفاده کرد. از جمله این روش‌ها می‌توان به موارد زیر اشاره داشت:</p>



<ul class="wp-block-list">
<li>متغیرهای محیطی در یک کانتینر</li>



<li>فایل‌هایی داخل یک کانتینر</li>



<li>آرگومان‌های خط فرمان در داخل یک کانتینر</li>
</ul>



<p>در ادامه هر یک از موارد فوق در زیربخش‌هایی شرح داده شده‌اند.</p>



<h3 class="wp-block-heading" id="h-متغیرهای-محیطی-در-یک-کانتینر">متغیرهای محیطی در یک کانتینر</h3>



<p>Secretها می‌توانند برای ارسال داده‌های حساس به کانتینرها/پادها به‌عنوان متغیرهای محیطی استفاده شوند. این یک موردِ استفاده و کاربرد رایج برای Secretها است، زیرا به برنامه اجازه می‌دهد به‌راحتی به این داده‌ها دسترسی پیدا کند.</p>



<h3 class="wp-block-heading" id="h-فایل-هایی-داخل-یک-کانتینر">فایل‌هایی داخل یک کانتینر</h3>



<p>Secretها می‌توانند به‌صورت فایل در یک کانتینر mount شوند. به این ترتیب برنامه می‌تواند به داده‌ها به‌صورت فایل دسترسی داشته باشد. این می‌تواند برای برنامه‌هایی مفید باشد که انتظار دارند داده‌های حساس در یک فایل ذخیره شوند.</p>



<h3 class="wp-block-heading" id="h-آرگومان-های-خط-فرمان-در-داخل-یک-کانتینر">آرگومان‌های خط فرمان در داخل یک کانتینر</h3>



<p>Secretها می‌توانند به‌عنوان آرگومان‌های خط فرمان به یک کانتینر ارسال شوند. این ویژگی می‌تواند برای برنامه‌هایی مفید باشد که انتظار دارند داده‌های حساس به‌عنوان آرگومان خط فرمان ارسال شوند.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="800" height="450" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/05/Kubernetes-Secrets.png" alt="کوبرنتیز سکرت یا کوبرنتیز سیکرت Kubernetes secrets" class="wp-image-2730" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/05/Kubernetes-Secrets.png 800w, https://hamravesh.com/blog/wp-content/uploads/2024/05/Kubernetes-Secrets-300x169.png 300w, https://hamravesh.com/blog/wp-content/uploads/2024/05/Kubernetes-Secrets-768x432.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-موارد-استفاده-kubernetes-secrets-چیست">مواردِ استفاده Kubernetes Secrets چیست؟</h2>



<p>موارد زیر نمونه‌هایی از کاربردهای متداول Secrets هستند:</p>



<ul class="wp-block-list">
<li><strong>فراهم کردن متغیرهای محیطی برای کانتینرها</strong>: مقادیر محیطی می‌توانند رفتار برنامه را کنترل کنند، بنابراین استفاده از Secrets برای ارائه این مقادیر توصیه می‌شود. این مقادیر محیطی کانتینر ممکن است شامل اطلاعات محرمانه مانند اعتبارنامه‌ها (Credentials) باشد که برای فراخوانی برنامه‌های شخص ثالث (مثلاً درگاه‌های پرداخت) مورد استفاده قرار می‌گیرند.</li>



<li><strong>فراهم کردن اعتبارنامه‌هایی مانند کلیدهای SSH، رمزهای عبور برای کانتینرها</strong>: Secrets می‌توانند اعتبارنامه‌هایی مانند کلیدهای SSH، رمزهای عبور، گواهینامه‌های TLS و موارد مشابه را به کانتینرها منتقل کنند. کلیدهای SSH و گواهینامه‌های TLS از نشانه‌های امنیتی مهمی هستند که می‌توانند در برنامه‌ها و از طریق Secrets ارسالی به آن‌ها، مورد استفاده قرار گیرند.</li>



<li><strong>ایجاد امکان pull شدن ایمیج‌های کانتینرها از رجیستری</strong>: Secrets همچنین برای اجازه دادن pull کردن تصاویر کانتینر از رجیستری‌ها در گره‌های کوبرنتیز به کار می‌روند. می‌توانید اعتبارنامه‌های دسترسی رجیستری Docker را از طریق Secrets ارائه کنید تا Kubelet از آنها برای pull کردن تصاویر کانتینر ذخیره شده در رجیستری استفاده کند.</li>



<li><strong>ذخیره اطلاعات اضافه مثل جزئیات Helm</strong>: همان‌طور که Helm از Secrets برای ذخیره اطلاعات مربوط به خود استفاده می‌کند، سایر برنامه‌ها نیز می‌توانند از Secrets برای انجام عملکردهای خود بهره ببرند.</li>
</ul>



<p>حالا در ادامه به سایر انواع Kubernetes Secrets می‌پردازیم.</p>



<h2 class="wp-block-heading" id="h-انواع-kubernetes-secrets-چیست">انواع Kubernetes Secrets چیست؟</h2>



<p>بر اساس مقادیر تعیین شده برای Secrets، آن‌ها به انواع زیر تقسیم می‌شوند:</p>



<ul class="wp-block-list">
<li><strong>Opaque</strong>: نوع پیش‌فرض و عمومی Secrets است که هر کسی می‌تواند آن را ایجاد و استفاده کند. این نوع، زوج‌های کلید-مقدار ساده هستند؛ بنابراین اگر نوع آن را مشخص نکنید، یک Secret از نوع Opaque (با تعریف نوع opaque) ایجاد خواهد شد.</li>



<li><strong>توکن‌های Service Account</strong>: برای شناسایی حساب‌های سرویس استفاده می‌شوند. این توکن‌ها به API‌های کوبرنتیز امکان دسترسی به پاد‌ها را می‌دهند. نوع این API، kubernetes.io/service-account-token است.</li>



<li><strong>SSH-auth</strong>: این نوع Secret برای ذخیره اطلاعات مورد نیاز به‌منظور احراز هویت SSH استفاده می‌شود. نوع آن <code>kubernetes.io/ssh-auth</code> است.</li>



<li><strong>TLS</strong>: از این نوع Secret برای ذخیره گواهینامه‌های TLS و کلید‌های مرتبط با آن‌ها استفاده می‌شود. نوع این <code>Secret kubernetes.io/tls</code> است.</li>



<li><strong>Basic-auth</strong>: برای Secret‌های «احراز هویت پایه» (basic auth)، نوع آن را <code>kubernetes.io/basic-auth</code> تعریف کنید.</li>



<li><strong>Docker-cgf و Dockerconfigjson</strong>: پیکربندی‌های مربوط به Docker و اعتبارنامه‌های رجیستری معمولاً در این دو نوع Secret ذخیره می‌شوند. برای استفاده از docker-cfg و dockerconfigjson، نوع را به‌ترتیب <code>kubernetes.io/dockercfg</code> یا <code>kubernetes.io/dockerconfigjson</code> تعریف کنید.</li>



<li><strong>توکن</strong>: این نوع Secret به توکن‌های «راه‌اندازی» (bootstrap) اشاره دارد که برای اضافه کردن Nodeهای جدید به خوشه کوبرنتیز مورد استفاده قرار می‌گیرند. برای استفاده از این توکن در فرایند راه‌اندازی نود، نوع آن را <code>bootstrap.kubernetes.io/token</code> تعریف کنید.</li>
</ul>



<h2 class="wp-block-heading" id="h-چطور-kubernetes-secret-بسازیم">چطور Kubernetes Secret بسازیم؟</h2>



<p>در این بخش از مقاله هر یک از مراحل ایجاد و استفاده از Kubernetes Secrets شرح داده شده است.</p>



<h3 class="wp-block-heading" id="h-گام-اول-ایجاد-و-ساخت-kubernetes-secret">گام اول: ایجاد و ساخت Kubernetes Secret</h3>



<p>چند روش برای ایجاد Kubernetes Secret وجود دارد که آسان‌ترین آن استفاده از دستور <code>kubectl create secret</code> است. در ادامه مثالی برای این روش ارائه کرده‌ایم:</p>



<pre class="wp-block-code"><code>kubectl create secret generic my-secret --from-literal=password=abc123</code></pre>



<p>دستور بالا یک سیکرت عمومی یا همان جنریک با نام <code>my-secret</code> ایجاد می‌کند و مقدار کلید <code>password</code> را برابر <code>abc123</code> قرار می‌دهد. همچنین می‌توان با استفاده از آپشن <code>— from-file</code> نیز یک Kubernetes Secret ایجاد کرد:</p>



<pre class="wp-block-code"><code>kubectl create secret generic my-secret --from-file=ssh-privatekey=/path/to/privatekey --from-file=ssh-publickey=/path/to/publickey</code></pre>



<p>دستور بالا یک سکرت عمومی با نام <code>my-secret</code> ایجاد می‌کند و مقادیر کلیدهای <code>ssh-privatekey</code> و <code>ssh-publickey</code> را برابر با محتویات فایل‌های مشخص شده قرار می‌دهد.</p>



<h3 class="wp-block-heading" id="h-گام-دوم-استفاده-از-kubernetes-secret-در-یک-pod">گام دوم: استفاده از Kubernetes Secret در یک Pod</h3>



<p>برای استفاده از یک Secret در یک Pod، باید volumeی را که به Secret ارجاع می‌دهد اضافه و سپس آن volume را به کانتینر وصل کنیم. در ادامه مثالی برای این مورد ارائه شده است.</p>



<pre class="wp-block-code"><code>apiVersion: v1
kind: Pod
metadata:
 name: my-pod
spec:
 containers:
 - name: my-container
 image: my-image
 volumeMounts:
 - name: my-secret
 mountPath: /etc/my-secret
 readOnly: true
 volumes:
 - name: my-secret
 secret:
 secretName: my-secret</code></pre>



<p>این فایل YAML یک Pod تعریف می‌کند که یک کانتینر و یک volume دارد. volume یک Secret کوبرنتیز با نام <code>my-secret</code> است که در مسیر <code>/etc/my-secret</code> به کانتینر mount شده است.</p>



<h3 class="wp-block-heading" id="h-گام-سوم-استفاده-از-kubernetes-secret-در-یک-deployment">گام سوم: استفاده از Kubernetes Secret در یک Deployment</h3>



<p>برای استفاده از Secret در یک Deployment، می‌توانیم یک متغیر محیطی که به Secret ارجاع می‌دهد را اضافه کنیم. در ادامه مثالی در این خصوص ارائه شده است.</p>



<pre class="wp-block-code"><code>apiVersion: apps/v1
kind: Deployment
metadata:
 name: my-deployment
spec:
 replicas: 3
 template:
 metadata:
 labels:
 app: my-app
 spec:
 containers:
 - name: my-container
 image: my-image
 env:
 - name: DB_PASSWORD
 valueFrom:
 secretKeyRef:
 name: my-secret
 key: password</code></pre>



<p>این فایل YAML یک Deployment را تعریف می‌کند که دارای یک کانتینر است. کانتینر یک متغیر محیطی به نام <code>DB_PASSWORD</code> دارد که مقدار آن از کلید <code>password</code> در سکرت <code>my-secret</code> گرفته شده است.</p>



<h3 class="wp-block-heading" id="h-گام-چهارم-مشاهده-kubernetes-secrets">گام چهارم: مشاهده Kubernetes Secrets</h3>



<p>برای مشاهده یک سکرت موجود، از دستور زیر استفاده می‌کنیم:</p>



<pre class="wp-block-code"><code>kubectl get secret secret-name</code></pre>



<p>سکرت توسط <code>kubectl</code> با فرمت کدگذاری شده base64 نمایش داده می‌شود. برای رمزگشایی کامل Secret، از یک دیکُدر base64 خارجی (مانند برنامه base64 در لینوکس) استفاده و دستوراتی مانند دستور زیر را اجرا می‌کنیم:</p>



<pre class="wp-block-code"><code>echo $encoded_secret | base64 -d</code></pre>



<p>توجه داشته باشید که اگر محدودیت‌های RBAC را برای مشاهده سکرت‌ها اعمال کرده‌اید، فقط کاربرانی که دارای مجوزهای لازم هستند می‌توانند به این روش به سکرت‌ها دسترسی داشته باشند. می‌توانید برای بررسی موفقیت‌آمیز ایجاد سکرت، از دستور زیر استفاده کنید:</p>



<pre class="wp-block-code"><code>kubectl get secrets</code></pre>



<p>دستور فوق، فهرست سکرت‌های موجود را به‌همراه نام، نوع، تعداد مقادیر داده‌ای که در آن‌ها موجود است و عمر آن‌ها را نمایش می‌دهد.</p>



<h3 class="wp-block-heading" id="h-گام-پنجم-ویرایش-مشخصات-یک-سکرت-k8s">گام پنجم: ویرایش مشخصات یک سکرت K8s</h3>



<p>برای تغییر مشخصات یک سکرت کوبرنتیز موجود، می‌توانیم از دستور <code>kubectl edit</code> استفاده کنیم. دستور زیر نشان می‌دهد که چطور می‌توان یک Kubernetes Secret با نام <code>production-secret</code> را ویرایش کرد:</p>



<pre class="wp-block-code"><code>kubectl edit secret production-secret</code></pre>



<h3 class="wp-block-heading" id="h-گام-ششم-حذف-یک-kubernetes-secret-با-استفاده-از-دستور-kubectl">گام ششم: حذف یک Kubernetes Secret با استفاده از دستور kubectl</h3>



<p>برای حذف یک سکرت، ابتدا با استفاده از دستورات <code>cat</code> یا <code>get</code> بررسی می‌کنیم که آیا سکرت‌هایی در کلاستر ما وجود دارد یا خیر. سپس با دستور <code>describe</code> می‌توانیم اطلاعات بیشتری در مورد یک سکرت خاص کسب کنیم. برای حذف سکرت‌های کوبرنتیز از دستور <code>kubectl delete</code> استفاده می‌شود:</p>



<pre class="wp-block-code"><code>kubectl delete secret production-secret</code></pre>



<p>به این ترتیب اکنون یاد گرفتیم که چطور Kubernetes Secrets را ایجاد و از آن‌ها استفاده کنیم.</p>



<h2 class="wp-block-heading" id="h-kubernetes-secrets-چقدر-ایمن-هستند">Kubernetes Secrets چقدر ایمن هستند؟</h2>



<p>سکرت‌های کوبرنتیز برای امنیت طراحی شده‌اند و مکانیزمی برای ذخیره و مدیریت امن داده‌های حساس در داخل یک کلاستر کوبرنتیز فراهم می‌کنند. هنگامی که سکرت‌های کوبرنتیز به‌درستی پیکربندی و استفاده شوند، می‌توانند امنیت بالایی را برای داده‌های حساس فراهم کنند.</p>



<p>Kubernetes Secrets به‌صورت رمزگذاری شده در سرور API کوبرنتیز ذخیره می‌شوند و تنها کاربران یا سرویس‌های مُجازی که مجوز لازم را دارند، می‌توانند به آن‌ها دسترسی داشته باشند. به‌طور پیش‌فرض، Secret‌ها با الگوریتم رمزنگاری AES-256 رمزگذاری می‌شوند و دسترسی به آن‌ها توسط قوانین RBAC (کنترل دسترسی نقش‌محور) کوبرنتیز کنترل می‌شود.</p>



<p>یک روش رایج این است که دسترسی ویرایش یا حذف به فردی که نیازی به آن ندارد، داده نشود. علاوه بر این، Kubernetes Secrets تنها زمانی که یک Pod از آن‌ها استفاده می‌کند در حافظه ذخیره می‌شوند. پس از خاتمه پاد، Secret‌ها برای همیشه از حافظه حذف می‌شوند که این امر لایه امنیتی افزوده‌ای را فراهم می‌کند.</p>



<p>با این حال، مهم است که بدانید Kubernetes Secrets کاملاً امن نیستند و خطرهای امنیتی بالقوه‌ای وجود دارد که می‌تواند امنیت Secret‌ها را به خطر بیندازد. به‌عنوان مثال، اگر یک مهاجم به کلاستر Kubernetes یا به پادی که از Secret‌ها استفاده می‌کند دسترسی پیدا کند، ممکن است بتواند به Secret‌ها هم دسترسی پیدا کند. در گذشته چنین مواردی رخ داده است، بنابراین باید با احتیاط عمل کرد؛ زیرا هیچ سیستمی در دنیا ۱۰۰ درصد امن نیست.</p>



<p>باید به خاطر داشت که نحوه ذخیره Kubernetes Secrets در etcd چندان امن نیست، زیرا رمزگذاری نمی‌شوند. بلکه به‌صورت اشیاء رمزگذاری‌شده Base64 ذخیره می‌شوند. این به آن معناست که اگر کسی به این داده‌ها دسترسی پیدا کند، می‌تواند به‌سرعت رشته Base64 را رمزگشایی و از تمام Secret‌ها استفاده کند. تنها چیزی که نیاز دارد، دسترسی برای مشاهده اشیاء Secret Kubernetes است (می‌توان از استفاده Base64 با بهره‌گیری از فیلد stringData اجتناب کرد).</p>



<h2 class="wp-block-heading" id="h-بهترین-شیوه-ها-در-kubernetes-secrets">بهترین شیوه‌ها در Kubernetes Secrets</h2>



<p>برای کاهش خطرهای امنیتی Kubernetes Secrets، پیروی از شیوه‌های مناسب به‌منظور تامین امنیت خوشه‌های Kubernetes، مانند اعمال کنترل‌های امنیتی شبکه، استفاده از سازوکارهای احراز هویت قوی و محدود کردن دسترسی به منابع حساس، ضروری است.</p>



<p>علاوه بر این، پیکربندی و استفاده صحیح از Kubernetes Secrets مانند اجتناب از ذخیره Secret‌ها در متغیرهای محیطی و محدود کردن دسترسی به Secret‌ها تنها برای پادهایی که به آن‌ها نیاز دارند، ضروری است. توجه به این امر ضرورت دارد که شیوه‌های مناسب صنعت را دنبال کنیم، چرا که تمام نشت‌های داده‌ای که تاکنون رخ داده‌اند، به علت عدم پیروی از پروتکل‌های امنیتی تایید شده بوده‌اند.</p>



<h3 class="wp-block-heading" id="h-پیکربندی-kubernetes-secrets-به-منظور-افزایش-امنیت-در-آن-ها">پیکربندی Kubernetes secrets به‌منظور افزایش امنیت در آن‌ها</h3>



<p>برای امن‌تر کردن Kubernetes secrets، می‌توان موارد زیر را انجام داد:</p>



<ul class="wp-block-list">
<li><strong>اعمال قوانین کنترل دسترسی نقش‌محور (RBAC)</strong>: کوبرنتیز از کنترل دسترسی نقش‌محور و مبتنی بر سیاست به خوبی پشتیبانی می‌کند. می‌توان به‌راحتی کنترل کرد که چه کسی مجاز است به کدام اجزا در Kubernetes دسترسی داشته باشد، بنابراین می‌توانیم استفاده از API‌های Secret را محدود و دسترسی به Secret‌ها را از تمام کاربران حذف کرد. اطمینان از عدم دسترسی به Secret‌ها از طریق ابزار خط فرمان Kubectl، اولین گام است.</li>



<li><strong>اجازه دسترسی به Secret‌های خاص تنها برای کانتینرها</strong>: همان‌طور که می‌توان دسترسی RBAC را برای کاربران کنترل کرد، می‌توان دسترسی به Secret‌ها را به مجموعه‌ای خاص از برنامه‌ها محدود کرد. به این ترتیب، Secret‌های شما تنها برای برنامه‌هایی در دسترس خواهند بود که مجاز به استفاده از آن‌ها هستند.</li>
</ul>



<h4 class="wp-block-heading" id="h-فعال-کردن-رمزگذاری-در-حالت-استراحت-encryption-at-rest">فعال کردن رمزگذاری در حالت استراحت (Encryption at rest)</h4>



<p>رمزگذاری در حالت استراحت (Encryption at rest) یک ویژگی است که می‌توان آن را با استفاده از پرچم <code>--encryption-provider-config</code> در سرور API فعال کرد. در این پرچم، شما به یک فایل اشاره می‌کنید که ارائه‌دهندگان رمزگذاری در حالت استراحت را مشخص می‌کند. محتوای این فایل YAML چیزی شبیه به این خواهد بود:</p>



<pre class="wp-block-code"><code>apiVersion: apiserver.config.k8s.io/v1

kind: EncryptionConfiguration

resources:

 - resources:

     - events

   providers:

     - identity: {} # do not encrypt Events even though *.* is specified below

 - resources:

     - '*.apps' 

   providers:

     - aescbc:

         keys:

         - name: first_key

           secret: c2VlkansaklnsxlanslxHsa1hUndklMgaXQ/Cg==

 - resources:

     - '*.*' 
   providers:

     - aescbc:

         keys:

         - name: second_key

           secret: c2VjcmV12ds2JJklY3vyZSwgSSB0aGluaw==</code></pre>



<p>با نگاه به این فایل، می‌بینید که آرایه‌ای از منابع وجود دارد که شرط‌هایی را برای آن‌ها اعمال می‌کنیم. منبع <code>events</code> «رمزگذاری در حالت استراحت» ندارد، زیرا هویت ارائه دهنده یک آرایه خالی است. سپس، مشخص کرده‌ایم که منابع تحت اِی‌پی‌آی <code>apps‌</code> باید در حالت استراحت رمزگذاری شوند. آخرین آرایه نشان می‌دهد که همه چیز در Kubernetes باید رمزگذاری شود.</p>



<h3 class="wp-block-heading" id="h-ابزارهایی-برای-مدیریت-پایدار-kubernetes-secrets">ابزارهایی برای مدیریت پایدار Kubernetes secrets </h3>



<p>با پیروی از نکات پیکربندی که تا اینجا ارائه شدند، می‌توان اطمینان حاصل کرد که هیچ کاربر یا نهاد غیرمجازی نمی‌تواند به Secret‌های ما دسترسی پیدا کند. با این حال، ارسال واقعی Secret‌ها به Kubernetes نیز خطرات امنیتی را به‌همراه دارد که نیازمند کنترل دسترسی نقش‌محور و سایر بررسی‌ها برای کاهش آن است. این‌‌ها ویژگی‌های بومی Kubernetes نیستند، اما خوشبختانه ابزارهای موثر زیادی برای انتخاب وجود دارد.</p>



<p>در ادامه ابتدا به راهکارهای شخص ثالث برای مدیریت پایدار Kubernetes secrets می‌پردازیم.</p>



<h4 class="wp-block-heading" id="h-راهکارهای-شخص-ثالث-برای-مدیریت-پایدار-kubernetes-secrets">راهکارهای شخص ثالث برای مدیریت پایدار Kubernetes secrets</h4>



<ul class="wp-block-list">
<li><strong>Vault</strong>: یک استاندارد صنعتی است که به‌طور گسترده مورد استفاده قرار می‌گیرد. با استفاده از کانتینر Sidecar، امکاناتی مانند RBAC، ممیزی، چرخش Secret‌ها و موتور Secret‌های پویا را ارائه می‌دهد. می‌توانید از Vault استفاده کنید و بدون نگرانی از امنیت، Secret‌ها را به کانتینرهای خود ارسال کنید.</li>



<li><strong>Secrets Manager ارائه شده توسط AWS</strong>:‌ سرویس AWS راه‌حلی بسیار مقرون‌به‌صرفه‌تر است، اما بسیاری از ویژگی‌های Vault، مانند تولید پویای Secret‌ها و رابط کاربری RBAC را ندارد. با این حال، می‌توانید RBAC را با استفاده از سیاست‌های IAM بومی AWS پیاده‌سازی کنید.</li>



<li><strong>قابلیت Key Vault در Azure</strong>: این سرویس مشابه Secrets Manager AWS است و Secret‌ها، گواهینامه‌های TLS، کلیدهای SSH و موارد دیگر را ایمن می‌کند. یک مزیت بزرگ شاید این باشد که می‌توانید Key Vault‌ها را در دیتاسنترهای بین‌المللی Azure ایجاد کنید تا Secret‌های خود را امن‌تر نگه دارید و کارایی آن‌ها را افزایش دهید.</li>
</ul>



<h4 class="wp-block-heading" id="h-راهکارهای-اوپن-سورس-برای-مدیریت-پایدار-kubernetes-secrets">راهکارهای اوپن سورس برای مدیریت پایدار Kubernetes secrets</h4>



<ul class="wp-block-list">
<li><strong>Helm secrets</strong>: برای مدیریت deploymentها در کوبرنتیز به‌طور گسترده استفاده می‌شود و Helm Secrets یک راه‌حل ساده برای یکپارچه‌سازی است. گرچه امنیت آن به اندازه Vault نیست، اما با داشتن مجوزهای مناسب، Helm راه‌حلی متن‌باز و قابل قبول است.</li>



<li><strong>Open-source Vault</strong>: علاوه بر نسخه پولی که قبلاً بحث شد، Vault دارای یک توزیع متن‌باز نیز هست. می‌توانید نسخه متن‌باز Vault را در خوشه‌های Kubernetes خود یا در یک ماشین مجازی بومی Deploy کنید و از آن برای ارسال Secret‌ها به کانتینرهای خود استفاده کنید. این نسخه از Vault تقریباً تمام ویژگی‌های نسخه ارتقا یافته را به غیر از پشتیبان‌گیری و بازیابی ارائه می‌دهد.</li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>Kubernetes Secret شیئی است که اطلاعات حساس مانند کلیدها، رمزهای عبور و توکن‌ها را در خود نگهداری می‌کند. این Secrets می‌توانند به‌صورت متغیرهای محیطی، فایل‌ها یا آرگومان‌های خط فرمان در کانتینرها استفاده شوند. با پیروی از شیوه‌های مناسب مانند کنترل دسترسی و رمزگذاری، می‌توان امنیت Secrets را افزایش داد. همچنین ابزارهای شخص ثالث و متن‌باز متعددی برای مدیریت پایدار Secrets در دسترس هستند.</p>



<p>Kubernetes secrets دارای برخی شکاف‌های امنیتی هستند، اما می‌توان با پیروی از اصل کمترین امتیاز و پیاده‌سازی رمزنگاری در حالت استراحت، با این موارد مقابله کرد. ممیزی نیز روشی کلیدی برای محدود کردن سطح حمله است و تمام ابزارهای ذکر شده دارای یک یا چند روش برای تولید لاگ‌های ممیزی هستند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-secrets/">Kubernetes Secrets چیست؟ – به زبان ساده</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-secrets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Traefik چیست و چطور کار می‌کند؟ – شرح ویژگی‌ها، کاربردها و مزایا</title>
		<link>https://hamravesh.com/blog/what-is-traefik/</link>
					<comments>https://hamravesh.com/blog/what-is-traefik/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Tue, 17 Dec 2024 10:47:34 +0000</pubDate>
				<category><![CDATA[شبکه]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2890</guid>

					<description><![CDATA[<p>traefik یک reverse proxy است که برای معماری‌های مدرن نرم‌افزار و میکروسرویس‌ها طراحی شده است. در این بلاگ پست با این پروکسی بیشتر آشنا می‌شویم.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-traefik/">Traefik چیست و چطور کار می‌کند؟ – شرح ویژگی‌ها، کاربردها و مزایا</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Traefik یک پروکسی معکوس پویای مستحکم و چندمنظوره محسوب می‌شود که با نظر به معماری‌های مُدرن، توزیع‌شده و <a href="https://hamravesh.com/blog/what-is-microservices/">میکروسرویس‌ها</a> طراحی شده است. به‌عنوان یک قطعه حیاتی از نرم‌افزار سرور، Traefik نقش محوری در مدیریت و بهینه‌سازی ترافیک شبکه، تضمین مسیریابی کارآمد و ارتقاء عملکرد و امنیت کلی خدمات وب ایفا می‌کند. در این مطلب می‌آموزیم که Traefik چیست و چگونه به‌عنوان «پروکسی معکوس پویا» (Dynamic Reverse Proxy)، به بهبود عملکرد وب کمک می‌کند، اتصالات امن را تضمین و ترافیک شبکه را بهینه‌سازی می‌کند. در این نوشته، فرآیند نصب، پیکربندی و به حداکثر رساندن مزایای Traefik نیز به تفصیل شرح داده شده است. در این راهنما، ما به بررسی Traefik، نحوه عملکرد آن، ویژگی‌های منحصر به فرد و مزایایی که به همراه دارد می‌پردازیم. درک عمیق از Traefik برای مدیران سرور وب و وبمسترهای با تجربه که به دنبال به حداکثر رساندن کارایی و اطمینان عملیات سرور وب خود هستند، ضروری است.</p>



<h2 class="wp-block-heading" id="h-نکات-کلیدی-پیرامون-traefik">نکات کلیدی پیرامون Traefik</h2>



<ul class="wp-block-list">
<li>Traefik یک پروکسی معکوس پویا و <a href="https://hamravesh.com/blog/what-is-load-balancing/">لود بالانسر</a> (متعادل‌کننده بار) به حساب می‌آید که برای معماری‌های مدرن و توزیع‌شده طراحی شده است. این ابزار در محیط‌هایی دارای عملکرد برجسته است که سرویس‌ها به طور مکرر در حال ارتقا و کاهش مقیاس هستند یا دائم دیپلوی و حذف می‌شوند، .</li>



<li>Traefik امکان پیکربندی پویا، پشتیبانی از چندین بک‌اند، تعادل بار، پشتیبانی از HTTP/2 ،HTTP/3 و WebSocket ،<a href="https://hamravesh.com/blog/what-is-ssl/">SSL</a>/TLS خودکار، میان‌افزارها، متریک‌ها و ردیابی و یک سیستم پلاگین را ارائه می‌دهد. این ویژگی‌ها آن را به ابزاری جامع و چندمنظوره برای مدیریت ترافیک شبکه تبدیل کرده است.</li>



<li>Traefik مدیریت سرورهای وب را ساده‌سازی می‌کند، عملکرد را از طریق تعادل بار کارآمد بهبود می‌بخشد، امنیت را با SSL/TLS خودکار افزایش می‌دهد و گزینه‌های سفارشی‌سازی گسترده‌ای را فراهم می‌آورد. همچنین بینش‌های ارزشمندی برای نظارت و عیب‌یابی برنامه‌ها ارائه می‌دهد.</li>



<li>در حالی که Traefik با ابزارهای دیگری مانند <a href="https://hamravesh.com/blog/what-is-nginx/">NGINX</a> ،HAProxy و Envoy رقابت می‌کند، نقاط قوت منحصر به فرد آن، به ویژه در محیط‌های پویا و بومی ابری، آن را متمایز می‌سازد. بهترین ابزار بسته به نیازها و محیط خاص شما متفاوت است.</li>



<li>Traefik را می‌توان در سیستم‌های مختلفی نظیر CentOS و Ubuntu نصب و پیکربندی کرد. هرچند فرایند راه‌اندازی چندین مرحله‌ای دارد، نتیجه یک ابزار قدرتمند و انعطاف‌پذیر برای مدیریت ترافیک شبکه در محیط سرور وب شما است.</li>
</ul>



<h2 class="wp-block-heading" id="h-traefik-چیست">Traefik چیست؟</h2>



<p>Traefik یک Edge Router اوپن سورس است که به مدیریت پیچیدگی‌های شبکه‌ای مربوط به معماری‌های نرم‌افزاری مُدرن و توزیع‌شده می‌پردازد. Traefik اغلب به عنوان یک پروکسی معکوس و متعادل‌کننده بار شناخته می‌شود، اما قابلیت‌های آن فراتر از این عملکردها است.</p>



<p>هدف اصلی Traefik، مسیریابی درخواست‌ها در سیستم ما به میکروسرویس‌های مناسب است. Traefik این کار را به صورت پویا انجام می‌دهد، به این معنا که می‌تواند به طور خودکار کشف و مدیریت مسیریابی به سرویس‌های جدیدی را انجام دهد که به معماری ما اضافه می‌شوند. این ویژگی، Traefik را برای محیط‌هایی بسیار مناسب می‌سازد که در آن‌ها سرویس‌ها مانند برنامه‌های میزبانی‌شده در ابر به طور مکرر در حال توسعه و کاهش یافته یا مستقر و حذف می‌شوند.</p>



<p>عملکرد Traefik تنها به مسیریابی درخواست‌ها محدود نمی‌شود. این ابزار ویژگی‌های ضروری دیگری نظیر پایان‌دهی SSL/TLS، پشتیبانی از HTTP/2 ،HTTP/3 و WebSocket، کشف خودکار سرویس، تعادل بار، مدارشکن‌ها، میان‌افزارها و موارد دیگر را نیز ارائه می‌دهد. این ویژگی‌ها Traefik را به ابزاری جامع و چندمنظوره برای مدیریت ترافیک شبکه در محیط‌های مختلف وب سرور تبدیل می‌کنند.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="862" height="450" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/05/What-is-traefik.png" alt="Traefik چیست" class="wp-image-2905" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/05/What-is-traefik.png 862w, https://hamravesh.com/blog/wp-content/uploads/2024/05/What-is-traefik-300x157.png 300w, https://hamravesh.com/blog/wp-content/uploads/2024/05/What-is-traefik-768x401.png 768w" sizes="auto, (max-width: 862px) 100vw, 862px" /></figure>



<h2 class="wp-block-heading" id="h-تاریخچه-مختصر-و-سیر-توسعه-traefik">تاریخچه مختصر و سیر توسعه Traefik</h2>



<p>Traefik برای اولین بار در سال ۲۰۱۵ توسط یک شرکت فرانسوی به نام Containous به دنیا معرفی شد. هدف اصلی، ایجاد مسیریاب edge، پویا و بومی ابری بود که بتواند پیچیدگی‌های معماری‌های نرم‌افزاری مُدرن و توزیع‌شده را مدیریت کند. خالقان به دنبال سازوکاری بودند که برای پیکربندی آسان باشد، قابلیت کشف خدمات (Service Discovery) پویا را داشته باشد و از چندین بک‌اند پشتیبانی کند.</p>



<p>از زمان آغاز به کار، Traefik به‌روزرسانی‌ها و بهبودهای متعددی داشته است که نیازهای در حال تغییر مدیران سرور وب و تغییرات گسترده‌تر در چشم‌انداز فناوری را منعکس می‌کند. در اینجا برخی از نقاط عطف مهم در تکامل Traefik آورده شده است:</p>



<ul class="wp-block-list">
<li><strong>Traefik 1.0</strong> با نام «<strong>Camembert</strong>» در سال ۲۰۱۶: این اولین نسخه پایدار Traefik بود. پیکربندی پویا و hot-reloading را معرفی کرد، به این معنی که می‌توانست بدون نیاز به راه‌اندازی مجدد، به تغییرات در محیط واکنش نشان دهد.</li>



<li>Traefik 1.7 با نام «<strong>Maroilles</strong>» در سال ۲۰۱۸: این نسخه پشتیبانی از مسیریابی TCP را معرفی کرد، افزودنی مهمی که قابلیت‌های Traefik را فراتر از HTTP گسترش داد.</li>



<li><strong>Traefik 2.0</strong> با نام «<strong>Mont d’Or</strong>» در سال ۲۰۱۹: این یک انتشار بزرگ بود که پشتیبانی از TCP و UDP، استقرارهای canary&nbsp;و یک rule syntax جدید را معرفی کرد. همچنین مفهوم Middlewares را معرفی کرد، که به کاربران امکان می‌دهد خط لوله پردازش درخواست را سفارشی کنند.</li>



<li><strong>Traefik 2.2</strong> با نام «<strong>Cantal</strong>» در سال ۲۰۲۰: این نسخه، Service Load Balancer را معرفی کرد. نوع جدیدی از خدمات است که می‌تواند بین سایر سرویس‌ها تعادل بار ایجاد کند، . همچنین پشتیبانی از Kubernetes IngressClass نیز اضافه شد.</li>



<li><strong>Traefik 2.3</strong> با نام «<strong>Comté</strong>» در سال ۲۰۲۰: در این نسخه، Traefik Pilot، پلتفرم جدیدی برای مدیریت و بهبود نمونه‌های Traefik معرفی شد. همچنین پشتیبانی از Kubernetes Service APIs را هم اضافه کرد.</li>



<li><strong>Traefik 2.4</strong> به نام «<strong>Morbier</strong>» در سال ۲۰۲۱: این نسخه سیستم افزونه را معرفی کرد، که به کاربران امکان می‌دهد عملکرد Traefik را با افزونه‌های سفارشی گسترش دهند.</li>



<li><strong>Traefik 3.0.0-beta3</strong> (آخرین): این نسخه پیش‌انتشاری، دارای چندین بهبود از جمله پشتیبانی از HostSNIRegexp در مسیرهای TLS GatewayAPI، افزودن پشتیبانی از TCP Servers Transports و افزودن اولویت روتر است.</li>
</ul>



<h2 class="wp-block-heading" id="h-نحوه-عملکرد-traefik-به-چه-صورت-است">نحوه عملکرد <strong>Traefik</strong> به چه صورت است؟</h2>



<p>به زبان ساده، Traefik به عنوان واسط بین کاربران و خدمات شما عمل می‌کند. زمانی که کاربری درخواستی به وب‌سایت شما می‌فرستد، Traefik این درخواست را دریافت می‌کند و بر اساس قوانینی که تعیین کرده‌اید، مسیریابی آن را تعیین می‌کند. این فرآیند شبیه به نحوه‌ای است که پلیس راهنمایی و رانندگی خودروها را در تقاطع هدایت می‌کند، تا اطمینان حاصل شود که همه درخواست‌ها به مقصد درست می‌رسند.</p>



<p>در محیط‌هایی که خدمات به طور مکرر تغییر می‌کنند، مانند زمانی که برنامه‌های جدید اضافه می‌شوند یا برنامه‌های قدیمی حذف می‌شوند، Traefik برجسته است. این سیستم، توانایی تشخیص خودکار این تغییرات را دارد و قوانین مسیریابی خود را متناسب با آن تنظیم می‌کند. این بدان معناست که همزمان با افزودن یا حذف خدمات، Traefik به طور خودکار مسیریابی خود را بدون هیچ دخالت دستی به‌روز می‌کند.</p>



<p>Traefik همچنین رمزنگاری داده‌های کاربران را انجام می‌دهد. زمانی که کاربری به وب‌سایت ما متصل می‌شود، اتصال آن‌ها می‌تواند با استفاده از SSL/TLS رمزنگاری شود، تا اطمینان حاصل کنیم که داده‌های آن‌ها هنگام انتقال از طریق اینترنت ایمن هستند. Traefik به طور خودکار این فرآیند رمزنگاری را مدیریت می‌کند، گواهی‌های لازم را به دست می‌آورد و به موقع تجدید می‌کند. این امر اطمینان می‌دهد که وب‌سایت ما حتی با تحول فناوری‌ها و استانداردها، امن باقی می‌ماند.</p>



<h2 class="wp-block-heading" id="h-ویژگی-های-کلیدی-traefik-چیست">ویژگی‌های کلیدی Traefik چیست؟</h2>



<p>Traefik ویژگی‌های متنوع و متعددی دارد که باعث می‌شود به عنوان ابزاری قدرتمند و انعطاف‌پذیر برای مدیریت ترافیک شبکه در سیستم‌های مدرن و توزیع‌شده شناخته شود. در اینجا به برخی از ویژگی‌های کلیدی اشاره می‌شود که ترافیک را از سایر نرم‌افزارهای سرور متمایز می‌کند:</p>



<ul class="wp-block-list">
<li><strong>کشف خدمات</strong> (<strong>Service Discovery</strong>): Traefik به طور خودکار خدمات جدیدی را که به معماری شما اضافه می‌شوند، شناسایی و مسیریابی می‌کند و به راحتی با سیستم‌های شناخته شده کشف خدمات، نظیر <a href="https://hamravesh.com/blog/what-is-docker/">داکر</a>، <a href="https://hamravesh.com/blog/what-is-kubernetes/">کوبرنتیز</a> و Rancher همگام می‌شود. قابلیت پیکربندی پویا و بارگذاری سریع، ترافیک را برای استفاده در محیط‌هایی ایده‌آل می‌سازد که خدمات به طور مداوم در حال افزایش یا کاهش هستند یا به سرعت نصب و حذف می‌شوند.</li>



<li><strong>مسیریابی</strong> (<strong>Routing</strong>): Traefik از اطلاعات میزبان و مسیر درخواست‌های ورودی استفاده می‌کند تا بتواند تعیین کند که آن‌ها را باید به کجا هدایت کند. شما می‌توانید قوانین مسیریابی را در پیکربندی Traefik تعریف کنید و این قوانین می‌توانند بر اساس نیاز ساده یا پیجیده باشند. ترافیک از روش‌های تطابق (matchersهای) محتلفی برای درخواست‌ها پشتیبانی می‌کند، از جمله تطابق بر اساس مسیر، header-based، و مچرهای مبتنی بر method.</li>



<li><strong>تعادل بار</strong> (<strong>Load Balancing</strong>): Traefik تعادل بار را برای مدیریت ترافیک به خدمات شما فراهم و درخواست‌های ورودی را بین چندین نمونه از یک خدمت توزیع می‌کند. این امر به تضمین این مسئله کمک می‌کند که هیچ نمونه‌ای به نقطه انسداد تبدیل نشود و عملکرد کلی برنامه‌های شما بهبود یابد.</li>



<li><strong>میان‌افزار</strong> (<strong>Middleware</strong>): Traefik مفهوم میان‌افزار را معرفی می‌کند که به کاربران امکان می‌دهد خط لوله پردازش درخواست را سفارشی کنند. میان‌افزارها می‌توانند برای وظایفی مانند rate limiting، احراز هویت، circuit breakerها و دیگر موارد استفاده شوند.</li>



<li><strong><strong>SSL/TLS Termination</strong></strong>: ابزار Traefik می‌تواند SSL/TLS Termination را انجام دهد، به این معنی که می‌تواند ترافیک رمزگذاری شده را قبول کند، آن را رمزگشایی و سپس آن را به سرویس‌های ما به صورت ترافیک رمزنگاری نشده منتقل کند. این کار بار مدیریت رمزنگاری را از روی خدمات شما برمی‌دارد.</li>



<li><strong>معیارها و ردیابی</strong> (<strong>Metrics and Tracing</strong>): Traefik متریک‌هایی برای سیستم‌های مختلف مانند Prometheus و Datadog فراهم می‌کند و از ردیابی توزیع‌شده (distributed tracing) با سیستم‌هایی مانند Jaeger و Zipkin پشتیبانی می‌کند. این امر، نظارت و عیب‌یابی برنامه‌های شما را آسان‌تر می‌کند.</li>



<li><strong>پشتیبانی از چندین بک‌اند</strong>: Traefik از تنوعی از بک‌اندها از جمله Swarm ،Rancher، کوبرنتیز، داکر و بسیاری دیگر پشتیبانی می‌کند. این مسئله Traefik را به ابزاری چندمنظوره تبدیل می‌کند که می‌توان در محیط‌های مختلف از آن استفاده کرد.</li>



<li><strong>پشتیبانی از پروتکل‌ها</strong>: ترافیک از پروتکل‌های مُدرن مانند HTTP/2 ،HTTP/3 و WebSocket‌ها پشتیبانی می‌کند که به شما امکان می‌دهد در برنامه‌های خود از این فناوری‌ها استفاده کنید.</li>



<li><strong>پلاگین‌ها</strong>: از نسخه ۲.۴، Traefik یک سیستم پلاگین را معرفی کرده است که به کاربران امکان می‌دهد با پلاگین‌های سفارشی، عملکرد Traefik را گسترش دهند.</li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>Traefik ابزاری قدرتمند و انعطاف‌پذیر برای مدیریت ترافیک شبکه در معماری‌های مُدرن و توزیع‌شده است. این پروکسی معکوس پویا با قابلیت‌های چشمگیر خود مانند کشف خدمات پویا، پیکربندی متنوع، تعادل بار، و پشتیبانی از پروتکل‌های مُدرن، کار مدیریت و بهینه‌سازی ترافیک را بسیار آسان‌تر می‌کند. علاوه بر این، ارائه امکاناتی مانند SSL/TLS خودکار و گستره وسیعی از افزونه‌ها، Traefik را به گزینه‌ای مطلوب برای محیط‌های پویا و متغیر تبدیل کرده است. این ابزار به‌ویژه برای مدیران وب سرور و توسعه‌دهندگان که به دنبال راه‌حلی کارآمد برای چالش‌های روزمره خود هستند، بسیار مفید و کاربردی است.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-traefik/">Traefik چیست و چطور کار می‌کند؟ – شرح ویژگی‌ها، کاربردها و مزایا</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-traefik/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CRUD چیست؟ – آموزش عملیات CRUD</title>
		<link>https://hamravesh.com/blog/what-is-crud/</link>
					<comments>https://hamravesh.com/blog/what-is-crud/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Sun, 15 Dec 2024 14:07:28 +0000</pubDate>
				<category><![CDATA[دیتابیس]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2997</guid>

					<description><![CDATA[<p>crud سرواژه‌ای است که به چهار عملیات اصلی در دنیای دیتابیس‌ها (ایجاد، خواندن، به‌روزرسانی و حذف) اشاره دارد. در این بلاگ‌پست به این چهار عملیات نگاهی انداخته‌ایم. </p>
<p>The post <a href="https://hamravesh.com/blog/what-is-crud/">CRUD چیست؟ – آموزش عملیات CRUD</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>«کراد» یا همان CRUD در واقع یک کلمه نیست، بلکه علامت اختصاری است که از حروف اول چهار عمل اصلی در دنیای <a href="https://hamravesh.com/blog/what-is-database/">دیتابیس</a> یا فضای ذخیره‌سازی داده‌ها تشکیل شده است. این ۴ عمل اصلی شامل «Create» (ایجاد)، «Read» (خواندن یا دریافت)، «Update» (بروزرسانی یا ویرایش) و «Delete» یا «Destroy» (حذف) می‌شود. در این مقاله قصد داریم توضیح دهیم که CRUD چیست و بررسی کنیم هر یک از این ۴ عمل دقیقاً چه کاری انجام می‌دهند. همچنین نحوه کارکرد عملیات ایجاد، خواندن، ویرایش و حذف را در محیطی واقعی بررسی می‌کنیم.</p>



<h2 class="wp-block-heading" id="h-crud-چیست">CRUD چیست؟</h2>



<p>CRUD به ۴ عملیات پایه‌ای اشاره دارد که هر نرم‌افزاری باید قادر به انجام آن‌ها باشد و شامل «Create» (ایجاد)، «Read» (خواندن یا دریافت)، «Update» (به‌روزرسانی یا ویرایش) و «Delete» یا «Destroy» (حذف) می‌شود. در چنین برنامه‌هایی، کاربران باید بتوانند داده‌ها را ایجاد کنند، از طریق رابط کاربری به داده‌ها دسترسی داشته باشند و آن‌ها را بخوانند، داده‌ها را ویرایش یا به‌روزرسانی و در نهایت آن‌ها را حذف کنند. در برنامه‌های کامل و تمام عیار، برنامه‌های CRUD از ۳ بخش تشکیل شده‌اند:</p>



<ul class="wp-block-list">
<li>رابط برنامه‌نویسی (API یا سرور)</li>



<li>پایگاه‌داده</li>



<li>رابط کاربری (UI)</li>
</ul>



<p>API شامل کدها و متُدهاست، پایگاه داده اطلاعات را ذخیره و به کاربر در بازیابی آن‌ها کمک می‌کند، در حالی که رابط کاربری به کاربران اجازه می‌دهد با برنامه تعامل داشته باشند. می‌توان با هر یک از زبان‌های برنامه نویسی موجود، برنامه CRUD نوشت و لازم نیست حتماً برنامه Full Stack باشد. می‌توان برنامه CRUD را صرفاً با جاوا اسکریپت در سمت کلاینت (Client-side) هم نوشت.</p>



<p>در واقع، برنامه‌ای که با آن نحوه کارکرد عملیات ایجاد، خواندن، ویرایش و حذف را به شما نشان خواهیم داد، تنها با جاوا اسکریپت سمت کلاینت نوشته شده است. هر یک از حروف اختصار CRUD با یک متد درخواست HTTP مرتبط است.</p>



<figure class="wp-block-table"><table><tbody><tr><td class="has-text-align-center" data-align="center"><strong>عملیات CRUD</strong></td><td class="has-text-align-center" data-align="center"><strong>متُد درخواست HTTP</strong></td></tr><tr><td class="has-text-align-center" data-align="center">Create</td><td class="has-text-align-center" data-align="center">POST</td></tr><tr><td class="has-text-align-center" data-align="center">Read</td><td class="has-text-align-center" data-align="center">GET</td></tr><tr><td class="has-text-align-center" data-align="center">Update</td><td class="has-text-align-center" data-align="center">PUT یا PATCH</td></tr><tr><td class="has-text-align-center" data-align="center">Delete</td><td class="has-text-align-center" data-align="center">DELETE</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="h-عملیات-create-در-crud-چیست-و-چطور-کار-می-کند">عملیات Create در CRUD چیست و چطور کار می‌کند؟</h2>



<p>در CRUD، عملیات ایجاد یا Create همان‌طور که از نامش پیداست، یعنی ساخت و ایجاد یک ورودی یا رکورد جدید. این ورودی می‌تواند یک حساب کاربری، اطلاعات کاربر، یک پست یا یک تسک (کار) باشد. همان‌طور که قبلاً اشاره شد، پروتکل HTTP که عملیات CREATE را پیاده‌سازی می‌کند، متد POST است.</p>



<p>در یک پایگاه‌داده SQL، برای ایجاد، از دستور <code>INSERT</code> استفاده می‌شود. در پایگاه‌داده غیرِ رابطه‌ای مانند <a href="https://hamravesh.com/blog/what-is-mongodb/">MongoDB</a>، برای ایجاد از متد<code>insert()</code> استفاده می‌شود. تصویر متحرک (GIF) زیر نشان می‌دهد که چگونه عملیات <code>CREATE</code> چگونه در یک رابط کاربری کار می‌کند:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="282" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/06/create-op.gif" alt="نحوه کارکرد عملیات Create در CRUD" class="wp-image-3000"/></figure>
</div>


<p>همانطور که مشاهده می کنید، کاربر اطلاعات را در فیلدهای مربوطه وارد می‌کند و سپس با کلیک بر روی دکمه «Submit»، یک رکورد جدید در فهرست کارها ایجاد می‌شود. در پشت صحنه، درخواست HTTP به روش POST به سرور ارسال می‌شود تا رکورد جدید در پایگاه‌داده ذخیره شود.</p>



<h2 class="wp-block-heading" id="h-عملیات-read-در-crud-چیست-و-چطور-کار-می-کند">عملیات READ در CRUD چیست و چطور کار می‌کند؟</h2>



<p>عملیات READ یعنی دسترسی پیدا کردن به ورودی‌ها یا رکوردهای موجود در رابط کاربری و دیدن آن‌ها. باز هم، این ورودی‌ها می‌توانند هر چیزی از اطلاعات کاربر گرفته تا پست‌های شبکه‌های اجتماعی و موارد دیگر باشند.</p>



<p>این دسترسی می‌تواند به این معنی باشد که کاربر بلافاصله پس از ایجاد رکوردها به آن‌ها دسترسی پیدا کند، یا اینکه بتواند برای یافتن آن‌ها جستجو کند. امکان جستجو برای این منظور پیاده‌سازی می‌شود که کاربر بتواند رکوردهای مورد نیاز خود را فیلتر کند. پروتکل HTTP که عملیات <code>READ</code> را پیاده‌سازی می‌کند، متد GET است.</p>



<p>در یک پایگاه‌داده SQL، برای خواندن از دستور <code>SELECT</code> استفاده می‌شود. در یک پایگاه‌داده غیر رابطه‌ای مانند MongoDB، برای خواندن از متدهای<code>find()</code> یا<code>findById()</code> استفاده می‌کنیم. تصویر زیر نشان می‌دهد که عملیات <code>READ</code> در رابط کاربری چگونه کار می‌کند:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="299" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/06/What-is-CRUD.png" alt="" class="wp-image-3021" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/06/What-is-CRUD.png 600w, https://hamravesh.com/blog/wp-content/uploads/2024/06/What-is-CRUD-300x150.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>
</div>


<p>همان‌طور که مشاهده می‌کنید، کاربر می‌تواند با استفاده از جعبه جستجو، رکوردهای خاصی را جستجو و فیلتر کند. سپس لیست فیلتر شده رکوردها در قسمت زیرین رابط کاربری نمایش داده می‌شود. در پشت صحنه، یک درخواست HTTP به روش GET به سرور ارسال می‌شود تا رکوردهای مورد نظر از پایگاه‌داده خوانده و بازیابی شوند.</p>



<h2 class="wp-block-heading" id="h-عملیات-update-در-crud-چیست-و-چطور-کار-می-کند">عملیات UPDATE در CRUD چیست و چطور کار می‌کند؟</h2>



<p>UPDATE عملیاتی است که به ما اجازه می‌دهد داده‌های موجود را اصلاح یا ویرایش کنیم، یعنی ویرایش داده‌ها را انجام دهیم. برخلاف READ، عملیات UPDATE داده‌های موجود را با ایجاد تغییرات در آن‌ها، ویرایش می‌کند.</p>



<p>برای پیاده‌سازی عملیات UPDATE، می‌توانید بسته به نیاز از پروتکل‌های HTTP به نام <code>PUT</code> و همچنین <code>PATCH</code> استفاده کنید. <code>PUT</code> زمانی باید استفاده شود که می‌خواهید کل رکورد به‌روزرسانی شود و <code>PATCH</code> زمانی که نمی‌خواهید کل رکورد تغییر کند مورد استفاده قرار می‌گیرد.</p>



<p>در یک پایگاه داده SQL، از دستور <code>UPDATE</code> برای به‌روزرسانی یک رکورد استفاده می‌شود. در یک پایگاه داده غیر رابطه‌ای مانند مونگودی‌بی، می‌توانید ویژگی به‌روزرسانی را با استفاده از متد<code>findByIdAndUpdate()</code> پیاده‌سازی کنید. GIF زیر نشان می‌دهد که چگونه عملیات <code>UPDATE</code> در رابط کاربری کار می‌کند:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="282" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/06/update-op.gif" alt="نحوه کارکرد عملیات UPDATE در CRUD" class="wp-image-3004"/></figure>
</div>


<p>همانطور که مشاهده می‌کنید، کاربر می‌تواند روی یکی از رکوردهای موجود کلیک کند تا فیلدهای آن رکورد قابل ویرایش شوند. سپس کاربر می‌تواند تغییرات مورد نظر را اعمال کند و با کلیک کردن روی دکمه «Update»، رکورد را به‌روزرسانی نماید. در پشت صحنه، یک درخواست HTTP به روش PUT یا PATCH به سرور ارسال می‌شود تا رکورد مربوطه در پایگاه داده ویرایش و به‌روزرسانی شود.</p>



<h2 class="wp-block-heading" id="h-عملیات-delete-چیست-و-چطور-کار-می-کند">عملیات DELETE چیست و چطور کار می‌کند؟</h2>



<p>حذف به این معنی است که یک رکورد یا ورودی را از رابط کاربری و پایگاه داده حذف کنید. DELETE پروتکل HTTP برای پیاده‌سازی عملیات حذف است. در یک پایگاه داده SQL، از دستور DELETE برای حذف رکورد استفاده می‌شود. در پایگاه داده غیر رابطه‌ای مانند مونگودی‌بی، می‌توانید عملیات حذف را با استفاده از متد findByIdAndDelete() پیاده‌سازی کنید. تصویر GIF زیر نشان می‌دهد که چگونه عملیات DELETE در رابط کاربری کار می‌کند:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="282" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/06/delete-op.gif" alt="" class="wp-image-3007"/></figure>
</div>


<p>همان‌طور که مشاهده می‌کنید، کاربر می‌تواند بر روی دکمه حذف در کنار هر رکورد کلیک کند تا آن رکورد از لیست حذف شود. در پشت صحنه، یک درخواست HTTP به روش DELETE به سرور ارسال می‌شود تا رکورد مورد نظر از پایگاه داده نیز حذف شود. عملیات حذف باید با احتیاط انجام شود، زیرا پس از حذف رکورد، دیگر امکان بازیابی آن وجود ندارد. معمولاً در برنامه‌های تجاری، به جای حذف کامل رکورد، یک فیلد وضعیت یا غیرفعال‌سازی برای آن در نظر گرفته می‌شود تا در صورت نیاز، بتوان آن را مجدد فعال کرد.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>این مقاله به ما نشان داد که CRUD به چه معناست و هر یک از عملیات انفرادی در یک برنامه CRUD چه کاری انجام می‌دهند. می‌توانیم در مورد CRUD به این شکل فکر کنید:</p>



<ul class="wp-block-list">
<li>یک حساب کاربری شبکه اجتماعی ایجاد و اطلاعات خود را وارد می‌کنیم: عملیات CREATE (ایجاد)</li>



<li>به اطلاعاتی که وارد کرده‌ایم دسترسی پیدا می‌کنیم و دیگران می‌توانند ما را جستجو کنند: عملیات READ (خواندن)</li>



<li>در گوگل استخدام می‌شویم و وضعیت استخدامی خود را به «شاغل» تغییر می‌دهیم: UPDATE (بروزرسانی)</li>



<li>از میزان سمی بودن شبکه‌های اجتماعی خسته می‌شویم و حساب کاربری خود را حذف می‌کنیم: DELETE (حذف)</li>
</ul>



<p>برای اینکه یاد بگیرید چگونه می‌توانید برنامه CRUD خودتان را بنویسید، می‌توانید از این آموزش [<a href="https://www.freecodecamp.org/news/learn-crud-operations-in-javascript-by-building-todo-app/">+</a>] استفاده کنید.</p>



<p>پس در این مقاله با مفهوم CRUD آشنا شدیم که شامل چهار عملیات اصلی ایجاد (Create)، خواندن (Read)، ویرایش (Update) و حذف (Delete) در دنیای برنامه‌نویسی و ذخیره‌سازی داده‌ها است. هر یک از این عملیات با یک متُد درخواست HTTP مرتبط است و در برنامه‌های کاربردی مُدرن برای مدیریت داده‌ها و تعامل با پایگاه‌های داده استفاده می‌شوند. همچنین مشاهده کردیم که چگونه هر عملیات در رابط کاربری و پایگاه داده پیاده‌سازی می‌شود.</p>



<p></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-crud/">CRUD چیست؟ – آموزش عملیات CRUD</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-crud/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>معماری رویدادمحور Event-Driven Architecture چیست؟</title>
		<link>https://hamravesh.com/blog/what-is-event-driven-architecture/</link>
					<comments>https://hamravesh.com/blog/what-is-event-driven-architecture/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Sat, 07 Dec 2024 14:16:40 +0000</pubDate>
				<category><![CDATA[مشاهده‌پذیری]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2745</guid>

					<description><![CDATA[<p>معماری Event-Driven در دنیای نرم‌افزار معماری جدیدی است که به‌جای معماری سنتی<br />
 request/response از آن استفاده می‌شود. در این بلاگ‌پست به‌صورت جزئی و با مثال با این معماری آشنا خواهیم شد</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-event-driven-architecture/">معماری رویدادمحور Event-Driven Architecture چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>معماری رویدادمحور (Event Driven Architecture) رویکردی در طراحی سیستم‌های نرم‌افزاری است که بر مبنای تولید و مصرف رویدادها عمل می‌کند. در این مطلب، به توضیح این معماری و اجزای اصلی آن شامل تولیدکننده‌ها، مصرف‌کننده‌ها و واسطه‌ها می‌پردازیم و مثال‌های کاربردی از صنایع مختلف مانند خرده‌فروشی و تولید را بررسی می‌کنیم. همچنین به مزایای استفاده از این معماری در بهبود واکنش سریع به تغییرات و افزایش مقیاس‌پذیری سیستم‌ها اشاره خواهیم کرد. با ما همراه باشید تا با جزئیات بیشتری از این رویکرد مُدرن در طراحی سیستم‌های دیجیتال آشنا شوید.</p>



<h2 class="wp-block-heading" id="h-event-driven-architecture-چیست">Event Driven Architecture چیست؟</h2>



<p>معماری Event-driven یا به اختصار EDA الگوی طراحی نرم‌افزار است که به سازمان‌ها اجازه می‌دهد «رویدادها» (Event) یا لحظات مهم در کسب‌وکارها (مثل تراکنش، بازدید سایت، ترک سبد خرید و غیره) را تشخیص داده و به آن‌ها در زمان واقعی یا نزدیک به زمان واقعی واکنش نشان دهند. این الگو جایگزین معماری سُنتی «درخواست/پاسخ» (request/response) می‌شود که در آن سرویس‌ها باید منتظر پاسخ می‌ماندند تا به کار بعدی بروند. جریان معماری Event-driven توسط eventها هدایت می‌شود و به گونه‌ای طراحی شده که به آن‌ها پاسخ داده یا عملی را در پاسخ به یک event انجام دهد.</p>



<p>معماری Event-driven اغلب به‌عنوان ارتباط «asynchronous» یا «غیرهم‌زمان» شناخته می‌شود. یعنی فرستنده و گیرنده لازم نیست برای انجام کار بعدی منتظر یکدیگر بمانند و سیستم‌ها به یک پیام وابسته نیستند. مثلاً تماس تلفنی ارتباط «هم‌زمان» محسوب می‌شود، مثل معماری سنتیِ «درخواست/پاسخ»، که در آن درخواست‌دهنده منتظر پاسخ می‌ماند. یک مثال غیرهم‌زمان، پیامک است. شما پیامک می‌فرستید و ممکن است ندانید که گیرنده کیست یا آیا کسی پیام را می‌خواند، اما منتظر پاسخ نمی‌مانید.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="774" height="223" src="https://blog.hamravesh.com/blog/wp-content/uploads/2024/05/Event-Driven_Architecture.png" alt="معماری رویداد محور Event Driven Architecture" class="wp-image-2775" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/05/Event-Driven_Architecture.png 774w, https://hamravesh.com/blog/wp-content/uploads/2024/05/Event-Driven_Architecture-300x86.png 300w, https://hamravesh.com/blog/wp-content/uploads/2024/05/Event-Driven_Architecture-768x221.png 768w" sizes="auto, (max-width: 774px) 100vw, 774px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-سیر-تکامل-معماری-event-driven-و-مقایسه-آن-با-معماری-داده-محور">سیر تکامل معماری Event Driven و مقایسه آن با معماری داده‌محور</h2>



<p>در چند سال گذشته، تمرکز از داده‌های ثابت (Service Oriented Architecture) به سمت رویدادها (Event-driven Architecture) تغییر کرده است. به‌جای انباشتن داده‌ها و ایجاد Data Lake، اکنون به داده‌های در جریان و ردیابی آن‌ها در حرکت توجه می‌شود. سیستم‌های سنتی عمدتاً در یک مدل داده‌محور کار می‌کردند که داده‌ها منبع اصلی حقیقت بودند. تغییر به سمت معماری Event-driven به معنای حرکت از مدل داده‌محور به مدل رویدادمحور است.</p>



<p>در مدل رویدادمحور، داده‌ها همچنان مهم هستند، اما eventها به مهم‌ترین بخش تبدیل می‌شوند. در مدل سرویس‌محور، اولویت اصلی حفظ داده‌ها بود، اما در معماری Event-driven، اولویت اصلی پاسخ به رویدادها به‌صورت همزمان است؛ زیرا ارزش رویدادها با گذشت زمان کاهش پیدا می‌کند. با این حال، امروزه معماری سرویس‌محور و معماری رویدادمحور اغلب به همراه هم استفاده می‌شوند.</p>



<h3 class="wp-block-heading" id="h-استفاده-از-log-و-مخزن-اطلاعات-در-event-driven-architecture">استفاده از log و مخزن اطلاعات در Event Driven Architecture</h3>



<p>معماری Event-driven اغلب از  log برای پیگیری رویدادها استفاده می‌کند. تحلیل‌گران eventها را به‌عنوان وقایع رخ داده غیرقابل تغییر در نظر می‌گیرند. اگر بخواهید بفهمید چه اتفاقی در گذشته افتاده، می‌توانید به log مراجعه کرده و آن را دوباره بازبینی کنید. در حالی که در مدل داده‌محور، تمرکز اصلی بر وضعیت فعلی داده‌ها است. آخرین قیاسی که تحلیل‌گران برای توصیف تفاوت بین معماری داده‌محور و رویدادمحور استفاده می‌کنند، مقایسه آن‌ها با یک مخزن اطلاعات و یک سیستم عصبی است که پیام‌ها را در سراسر سازمان منتقل می‌کند.</p>



<h3 class="wp-block-heading" id="h-event-producerها-در-معماری-رویدادمحور">Event Producerها در معماری رویدادمحور</h3>



<p>در معماری Event-driven، تولیدکننده‌های رویداد را داریم که نوتیفیکیشن‌های event را ایجاد و ارسال می‌کنند و ممکن است یک یا چند مصرف‌کننده event هم وجود داشته باشد که در آنجا دریافت event باعث اجرای منطق پردازش (Processing Logic) می‌شود. </p>



<p>مثلاً فرض کنید نتفلیکس فیلم جدیدی را آپلود کرده است. چندین اپلیکیشن می‌توانند منتظر این نوتیفیکیشن باشند و سپس سیستم‌های داخلی خود را فعال کنند تا اطلاعات مربوط به آن event را به کاربرانشان بفرستند. این روش با پیام‌رسانی درخواست-پاسخ سنتی متفاوت است؛ در اینجا اپلیکیشن‌ها در حال اجرا هستند و حتی اگر منتظر این رویداد باشند، معطل نمی‌مانند و می‌توانند به محض دریافت پیام، پاسخ دهند. به این ترتیب، بسیاری از سرویس‌ها می‌توانند به‌صورت همزمان اجرا شوند.</p>



<h2 class="wp-block-heading" id="h-مفهوم-event-در-event-driven-architecture-چیست">مفهوم Event در Event Driven Architecture چیست؟</h2>



<p>رویداد یا همان Event به تغییر وضعیت یک سیستم کلیدی کسب‌وکار گفته می‌شود. مثلاً، شخصی محصولی می‌خرد، فردی برای پرواز چک‌این می‌کند یا اتوبوسی دیر به مقصد می‌رسد. اگر دقت کنیم، Eventها در همه جا و در هر صنعتی رخ می‌دهند. هر چیزی که یک «پیام» ایجاد کند، از تولید و انتشار گرفته تا شناسایی و مصرف، به‌عنوان رویداد شناخته می‌شود. رویداد از پیام جداست، چون Event وقوع یک تغییر است و پیام، اعلان (نوتیفیکیشن) در حال حرکتِ این وقوع را انتقال می‌دهد. در معماری Event-driven، رویداد ممکن است یک یا چند عمل یا فرآیند را در پاسخ به وقوع خود تحریک (Trigger) کند. نمونه‌هایی از رویدادها شامل موارد زیر هستند:</p>



<ul class="wp-block-list">
<li>درخواست برای بازنشانی رمز عبور</li>



<li>تحویل بسته به مقصد</li>



<li>به‌روزرسانی موجودی یک انبار مواد غذایی</li>



<li>رد تلاش برای دسترسی غیرمجاز</li>
</ul>



<p>هر یک از این رویدادها ممکن است یک یا چند عمل یا فرآیند را در پاسخ، Trigger کنند. یکی از پاسخ‌ها ممکن است به سادگیِ ثبت Event برای اهداف نظارتی باشد. پاسخ‌های دیگر می‌توانند شامل موارد زیر باشند:</p>



<ul class="wp-block-list">
<li>ارسال ایمیل برای بازنشانی رمز عبور به مشتری</li>



<li>بسته شدن فروش بلیط</li>



<li>ثبت سفارش جدید برای کالاهای در حال اتمام مانند کاهو</li>



<li>قفل شدن حساب و اطلاع‌رسانی به پرسنل امنیتی</li>
</ul>



<p>در معماری Event-driven، زمانی که نوتیفیکیشن رویداد ارسال می‌شود، سیستم ثبت می‌کند که تغییری رخ داده است و منتظر می‌ماند تا پاسخ را به هر فردی که درخواست کرده، هر زمان که درخواست کند، ارسال کند. اپلیکیشنی که آن پیام را دریافت کرده می‌تواند بلافاصله پاسخ دهد یا تا زمانی که تغییر وضعیت مورد انتظار رخ دهد، منتظر بماند.</p>



<p>اپلیکیشن‌های مبتنی بر معماری Event-driven امکان ایجاد کسب‌وکارهای دیجیتال سریع‌تر، مقیاس‌پذیرتر، با زمینه بهتر و پاسخگوتر را فراهم می‌کنند.</p>



<h2 class="wp-block-heading" id="h-نحوه-عملکرد-معماری-event-driven-چگونه-است">نحوه عملکرد معماری Event Driven چگونه است؟</h2>



<p>اجزای معماری رویدادمحور شامل ۳ بخش «تولیدکننده» (Producer)، «مصرف‌کننده» (Consumer) و «واسطه» (Broker) است. واسطه ممکن است اختیاری باشد، به‌خصوص زمانی که تولیدکننده و مصرف‌کننده مستقیماً با هم در ارتباط هستند و تولیدکننده eventها را به مصرف‌کننده می‌فرستد. به عنوان مثال، تولیدکننده می‌تواند رویدادها را فقط به یک پایگاه داده یا انبار داده ارسال کند تا رویدادها برای تحلیل جمع‌آوری و ذخیره شوند. معمولاً در شرکت‌ها، منابع متعددی وجود دارند که انواع مختلف رویدادها را ارسال می‌کنند و یک یا چند مصرف‌کننده به برخی یا همه آن رویدادها علاقه‌مند هستند.</p>



<p>به یک مثال توجه کنیم. مثلاً اگر شما خرده‌فروش هستید، ممکن است تمامی خریدهایی را که در تمام فروشگاه‌های شما در سراسر جهان انجام می‌شوند، جمع‌آوری کنید. این رویدادها را که بر تقلب نظارت می‌کنند به معماری رویدادمحور خود می‌خورانید و آن‌ها را به پردازشگر کارت اعتباری ارسال می‌کنید یا هر اقدام مورد نیاز دیگر را انجام می‌دهید. برای تولیدکننده، شما انواع داده‌ها را از تجهیزات خود دریافت می‌کنید. این داده‌ها به شما اطلاعاتی مانند دما و فشار را می‌دهند تا بتوانید بسته به آنچه داده‌ها به شما می‌گویند، این رویدادها را به‌صورت لحظه‌ای نظارت کنید و اقداماتی مانند پیش‌بینی خرابی‌ها یا برنامه‌ریزی تعمیرات را انجام دهید.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>معماری رویدادمحور رویکرد نوینی در طراحی سیستم‌های نرم‌افزاری است که بر اساس تولید و مصرف رویدادها کار می‌کند. این معماری از تولیدکنندگان و مصرف‌کنندگان رویدادها تشکیل شده است و می‌تواند شامل واسطه‌هایی برای مدیریت بهتر جریان داده‌ها باشد. در این سیستم، رویدادها به صورت لحظه‌ای تولید و پردازش می‌شوند، که این امر امکان واکنش سریع به تغییرات و رویدادها را فراهم می‌کند. به عنوان مثال، در صنعت خرده‌فروشی، این معماری می‌تواند برای نظارت بر خریدها و تشخیص تقلب استفاده شود و در تولید، می‌تواند داده‌های مربوط به تجهیزات را برای پیش‌بینی خرابی‌ها و برنامه‌ریزی تعمیرات جمع‌آوری کند. در کل، معماری رویدادمحور به کسب‌وکارها امکان می‌دهد تا سامانه‌های دیجیتال خود را به شکل انعطاف‌پذیرتر، مقیاس‌پذیرتر و پاسخگوتر طراحی کنند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-event-driven-architecture/">معماری رویدادمحور Event-Driven Architecture چیست؟</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-event-driven-architecture/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ترفندهایی برای کاهش هزینه‌ها در کوبرنتیز</title>
		<link>https://hamravesh.com/blog/kubernetes-cost-optimizat/</link>
					<comments>https://hamravesh.com/blog/kubernetes-cost-optimizat/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Tue, 03 Dec 2024 14:27:23 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3541</guid>

					<description><![CDATA[<p>در این نوشته،‌ انواع هزینه‌های مرتبط با کوبرنتیز را بررسی می‌کنیم و برخی از راهکارهای کلیدی و نکات کاربردی برای بهینه‌سازی و کاهش هزینه کوبرنتیز را مرور می‌کنیم.</p>
<p>The post <a href="https://hamravesh.com/blog/kubernetes-cost-optimizat/">ترفندهایی برای کاهش هزینه‌ها در کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>«کوبرنتیز» (<a href="https://hamravesh.com/blog/what-is-kubernetes/">Kubernetes</a>) حالا به راه‌حل اصلی برای مدیریت و هماهنگی <a href="https://hamravesh.com/blog/what-is-container/">کانتِینرها</a> تبدیل شده است، اما کنترل هزینه‌های آن برای شرکت‌هایی که می‌خواهند هزینه‌های IT خود را بهینه کنند، چالش برانگیز است. در این نوشته،‌ انواع هزینه‌های مرتبط با اجرای کوبرنتیز را بررسی می‌کنیم و برخی از راهکارهای کلیدی و نکات کاربردی برای بهینه‌سازی و کاهش هزینه کوبرنتیز را مرور می‌کنیم.</p>



<h2 class="wp-block-heading" id="h-انواع-هزینه-کوبرنتیز-کدامند">انواع هزینه کوبرنتیز کدامند؟</h2>



<p>در اجرای کوبرنتیز، چند نوع هزینه وجود دارد که باید در نظر بگیرید. این هزینه‌های کوبرنتیز را می‌توان به‌طور کلی به ۳ دسته اصلی تقسیم کرد. این ۳ دسته شامل <strong>پردازش</strong>، <strong>شبکه</strong> و <strong>ذخیره‌سازی</strong> می‌شود که در ادامه هر کدام را شرح می‌دهیم.</p>



<h3 class="wp-block-heading" id="h-هزینه-های-مربوط-به-پردازش-یا-محاسبات-در-کوبرنتیز">هزینه‌های مربوط به پردازش یا محاسبات در کوبرنتیز</h3>



<p>هزینه‌های پردازش معمولاً بخش اصلی صورت‌حساب کوبرنتیز را تشکیل می‌دهند. این هزینه‌ها مربوط به سرورهایی هستند که nodeهای کوبرنتیز شما را اجرا می‌کنند. هر نود در یک کلاستر کوبرنتیز، یک ماشین worker است و هزینه هر ماشین بر اساس ظرفیت CPU و حافظه آن محاسبه می‌شود. هر چه تعداد گره‌ها بیشتر و ظرفیت آن‌ها بزرگتر باشد، هزینه‌های پردازش نیز بالاتر خواهد بود.</p>



<h3 class="wp-block-heading" id="h-هزینه-های-کوبرنتیز-مربوط-به-شبکه">هزینه‌های کوبرنتیز مربوط به شبکه</h3>



<p>در کوبرنتیز، هزینه‌های شبکه مربوط به انتقال داده بین سرویس‌های شما و دنیای خارج و همچنین بین سرویس‌های مختلف درون کلاستر شماست. این هزینه‌های کوبرنتیز می‌توانند به‌سرعت افزایش یابند، به‌خصوص اگر برنامه‌های شما حجم زیادی از داده‌ها را پردازش می‌کنند یا اگر سرویس‌هایی را در مناطق مختلف اجرا می‌کنید.</p>



<h3 class="wp-block-heading" id="h-هزینه-ذخیره-سازی-در-کوبرنتیز">هزینه ذخیره‌سازی در کوبرنتیز</h3>



<p>هزینه‌های ذخیره‌سازی زمانی مطرح می‌شوند که شما از حجم‌های پایدار در کلاستر کوبرنتیز خود استفاده می‌کنید. حجم‌های پایدار برای ذخیره داده‌هایی (مثل فایل‌های پایگاه داده) استفاده می‌شوند که باید پس از ری‌استارت شدن podها حفظ شوند. هزینه این حجم‌ها به اندازه آن‌ها و نوع ذخیره‌سازی که استفاده می‌کنید بستگی دارد.</p>



<h2 class="wp-block-heading" id="h-انباشتگی-هزینه-های-کوبرنتیز-در-تنظیمات-بهینه-نشده">انباشتگی هزینه‌های کوبرنتیز در تنظیمات بهینه‌نشده</h2>



<p>در تنظیمات کوبرنتیز که بهینه نشده‌اند، هزینه‌ها می‌توانند به‌سرعت انباشته شوند. اینجا چند سناریوی رایج را مرور می‌کنیم:</p>



<ul class="wp-block-list">
<li><strong>تخصیص بیش از حد منابع</strong>: اگر nodeهای بیشتر از حد نیاز اجرا می‌کنید یا اگر nodeهای شما بزرگتر از حد نیاز هستند، برای ظرفیت استفاده نشده هزینه پرداخت می‌کنید. این یکی از رایج‌ترین منابع هزینه‌های غیرضروری در کوبرنتیز است.</li>



<li><strong>شبکه‌‌بندی ناکارآمد</strong>: اگر سرویس‌های شما طوری طراحی نشده‌اند که انتقال داده را به حداقل برسانند، ممکن است هزینه‌های شبکه بالایی داشته باشید. این مسئله به‌خصوص زمانی صادق است که داده‌ها را بین regionهای مختلف منتقل می‌کنید، یا سرویس‌های شما پرگفتگو هستند و داده‌های زیادی را مبادله می‌کنند.</li>



<li><strong>volumeهای پایدار استفاده نشده</strong>: volumeهای پایداری که تخصیص داده شده‌اند اما استفاده نمی‌شوند همچنان هزینه دارند. مهم است که به‌طور منظم volumeهای استفاده نشده را بررسی و پاک‌سازی کنید تا از پرداخت هزینه کوبرنتیز برای ذخیره‌سازی که نیاز ندارید جلوگیری شود.</li>
</ul>



<h2 class="wp-block-heading" id="h-استراتژی-های-کلیدی-برای-کاهش-هزینه-های-کوبرنتیز">استراتژی‌های کلیدی برای کاهش هزینه‌های کوبرنتیز</h2>



<p>بهینه‌سازی و کاهش هزینه کوبرنتیز شامل ترکیبی از برنامه‌ریزی استراتژیک و مدیریت مؤثر منابع است. در اینجا استراتژی‌های اصلی که باید در نظر گرفت آمده است:</p>



<ul class="wp-block-list">
<li><strong>نظارت بر هزینه کوبرنتیز برای کاهش آن</strong>: ایجاد یک سیستم قوی برای نظارت بر هزینه‌ها ضروری است. این استراتژی شامل پیگیری مخارج کوبرنتیز برای شناسایی ترندها و مواردی است که می‌توان هزینه‌ها را در آن‌ها بهینه کرد.</li>



<li><strong>محدودیت‌های منابع</strong>: اعمال محدودیت‌های منابع برای کنترل و کاهیش هزینه کوبرنتیز ضروری است. با تعیین حد بالا برای استفاده از منابع، از مصرف بیش از حد منابع توسط هر برنامه یا سرویس جلوگیری می‌کنید و در نتیجه هزینه‌های کلی را بهینه می‌کنید.</li>



<li><strong>مقیاس‌پذیری خودکار</strong>: ترکیب Auto-Scaling افقی و عمودی، تخصیص منابع را با استفاده واقعی هماهنگ می‌کند و اطمینان می‌دهد که فقط برای آنچه نیاز دارید هزینه می‌کنید. این استراتژی برای سازگاری با شرایط بار (load) متغیر بدون تخصیص بیش از حد منابع ضروری است.</li>



<li><strong>استفاده از منابع تخفیف‌دار برای کاهش هزینه کوبرنتیز</strong>: استفاده از ریسورس‌های تخفیف‌دار ارائه‌دهندگان ابری، مانند نمونه‌های موقتی یا رزرو شده، می‌تواند هزینه‌ها را به طور قابل توجهی کاهش دهد. این گزینه‌ها به ویژه برای بارهای کاری انعطاف‌پذیر یا کم‌تر حساس به زمان ارزشمند هستند.</li>



<li><strong>حالت خواب</strong> (<strong>Sleep Mode</strong>): برای محیط‌های غیر تولیدی (non-production)، اجرای حالت‌های خواب در ساعات کم مصرف می‌تواند هزینه‌ها را به شدت کاهش دهد.</li>



<li><strong>استراتژی‌های پاکسازی</strong>: maintenance منظم برای حذف منابع قدیمی یا استفاده نشده، از جمله بارهای کاری، تصاویر و گزارش‌ها، از هزینه‌های بیهوده جلوگیری می‌کند.</li>



<li>اشتراک‌گذاری کلاستر و Multi-Tenancy: با ادغام بارهای کاری در خوشه‌های کمتر و استفاده از Multi-Tenancy (چند-مستأجری) می‌توانید هزینه‌های سربار و مدیریت را کاهش دهید. این رویکرد باید جداسازی مناسب بین مستأجران را برای جلوگیری از مسائل امنیتی و عملکردی تضمین کند.</li>
</ul>



<h2 class="wp-block-heading" id="h-استفاده-از-راهکار-مدیریت-کانتینر-برای-کاهش-هزینه-کوبرنتیز">استفاده از راهکار مدیریت کانتینر برای کاهش هزینه کوبرنتیز</h2>



<p>راهکارهای مدیریت کانتینر، ابزارهایی هستند که فرآیند مدیریت و هماهنگ‌سازی برنامه‌های کانتینری را ساده می‌کنند. این ابزارها می‌توانند به‌طور قابل توجهی به بهینه‌سازی هزینه‌ها در محیط‌های کوبرنتیز کمک کنند. این پلتفرم‌ها ویژگی‌هایی مانند مقیاس‌پذیری خودکار، تخصیص کارآمد منابع و نظارت بر هزینه را ارائه می‌دهند که در بسیاری از پلتفرم‌ها مشترک و برای بهینه‌سازی هزینه بسیار مهم هستند.</p>



<h2 class="wp-block-heading" id="h-نکات-کاربردی-برای-بهینه-سازی-و-کاهش-هزینه-های-کوبرنتیز">نکات کاربردی برای بهینه‌سازی و کاهش هزینه‌های کوبرنتیز</h2>



<p>در اینجا چند نکته کاربردی و بهترین روش‌ها برای بهینه‌سازی و کاهش هزینه در کوبرنتیز آورده شده است.</p>



<ul class="wp-block-list">
<li><strong>نظارت جامع بر هزینه‌ها</strong>: از ابزارهایی مانند <a href="https://hamravesh.com/blog/what-is-prometheus/">پرومتئوس (Prometheus)</a> و Kubecost برای دریافت اطلاعات مالی دقیق استفاده کنید. بررسی منظم این معیارها امکان تنظیم به موقع استراتژی‌های شما را فراهم می‌کند.</li>



<li><strong>اعمال محدودیت‌ها و درخواست‌ها برای منابع</strong>: با استفاده از قابلیت‌های داخلی کوبرنتیز، درخواست‌ها و محدودیت‌های دقیق منابع را برای هر pod تعیین کنید. این کار به استفاده کارآمد از منابع و جلوگیری از هزینه‌های اضافی کمک می‌کند.</li>



<li><strong>استفاده هوشمندانه از مقیاس‌پذیری خودکار</strong> (<strong>Autoscaling</strong>): از «مقیاس‌دهنده افقی پاد و مقیاس‌دهنده عمودی پاد کوبرنتیز» (Horizontal Pod Autoscaler and Vertical Pod Autoscaler) استفاده کنید تا منابع به‌صورت پویا بر اساس نیاز واقعی تنظیم شوند و کارایی هزینه تضمین شود.</li>



<li><strong>بهینه‌سازی با استفاده از منابع ابری تخفیف‌دار</strong>: از تخفیف‌های ارائه‌دهندگان ابری مانند نمونه‌های اسپات AWS برای کارهای قابل وقفه، یا نمونه‌های رزرو شده Azure برای کارهای قابل پیش‌بینی استفاده کنید تا در هزینه‌ها صرفه‌جویی شود.</li>



<li><strong>اجرای روش‌های کارآمد مدیریت منابع</strong>: پاکسازی منظم منابع را انجام دهید، حالت خواب (Sleep Mode) را برای محیط‌های بیکار (Idle) پیاده‌سازی کنید و از فضاهای نام (Namespace) برای جداسازی و مدیریت موثر منابع استفاده کنید.</li>



<li><strong>استفاده از روش‌های اشتراک‌گذاری خوشه و چند مستاجری</strong>: از ابزارهایی مانند فضاهای نام کوبرنتیز و خوشه‌های مجازی (Virtual Cluster) استفاده کنید و استفاده از پلتفرم‌هایی را در نظر بگیرید که استقرار و مدیریت برنامه‌ها روی کوبرنتیز را ساده می‌کنند. این پلتفرم‌ها می‌توانند به ساده‌سازی اشتراک‌گذاری خوشه و چند مستاجری کمک کنند و مدیریت منابع را آسان‌تر کرده و احتمالاً هزینه‌ها را کاهش دهند.</li>



<li><strong>استفاده از زمانبندی و تخصیص منابع پیشرفته</strong>: از ویژگی‌های زمانبندی کوبرنتیز و ابزارهایی مانند Descheduler یا Kube-batch برای مدیریت و بهینه‌سازی بهتر منابع استفاده کنید.</li>
</ul>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="721" height="376" src="https://hamravesh.com/blog/wp-content/uploads/2024/08/Reducing-Kubernetes-Costs.png" alt="کاهش هزینه کوبرنتیز" class="wp-image-3567" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/08/Reducing-Kubernetes-Costs.png 721w, https://hamravesh.com/blog/wp-content/uploads/2024/08/Reducing-Kubernetes-Costs-300x156.png 300w" sizes="auto, (max-width: 721px) 100vw, 721px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>بهینه‌سازی و کاهش هزینه‌های کوبرنتیز برای افزایش کارایی و اثربخشی زیرساخت ابری شما ضروری است. نکات کلیدی این مقاله شامل اهمیت نظارت بر هزینه‌ها با استفاده از ابزارهایی مانند پرومتئوس و Kubecost، اعمال محدودیت‌های منابع و استفاده از Auto-Scaling برای تطبیق استفاده از منابع با نیازهای واقعی است. </p>



<p>علاوه بر این، استفاده از <a href="https://www.qovery.com/blog/kubernetes-cost-optimization-tips-and-best-practises/">راهکارهای مدیریت کانتینر</a>، بهینه‌سازی هزینه را با ارائه ویژگی‌هایی مانند اشتراک‌گذاری منابع، خاموش کردن محیط‌های غیرفعال و استفاده از نمونه‌های مقرون‌به‌صرفه ARM بهبود می‌بخشد. با به‌کارگیری این استراتژی‌ها و بهترین روش‌ها، سازمان‌ها می‌توانند اطمینان حاصل کنند که فقط برای منابع مورد نیاز خود هزینه می‌کنند و بدین ترتیب هزینه‌های کلی را کاهش داده و کارایی عملیاتی را افزایش می‌دهند.</p>
<p>The post <a href="https://hamravesh.com/blog/kubernetes-cost-optimizat/">ترفندهایی برای کاهش هزینه‌ها در کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/kubernetes-cost-optimizat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>نصب گیت در اوبونتو – راهنمای سریع و جامع</title>
		<link>https://hamravesh.com/blog/install-git-on-ubuntu/</link>
					<comments>https://hamravesh.com/blog/install-git-on-ubuntu/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Tue, 19 Nov 2024 09:11:13 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[لینوکس]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3635</guid>

					<description><![CDATA[<p>در این راهنما، به ۲ روش مختلف برای نحوه پیکربندی و نصب گیت در اوبونتو سرور می‌پردازیم.</p>
<p>The post <a href="https://hamravesh.com/blog/install-git-on-ubuntu/">نصب گیت در اوبونتو – راهنمای سریع و جامع</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>در این راهنما، به ۲ روش مختلف برای نحوه پیکربندی و نصب گیت در اوبونتو سرور می‌پردازیم. ابتدا نصب گیت روی اوبونتو از طریق مدیر بسته داخلی سیستم را بررسی می‌کنیم و سپس به نصب گیت در اوبونتو به‌وسیله سورس (کُدِ منبع) خواهیم پرداخت.</p>



<h2 class="wp-block-heading" id="h-مقدمه">مقدمه</h2>



<p>استفاده از سیستم‌های کنترل نسخه مانند گیت (<a href="https://hamravesh.com/blog/10-git-command/">Git</a>)، برای پیاده‌سازی بهترین روش‌های توسعه نرم‌افزارهای مُدرن ضروری است. نسخه‌بندی (Versioning) به ما اجازه می‌دهد تا وضعیت نرم‌افزار خود را در سطح سورس ره‌گیری و پیگیری کنیم. </p>



<p>می‌توانیم تغییرات را دنبال کنیم، به مراحل قبلی برگردیم و شاخه‌های (Branch) جدیدی را برای ایجاد نسخه‌های مختلف از فایل‌ها و پوشه‌ها بسازیم. فایل‌های بسیاری از پروژه‌های نرم‌افزاری در مخازن گیت نگهداری می‌شوند و پلتفرم‌هایی مانند گیت‌هاب، گیت‌لب و بیت‌باکت به اشتراک‌گذاری و همکاری در پروژه‌های توسعه نرم‌افزار کمک می‌کنند.</p>



<h2 class="wp-block-heading" id="h-پیش-نیازهای-نصب-گیت-در-اوبونتو">پیش‌نیازهای نصب گیت در اوبونتو</h2>



<p>برای نصب گیت در اوبونتو ما به سرور اوبونتو با حساب کاربری غیرِ روت (non-root) نیاز داریم که دسترسی سوپریوزر دارد. برای راه‌اندازی این مورد، می‌توان از یک راهنمای تنظیمات اولیه سرور <a href="https://hamravesh.com/blog/install-linux-ubuntu/">لینوکس اوبونتو</a> استفاده کرد.</p>



<h2 class="wp-block-heading" id="h-نصب-گیت-در-اوبونتو-با-پکیج-های-پیش-فرض">نصب گیت در اوبونتو با پکیج‌های پیش‌فرض</h2>



<p>اگر بخواهیم سریعاً گیت را راه‌اندازی کنیم، نسخه پایدار و پرکاربرد را ترجیح می‌دهیم یا به جدیدترین امکانات نیاز نداریم، نصب با بسته‌های پیش‌فرض بهترین گزینه است. اگر به دنبال آخرین نسخه هستید، باید به بخش نصب از طریق سورس بروید تا بتوانید نسخه مورد نظر خود را انتخاب کنید. احتمال دارد گیت از قبل روی سرور اوبونتوی ما نصب شده باشد. می‌توانیم این موضوع را با دستور زیر بررسی کنیم:</p>



<pre class="wp-block-code"><code>git --version</code></pre>



<p>اگر خروجی مشابه زیر دریافت کردیم، یعنی گیت از قبل نصب شده است:</p>



<pre class="wp-block-code"><code>Output
git version 2.25.1</code></pre>



<p>در این صورت، اگر نسخه گیت قدیمی باشد، ممکن است نیاز به بروزرسانی آن داشته باشیم و سپس می‌توانیم به انجام تنظیمات Git بپردازیم که در بخش‌های بعدی این نوشته شرح داده شده است. حالا برای نصب گیت روی اوبونتو، ابتدا با استفاده از ابزارهای مدیریت بسته apt، فهرست بسته‌های محلی خود را به‌روز می‌کنیم:</p>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<p>پس از اتمام بروزرسانی، می‌توانیم نصب گیت در اوبونتو را انجام دهیم:</p>



<pre class="wp-block-code"><code>sudo apt install git</code></pre>



<p>می‌توانیم با اجرای دستور زیر و بررسی خروجی مربوطه، از نصب صحیح گیت اطمینان حاصل کنیم:</p>



<pre class="wp-block-code"><code>git --version</code></pre>



<p>خروجی:</p>



<pre class="wp-block-code"><code>Output
git version 2.45.2</code></pre>



<p>حالا که گیت با موفقیت نصب شده، می‌توانیم به بخش «تنظیمات گیت» در این آموزش مراجعه کنیم تا تنظیمات لازم را انجام بدهیم.</p>



<h2 class="wp-block-heading" id="h-آموزش-نصب-گیت-روی-اوبونتو-از-طریق-سورس">آموزش نصب گیت روی اوبونتو از طریق سورس</h2>



<p>اگر به دنبال روشی انعطاف‌پذیرتر برای نصب گیت هستید، ممکن است بخواهید نرم‌افزار را از سورس کامپایل کنید که در این بخش به آن می‌پردازیم. این روش زمان بیشتری می‌برد و از طریق پکیج منیجر مدیریت نمی‌شود، اما به شما امکان می‌دهد تا آخرین نسخه را دانلود کنید و اگر مایل به سفارشی‌سازی هستید، کنترل بیشتری روی گزینه‌های مورد نظر خواهید داشت. ابتدا نسخه فعلی گیت نصب شده روی سرور را بررسی کنید:</p>



<pre class="wp-block-code"><code>git --version</code></pre>



<p>اگر گیت نصب شده باشد، خروجی مشابه زیر را دریافت خواهید کرد:</p>



<pre class="wp-block-code"><code>Output
git version 2.25.1</code></pre>



<p>قبل از شروع، باید نرم‌افزارهایی را نصب کنید که گیت به آن‌ها وابستگی دارد. همه این‌ها در مخازن پیش‌فرض موجود هستند، پس می‌توانیم فهرست پکیج‌های محلی را به‌روز کرده و سپس بسته‌های مربوطه را نصب کنیم:</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install libz-dev libssl-dev libcurl4-gnutls-dev libexpat1-dev gettext cmake gcc</code></pre>



<p>پس از نصب وابستگی‌های لازم، پوشه‌ای موقت ایجاد کرده و وارد آن شوید. اینجا جایی است که فایل فشرده گیت یا به اصطلاح «tarball» گیت را دانلود خواهیم کرد:</p>



<pre class="wp-block-code"><code>mkdir tmp
cd /tmp</code></pre>



<p>از وب‌سایت پروژه گیت [<a href="https://git-scm.com/">+</a>]، می‌توانیم به صفحه فهرست فایل‌های فشرده موجود در [<a href="https://mirrors.edge.kernel.org/pub/software/scm/git/">+</a>] برویم و نسخه مورد نظرمان را دانلود کنیم. در زمان نگارش این متن، آخرین نسخه ۲.۹.۵ است، پس ما آن را برای نمایش دانلود می‌کنیم. از <code>curl</code> استفاده می‌کنیم و فایل دانلود شده را <code>git.tar.gz</code> می‌نامیم:</p>



<pre class="wp-block-code"><code>curl -o git.tar.gz https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.26.2.tar.gz</code></pre>



<p>فایل را از حالت فشرده خارج می‌کنیم:</p>



<pre class="wp-block-code"><code>tar -zxf git.tar.gz</code></pre>



<p>سپس وارد پوشه جدید گیت می‌شویم:</p>



<pre class="wp-block-code"><code>cd git-*</code></pre>



<p>حالا می‌توانیم پکیج را بسازیم و با تایپ این ۲ دستور آن را نصب کنیم:</p>



<pre class="wp-block-code"><code>make prefix=/usr/local all
sudo make prefix=/usr/local install</code></pre>



<p>اکنون، پراسس shell را جایگزین می‌کنیم تا نسخه گیتی که همین الان نصب کردیم استفاده شود:</p>



<pre class="wp-block-code"><code>exec bash</code></pre>



<p>با تکمیل این مراحل، می‌توانیم با بررسی نسخه، از موفقیت نصب گیت در اوبونتو مطمئن شویم:</p>



<pre class="wp-block-code"><code>git --version</code></pre>



<p>خروجی:</p>



<pre class="wp-block-code"><code>Output
git version 2.26.2</code></pre>



<p>حالا که گیت با موفقیت نصب شده، می‌توانیم تنظیمات مورد نیاز را هم انجام بدهیم.</p>



<h2 class="wp-block-heading" id="h-به-روزرسانی-گیت-در-اوبونتو">به‌روزرسانی گیت در اوبونتو</h2>



<p>قبل از تنظیم گیت، باید اطمینان حاصل کنیم که از آخرین نسخه پایدار استفاده می‌کنیم، چون نسخه‌ها می‌توانند به سرعت قدیمی شوند. برای به‌روزرسانی گیت در اوبونتو، ابتدا فهرست بسته‌های یا همان پکیج‌های خود را بروز می‌کنیم:</p>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<p>حالا گیت را به‌روزرسانی کنید:</p>



<pre class="wp-block-code"><code>sudo apt install git</code></pre>



<p>در نهایت، بررسی کنید که آخرین نسخه پایدار گیت را نصب دارید:</p>



<pre class="wp-block-code"><code>git --version</code></pre>



<h2 class="wp-block-heading" id="h-تنظیمات-گیت-پس-از-نصب-در-اوبونتو">تنظیمات گیت پس از نصب در اوبونتو</h2>



<p>پس از موفقیت در نصب نسخه گیت مورد نظرمان، باید گیت را پیکربندی و کانفیگ کنیم تا کامیت مسیج‌هایی که ایجاد می‌کنیم حاوی اطلاعات صحیح مورد نظر ما باشند فرایند ساخت پروژه نرم‌افزاری ما تا حد امکان تسهیل شود.</p>



<p>پیکربندی را می‌توان با استفاده از دستور <code>git config</code> انجام داد. به‌طور خاص، ما باید نام و آدرس ایمیل خود را ارائه دهیم، زیرا گیت این اطلاعات را در هر کامیتی که انجام می‌دهیم، جاسازی می‌کند. می‌توانیم این اطلاعات را با وارد کردن دستورات زیر اضافه کنیم:</p>



<pre class="wp-block-code"><code>git config --global user.name "Your Name"
git config --global user.email "youremail@domain.com"</code></pre>



<p>می‌توانیم تمام موارد کانفیگ که تنظیم شده‌اند را با تایپ دستور زیر نمایش دهیم:</p>



<pre class="wp-block-code"><code>git config --list</code></pre>



<p>خروجی:</p>



<pre class="wp-block-code"><code>Output
user.name=Your Name
user.email=youremail@domain.com
...</code></pre>



<p>اطلاعاتی که وارد می‌کنیم در فایل پیکربندی گیت ذخیره می‌شود، که می‌توانیم به صورت اختیاری آن را با یک ویرایشگر متن به انتخاب خودمان ویرایش کنیم (ما از نانو استفاده می‌کنیم):</p>



<pre class="wp-block-code"><code>nano ~/.gitconfig</code></pre>



<p>محتوای فایل کانفیگ:</p>



<pre class="wp-block-code"><code>&#91;user]
  name = Your Name
  email = youremail@domain.com</code></pre>



<p>برای خروج از ویرایشگر متن، <code>CTRL</code> و <code>X</code>، سپس <code>Y</code> و در نهایت <code>ENTER</code> را می‌زنیم. گزینه‌های بسیار زیاد دیگری هم وجود دارد که می‌توانیم تنظیم کنیم، اما این ۲ مورد، ضروری‌ترین مواردی هستند که نیاز داریم. اگر این مرحله را نادیده بگیرید، احتمالاً هنگام کامیت در گیت هشدارهایی خواهید دید. این باعث می‌شود کار بیشتری برای شما ایجاد شود، زیرا سپس باید کامیت‌هایی را که انجام داده‌اید با اطلاعات صحیح اصلاح کنید.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>در این مقاله روش‌های مختلف پیکربندی و نصب گیت در اوبونتو سرور را بررسی کردیم و یاد گرفتیم. ۲ روش اصلی نصب شامل استفاده از مدیر بسته داخلی (apt) و نصب از طریق کد منبع (سورس) بود. پس از نصب، بر اهمیت به‌روزرسانی گیت و انجام تنظیمات اولیه مانند تعیین نام و ایمیل کاربر تأکید شد. این مراحل برای استفاده صحیح و کارآمد از گیت در پروژه‌های نرم‌افزاری ضروری هستند و به توسعه‌دهندگان کمک می‌کنند تا از مزایای کامل این سیستم کنترل نسخه بهره‌مند شوند.</p>
<p>The post <a href="https://hamravesh.com/blog/install-git-on-ubuntu/">نصب گیت در اوبونتو – راهنمای سریع و جامع</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/install-git-on-ubuntu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Argo CD چیست‌؟ – تسهیل گیت‌آپس با کوبرنتیز</title>
		<link>https://hamravesh.com/blog/what-is-argocd/</link>
					<comments>https://hamravesh.com/blog/what-is-argocd/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Mon, 11 Nov 2024 11:13:26 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3459</guid>

					<description><![CDATA[<p>argo cd ابزاری برای «استقرار مداوم» (CD) است که به‌طور ویژه برای کوبرنتیز طراحی شده است. در این مقاله با این ابزار بیشتر آشنا خواهیم شد.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-argocd/">Argo CD چیست‌؟ – تسهیل گیت‌آپس با کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Argo CD ابزار قدرتمند استقرار مداوم (<a href="https://hamravesh.com/blog/what-is-ci-cd/">CD</a>) برای <a href="https://hamravesh.com/blog/what-is-kubernetes/">کوبرنتیز</a> است که از رویکرد گیت‌آپس استفاده می‌کند. در این مطلب، ضمن پاسخ به این پرسش که Argo CD چیست توضیح می‌دهیم که چگونه این ابزار فرآیند CI/CD را در محیط‌های کوبرنتیز بهبود می‌بخشد. ما ویژگی‌های کلیدی Argo CD، نحوه عملکرد آن در چارچوب گیت‌آپس و اجزای اصلی این سیستم را مورد بحث قرار خواهیم داد. همچنین، به این موضوع می‌پردازیم که چگونه Argo CD به تسهیل گیت‌آپس در کوبرنتیز کمک می‌کند و مزایای استفاده از آن را در فرآیند توسعه و استقرار نرم‌افزار بررسی خواهیم کرد.</p>



<h2 class="wp-block-heading" id="h-argo-cd-چیست">Argo CD چیست‌؟</h2>



<p>«آرگو سی‌دی» (Argo CD) ابزار «استقرار مداوم» (Continues Integration | CD) محسوب می‌شود که به‌طور ویژه برای کوبرنتیز طراحی شده است. برخلاف ابزارهای استقرار مداوم خارجی که تنها از روش‌های استقرار مبتنی بر فشار (Push-Based) استفاده می‌کنند، Argo CD می‌تواند کدهای به‌روزشده را مستقیماً از مخازن گیت (<a href="https://hamravesh.com/blog/10-git-command/">Git</a>) دریافت کرده و آن‌ها را روی منابع کوبرنتیز مستقر کند. این ویژگی به توسعه‌دهندگان امکان می‌دهد تا هم پیکربندی زیرساخت و هم به‌روزرسانی‌های نرم‌افزار را در یک سیستم واحد مدیریت کنند. Argo CD ویژگی‌ها و قابلیت‌های کلیدی زیر را ارائه می‌دهد:</p>



<ul class="wp-block-list">
<li>استقرار دستی یا خودکار برنامه‌ها روی خوشهٔ کوبرنتیز</li>



<li>همگام‌سازی خودکار وضعیت برنامه با آخرین نسخهٔ پیکربندی اعلامی</li>



<li>رابط کاربری تحت وب و رابط خط فرمان (CLI)</li>



<li>توانایی نمایش مشکلات استقرار، تشخیص و رفع ناهماهنگی‌های پیکربندی</li>



<li>کنترل دسترسی مبتنی بر نقش (RBAC) که امکان مدیریت چند خوشه را فراهم می‌کند.</li>



<li>ورود یکپارچه (SSO) با ارائه‌دهندگانی مانند گیت‌لب، گیت‌هاب، مایکروسافت، OAuth2 ،OIDC، لینکدین، LDAP و SAML 2.0</li>



<li>پشتیبانی از وب‌هوک‌ها برای راه‌اندازی اقدامات در گیت‌لب، گیت‌هاب و بیت‌باکت.</li>
</ul>



<p>این ویژگی‌ها به کاربران اجازه می‌دهند تا فرآیند استقرار و مدیریت برنامه‌های خود را در محیط کوبرنتیز به شکلی کارآمد و انعطاف‌پذیر انجام دهند.</p>



<h2 class="wp-block-heading" id="h-گیت-آپس-با-argo-cd-چیست">گیت‌آپس با Argo CD چیست؟</h2>



<p>گیت‌آپس (GitOps) یک روش مهندسی نرم‌افزار است که از مخزن گیت به‌عنوان تنها منبع حقیقت استفاده می‌کند. در این روش، تیم‌ها پیکربندی‌های اعلامی را در گیت ثبت می‌کنند و از این پیکربندی‌ها برای ایجاد محیط‌های مورد نیاز در فرآیند تحویل مداوم استفاده می‌شود. در گیت‌آپس، هیچ تنظیم دستی محیط یا استفاده از اسکریپت‌های مجزا وجود ندارد، همه چیز از طریق مخزن گیت تعریف می‌شود.</p>



<p>یکی از بخش‌های اساسی فرآیند گیت‌آپس، درخواست ادغام (Pull Request) است. نسخه‌های جدید پیکربندی از طریق درخواست ادغام معرفی می‌شوند، با شاخهٔ اصلی در مخزن گیت ترکیب می‌شوند و سپس نسخهٔ جدید به‌طور خودکار مستقر می‌شود. مخزن گیت شامل سابقهٔ کاملی از تمام تغییرات، از جمله تمام جزئیات محیط در هر مرحله از فرآیند است.</p>



<p>آرگو سی‌دی مراحل پایانی فرآیند گیت‌آپس را مدیریت می‌کند و اطمینان حاصل می‌کند که پیکربندی‌های جدید به‌درستی روی خوشهٔ کوبرنتیز مستقر می‌شوند. به‌طور کلی، فرآیند Argo CD به این صورت عمل می‌کند:</p>



<ul class="wp-block-list">
<li>یک توسعه‌دهنده تغییراتی در برنامه ایجاد می‌کند و نسخهٔ جدیدی از تعاریف منابع کوبرنتیز را به مخزن گیت ارسال می‌کند.</li>



<li>یکپارچه‌سازی مداوم (Continuous Integration | CI) فعال می‌شود که منجر به ذخیرهٔ تصویر کانتینر جدید در یک مخزن می‌گردد.</li>



<li>توسعه‌دهنده درخواست ادغام (Pull Request) را صادر می‌کند که شامل تغییرات در مانیفست‌های کوبرنتیز است. این مانیفست‌ها می‌توانند به صورت دستی یا خودکار ایجاد شده باشند.</li>



<li>درخواست ادغام بررسی شده و تغییرات با شاخهٔ اصلی ترکیب می‌شوند. این عمل یک وب‌هوک را فعال می‌کند که به Argo CD اطلاع می‌دهد تغییری ایجاد شده است.</li>



<li>آرگو سی‌دی مخزن را کلون و وضعیت برنامه را با وضعیت فعلی خوشهٔ کوبرنتیز مقایسه می‌کند. سپس تغییرات لازم را در پیکربندی خوشه اعمال می‌کند.</li>



<li>کوبرنتیز از کنترلِرهای خود استفاده می‌کند تا تغییرات مورد نیاز در منابع خوشه را اعمال کند، تا زمانی که به پیکربندی مطلوب برسد.</li>



<li>Argo CD پیشرفت کار را نظارت می‌کند و زمانی که خوشهٔ کوبرنتیز آماده شد، گزارش می‌دهد که برنامه همگام شده است.</li>



<li>آرگو سی‌دی همچنین در جهت مخالف نیز کار می‌کند، یعنی تغییرات در خوشهٔ کوبرنتیز را نظارت می‌کند و اگر با پیکربندی فعلی در گیت مطابقت نداشته باشند، آن‌ها را نادیده می‌گیرد.</li>
</ul>



<h3 class="wp-block-heading" id="h-argo-cd-چطور-به-تسهیل-گیت-آپس-با-کوبرنتیز-کمک-می-کند">Argo CD چطور به تسهیل گیت‌آپس با کوبرنتیز کمک می‌کند؟</h3>



<ul class="wp-block-list">
<li><strong>عامل گیت‌آپس</strong> (<strong>GitOps Agent</strong>): Argo CD مسئول دریافت کدهای به‌روزشده از مخازن گیت و استقرار مستقیم آن‌ها روی منابع کوبرنتیز است. این ابزار هم پیکربندی زیرساخت و هم به‌روزرسانی‌های برنامه را در سیستمی واحد مدیریت می‌کند.</li>



<li><strong>تعاریف منابع سفارشی</strong> (<strong>CRD</strong> | <strong>Custom Resource Definitions</strong>): آرگو سی‌دی در فضای نام اختصاصی خود درون خوشهٔ کوبرنتیز فعالیت می‌کند. این ابزار CRDهای خاص خود را ارائه می‌دهد که API کوبرنتیز را گسترش داده و امکان تعریف وضعیت مطلوب برنامه را به شکلی اعلامی (Declarative) فراهم می‌کند. Argo CD بر اساس دستورالعمل‌های موجود در مخزن گیت یا مخزن Helm، از CRDهای خود برای اعمال تغییرات در فضای نام اختصاصی‌اش استفاده می‌کند.</li>



<li><strong>رابط خط فرمان</strong> (<strong>CLI</strong>): آرگو سی‌دی CLI قدرتمندی ارائه می‌دهد که شما را قادر می‌سازد با چند دستور ساده، تعاریف منابع YAML را ایجاد کنید. برای مثال، دستور <code>Argo CD app create</code> به شما اجازه می‌دهد با مشخص کردن چند پرچم، یک شیء Application معتبر ایجاد کنید که برنامهٔ شما را بدون نیاز به نوشتن دستی YAML توصیف می‌کند.</li>



<li><strong>رابط کاربری</strong>: Argo CD در این زمینه منحصر به فرد است که یک رابط کاربری تحت وب راحت ارائه می‌دهد که به شما امکان می‌دهد همان کار را انجام دهید، یعنی برنامه را تعریف کنید و از آرگو سی‌دی بخواهید پیکربندی‌های YAML مربوطه را ایجاد کند. همچنین به شما امکان می‌دهد پیکربندی کوبرنتیز حاصل را از نظر پادها و کانتینرها مشاهده کنید. اگرچه برخی ممکن است فکر کنند استفاده از رابط کاربری «گیت‌اپس واقعی» نیست، این درست نیست، زیرا رابط کاربری برای کنترل مستقیم خوشه استفاده نمی‌شود، بلکه فقط راهی آسان‌تر برای ایجاد پیکربندی اعلامی است.</li>



<li><strong>چند مستأجری</strong> (<strong>Multi-tenancy</strong>): آرگو سی‌دی از همکاری چندین تیم روی پروژه‌های مختلف در یک محیط کوبرنتیز به خوبی پشتیبانی می‌کند. CRDهای Argo CD می‌توانند محدود شوند تا فقط مخازن منبع متعلق به یک پروژهٔ خاص را بخوانند و می‌توانند طوری تنظیم شوند که برنامه‌ها را در خوشه و فضای نام خاصی مستقر کنند. هر نمونه CRD همچنین می‌تواند تنظیمات کنترل دسترسی مبتنی بر نقش (RBAC) خاص خود را داشته باشد.</li>



<li><strong>بهره‌گیری از ابزارهای موجود</strong>: بسیاری از سازمان‌ها قبلاً در پیکربندی‌های اعلامی مبتنی بر YAML، چارت‌های Helm ،Kustomize یا سایر سیستم‌ها سرمایه‌گذاری کرده‌اند. Argo CD هدفش استفاده از این سرمایه‌گذاری‌های موجود است، نه جایگزینی آن‌ها. این ابزار می‌تواند از هر یک از این فرمت‌ها برای ایجاد خودکار تعاریف CRD مربوطه استفاده کند.</li>
</ul>



<h2 class="wp-block-heading" id="h-argo-cd-چطور-کار-می-کند">Argo CD چطور کار می‌کند؟</h2>



<p>هنگام استفاده از Argo CD، می‌توانید پیکربندی برنامه را با استفاده از چندین نوع مانیفست کوبرنتیز مشخص کنید، از جمله:</p>



<ul class="wp-block-list">
<li>مانیفست‌های ساده YAML یا JSON</li>



<li>چارت‌های Helm</li>



<li>Kustomize</li>



<li>برنامه‌های Ksonnet و Jsonnet</li>
</ul>



<p>همچنین امکان استفاده از هر ابزار مدیریت پیکربندی سفارشی به‌عنوان یک افزونه نیز وجود دارد. Argo CD به‌طور خودکار وضعیت مطلوب یک برنامه را در محیط هدفِ مشخص‌شده مستقر می‌کند. به‌روزرسانی‌ها از طریق برچسب‌ها (Tags)، شاخه‌ها (Branches)، یا نسخه‌های خاص ثابت‌شده (Pinned Specific Versions) یک مانیفست در کامیت‌های گیت قابل ردیابی هستند.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="512" height="488" src="https://hamravesh.com/blog/wp-content/uploads/2024/07/image-3.png" alt="نحوه کار Argo CD چیست" class="wp-image-3460" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/07/image-3.png 512w, https://hamravesh.com/blog/wp-content/uploads/2024/07/image-3-300x286.png 300w" sizes="auto, (max-width: 512px) 100vw, 512px" /><figcaption class="wp-element-caption">منبع تصویر [<a href="https://argo-cd.readthedocs.io/en/stable/assets/argocd_architecture.png">+</a>] </figcaption></figure>
</div>


<p>آرگو سی‌دی یک کنترلر کوبرنتیز است که وظیفهٔ نظارت مداوم بر تمام برنامه‌های در حال اجرا را بر عهده دارد. این ابزار، وضعیت فعلی برنامه‌ها را با وضعیت مطلوبی که در مخزن گیت تعریف شده، مقایسه می‌کند. اگر وضعیت فعلی یک برنامهٔ مستقر شده با وضعیت مطلوب آن تفاوت داشته باشد، Argo CD آن را به عنوان «ناهمگام» (OutOfSync) شناسایی می‌کند.</p>



<p>آرگو سی‌دی این تفاوت‌ها را گزارش می‌دهد و با ارائهٔ نمایش‌های بصری، به توسعه‌دهندگان کمک می‌کند تا وضعیت فعلی را به صورت دستی یا خودکار با وضعیت مطلوب هماهنگ کنند. این ابزار قادر است هر تغییری که در وضعیت مطلوب (در مخزن گیت) ایجاد شود را به طور خودکار در محیط هدف اعمال کند. این قابلیت تضمین می‌کند که برنامه‌ها همواره در حالت همگام باقی بمانند.</p>



<h3 class="wp-block-heading" id="h-اجزای-اساسی-argo-cd-چیست">اجزای اساسی Argo CD چیست؟</h3>



<p>در ادامه هر یک از اجزای اساسی Argo CD را معرفی می‌کنیم و آن‌ها را شرح می‌دهیم.</p>



<h4 class="wp-block-heading" id="h-api-در-argo-cd-چیست">API در Argo CD چیست؟</h4>



<p>این سرویس، یک سرور API از نوع gRPC/REST است که رابط برنامه‌نویسی را برای اجزایی مانند رابط خط فرمان و رابط کاربری وب فراهم می‌کند. وظایف اصلی این سرویس عبارتند از:</p>



<ul class="wp-block-list">
<li>مدیریت برنامه‌ها و گزارش وضعیت آن‌ها</li>



<li>اجرای عملیات‌های برنامه مانند اقدامات تعیین‌شده توسط کاربر، همگام‌سازی و بازگشت به نسخه‌های قبلی</li>



<li>مدیریت اعتبارنامه‌های خوشه و مخزن که به صورت اسرار کوبرنتیز ذخیره می‌شوند</li>



<li>احراز هویت و واگذاری مجوز به ارائه‌دهندگان هویت شخص ثالث</li>



<li>اعمال سیاست‌های کنترل دسترسی مبتنی بر نقش (RBAC)</li>



<li>دریافت و ارسال رویدادهای وب‌هوک گیت</li>
</ul>



<h4 class="wp-block-heading" id="h-سرویس-مخزن-در-argo-cd">سرویس مخزن در Argo CD</h4>



<p>این سرویس داخلی، مخزن گیت را به صورت محلی در حافظه پنهان ذخیره می‌کند و مانیفست‌های برنامه را نگهداری می‌کند. سرویس مخزن، مانیفست‌های کوبرنتیز را تولید می‌کند و بر اساس ورودی‌هایی مانند آدرس مخزن، مسیر برنامه، نسخه‌ها (مانند کامیت‌ها، برچسب‌ها، شاخه‌ها) و تنظیمات خاص قالب (مانند مقادیر Helm، محیط‌های Ksonnet، پارامترها) آن‌ها را برمی‌گرداند.</p>



<h4 class="wp-block-heading" id="h-کنترلر-برنامه">کنترلر برنامه</h4>



<p>این جزء، یک کنترلر کوبرنتیز است که به‌طور مداوم برنامه‌ها را نظارت می‌کند و وضعیت هدف مشخص‌شده در مخزن گیت را با وضعیت فعلی هر برنامه مقایسه می‌کند. کنترلر برنامه‌ها تشخیص می‌دهد که چه زمانی یک برنامه ناهمگام است و در صورت مشخص شدن، می‌تواند اصلاحات را اعمال کند. این کنترلر همچنین قلاب‌هایی را که توسط کاربر برای رویدادهای چرخه حیات برنامه (مانند قبل از همگام‌سازی، همگام‌سازی و پس از همگام‌سازی) تعریف شده‌اند، فراخوانی می‌کند.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>آرگو سی‌دی (Argo CD) یک ابزار قدرتمند استقرار مداوم برای کوبرنتیز است که با استفاده از رویکرد گیت‌آپس، فرآیند مدیریت و استقرار برنامه‌ها را بهبود می‌بخشد. این ابزار با ارائه ویژگی‌هایی مانند همگام‌سازی خودکار، رابط کاربری تحت وب، کنترل دسترسی مبتنی بر نقش و پشتیبانی از انواع مختلف مانیفست‌ها، به توسعه‌دهندگان امکان می‌دهد تا پیکربندی زیرساخت و به‌روزرسانی‌های نرم‌افزار را در یک سیستم واحد مدیریت کنند. </p>



<p>آرگو سی‌دی با استفاده از اجزای کلیدی خود مانند API، سرویس مخزن و کنترلر برنامه، اطمینان حاصل می‌کند که وضعیت برنامه‌ها همواره با آخرین نسخه پیکربندی در مخزن گیت همگام باشد. این رویکرد نه تنها فرآیند استقرار را ساده‌تر می‌کند، بلکه قابلیت ردیابی، امنیت و ثبات بیشتری را در محیط‌های کوبرنتیز فراهم می‌آورد.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-argocd/">Argo CD چیست‌؟ – تسهیل گیت‌آپس با کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-argocd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>تفاوت داکر سوارم و کوبرنتیز – Docker Swarm vs Kubernetes</title>
		<link>https://hamravesh.com/blog/docker-swarm-vs-kubernetes/</link>
					<comments>https://hamravesh.com/blog/docker-swarm-vs-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Wed, 30 Oct 2024 10:34:27 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3740</guid>

					<description><![CDATA[<p>داکر سوارم و کوبرنتیز دو ابزار محبوب برای ارکستریشن کانتینرها هستند. در این بلاگ‌پست این دو  تکنولو‌ژی را باهم مقایسه می‌کنیم و به نقاط قوت و ضعفشان می‌پردازیم.</p>
<p>The post <a href="https://hamravesh.com/blog/docker-swarm-vs-kubernetes/">تفاوت داکر سوارم و کوبرنتیز – Docker Swarm vs Kubernetes</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>تفاوت داکر سوارم و کوبرنتیز چیست و کدامیک از این ابزارهای هماهنگ‌سازی Container برای ما مناسب‌تر است؟ در دنیای امروزی که مدیریت خودکار مایکروسرویس‌ها در توسعه اپلیکیشن‌ها بیش از هر زمان دیگری اهمیت پیدا کرده، هماهنگ‌سازیِ بارِ کاری (Workload Orchestration) امری بسیار حیاتی است. اما در مورد اینکه آیا Docker Swarm برای این <a href="https://hamravesh.com/blog/what-is-orchestration/">ارکستریشن</a> مناسب‌تر است یا Kubernetes، بحث و جدل زیادی وجود دارد. بنابراین در این مطلب می‌خواهیم شباهت‌ها و تفاوت‌های داکر سوارم و کوبرنتیز را بررسی کنیم و ببینیم کدام یک برای محیط ما مناسب‌تر است.</p>



<h2 class="wp-block-heading" id="h-کانتینر-container-چیست">کانتینر Container چیست؟</h2>



<p>در یک کلام <a href="https://hamravesh.com/blog/what-is-container/">کانتینرها</a>، روشی استاندارد برای بسته‌بندی (پکیج کردن) برنامه‌ها و همه وابستگی‌های (Dependency) آن‌ها هستند تا بتوانید برنامه‌ها را بدون مشکل بین محیط‌های Runtime منتقل کنید. با بسته‌بندی کُدهای برنامه، وابستگی‌ها و پیکربندی‌ها (Configuration) در یک بلوک ساختاری که به سادگی قابل استفاده است، کانتینرها به شما کمک می‌کنند گام‌های مهمی برای کاهش زمان استقرار و بهبود قابلیت اطمینان برنامه بردارید.</p>



<p>در برنامه‌های سازمانی، تعداد کانتینرها می‌تواند به سرعت به حدی غیرقابل مدیریت برسد. برای استفاده موثرتر از کانتینرهای خود، نیاز داریم برنامه‌های کانتینری خود را هماهنگ‌سازی (Orchestrate) کنیم و این جاست که <a href="https://hamravesh.com/blog/what-is-kubernetes/">Kubernetes</a> و Docker Swarm مورد استفاده قرار می‌گیرند و بحث استفاده از آن‌ها مطرح می‌شود.</p>



<h2 class="wp-block-heading" id="h-کوبرنتیز-kubernetes-چیست">کوبرنتیز Kubernetes چیست؟</h2>



<p>کوبرنتیز پلتفرمی سیار و متن‌باز برای مدیریت کانتینرها، بارهای کاری پیچیده در تولید و مدیریت انطباق‌پذیری کانتینرها است. با Kubernetes، توسعه‌دهندگان و تیم‌های دواپس می‌توانند برنامه‌های با دسترسی بالا را با استفاده از انعطاف‌پذیری کلاسترها، برنامه‌ریزی، مستقر، مدیریت و کشف کنند. یک کلاستر کوبرنتیز متشکل از میزبان‌های محاسباتی به نام «Worker Node» (گره‌های کارگزار) است. این Worker Nodeها توسط یک Master کوبرنتیز مدیریت می‌شوند که همه منابع در خوشه را کنترل و پایش می‌کند. یک Node می‌تواند ماشین مجازی (VM) یا ماشین فیزیکی باشد.</p>



<p>در ابتدای ظهور کوبرنتیز، اعضای کامیونیتی برای بهره‌برداری از کوبرنتیز از دانش خود در ایجاد و اجرای ابزارهای داخلی مانند Borg و Omega (دو سیستم مدیریت خوشه‌ها) استفاده کردند. با ظهور بنیاد محاسبات ابری (<a href="https://hamravesh.com/blog/what-is-cncf/">CNCF</a>) و در همکاری با بنیاد لینوکس، کامیونیتی، حکمرانیِ باز (Open Governance) را برای کوبرنتیز اتخاذ شد، مجموعه‌ای از قوانین برای خوشه‌های کوبرنتیز که به تیم‌ها کمک می‌کند تا در مقیاس بزرگ عمل کنند. IBM، به عنوان عضو بنیانگذار CNCF، به‌طور فعال در پروژه‌های متن‌باز CNCF همانند سایر شرکت‌ها مانند گوگل، Red Hat، مایکروسافت و آمازون مشارکت می‌کند.</p>



<h2 class="wp-block-heading" id="h-مزایای-کوبرنتیز-چیست">مزایای کوبرنتیز چیست؟</h2>



<ul class="wp-block-list">
<li>کوبرنتیز مجموعه گسترده‌ای از ویژگی‌های کلیدی را ارائه می‌دهد. از جمله: «کشف سرویس» (Service Discovery)، «ingress» و «لود بالانسینگ»، «خود-درمانی» (Self-Healing)، «Storage Orchestration»، «انطباق افقی» (Horizontal Scaling)، «استقرارها/بازگشت‌های خودکار» (automated rollouts/rollbacks) و «اجرای دسته‌ای» (Batch Execution).</li>



<li>سیستم کوبرنتیز دارای مجموعه‌ای متحد از API‌ها و گارانتی‌های قوی در مورد وضعیت خوشه است.</li>



<li>کوبرنتیز دارای <a href="https://kubernetes.io/community/">کامیونیتی اوپن‌سورسی</a> است که به‌طور فعال در حال توسعه کدبِیس هستند.</li>



<li>کنفرانس‌های به سرعت در حال رشد به نام KubeCon در طول سال، بینش‌های کاربران را انعکاس می‌دهند.</li>



<li>کوبرنتیز بیش‌ترین میزان استفاده را در بازار از آن خود کرده است.</li>



<li>کوبرنتیز توسط بازیگران بزرگی مثل گوگل و IBM در عمل امتحانش را پس داده است و روی اکثر سیستم‌عامل‌ها هم اجرا می‌شود.</li>



<li>در ابرهای عمومی (مثل AWS یا Azure) در دسترس است و همچنین برای استفاده در سرورهای خصوصی هم می‌توان از آن استفاده کرد. همچنین از سوی ارائه‌دهندگان ابری بزرگ هم به صورت مدیریت شده و هم به صورت خام ارائه قابل دسترسی است.</li>



<li>همچنین از پشتیبانی گسترده‌ای از اکوسیستم ابزارهای ابری مانند Sysdig ،LogDNA و Portworx (در میان بسیاری دیگر) برخوردار است.</li>
</ul>



<h2 class="wp-block-heading" id="h-چالش-های-استفاده-از-کوبرنتیز">چالش‌های استفاده از کوبرنتیز</h2>



<p>استفاده از Kubernetes چالش‌های خاص خود را دارد که در ادامه به آن‌ها اشاره شده است.</p>



<ul class="wp-block-list">
<li>یادگیری آن نیاز به تلاش زیادی دارد و مدیریت Kubernetes نیازمند دانش تخصصی است.</li>



<li>به‌روزرسانی‌های جامعه متن‌باز به طور مداوم اتفاق می‌افتد و نیاز به پچ کردن دقیق دارد تا از اختلال در بارهای کاری جلوگیری شود.</li>



<li>برای توسعه‌دهندگانِ فردی و برای برنامه‌های ساده و استقرارهای کوچک مناسب نیست و بسیار سنگین است.</li>



<li>تیم‌ها معمولاً به ابزارهای اضافی (مانند رابطِ خط فرمانِ kubectl)، خدمات، جریان‌های کاری CI/CD و سایر روش‌های DevOps نیاز دارند تا به‌طور کامل بتوانند بر دسترسی، هویت، حاکمیت و امنیت مدیریت کنند.</li>
</ul>



<h2 class="wp-block-heading" id="h-داکر-سوارم-docker-swarm-چیست">داکر سوارم Docker Swarm چیست؟</h2>



<p>داکر سوارم هم پلتفرم متن‌باز دیگری برای هماهنگ‌سازی کانتِینرها به‌حساب می‌آید که مدت‌هاست وجود دارد. Swarm یا به بیان دقیق‌تر، «حالت خوشه» (Swarm Mode)، پشتیبانی درونی داکر برای هماهنگ‌سازی خوشه‌های موتورهای داکر به حساب می‌آید. یک خوشه Swarm متشکل از گره‌های مدیریت کننده Docker Engine (که خوشه را هماهنگ و مدیریت می‌کنند) و Nodeهای Worker (که به دستور Nodeهای مدیریت کننده&amp; وظایف را اجرا می‌کنند) است.</p>



<h3 class="wp-block-heading" id="h-مزایای-docker-swarm">مزایای Docker Swarm</h3>



<p>استفاده از Docker Swarm به چند دلیل مزیت دارد:</p>



<ul class="wp-block-list">
<li>اول اینکه داکر پلتفرم کانتینری رایجی برای ساخت و استقرار برنامه‌های کانتینری است. Swarm هم برای استفاده با موتور داکر ساخته شده است و بخشی از پلتفرمی آشنا برای اکثر تیم‌هاست.</li>



<li>نصب و راه‌اندازی آن برای محیط Docker آسان است.</li>



<li>ابزارها، خدمات و نرم‌افزارهایی که با کانتینرهای داکر اجرا می‌شوند، با Swarm هم به خوبی کار می‌کنند.</li>



<li>داکر Swarm دارای API خاص خودش است.</li>



<li>داکر سوارم با ابزارهای Docker مانند Docker Compose و رابط خط فرمانِ داکر یکپارچگی خوبی دارد، چون از همان رابط خط فرمان (CLI) موتور داکر استفاده می‌کند.</li>



<li>همچنین از یک سیستم فیلترینگ و زمان‌بندی استفاده می‌کند تا Nodeهای بهینه را برای استقرار کانتینرها در خوشه انتخاب کند.</li>
</ul>



<h3 class="wp-block-heading" id="h-چالش-ها-و-مشکلات-داکر-سوارم">چالش‌ها و مشکلات داکر سوارم</h3>



<ul class="wp-block-list">
<li>Swarm گزینه‌های سفارشی و افزونه‌های محدودی دارد.</li>



<li>از نظر عملکردی اندکی ضعیف است و قابلیت‌های اتوماسیون کمتری نسبت به Kubernetes دارد.</li>



<li>در یک پایپلاین دواپس، جدا کردن بارهای کاری توسعه-آزمایش-تولید (Dev-Test-Prod) به راحتی امکان‌پذیر نیست.</li>
</ul>



<p>البته برای جلوگیری از ایجاد ابهام، باید گفت که Docker Enterprise Edition اکنون پشتیبانی از Kubernetes را هم ارائه می‌دهد.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="600" height="331" src="https://hamravesh.com/blog/wp-content/uploads/2024/09/image.png" alt="تفاوت داکر سوارم و کوبرنتیز – Docker Swarm vs Kubernetes" class="wp-image-3751" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/09/image.png 600w, https://hamravesh.com/blog/wp-content/uploads/2024/09/image-300x166.png 300w" sizes="auto, (max-width: 600px) 100vw, 600px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-تفاوت-داکر-سوارم-و-کوبرنتیز">تفاوت داکر سوارم و کوبرنتیز</h2>



<p>حالا که مزایا و چالش‌های هر کدام را بررسی کردیم، بیایید راجع به تفاوت‌ها و شباهت‌های بین Kubernetes و Docker Swarm توضیح بدهیم. هر دوی این پلتفرم‌ها به شما امکان مدیریت کانتینرها و مقیاس‌دهی استقرار برنامه‌ها را می‌دهند. تفاوت‌های آن‌ها به بحث پیچیدگی مربوط می‌شود. کوبرنتیز روشی کارآمد برای مدیریت کانتینرها فراهم می‌کند که برای برنامه‌های پرتقاضا با پیکربندی پیچیده عالی است، در حالی که Docker Swarm برای سهولت استفاده طراحی شده است و انتخاب خوبی برای برنامه‌های ساده محسوب می‌شود که سریع استقرار داده می‌شوند و مدیریت آسانی دارند.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="450" height="450" src="https://hamravesh.com/blog/wp-content/uploads/2024/09/Docker-Swarm-vs-Kubernetes.png" alt="مقایسه داکر سوارم و کوبرنتیز" class="wp-image-3753" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/09/Docker-Swarm-vs-Kubernetes.png 450w, https://hamravesh.com/blog/wp-content/uploads/2024/09/Docker-Swarm-vs-Kubernetes-300x300.png 300w, https://hamravesh.com/blog/wp-content/uploads/2024/09/Docker-Swarm-vs-Kubernetes-150x150.png 150w, https://hamravesh.com/blog/wp-content/uploads/2024/09/Docker-Swarm-vs-Kubernetes-250x250.png 250w, https://hamravesh.com/blog/wp-content/uploads/2024/09/Docker-Swarm-vs-Kubernetes-100x100.png 100w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>
</div>


<p>در ادامه با جزئیات بیشتری به شرح تفاوت و مقایسه داکر سوارم و کوبرنتیز پرداخته شده است.</p>



<h3 class="wp-block-heading" id="h-تفاوت-داکر-سوارم-و-کوبرنتیز-در-نصب-و-راه-اندازی">تفاوت داکر سوارم و کوبرنتیز در نصب و راه‌اندازی</h3>



<p>به دلیل پیچیدگی کوبرنتیز، Docker Swarm برای نصب و پیکربندی ساده‌تر است.</p>



<ul class="wp-block-list">
<li><strong>Kubernetes:</strong> نصب دستی ممکن است برای هر سیستم عامل متفاوت باشد. برای ارائه‌دهندگان ابری، نیازی به نصب وجود ندارد.</li>



<li><strong>Swarm:</strong> نصب آن با داکر ساده است و Instanceها معمولاً در سیستم‌عامل‌ها منسجم و یکپارچه هستند.</li>
</ul>



<h3 class="wp-block-heading" id="h-مفایسه-داکر-سوارم-و-کوبرنتیز-از-نظر-انطباق-پذیری-scalability">مفایسه داکر سوارم و کوبرنتیز از نظر انطباق‌پذیری (Scalability)</h3>



<p>کوبرنتیز امکان انطباق‌پذیری و قابلیت ارتقای همه‌کاره (All in One) بر اساس ترافیک را ارائه می‌دهد، در حالی که داکر سوارم بر انطباق‌پذیری سریع متمرکز است.</p>



<ul class="wp-block-list">
<li><strong>کوبرنتیز</strong>: انطباق‌پذیری و قابلیت ارتقای خودکار افقی به صورت تعبیه شده و داخلی وجود دارد.</li>



<li><strong>سوارم</strong>: قابلیت انطباق‌پذیری خودکار در صورت تقاضا (On Demand) را ارائه می‌دهد.</li>
</ul>



<h3 class="wp-block-heading" id="h-تفاوت-داکر-سوارم-و-کوبرنتیز-در-لود-بالانسینگ">تفاوت داکر سوارم و کوبرنتیز در لود بالانسینگ</h3>



<p>داکر سوارم دارای لود بالانسینگ خودکار است، در حالی که کوبرنتیز این قابلیت را ندارد. البته، می‌توان لودبالانسر خارجی را به راحتی از طریق ابزارهای شخص ثالث در کوبرنتیز تعبیه و اضافه کرد.</p>



<ul class="wp-block-list">
<li><strong>کوبرنتیز</strong>: کشف سرویس‌ها از طریق تنها یک نام DNS فعال می‌شود. کوبرنتیز از طریق یک آدرس IP یا مسیر HTTP به اپلیکیشن‌های کانتینری دسترسی دارد.</li>



<li><strong>سوارم</strong>: دارای لودبالانسرهای داخلی است.</li>
</ul>



<h3 class="wp-block-heading" id="h-مقایسه-docker-swarm-و-kubernetes-از-نظر-دسترس-پذیری-زیاد">مقایسه Docker Swarm و Kubernetes از نظر دسترس‌پذیری زیاد</h3>



<p>هر دوی این ابزارهای هماهنگ‌سازی، قابلیت دسترسی بالایی را ارائه می‌دهند.</p>



<ul class="wp-block-list">
<li><strong>کوبرنتیز</strong>: به‌وسیله دور کردن ترافیک از podهای ناسالم، کوبرنتیز خود-درمانی می‌کند. کوبرنتیز قابلیت زمان‌بندی هوشمند و دسترس‌پذیری بالای سرویس‌ها را از طریق همانند‌سازی (Replication) انجام می‌دهد.</li>



<li><strong>سوارم</strong>: منیجرهای سوارم، کنترل دسترس‌پذیری را ارائه می‌دهند و مایکروسرویس‌ها می‌توانند به راحتی همانندسازی شوند.</li>
</ul>



<h2 class="wp-block-heading" id="h-کدام-یک-برای-من-بهتر-است-کوبرنتیز-یا-داکر-سوارم">کدام‌یک برای من بهتر است؟ کوبرنتیز یا داکر سوارم؟</h2>



<p>کدام ابزار ارکستراسیون کانتینر برای شما مناسب‌تر است؟ مانند بیشتر تصمیم‌گیری‌های پلتفرمی، ابزار مناسب بستگی به نیازهای سازمان شما دارد. کوبرنیتیز به دلیل پذیرش گسترده و کامیونیتی بزرگی که دارد، محبوب است. همه ارائه‌دهندگان بزرگ ابری از آن پشتیبانی می‌کنند و گزینه‌های «خودت انجام بده» مانند Docker Enterprise Edition نیز موجود هستند. </p>



<p>کوبرنیتیز قدرتمندتر، قابل تنظیم‌تر و انعطاف‌پذیرتر است، اما به همان نسبت یادگیری اولیه آن سخت‌تر است. برای استفاده از آن، نیاز به تیمی با تجربه و توانمند دارید که بتواند آن را مدیریت کند؛ با این حال، بسیاری از شرکت‌ها ترجیح می‌دهند از یک ارائه‌دهنده خدمات مدیریت‌شده استفاده کنند تا مسئولیت‌های مدیریت نرم‌افزارهای متن‌باز را ساده‌تر کرده و بتوانند بیشتر روی توسعه اپلیکیشن‌ها تمرکز کنند.<br><br>مزیت Docker Swarm در سادگی و آشناتر بودن آن است. این ابزار با Docker Engine عرضه می‌شود و به‌راحتی در محیط شما در دسترس است. بنابراین، Swarm شروع کار را آسان‌تر می‌کند و ممکن است برای بارهای کاری کوچک ایده‌آل‌تر باشد.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>کوبرنیتیز و داکر سوارم ۲ ابزار اصلی برای هماهنگ‌سازی کانتینرها هستند که هر کدام مزایا و چالش‌های خاص خود را دارند. کوبرنیتیز قدرتمندتر و انعطاف‌پذیرتر است، اما نیاز به دانش تخصصی و یادگیری بیشتری دارد. در مقابل، داکر سوارم با سادگی و آشنایی بیشتر، برای پروژه‌های کوچکتر و شروع کار، مناسب‌تر است. انتخاب بین این ۲ ابزار به نیازهای سازمان و پیچیدگی پروژه‌ها بستگی دارد؛ کوبرنیتیز برای مدیریت بارهای سنگین و محیط‌های پیچیده مناسب است، در حالی که داکر سوارم برای استفاده سریع و ساده در پروژه‌های کوچک‌تر گزینه بهتری است.<br></p>
<p>The post <a href="https://hamravesh.com/blog/docker-swarm-vs-kubernetes/">تفاوت داکر سوارم و کوبرنتیز – Docker Swarm vs Kubernetes</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/docker-swarm-vs-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>راه‌اندازی و اتصال به ssh در لینوکس با کلید ssh</title>
		<link>https://hamravesh.com/blog/how-to-set-up-ssh-keys-on-linux/</link>
					<comments>https://hamravesh.com/blog/how-to-set-up-ssh-keys-on-linux/#respond</comments>
		
		<dc:creator><![CDATA[بابک خوش‌نویس]]></dc:creator>
		<pubDate>Mon, 28 Oct 2024 12:13:25 +0000</pubDate>
				<category><![CDATA[شبکه]]></category>
		<category><![CDATA[مقالات]]></category>
		<category><![CDATA[لینوکس]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3199</guid>

					<description><![CDATA[<p>در این مقاله با نحوه ایجاد جفت کلید ssh  و اتصال به آن در لینوکس آشنا می‌شوید.</p>
<p>The post <a href="https://hamravesh.com/blog/how-to-set-up-ssh-keys-on-linux/">راه‌اندازی و اتصال به ssh در لینوکس با کلید ssh</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>SSH یا Secure Shell، پروتکل رمزنگاری‌شده‌ای است که برای مدیریت و ارتباط با سرورها استفاده می‌شود. هنگام کار با سرور اوبونتو، معمولاً بیشتر وقت خود را در سِشِن ترمینالی سپری می‌کنیم که از طریق SSH به آن متصل شده‌ایم. در این راهنما، ما بر اتصال به ssh در لینوکس از طریق راه‌اندازی کلیدهای SSH بر روی Ubuntu 20.04 تمرکز خواهیم کرد. کلیدهای SSH روشی امن برای ورود به سرور فراهم می‌کنند و استفاده از آن‌ها به جای پسورد به تمام کاربران توصیه می‌شود.</p>



<h2 class="wp-block-heading" id="h-گام-اول-اتصال-به-ssh-در-لینوکس-ایجاد-جفت-کلیدها">گام اول اتصال به ssh در لینوکس — ایجاد جفت کلیدها</h2>



<p>مرحله اول، ایجاد یک جفت کلید روی دستگاه کلاینت (معمولاً رایانه شخصی شما) است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * 1rem);line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="کپی" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh-keygen</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">ssh-keygen</span></span></code></pre></div>



<p>به طور پیش‌فرض، نسخه‌های اخیر <code>ssh-keygen</code> یک جفت کلید RSA با طول ۳۰۷۲ بیت ایجاد می‌کنند که برای بیشتر کاربردها، امنیت کافی را فراهم می‌کند (در صورت تمایل، می‌توانید با استفاده از پرچم <code>-b 4096</code> یک کلید بزرگ‌تر ۴۰۹۶ بیتی ایجاد کنید). پس از وارد کردن دستور، باید خروجی زیر را مشاهده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">Generating</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">public/private</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rsa</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">pair.</span></span>
<span class="line"><span style="color: #F69D50">Enter</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">file</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">in</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">which</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">to</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">save</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">the</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7"> (/your_home/.ssh/id_rsa):</span></span></code></pre></div>



<p>برای ذخیره کردن جفت کلید در زیردایرکتوری <code>.ssh/</code> در دایرکتوری home اینتر بزنید، یا مسیر دیگری مشخص کنید. اگر قبلاً یک جفت کلید SSH تولید کرده‌اید، ممکن است پرسش زیر را مشاهده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
/home/your_home/.ssh/id_rsa already exists.
Overwrite (y/n)?</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">/home/your_home/.ssh/id_rsa</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">already</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">exists.</span></span>
<span class="line"><span style="color: #F69D50">Overwrite</span><span style="color: #ADBAC7"> (y/n)</span><span style="color: #F47067">?</span></span></code></pre></div>



<p>اگر تصمیم به بازنویسی کلید روی دیسک بگیرید، دیگر نخواهید توانست با استفاده از کلید قبلی احراز هویت کنید. هنگام انتخاب بله، بسیار محتاط باشید، زیرا این یک فرایند مخرب است که قابل برگشت نیست. سپس باید خروجی زیر را مشاهده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
Enter passphrase (empty for no passphrase):</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">Enter</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">passphrase</span><span style="color: #ADBAC7"> (empty </span><span style="color: #96D0FF">for</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">no</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">passphrase</span><span style="color: #ADBAC7">):</span></span></code></pre></div>



<p>در اینجا می‌توانید به صورت اختیاری یک عبارت عبور امن وارد کنید، که به شدت توصیه می‌شود. عبارت عبور یک لایه امنیتی اضافی ایجاد می‌کند تا از ورود کاربران غیرمجاز جلوگیری کند. برای آموختن بیشتر درباره امنیت، می‌توانید به آموزش پیرامون چگونگی پیکربندی احراز هویت مبتنی بر کلید SSH در یک سرور <a href="https://hamravesh.com/blog/what-are-linux-distributions/">لینوکس</a> [<a href="https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server">+</a>] مراجعه کنید. سپس باید خروجی مشابه زیر را ببینید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
Your identification has been saved in /your_home/.ssh/id_rsa
Your public key has been saved in /your_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host
The key's randomart image is:
+---&#91;RSA 3072&#93;----+
|                .|
|               + |
|              +  |
| .           o . |
|o       S   . o  |
| + o. .oo. ..  .o|
|o = oooooEo+ ...o|
|.. o *o+=.*+o....|
|    =+=ooB=o.... |
+----&#91;SHA256&#93;-----+</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">Your</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">identification</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">has</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">been</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">saved</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">in</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/your_home/.ssh/id_rsa</span></span>
<span class="line"><span style="color: #F69D50">Your</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">public</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">has</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">been</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">saved</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">in</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/your_home/.ssh/id_rsa.pub</span></span>
<span class="line"><span style="color: #F69D50">The</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">fingerprint</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">is:</span></span>
<span class="line"><span style="color: #F69D50">SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">user@host</span></span>
<span class="line"><span style="color: #F69D50">The</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key&#39;s randomart image is:</span></span>
<span class="line"><span style="color: #96D0FF">+---&#91;RSA 3072&#93;----+</span></span>
<span class="line"><span style="color: #96D0FF">|                .|</span></span>
<span class="line"><span style="color: #96D0FF">|               + |</span></span>
<span class="line"><span style="color: #96D0FF">|              +  |</span></span>
<span class="line"><span style="color: #96D0FF">| .           o . |</span></span>
<span class="line"><span style="color: #96D0FF">|o       S   . o  |</span></span>
<span class="line"><span style="color: #96D0FF">| + o. .oo. ..  .o|</span></span>
<span class="line"><span style="color: #96D0FF">|o = oooooEo+ ...o|</span></span>
<span class="line"><span style="color: #96D0FF">|.. o *o+=.*+o....|</span></span>
<span class="line"><span style="color: #96D0FF">|    =+=ooB=o.... |</span></span>
<span class="line"><span style="color: #96D0FF">+----&#91;SHA256&#93;-----+</span></span></code></pre></div>



<p>شما اکنون یک کلید عمومی و خصوصی دارید که می‌توانید برای احراز هویت استفاده کنید. مرحله بعدی، قرار دادن کلید عمومی بر روی سرور شما است تا بتوانید با استفاده از احراز هویت مبتنی بر کلید SSH وارد شوید.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="450" height="450" src="https://hamravesh.com/blog/wp-content/uploads/2024/06/how-to-ssh-to-linux-with-ssh-key-from-linux.png" alt="اتصال به ssh در لینوکس" class="wp-image-3211" srcset="https://hamravesh.com/blog/wp-content/uploads/2024/06/how-to-ssh-to-linux-with-ssh-key-from-linux.png 450w, https://hamravesh.com/blog/wp-content/uploads/2024/06/how-to-ssh-to-linux-with-ssh-key-from-linux-300x300.png 300w, https://hamravesh.com/blog/wp-content/uploads/2024/06/how-to-ssh-to-linux-with-ssh-key-from-linux-150x150.png 150w, https://hamravesh.com/blog/wp-content/uploads/2024/06/how-to-ssh-to-linux-with-ssh-key-from-linux-250x250.png 250w, https://hamravesh.com/blog/wp-content/uploads/2024/06/how-to-ssh-to-linux-with-ssh-key-from-linux-100x100.png 100w" sizes="auto, (max-width: 450px) 100vw, 450px" /></figure>
</div>


<h2 class="wp-block-heading" id="h-مرحله-۲-کپی-کردن-کلید-عمومی-به-سرور-لینوکس">مرحله ۲ — کپی کردن کلید عمومی به سرور لینوکس</h2>



<p>سریع‌ترین راه برای انتقال کلید عمومی به میزبان Ubuntu، استفاده از ابزاری به نام <code>ssh-copy-id</code> است. به دلیل سادگی استفاده، این روش در صورت در دسترس بودن، به شدت توصیه می‌شود. اگر ابزار <code>ssh-copy-id</code> در دستگاه کلاینت شما موجود نیست، می‌توانید از یکی از ۲ روش جایگزین ارائه‌شده در این بخش استفاده کنید (کپی کردن از طریق SSH مبتنی بر رمز عبور یا کپی دستی کلید).</p>



<h3 class="wp-block-heading" id="h-کپی-کردن-کلید-عمومی-با-استفاده-از-ssh-copy-id">کپی کردن کلید عمومی با استفاده از <code>ssh-copy-id</code></h3>



<p>ابزار <code>ssh-copy-id</code> به طور پیش‌فرض در بسیاری از سیستم‌های عامل گنجانده شده است، بنابراین ممکن است در سیستم محلی شما در دسترس باشد. برای اینکه این روش کار کند، باید قبلاً دسترسی SSH مبتنی بر رمز عبور را به سرور خود داشته باشید.</p>



<p>برای استفاده از این ابزار، میزبان دوردستی (ریموتی) که می‌خواهیم به آن متصل شویم و حساب کاربری که دسترسی SSH مبتنی بر رمز عبور به آن داریم را مشخص می‌کنیم. این حساب کاربری همان حسابی است که کلید SSH عمومی شما به آن کپی خواهد شد. دستور به شکل زیر است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh-copy-id username@remote_host</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">ssh-copy-id</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">username@remote_host</span></span></code></pre></div>



<p>ممکن است پیام زیر را مشاهده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can'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</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">The</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">authenticity</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">of</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">host</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;203.0.113.1 (203.0.113.1)&#39;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">can&#39;t be established.</span></span>
<span class="line"><span style="color: #96D0FF">ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.</span></span>
<span class="line"><span style="color: #96D0FF">Are you sure you want to continue connecting (yes/no)? yes</span></span></code></pre></div>



<p>این یعنی رایانه محلی شما میزبان دوردست را نمی‌شناسد. این اتفاق در اولین اتصال شما به یک میزبان جدید رخ می‌دهد. «yes» را تایپ کرده و ENTER را فشار دهید تا ادامه کار انجام شود. سپس، ابزار مربوطه کلید <code>id_rsa.pub</code> را که قبلاً ایجاد کردیم در حساب محلی ما جستجو می‌کند. وقتی کلید را پیدا کند، رمز عبور حساب کاربری ریموت را از ما درخواست می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@203.0.113.1's password:</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">/usr/bin/ssh-copy-id:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">INFO:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">attempting</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">to</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">log</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">in</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">with</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">the</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">new</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">)</span><span style="color: #96D0FF">,</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">to</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">filter</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">out</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">any</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">that</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">are</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">already</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">installed</span></span>
<span class="line"><span style="color: #F69D50">/usr/bin/ssh-copy-id:</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">INFO:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">) </span><span style="color: #96D0FF">remain</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">to</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">be</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">installed</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">if</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">you</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">are</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">prompted</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">now</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">it</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">is</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">to</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">the</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">new</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">keys</span></span>
<span class="line"><span style="color: #F69D50">username@203.0.113.1</span><span style="color: #F69D50">&#39;s password:</span></span></code></pre></div>



<p>رمز عبور را تایپ می‌کنیم (چیزی که تایپ کرده‌ایم به دلایل امنیتی نمایش داده نمی‌شود) و سپس ENTER را فشار می‌دهیم. ابزار مربوطه به حساب کاربری روی میزبان دوردست با استفاده از رمز عبوری که فراهم کردیم، متصل می‌شود. سپس محتویات کلید <code>~/.ssh/id_rsa.pub</code> ما را درون فایلی در دایرکتوری هوم <code>~/.ssh</code> حساب دوردست به نام <code>authorized_keys</code> کپی می‌کند. حالا باید خروجی زیر را مشاهده کنیم:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'username@203.0.113.1'"
and check to make sure that only the key(s) you wanted were added.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">Number</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">of</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">) </span><span style="color: #96D0FF">added:</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F69D50">Now</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">try</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">logging</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">into</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">the</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">machine,</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">with:</span><span style="color: #ADBAC7">   </span><span style="color: #96D0FF">&quot;ssh &#39;username@203.0.113.1&#39;&quot;</span></span>
<span class="line"><span style="color: #F69D50">and</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">check</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">to</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">make</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">sure</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">that</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">only</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">the</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">key</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">s</span><span style="color: #ADBAC7">) </span><span style="color: #96D0FF">you</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">wanted</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">were</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">added.</span></span></code></pre></div>



<p>در این مرحله، کلید <code>id_rsa.pub</code> ما به حساب دوردست آپلود شده است. حالا می‌توانیم برای ادامه به مرحله ۳ برویم.</p>



<h3 class="wp-block-heading" id="h-کپی-کردن-کلید-عمومی-با-استفاده-از-ssh">کپی کردن کلید عمومی با استفاده از SSH</h3>



<p>اگر به ابزار <code>ssh-copy-id</code> دسترسی ندارید، اما به حسابی در سرورتان دسترسی SSH مبتنی بر رمز عبور دارید، می‌توانید کلیدهای خود را با استفاده از روش معمول SSH بارگذاری کنید. این کار را با استفاده از دستور <code>cat</code> برای خواندن محتوای کلید SSH عمومی در رایانه محلی‌مان و انتقال آن از طریق اتصال SSH به سرور ریموت انجام می‌دهیم.</p>



<p>در سمت دیگر، می‌توانیم مطمئن شویم که دایرکتوری <code>~/.ssh</code> وجود دارد و دارای مجوزهای صحیح تحت حسابی است که از آن استفاده می‌کنیم. سپس می‌توانیم محتوایی را که درون فایلی به نام <code>authorized_keys</code> پایپ کردیم را در این دایرکتوری خروجی دهیم. از نماد تغییرمسیر <code>&gt;&gt;</code> برای افزودن محتوا به جای بازنویسی آن استفاده می‌کنیم. این امکان را به ما می‌دهد تا کلیدها را بدون از بین بردن کلیدهای قبلاً افزوده شده، اضافه کنیم. دستور کامل به این شکل است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh &amp;&amp; touch ~/.ssh/authorized_keys &amp;&amp; chmod -R go= ~/.ssh &amp;&amp; cat >> ~/.ssh/authorized_keys"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">cat</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">~/.ssh/id_rsa.pub</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">ssh</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">username@remote_host</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;mkdir -p ~/.ssh &amp;&amp; touch ~/.ssh/authorized_keys &amp;&amp; chmod -R go= ~/.ssh &amp;&amp; cat &gt;&gt; ~/.ssh/authorized_keys&quot;</span></span></code></pre></div>



<p>ممکن است با پیام زیر مواجه شوید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can'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</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">The</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">authenticity</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">of</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">host</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;203.0.113.1 (203.0.113.1)&#39;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">can&#39;t be established.</span></span>
<span class="line"><span style="color: #96D0FF">ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.</span></span>
<span class="line"><span style="color: #96D0FF">Are you sure you want to continue connecting (yes/no)? yes</span></span></code></pre></div>



<p>این یعنی رایانه محلی شما میزبان دوردست را نمی‌شناسد. این اتفاق در اولین اتصال شما به میزبان جدید رخ می‌دهد. «yes» را تایپ کنید و ENTER را فشار دهید تا کار ادامه یابد. سپس، باید برای وارد کردن رمز عبور حساب کاربری دوردست از شما درخواست شود:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
username@203.0.113.1's password:</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">username@203.0.113.1</span><span style="color: #F69D50">&#39;s password:</span></span></code></pre></div>



<p>پس از وارد کردن رمز عبور، محتوای کلید <code>id_rsa.pub</code> شما به انتهای فایل <code>authorized_keys</code> حساب کاربر دوردست کپی خواهد شد. پس از آنکه این کار با موفقیت انجام شد، به مرحله ۳ بروید.</p>



<h3 class="wp-block-heading" id="h-کپی-کردن-کلید-عمومی-به-صورت-دستی">کپی کردن کلید عمومی به صورت دستی</h3>



<p>اگر دسترسی SSH مبتنی بر رمز عبور به سرور خود ندارید، باید فرایند فوق را به صورت دستی انجام دهید. پس به صورت دستی محتوای فایل <code>id_rsa.pub</code> را به فایل <code>~/.ssh/authorized_keys</code> در دستگاه دوردست اضافه می‌کنیم. برای نمایش محتوای کلید <code>id_rsa.pub</code> خود، این دستور را در کامپیوتر محلی خود تایپ کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat ~/.ssh/id_rsa.pub</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">cat</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">~/.ssh/id_rsa.pub</span></span></code></pre></div>



<p>محتوای کلید نمایش داده می‌شود، که باید شبیه به خروجی زیر باشد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">ssh-rsa</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ==</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">demo@test</span></span></code></pre></div>



<p>با استفاده از هر روشی که در دسترس دارید، به میزبان دوردست دسترسی پیدا کنید. پس از دسترسی به حساب خود در سرور دوردست، باید مطمئن شوید که دایرکتوری <code>~/.ssh</code> وجود دارد. این دستور، در صورت نیاز دایرکتوری را ایجاد می‌کند و اگر از قبل وجود داشته باشد، کاری انجام نمی‌دهد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mkdir -p ~/.ssh</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">mkdir</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-p</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">~/.ssh</span></span></code></pre></div>



<p>اکنون، می‌توانید فایل <code>authorized_keys</code> را در این دایرکتوری ایجاد یا ویرایش کنید. می‌توانید محتویات فایل <code>id_rsa.pub</code> خود را در انتهای فایل <code>authorized_keys</code> اضافه کنید، و در صورت نیاز آن را با استفاده از این دستور ایجاد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>echo public_key_string >> ~/.ssh/authorized_keys
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">public_key_string</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&gt;&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">~/.ssh/authorized_keys</span></span>
<span class="line"></span></code></pre></div>



<p>در دستور فوق، به جای <code>public_key_string</code>، خروجی دستور <code>cat ~/.ssh/id_rsa.pub</code> که در سیستم محلی خود اجرا کرده‌اید را قرار دهید. این خروجی باید با <code>ssh-rsa AAAA…</code> شروع شود. در نهایت، مطمئن می‌شویم که دایرکتوری <code>~/.ssh</code> و فایل <code>authorized_keys</code> دارای مجوزهای مناسب هستند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>chmod -R go= ~/.ssh</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">chmod</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-R</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">go=</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">~/.ssh</span></span></code></pre></div>



<p>این دستور به‌طور بازگشتی تمام مجوزهای «group» و «other» را برای دایرکتوری <code>~/.ssh</code> حذف می‌کند. اگر از حساب <strong>روت</strong> برای تنظیم کلیدها برای حساب کاربری استفاده می‌کنید، مهم است که دایرکتوری <code>~/.ssh</code> متعلق به یوزر باشد و نه متعلق به <strong>روت</strong>:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>chown -R sammy:sammy ~/.ssh</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">chown</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-R</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">sammy:sammy</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">~/.ssh</span></span></code></pre></div>



<p>در این آموزش، کاربر ما «sammy» نام دارد اما شما باید نام کاربری مناسب را در دستور فوق جایگزین کنید. اکنون می‌توانیم احراز هویت بدون رمز عبور با سرور Ubuntu خود را انجام دهیم.</p>



<h2 class="wp-block-heading" id="h-گام-سوم-اتصال-به-ssh-در-لینوکس-احراز-هویت-در-سرور-ubuntu-با-استفاده-از-کلیدهای-ssh">گام سوم اتصال به ssh در لینوکس — احراز هویت در سرور Ubuntu با استفاده از کلیدهای SSH</h2>



<p>اگر یکی از روش‌های بالا را با موفقیت به پایان رسانده‌اید، حالا باید قادر به ورود به میزبان دوردست بدون ارائه رمز عبور حساب دوردست باشید. فرایند کلی یکسان است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh username@remote_host</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">ssh</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">username@remote_host</span></span></code></pre></div>



<p>اگر این اولین بار است که به این میزبان متصل می‌شوید (اگر از آخرین روش بالا استفاده کرده‌اید)، ممکن است چیزی شبیه به خروجی زیر را مشاهده کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can'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</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">Output</span></span>
<span class="line"><span style="color: #F69D50">The</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">authenticity</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">of</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">host</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;203.0.113.1 (203.0.113.1)&#39;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">can&#39;t be established.</span></span>
<span class="line"><span style="color: #96D0FF">ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.</span></span>
<span class="line"><span style="color: #96D0FF">Are you sure you want to continue connecting (yes/no)? yes</span></span></code></pre></div>



<p>این یعنی رایانه محلی شما میزبان دوردست را نمی‌شناسد و این اولین بار است که به آن متصل می‌شوید. «yes» را تایپ کنید و سپس ENTER را فشار دهید ادامه کار انجام شود.</p>



<p>اگر برای کلید خصوصی خود عبارت عبوری (Passphrase) تعیین نکرده‌اید، بلافاصله وارد می‌شوید. اگر هنگام ایجاد کلید، عبارت عبوری برای کلید خصوصی تعیین کرده‌اید، اکنون از شما خواسته می‌شود که آن را وارد کنید (توجه داشته باشید که حروف وارد شده در سِشِن ترمینال به دلایل امنیتی نمایش داده نمی‌شوند). پس از احراز هویت، یک سشن شل جدید برای شما با حساب پیکربندی شده در سرور Ubuntu باز می‌شود.</p>



<p>اگر احراز هویت مبتنی بر کلید موفقیت‌آمیز بوده است، مطالعه این مطلب را ادامه دهید تا یاد بگیرید چگونه با غیرفعال کردن احراز هویت رمز عبور، سیستم خود را بیشتر ایمن کنید.</p>



<h2 class="wp-block-heading" id="h-گام-چهارم-غیرفعال-کردن-احراز-هویت-با-پسورد-برای-اتصال-به-سرور">گام چهارم — غیرفعال کردن احراز هویت با پسورد برای اتصال به سرور</h2>



<p>اگر توانستید بدون استفاده از رمز عبور با استفاده از SSH به حساب خود وارد شوید، به این معناست که احراز هویت مبتنی بر کلید SSH را برای حساب خود به درستی پیکربندی کرده‌اید. با این حال، مکانیزم احراز هویت بر پایه رمز عبور همچنان فعال است، به این معنی که سرور شما هنوز در معرض حملات نیرومند (Brute-Force) قرار دارد.</p>



<p>پیش از انجام مراحل این بخش، اطمینان حاصل کنید که یا احراز هویت مبتنی بر کلید SSH را برای حساب روت در این سرور پیکربندی کرده‌اید، یا بهتر اینکه، احراز هویت مبتنی بر کلید SSH را برای حساب غیر root در این سرور با امتیازات sudo پیکربندی کرده‌اید. این مرحله ورود‌های مبتنی بر رمز عبور را محدود می‌کند، بنابراین تضمین اینکه همچنان قادر به دسترسی مدیریتی خواهید بود، حیاتی است.</p>



<p>پس از تأیید اینکه حساب دوردست شما دارای امتیازات مدیریتی است، با استفاده از کلیدهای SSH، به سرور دوردست خود وارد شوید، چه به عنوان روت و چه با حسابی که دارای امتیازات سودو است. سپس، فایل پیکربندی دیمون SSH را باز کنید:</p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo nano /etc/ssh/sshd_config</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">nano</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/etc/ssh/sshd_config</span></span></code></pre></div>



<p>در داخل فایل، به دنبال دستورالعملی به نام <code>PasswordAuthentication</code> بگردید. این خط ممکن است با علامت <code>#</code> به صورت کامنت در آنده باشد. خط را با حذف #، Uncomment کنید و مقدار آن را به <code>no</code> تغییر دهید. این کار قابلیت ورود شما از طریق SSH با استفاده از رمزهای عبور حساب را غیرفعال می‌کند:</p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>. . .
PasswordAuthentication no
. . .</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #6CB6FF">.</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">.</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">.</span></span>
<span class="line"><span style="color: #F69D50">PasswordAuthentication</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">no</span></span>
<span class="line"><span style="color: #6CB6FF">.</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">.</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">.</span></span></code></pre></div>



<p></p>



<p>پس از اتمام کار، فایل را با فشار دادن CTRL+X و سپس Y برای تأیید ذخیره‌سازی فایل و در نهایت با زدن ENTER برای خروج از nano ببندید. برای فعال کردن این تغییرات، باید سرویس <code>sshd</code> را مجدداً راه‌اندازی کنیم:</p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl restart ssh</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">systemctl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">restart</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ssh</span></span></code></pre></div>



<p>برای احتیاط، یک پنجره ترمینال جدید باز کنید و قبل از بستن سشن فعلی خود، تست کنید که سرویس SSH به درستی کار می‌کند یا خیر:</p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh username@remote_host
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">ssh</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">username@remote_host</span></span>
<span class="line"></span></code></pre></div>



<p>پس از تأیید اینکه سرویس SSH شما به درستی کار می‌کند، می‌توانید تمام جلسات فعلی سرور را با خیال راحت ببندید. دیمون SSH در سرور اوبونتو شما اکنون فقط به احراز هویت مبتنی بر کلید SSH پاسخ می‌دهد و ورود‌های مبتنی بر رمز عبور غیرفعال شده‌اند.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p>احراز هویت مبتنی بر کلید SSH یک رویکرد امنیتی استاندارد است که امکان دسترسی ایمن به سرورها را بدون نیاز به رمز عبور فراهم می‌آورد. با پیروی از دستورالعمل‌های ارائه شده، شما قادر به راه‌اندازی و مدیریت کلیدهای SSH برای ورود به سرور اوبونتو خود هستید. این روش نه تنها امنیت دسترسی به سرور را تقویت می‌کند، بلکه با کاهش خطر حملات نیرومند و سایر تهدیدات امنیتی، آرامش خاطر بیشتری را برای مدیران سیستم فراهم می‌آورد. پس از آنکه که احراز هویت مبتنی بر کلید پیکربندی شد، توصیه می‌شود اقدامات بعدی برای بهبود امنیت سیستم، مانند غیرفعال سازی احراز هویت مبتنی بر رمز عبور، انجام شود تا در برابر دسترسی‌های ناخواسته از سرور حفاظت بیشتری داشته باشیم.</p>
<p>The post <a href="https://hamravesh.com/blog/how-to-set-up-ssh-keys-on-linux/">راه‌اندازی و اتصال به ssh در لینوکس با کلید ssh</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/how-to-set-up-ssh-keys-on-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
