<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali</title>
        <link>https://virgool.io/feed/@alidoosti01</link>
        <description>خلاصه‌ای از همه چی، یه DevOps ساده که سعی میکنه چیزای جدید رو یاد بگیره، و با لبخند ادامه میده.</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:54:24</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/895027/avatar/jfcoTo.png?height=120&amp;width=120</url>
            <title>Ali</title>
            <link>https://virgool.io/@alidoosti01</link>
        </image>

                    <item>
                <title>مقیاس افقی - Horizontal Pod Autoscaling</title>
                <link>https://virgool.io/@alidoosti01/%D9%85%D9%82%DB%8C%D8%A7%D8%B3-%D8%A7%D9%81%D9%82%DB%8C-horizontal-pod-autoscaling-flkdupagvvhd</link>
                <description>در حالت عادی ما سعی میکنیم دید خوبی نسبت به منابع و میزان مصرفشون در سرویس داشته باشیم تا همه‌چی نرمال باشه و درست پیش بره، ولی بیاین به این مورد فکر کنیم که اگه از دستمون در بره چی؟ و نتونیم به درستی لود سرویسمون (pod) رو مدیریت کنیم چی؟، اینجاست که HPA به دادمون میرسه و به خوبی و به صورت خودکار Pod رو اسکیل میکنه، مثلا در زمانی که میزان لود منابعش با مشکل رو به رو بشه.HPAاسکیل کردن به صورت افقی (Horizontal)، آپدیت شدن منابع workload (مثل deployment و یا statefulset) با این هدف که به صورت خودکار workload رو با توجه به تقاضا کاهش بده. در ساده ترین تعریف از اسکیل کردن افقی، میشه به این مورد اشاره کرد که در کنار یک پاد چندین پاد دیگه ایجاد میشه تا load بین این podها تقسیم بشه، در این جا autoscaling به این معنی هستش اگه لود کاهش پیدا کنه به صورت خودکار تعداد پادهای ساخته شده هم کم میشه تا به minimumترین حالت (یعنی مقداری که براش تعریف شده) برسه.عکس زیر نمایی از HPA هستش که چه طوری کار میکنه، metrics-server اطلاعات مورد نیاز رو به HPA میفرسته و HPA (با توجه به منابع مصرف شده (قانونی که براش تعریف شده)) تصمیم میگیره که اسکیل پاد رو بیشتر کنه یا کمتر. به عنوان مثال اگه میزان مصرف CPU بیشتر از 80درصد باشه HPA تصمیم میگیره تا scale-UP کنه و اگه میزان مصرفش به 10درصد رسید تصمیم به scale-DOWN میکنه (البته پادهای ساخته شده رو کمتر میکنه تا به مینیموم ترین مقدار برسه).HPA with metrics-serverنصب metrics-serverبرای پیاده سازی این سناریو نیاز داریم که metrics-server رو نصب کنیم، برای این مورد ما از Helm استفاده کردیم و نیاز توی values فایل یه تغییری بدیم، مقدار replicas رو بزاریم 2 و همین طور نیازه توی defaultArgs مقدار kubelet-insecure-tls-- رو هم وارد کنیم.$ helm install metrics-server metrics-server/metrics-server -f values-file.ymlMetrics-serverبعد از نصب دستورهای زیر رو میتونیم استفاده کنیم تا میزان مصرف podها و یا Nodeها رو ببنیم:$ kubectl top nodes$kubectl top pods -n &lt;namespace&gt;اپلیکیشن php-apacheبرای تست یک اپلیکیشن میسازیم و نیاز داریم برای اپلیکیشنی که میسازیم resource رو توی منیفست استفاده کنیم. به عنوان مثال میزان استفاده از CPU رو توی resource میتونیم بزاریم.apache $ kubectl apply -f php-apache.ymlتعریف HPA بعد از ساخته شدن اپلیکیشن، میتونیم HPA رو براش تعریف کنیم، ما در این سناریو به صورت کامند لاین تعریف کردیم که توی یک خط تعریف میشه که کدوم Deployment ما براش HPA لحاظ بشه:$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max 10در مثال بالا ما تعریف کردیم برای deploymentی با اسم php-apache که اگه درصد استفاده CPUش بیشتر از 50 شد بهش replicas اضافه بشه و حداکثر تعدادی که میتونه اضافه کنه 10 هستش و همین طور در زمان کاهش هم کمترین مقدار 1 هستش.لود تستبرای این که تست کنیم که واقعا این HPA تعریف شده به درستی کار میکنه، یک busybox میاریم بالا و لود میندازیم روی اپلیکیشن php-apache مون:$ kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -C &quot;while sleep 0.01; do wget -q -O- http://php-apache; done&quot;بعد از اجرا کردن دستور بالا، لود مناسبی رو، روی اپلیکیشن php-apache میندازیم که میتونیم از طریق دستور kubectl get hpa --watch، وضعیت HPA تعریف شده رو ببینیم:توی عکس میبینیم که درصد استفاده از CPU بیشتر از حد تعریف شده هستش و همین طور تعداد replicas ساخته شده تا اینجای کار 5 عدد هستش، این مورد ادامه پیدا میکنه تا میزان استفاده از CPU به کمتر از 50درصد برسه یا مقدار replicas به مقدار max تعریف شده برسه.تعریف کردن چند metrics و یا custom metricsتا اینجا ما از autoscaling/v1 استفاده کردیم، ولی حالا توی نسخه جدیدتر میتونیم کارای بهتری مثل multiple metrics و یا custom metrics تعریف کنیم. به عنوان مثال در نمونه HPA زیر هم حالتی برای scaleUp تعریف کردیم و هم برای scaleDown کردن اپلیکیشن:متریک های خاصما دسترسی به متریک های زیادی داریم که بتونیم قانون های خودمون رو تعریف کنیم، ما حتی میتونیم از label ها هم استفاده کنیم جدای از CPU و Ram. به عنوان مثال توی نمونه زیر ما متریک http_requests رو با لیبل verb استفاده کردیم: تعریف HPA به صورت manifestتوی سناریو بالا ما توی یک خط HPA رو تعریف کردیم، میتونیم همین قانون رو توی manifest قرار بدیم تا بعد به راحتی بتونیم تغییر بدیم، توی عکس زیر دقیقا همون سناریو رو توی manifest قرار دادیم و apply کردیم:سعی شد توی این مقاله نمونه های کاملی از ساخت اپلیکیشن تا لود انداختن روی اپلیکیشن رو پیاده سازی کنیم و همین طور از HPAی که تعریف کردیم مطمئن شدیم که به درستی کار میکنه، نمونه‌ای از v1 رو دیدیم و همین طور v2، توی نسخه v2 ما قابلیت‌های بیشتری داریم هم توی متریک نویسی و هم توی قوانین scale UP/DOWN کردن اپلیکیشن ها.منابع:Horizontal Pod AutoscalingHorizontalPodAutoscaler Walkthroughmake a Kubernetes autoscaling HPA</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Wed, 27 Nov 2024 17:41:57 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی Gitlab-Runner روی کلاستر Kubernetes</title>
                <link>https://virgool.io/@alidoosti01/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-gitlab-runner-%D8%B1%D9%88%DB%8C-%DA%A9%D9%84%D8%A7%D8%B3%D8%AA%D8%B1-kubernetes-oxedcg07ktoe</link>
                <description>بیشترین جاهای استفاده شده از Gitlab-Runner روی سرورها به صورت native بوده یا نهایتش Docker.خیلی دیگه نهایتش، این بود که یه تغییری روی executorش میدادیم (مثلا میزاشتیم روی داکر یا shell) و استفاده میکردیم.از kubernetes executor استفاده میکنیم در کلاستر kubernetes برای ساخت اپلیکیشن، این executor با کال کردن API کلاستر یک pod به ازای هر CI job بالا میاره.در واقع kubernetes executor مراحل ساخت رو به چند مرحله تقسیم میکنه:آماده سازی: یک pod در کلاستر ایجاد میشه، این پاد نیاز هستش جهت ساخت و یا اجرای سرویس ساخته بشه.پیش-ساخت یا قبلِ-ساخت: این مرحله بابت کلون کردن یا ریستور cache و یا حتی گرفتن artifact از جاب stage های قبلی هستش، این مرحله یک کانتینر به خصوصی رو به عنوان بخشی از pod ایجاد میکنه.ساخت: مرحله ساختن، مخصوص کاربر جهت بررسی دسترسی (توی کوبر با serviceaccount شناخته میشه).پس از ساخت - بعد از ساخت: ساخت cache یا آپلود کردن artifact در Gitlab. این مرحله هم یک کانتینر به خصوصی رو به عنوان بخشی از pod بالا میاره.پیش نیازقبل از این که سراغ نصب و پیاده سازی اصل داستان بریم، برای تمیز پیش رفتن و بجای این که بریم همه چی رو به insecure تغییری بدیم، cert-manager رو نصب میکنیم.انتظار میره روی کلاسترتون ingress رو داشته باشینبرای نصب cert-manager به صورت خوشگل و best-practice مثل همیشه با Helm پیش میریم.install cert-managerبعد از نصب cert-manager ما یک ClusterIssuer تعریف میکنیم که بتونیم گواهینامه ssl رو دریافت کنیم، (این کار رو کنین تا هر وقت نیاز به ssl داشتین به صورت خودکار خودِ cert-manager براتون اوکی کنه)clusterissuer yaml fileپیاده سازی Gitlab Runner Operatorدر واقع operator برای مدیریت چرخه حیات (lifecycle) هستش، چرخه حیاتِ gitlab runner در کلاستر kubernetes و یا open-shift.هدف از operator این هستش که وظایف (tasks) مورد نیاز برای اجرای CI/CD در کلاستر رو خودکار کنه.برای نصب operator نیاز هستش کلاستر کوبر از ورژن 1.27 به بعد باشه و همین طور operator ما هم ورژنی که معرفی شده 0.28 هستش که نصب میکنیم.نصب Gitlab Runner Operatorدر مرحله اول، نصب Operator Lifecycle Manager (OLM)، که ابزاری برای کمک به مدیریت operatorهای در حال اجرا روی کلاستر هستش و بعد از آن نصب خودِ Operator.در نظر داشته باشید operator ما روی نیم اسپیس operators هستشinstall OLM and Operator
نمونه خروجی بعد از نصب موفق آمیز:get all operators namespaceپیاده سازی Gitlab Runnerمثل همیشه ما از Helm استفاده کردیم و تغییراتی که نیاز هستش رو روش اعمال کردیم، یک سری تغییرات نیاز هستش که انجام بشه، مثلا اجازه این که رانر بتونه در کل کلاستر اپلیکیشن رو اجرا کنه نه فقط در namespaceی که بهش داده شده (یعنی دسترسی داشته باشه به بقیه namespaceها) - همین طور رولی که دسترسی داشته باشه به ساخت یا آپدیت و یا حتی دیلیت resourceهایی که در pipeline تعریف میشه، این مورد بسته به نیاز شما و pipeline شما تغییر میکنه:GitLab Runner Helm Chart در تصویر بالا تمامی نمونه تغییراتی هستش که نیاز داشتیم روی values فایل برای runner بدیم.بعد از تغییراتی که خواستیم و اعمال کردیم میریم سراغ نصب gitlab-runner: install gitlab-runnerبعد از نصب هم میتونیم ازش با دستور kubectl get all -n gitlab-runner مطمئن بشیم:get all gitlab-runner namespaceخلاصه مطلببعد از مراحل بالا شما gitlab-runnerتون به صورت کامل اماده هستش و میتونین pipelineهای خودتون رو اجرا کنین، شاید سوال باشه که چرا cert-manager استفاده شده چون یکی از پیش نیاز های operator هستش و باید از ورژن 1.7.1 به بعد هم باشه.سعی کردم تمام مراحل رو به صورت جزئی بزارم، ولی اگه جایی اشتباهی وجود داره و یا موردی هستش خودشحال میشم باهام در ارتباط باشین.منابع:Install GitLab Runner OperatorGitLab Runner Helm ChartKubernetes executor</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Sat, 05 Oct 2024 12:42:35 +0330</pubDate>
            </item>
                    <item>
                <title>GitOps - ترکیب GitLab-Ci با ArgoCD</title>
                <link>https://virgool.io/@alidoosti01/gitops-%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8-gitlab-ci-%D8%A8%D8%A7-argocd-kefrdzmbqqgn</link>
                <description>میدونیم که با خود Gitlab میتونیم CI/CD رو انجام بدیم، ولی خب همیشه ابزارهای خوشگلی مثل ArgoCD میان که یک نیاز رو به شکل زیباتری برطرف کنن.برای این که راحتتر بشه CDمون رو مدیریت کنیم میتونیم از ابزارهای متفاوتی استفاده کنیم ولی از اونجایی که Argoproj هم تایید شده‌س و هم پروژه های خیلی بزرگی ازش استفاده میکنن و هم بهمون این قابلیت رو میده که به صورت UI و هم CLI بتونیم کار کنیم، ما هم انتخابش میکنیم.پروژه Argo به عنوان یکی از پروژه های تایید شده CNCF هستش که به صورت open source برای Kubernetes ارایه شده و برگرفته از چهار پروژه خیلی خوبِ Argo Workflows - Argo CD - Argo Rollouts و Argo Events هستش.قاعدتا کلمه GitOps رو شنیدین و مخصوصا امروزه خیلی بیشتر هم باهاش رو به رو شدین، توی این مقاله جزییات GitOps رو نمیگم چون مقاله های خوبی براش ایجاد شده، ولی در ساده ترین تعریف میشه به این مورد اشاره کرد که Gitops یک چارچوب عملیاتی هستش که بر پایه‌ی DevOps پیش میره.gitops به صورت رسم شکل توی این سناریو انتظار میره که شما ArgoCD و gitlab رو setup کردین و دارینش، پس توی این مقاله ما درگیر ایجاد و ستاپ کردنشون نمیشیم. (اگه بابت این مورد مشتاق بودین خوشحال میشم بهم اطلاع بدین)ستاپ کردن ArgoCDمن از Helm chart خود Argoproj بابت ایجادش استفاده کردم.ستاپ کردن gitlabچون این مورد جهت تست ما بوده از docker compose file برای ایجادش استفاده کردیم:ما یک repo برای کد و تغییراتی که میخوایم ایجاد کردیم و یک repo برای ArgoCD که تنها در زمان push کردن دیپلوی نهایی روی این repo باعث triggerشدنش توسط ArgoCd میشه و دیپلوی آخر رو برامون میسازه.همین طور نمونه کد کامل شده رو توی این ریپو قرار دادم و میتونین نمونه ای ازش رو ببینین.در جاب build ما از buildah استفاده کردیم و imageی که با nginx مدنظرمون هستش رو ایجاد میکنیم و در نهایت با versionی که براش ست میشه توی gitlab registryمون ذخیره میشه.جاب buildو بعد از این اتمام جاب میتونین از قسمت gitlab-repo &gt; Deploy &gt; Container Registry دقیقا همون image با versionی که ست شده رو داشته باشین.در جاب deploy ما یک سری variable در فایل های deployment و service استفاده کردیم که این variable ها بسته به خروجی های جاب های قبلی مثل build و یا مقدار های تعریف شده از پیش جای گذاری میشن و فایل با مقادیر مدنظر کامل میشه، و بعد از کامل شدن به repoیی که برای ArgoCD درست کردیم push میشه.جاب deployاخرین commitی که انجام شده روی ریپوی argocd انجام شده که عملا desired state ما برای اپلیکیشن هستش:خلاصه مطلبهمیشه best practice هایی برای استفاده از ابزار های وجود داره و بهترین reference هم مقالات سایت خود ابزار هستش. همین طور همیشه پرکاربردترین راه بهترین راه نیست، خیلی از سناریو با توجه به نیاز شما و کاری که میخواین انجام بدین تعریف میشه.اگه در این مورد سوالی داشتید و یا انتقادی در مورد این نوع مقالات خوشحال میشم باهام در ارتباط باشین.</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Tue, 01 Oct 2024 16:15:30 +0330</pubDate>
            </item>
                    <item>
                <title>ساختن image داکر روی کوبرنتیز به کمک buildah - Gitlab-CI</title>
                <link>https://virgool.io/@alidoosti01/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-image-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%B1%D9%88%DB%8C-%DA%A9%D9%88%D8%A8%D8%B1%D9%86%D8%AA%DB%8C%D8%B2-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-buildah-gitlab-ci-jv2h6p9pvt3y</link>
                <description>یکی از دوستان سناریویی مطرح کرد در راستای این که اگه runner روی کلاستر کوبر باشه و executorش هم روی کوبر قرار داده باشیم، چه طوری میتونیم یه Dockerfile رو اجرا کنیم که واسمون build کنه؟ساختن image در CI یکی از کارهای رایجی هستش که رخ میده، ولی خب سوالاتی هم مثل همین مورد که اگه روی کوبر باشیم چی، این که اصلا چه طوری میشه این کار رو کرد، مگه runner و executorش رو کوبر نیست، پس قاعدتا یک pod میاد بالا تا جاب رو انجام بده، چه طوری میشه یک ایمیج داکر ساخت؟.که ما میخوایم با buildah به این سوالات پاسخ بدیم.قبل از شروع موضوع اصلی یه نگاهی به ساختار CIمون بندازیم:ما از Gitlab برای استفاده از Gitlab CI و مدیریت کدهامون استفاده کردیم.ما یک Gitlab runner به همراه executor کوبرنتیز هم ایجاد کردیم، به این معنی هستش که هر job به صورت یک pod ایجاد میشه.ما توی این پایپ لاین یک image رو build میگیرم و بعد روی Registryمون Push میکنیم.میدونیم که راه های متفاوتی برای ساختن یک Image وجود داره، ولی این رو هم میدونیم که نمیتونیم از دستور . docker build -t testiamge استفاده کنیم، چون این مورد نیاز به docker daemon داره و از اوجایی که خود این مورد قراره توی یک pod انجام بشه کار رو پیچیده تر هم میکنه.یک کار زشت ولی خب به طور معمول رو میشه انجام داد، اونم mount کردن docker socket به داخل یک کانیتر هستش که عملا بهش این اجازه رو میدیم که از داخل کانتینر با دستور docker بتونه docker daemon اجرا روی سرورمون (host) رو مدیریت کنه، خب قاعدتن ما این کار رو نمیکنیم.از یک پروژه زیبا به اسم buildah استفاده میکنیم و این کار رو برامون خیلی راحت و بهتر میکنه، حتی زمانی که از داخل یک کانتینر اجرا میکنین.ما از image خودش استفاده میکنیم که alpine-based هستش و شامل موارد زیر هم میشه:PodmanRuncConmonFuse-overlayfsslirp4netnsbuildahکوبرنتیز و Gitlab runner ماما میخوایم از طریق پایپ لاین Gitlab-CI این کار رو انجام بدیم، من runner رو با Helm ساختم و از values فایل زیر استفاده کردم:Gitlab Runner Helm Values Fileما نیاز داریم یک آدرسی رو برای buildah که عملا کانتینرها رو اونجا ذخیره میکنه توی config.toml رانرمون mount کنیم، دیتای بیشتر بابت علت این mount کردن.شاید براتون سوال باشه که چرا Mount کردن دایرکتوری بهتر از اینه که یک socket رو mount کنیم؟تفاوت خیلی زیادی دارن، ما میتونیم هر دایرکتوری از hostمون رو به داخل buildah به صورت راحت mount کنیم و پروژه های جداگانه‌ای رو باهاشون داشته باشیم. و از همه مهمتر این که آدرس &#x60;/var/lib/containers/&#x60; فقط یک دایرکتوریه (واسه storage و ذخیره سازی)، نه مدیریت socket.ساختن imageحالا ما هم builder imageمون رو داریم و هم Gitlab runnerمون رو که آماده هستن واسه ساختن image و تنها چیزی که نیاز داریم اینه تا پایپ لاین CIمون رو بنویسیم.فقط نیازه دو سه تا دستور رو جایگزین کنیم به جای روال عادی مون در استفاده از docker:از podman login استفاده میکنیم به جای docker loginاز buildah bud استفاده میکنیم به جای docker buildو از buildah push استفاده میکنیم به جای docker pushو حالا پایپ لاین رو اجرا میکنیم و میریم چایی میخوریم تا کارش تموم بشه:
خلاصه مطلبحالا ما میتونیم imageهایی که میخوایم رو با Gitlab CI با توجه به این که executor رانرمون هم کوبرنتیز هستش رو هم بسازیم. این هم در نظر داشته باشین که تماما به شما بستگی داره که از چه ابزاری برای این مورد استفاده میکنین، ولی استفاده های جالب تری هم میشه از podman و buildah هم داشت مثل image signing. اگه از این مطلب خوشتون اومد حتما به من بگین.منابع:Use Buildah in a rootless container with GitLab Runner OperatorUsing buildah in GitLab CIUse Docker to build Docker images</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Fri, 27 Sep 2024 19:57:38 +0330</pubDate>
            </item>
                    <item>
                <title>برای آپدیت وردپرس FTP نیازه !!!</title>
                <link>https://virgool.io/@alidoosti01/%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A2%D9%BE%D8%AF%DB%8C%D8%AA-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-ftp-%D9%86%DB%8C%D8%A7%D8%B2%D9%87-itriohvcojjm</link>
                <description>یه موردی رو داشتیم رو تست میکردیم که برامون جالب بود و بعدش جالب تر هم شد. قصد داشتیم وردپرس رو روی کانتینر یا PAAS بالا بیاریم و تست کنیم ببینم چه جوریاست به یه مورد جالبی خوردیم. برای آپدیت از ما اطلاعات دسترسی FTP سرور میخواست که اصن نمیدونستیم کجای کانتینرمون میشه.توی ویرگول هم چندتا مقاله خوب برای راه‌اندازی وردپرس با docker هستش که دو تاشو اینجا میزارم:سناریو کامل راه‌اندازی wprdpress با داکر : احمد رفیعیراه‌اندازی وردپرس با داکر wordpress + docker : مهران سعادتما این تست رو روی کانتینر ابری آروان انجام دادیم، یکی از چیزایی که دوست داشتیم این بود که توی پنل کاربریمون به ما دسترسی cloud shell داده شده این برامون جالب بود.حالا مورد چی بود، متوجه شدیم چند روش برای آپدیت کردن وردپرس وجود داره که یکیش دسترسی FTP سرور هستش و این مورد به صورت خودکار بعد از دادن دسترسی انجام میشه و دیتا رو از طریق این دسترسی انتقال میده، ولی ما این مورد رو نداشتیم و نیاز به همون حالت قبلی که روی هاستینگ بالا میاوردیم رو داشتیم.برای این کار متوجه شدیم باید یه مقداری برای فایل کانفیگ وردپرس تعریف کنیم که در واقع این مورد رو constant FS_METHOD میگن.چندین راه برای اپدیت وردپرس وجود داره که راه رسیدن به خدا رو نشون میدن، که لیستش رو براتون میفرستم:directssh2ftpextftpsocketsحالتی که ما دنبالش بودیم حالت direct بود که به صورت پیشفرض باید باشه برای آپدیت خودکار و مستقیم.برای این مورد باید وارد فایل wp-config.php بشید که دنبال FS_METHOD بگردین و اگه پیدا کردینش مقدارش به direct تغییر بدین و یا اگه نبود خط زیر رو به فایل اضافه کنین که این مورد فورس بشه:define( &#x27;FS_METHOD&#x27;, &#x27;direct&#x27; );تعریف fs_methodبعد از اضافه کردن این مورد معمولن نیاز هستش که یکبار کانتینر رو ریستارت کنید، بعد از ریستارت به بخش داشبورد وردپرس برین و یه بار رفرش کنین.البته این نکته رو هم بگم که توی آپدیت های جدید این مورد به صورت پیش فرض روی direct قرار داره.</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Thu, 01 Jun 2023 19:16:17 +0330</pubDate>
            </item>
                    <item>
                <title>تست ترافیک TCP/UDP بین دو سرور با iperf3</title>
                <link>https://virgool.io/@alidoosti01/%D8%AA%D8%B3%D8%AA-%D8%AA%D8%B1%D8%A7%D9%81%DB%8C%DA%A9-tcpudp-%D8%A8%DB%8C%D9%86-%D8%AF%D9%88-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7-iperf3-nskfsrzyt2mv</link>
                <description>خیلی وقت ها ابزارها و اپلیکیشن هایی داریم که مخصوصن توی شرایط نتورکی کشور مجبوریم از دو سرور استفاده کنیم، یکی داخل ایران و یکی هم خارج از ایران، و این وسط ارتباط این دو سرور هم برای ما مهم هستش.خیلی وقت ها ارتباط یا قطع میشه و یا سروری که تو ایران داریم نمیتونه با سرور خارجیمون ارتباط بگیره، توی شرایط فعلی نتورک کشور خیلی پیش میاد که یه رنج آی پی از سمت زیرساخت کشور فیلتر یا بسته شده باشه که میتونم خیلی راحت بگم این چند وقت هم کم ندیدم، از فیلتر بودن یک پورت روی آی پی گرفته تا بسته بودن UDP برای یک رنج آی پی.iperf3هدفم توی این مقاله اینه که ترافیک TCP و UDP رو بین دو تا سرور ارسال و تست کنم، با ابزار iperf3.شاید بگید چرا این ابزار، ابزارهای دیگه هم هست که معروفن و مقالات خیلی خوبی هم در موردشون هست. این ابزار هم کارش درسته و خوشم اومد ازش در کنار اینکه خیلی سبکه، کار راه بنداز هم هست.پیش‌نیاز این کار دانلود کردن ابزار هستش و ما اول دانلود میکنم(تستمون رو روی ubuntu دارم انجام میدم):$ sudo apt-get install iperf3راستی برای نسخه ویندوز اگه ابزار رو خواستین میتونین از آدرس زیر استفاده کنید:https://iperf.fr/iperf-download.phpمیخوایم بشینیم تست کنیم، الان میخوایم ترافیک TCP رو به سرور اول از سرور دوم تست کنیم:باید یک پورت انتخاب کنید و روی اون پورت این تست رو انجام بدین، برای این مورد من دستور زیر استفاده میکنم تا سرور روی پورتی که میخوام شروع به لیسن (listening) روی ترافیک ورودی کنه:$ iperf3 -s -p 6789که s- میشه که روی سرور اجرا میشه و p- هم برای این که پورت رو بهش بدیم و اون مقدار هم مقداری هست که داره الان روش لیسن میکنه.در حال لیسن کردن پورت مدنظربعد از این مورد میریم توی سرور دوم و با دستور زیر این سرور ترافیک TCP رو به سمت سرور یکمون میفرستیم:$ iperf3 -c 172.32.5.20 -p 6789 -b 1Mکه اینجا c- برای کلاینت هستش که وصل بشه به هاست، p- هم همون پورتی رو میدیم که توی سرور یک باز کردیم و b- هم برای پهنای باندی هست که میخوایم بفرستیم. بعد از زدن این خط سعی میکنه با آی پی داده شده روی پورت تعریف شده ارتباط رو بگیره، اگر پورت رو اشتباه بدین یا ارتباط برقرار نشه سریع خطا رو نشون میده.ارسال ترافیک tcp از سرور دوم به سرور اولدریافت ترافیک tcp در سرور اول از سرور دومدر عکس دقت کنید جزییات خوبی نشون داده شده از اینکه این ارتباط از کدوم آی پی هستش، تعداد درخواست ها و اندازه پکت ها و ... .برای UDP دقیقن به همین شکل هستش در این تفاوت که باید بهش بگیم ترافیکی میفرستی با UDP باشه.برای مثال UDP میخوام از سرور اول به سرور دوم ترافیک رو ارسال کنم، برای این مورد باید مثل قبلی اول یه پورتی برای لیسن باز بزاریم که این همون 6789 رو برای سرور دومم باز میزارم:لیسن کردن پورت در سرور دومبعد میریم توی سرور اول و به سمت سرور اولمون ترافیک UDP رو میفرستیم:$ iperf3 -c 172.32.6.30 -p 6789 -b 1M -uتنها تفاوت در این خط استفاده از u- به معنی UDP است. خروجیش رو میتونید ببنید:ارسال ترافیک UDP از سرور اول به سرور دومدریافت ترافیک UDP در سرور دوم از سرور اولاین ابزار خیلی خوبی هستش برای تست نتورک و ارتباطات، سوییچ های زیاد و خیلی خوبی داره پیشنهاد میدم برای فان هم شده تست داشته باشید باهاش. به عنوان مثال میتونید براش زمان مشخص کنید با سوییچ t- یا فقط یک ورژن آی پی رو فورس با سوییچ 4- یا 6-  و یا همین طور میتونید خروجی رو توی یه فایل json با سوییچ J- ذخیره کنید.</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Sun, 02 Apr 2023 19:53:35 +0330</pubDate>
            </item>
                    <item>
                <title>تیشوت ناموسی ریموت دسکتاپ !!!</title>
                <link>https://virgool.io/@alidoosti01/%D8%AA%DB%8C%D8%B4%D9%88%D8%AA-%D9%86%D8%A7%D9%85%D9%88%D8%B3%DB%8C-%D8%B1%DB%8C%D9%85%D9%88%D8%AA-%D8%AF%D8%B3%DA%A9%D8%AA%D8%A7%D9%BE-tbh1hu9fnyhb</link>
                <description>آقا می‌خوایم پدر مادر ویندوز رو بیاریم جلو چشماش بابت رفع کردن مشکل ریموت دسکتاپ، مشکلی که مخصوصن برای سرورهای ویندوزی پیش میاد و افکارات آدم رو بهم می‌ریزه. تو این مقاله قرار حرکت های جالبی بزنیم.موردی که اینجا با هم پیش می‌بریم جمع بندی کارهایی هستش که تا الان برای تیشوت ریموت دسکتاپ انجام دادم و سعی میکنم همش رو دقیق بهتون بگم ولی به ترتیب و اینا نیست. به صورت کلی توی نسخه های قبلی ویندوز سرور مثل 2012 بجز این که باید ریموت رو فعال میکردن باید می‌رفتین توی بخش فایروال ریموت دسکتاپ رو می‌زاشتید رو پابلیک و هم توی server manager هم باید enable می‌شد ولی توی 2016 بعد خودش با فهم بود و فقط کافی بود ریموت دسکتاپ رو فعال می‌کردین و یا یه کاربر بهش معرفی می‌کردین و تامام.حالا یه مواقعی شما یه سرویس هایی دارین که تغییراتی اعمال می‌کنه و یا تغییراتی انجام دادین که نمی‌دونین چه کردین و یا چی نصب کردین که این طوری شده و حالا هر چیزی که باعث شده ریموت دسکتاپ کار نکنه و با تغییر فایروال و server manager هم باز درست نشده، چاره چیه؟ چاره کار تیشوت ماجراس. و ما می‌خوایم همین کار رو کنیم.در مرحله اول قاعدتن باید ببینم که اصن ریموت فعال هستش و این که دسترسی وجود داره یا نه:فعال بودن ریموت (برای همه کاربران)فعال بودن ریموت در server managerثبت بودن رول های ریموت در فایروالاگر مراحل بالا رو دیدید و وصل نمیشد، مطمئن بشید که سرویس ریموت ران هستش یا نه؟ران بودن سرویس ریموتاین هم که رانینگ هستش تازه باید برامون قراره جالب بشه و باید بگیم آقا اذیت نکن دیکه، مشکلی برای ما نیست ما می‌ریم سر وقت رجیستری توی آدرس زیر فایل fDenyTSConnections پیدا می‌کنیم و مقدارش رو صفر می‌کنیم، مقدار 0 یعنی enable و مقدار 1 یعنی disable (شاید فکر کنین دارم برعکس میگم ولی دقیقن همینه):HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Serverاگه شما هم مثل من حوصله گشتن ندارین پاورشل رو باز کنید یه خط پایین رو بزنید تا مقدار صفر بشه:Set-ItemProperty -Path &#039;HKLM:\System\CurrentControlSet\Control\Terminal Server&#039; -name &amp;quotfDenyTSConnections&amp;quot -value 0برای اطمینان هم می‌تونیم فایروال رولش رو هم آپدیت بدیم تا پاورشل باز هستش:Enable-NetFirewallRule -DisplayGroup &amp;quotRemote Desktop&amp;quotبعد این برای اطمینان می‌ریم ببینیم دسترسی کاربرا وجود داره برای ریموت، win+r رو می‌زنیم و کلمه gpedit.msc رو وارد می‌کنیم و توی پنجره باز شده دنبال آدرس زیر میگردیم:Computer Configuration\Administrative Templates\Windows  Components\Remote Desktop Services\Remote Desktop Session  Host\Connectionsروش کلیک کنیم و فایل زیر رو دوبار کلیک کنیم تا باز بشه و مقدارش رو به enable تغییر می‌دیم:Allow users to connect remotely by using Remote Desktop Services.تا اینجا خیلی خوب پیش رفتیم و اگه بازم ریموت نشد بزنیم میریم سراغ مرحله بعد:پاورشل رو باز کنید ببینیم اصن RDP دارن listen میکنه یا نه و بعدش میریم سراغ پورتش، توی پاورشل دستور زیر رو میزنیم:Enter-PSSession -ComputerName &lt;computer name&gt;بعد از این کلمه qwinsta رو میزنیم قاعدتن توی خروجی باید به ما RDP-tcp رو نشون بده:می‌ریم سر وقت این که داره روی چی لیسن میکنه، می‌ریم توی رجیستری و دنبال آدرس زیر می‌گردیم:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\&lt;listener&gt;.اگه هر مقداری به جز 3389 بود برای فایل PortNumber تغییرش می‌دیم به 3389.همین طور برای این که مطمئن بشیم این پورت اشتغال شده توسط نرم افزاری یا نه می‌تونیم توی پاورشل از دستور زیر استفاده کنیم:cmd /c &#039;netstat -ano | find &amp;quot3389&amp;quot&#039;در خروجی به ما میگه رو چه پروتکلی داره لیسن میکنه و این که در اخرش به ما PID میده که می‌تونیم باهاش سرویس رو پیدا کنیم:cmd /c &#039;tasklist /svc | find &amp;quotPID listening to 3389&amp;quot&#039;اگه اختصاص به سرویس دیگه‌ای بود می‌تونیم تغییر بدیم و یا اگه لازم نیست سرویس رو ببندیم که پورت در دسترس قرار بگیره.تا این جا اگه پیش رفتین ریموت درست نشد سرورتون رو پاک کنید :) شوخی کردم تا اینجا چیزی بود که من خودم استفاده داشتم ولی صد در صد راه حل های دیکه هم هست که اگه شما باهاش مواجه شدید خیلی خوشحال میشم که کامنت کنید.دو تا راهکار دیکه هست که من تست نکردم خودم چون نداشتم موردش رو ولی در ادامه میارمش، اگر روی سرورتون وب سرور دارید و از certificate self-sign استفاده کرده باشید این مورد میتونه تاثیر گذار باشه که باید برای این مورد به MMC برید و در بخش remote desktop فایلی با عنوان certification وجود داره که باید حذفش کنید تا با این cert احراز نشه در زمان ریموت زدن.و اون یکی راه اگه خودتون فایل رجیستری برای ریموت دارید و میخواید تنظیمات خودتون رو وارد کنید میتونید از طریق زیر اقدام کنین:اول از فایل فعلی یه بکاپ بگیرید:cmd /c &#039;reg export &amp;quotHKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-tcp&amp;quot C:\Rdp-tcp-backup.reg&#039;بعد از گرفتن بکاپ بزنید فایل رو پاک کنید:Remove-Item -path &#039;HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-tcp&#039; -Recurse -Forceبعد از حذف هم فایل رجیستری خودتون رو وارد کنید:cmd /c &#039;regedit /s c:\&lt;filename&gt;.reg&#039; و در اخر هم سرویس رو ریستارت کنید:Restart-Service TermService -Force</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Tue, 28 Mar 2023 15:50:34 +0330</pubDate>
            </item>
                    <item>
                <title>کار با s3cmd در دبیان</title>
                <link>https://virgool.io/@alidoosti01/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-s3cmd-%D8%AF%D8%B1-%D8%AF%D8%A8%DB%8C%D8%A7%D9%86-spzrtzqajwtg</link>
                <description>اصن s3cmd چیه و چیکار میکنه؟ و چه طوری میشه ازش استفاده کرد؟اول از همه یه توضیح خیلی ساده در مورد s3 یا در واقع amazon s3 باید بدم. s3 در رواقع مخفف Amazon Simple Storage Service هستش که بهش Object Storage میگیم، یک فضای ذخیره سازی اطلاعات که مقیاس پذیری، دردسترس بودن داده و امنیت رو ارائه میده.کاربران و شرکت‌ها در هر اندازه از این فضای ذخیره سازی رو که نیاز داشته باشن می‌تونن تهیه کنن، هر اندازه منظورم بیش از 10 ترابایت هستش. خوبی Amazon s3 اینه که خیلی راحت میشه با API بهش وصل شد و هرکاری دلمون میخواد رو انجام بدیم، مثلن تعریف سطوح دسترسی، تعریف policy های متفاوت، ایجاد لیست دسترسی و همین طور با ابزار هایی که هست میشه به صورت خودکار بک آپ‌هامون رو روش ذخیره کنیم.تو این آموزش به دلیل تحریم بودن نمیشه از Amazon استفاده کرد، من از فضای ابری ابرآروان استفاده کردم به این دلیل که هم 5 گیگش رایگانه هم ساختار S3 داره و هم در کنار API که ارائه داده یه سری SDK با زبان‌های متفاوت هم برای استفاده قرار داده. برای متصل شدن به این فضای ابری ابزارهای زیادی وجود داره، به عنوان مثال s3browser برای ویندوز، s3cmd برای لینوکس، TNTdrive یا CloudBerry. اینو باید بگم که هر ابزاری که s3 compatible باشه میتونه با این فضا ارتباط داشته باشه.خب بریم سراغ اصل مطلب یعنی کار با s3cmd تو لینوکس و دیدن یه سری دستورات خوب که بکارمون میاد.اول از نصب s3cmd شروع می‌کنیم:&#x60; sudo apt-get install s3cmd &#x60;بعد از نصب باید کانفیگش کنیم یعنی از طریق API به فضای ابری وصل بشیم، این مورد نیازمند سه چیز اصلی یعنی Endpoint URL, Access key, Secret key هستش که این موارد رو باید از آمازون استوریج یا ما که از آروان استفاده می‌کنیم، بگیریم. تو حساب کاربریتون در ابرآروان برید و رو Storage کلیک کنید تو بخش پیشخوان سمت چپ نوشته شده &quot;اتصال از طریق API&quot; که این سه مورد رو براتون گذاشته.دستور زیر رو میزنم تا s3cmd رو کانفیگ کنیم:&#x60; s3cmd --configure &#x60;با صفحه‌ی زیر مواجه می‌شید:کانفیگ کردن s3cmdاول از شما Access key رو میپرسه که همون طور که گفتم از تو پیشخوان می‌تونید بردارید، اینجا واردش کنیدبعد از شما Secret key رو میپرسه که باید وارد کنید. بعد از این مرحله از شما Endpoint URL رو میخواد که به صورت پیش‌فرض رو s3.amazonaws.com ست شده، اینجا ما برای ابرآروان رو وارد می‌کنیم.بعدش از شما هدف یا تارگت رو میخواد که باید نحوه ساختار فضای ابری رو وارد کنید که به صورت پیش‌فرض رو آمازون ست شده و ما این مورد رو تغییر میدیم به ابرآروان، این مورد برای اینه که بتونه به راحتی با باکت‌ها (صندوقچه‌ها) ارتباط داشته باشه:&#x60; [%(bucket).s3.ir-thr-at1.arvanstorage.com] &#x60;تا اینجا این موارد از مهم ترین ها بودن بقیه موارد رو به صورت دلخواه می‌تونید وارد کنید، مثلن از شما می‌پرسه میخوای برای رمزنگاری، پسورد بزارید یا نه، یا میخوای از پروتکل HTTPS استفاده کنی یا نه، در آخر هم از تنظیمات یه خروجی نشون میده که با ذخیره کردن ازش خارج میشه.یه سری دستورات رو با نتیجه‌ش براتون میزارم:دیدن لیستی از باکت‌های موجود در فضای ابری دستور &#x60; s3cmd ls &#x60; رو وارد کنید:لیت باکت ها
برای ساختن باکت (صندوقچه) از دستور &#x60; s3cmd mb s3://bucketname &#x60; استفاده می‌کنیم، فقط حواستون باشه باید یک اسم خاص انتخاب کنید نه یه اسم تکراری.ساختن یک باکتدستور &#x60; /s3cmd put file.txt s3://bucketname &#x60; برای ارسال یه فایل به باکت مدنظر هستش:ارسال فایل به باکتارسال یک دایرکتوری یا یک پوشه به باکت: &#x60; s3cmd put -r bucket s3://bucketname/ &#x60; :ارسال پوشه به باکتاگر مد نظر شما این باشه که تمامی فایل های یک دایرکتوری یا پوشه رو به باکت بفرستید می‌تونید بعد از اسم فایل یه اسلش / وارد کنید. &#x60; s3cmd put -r bucket/ s3://bucketname/ &#x60;.اگر بخواین یه فایلی رو از باکت دانلود کنید از دستور زیر استفاده می‌کنیم: &#x60; s3cmd get s3://bucketname/file.txt &#x60;دانلود فایل از باکتبرای پاک کردن فایل : &#x60; s3cmd del s3://bucketname/file.txt &#x60; : پاک کردن فایل از باکتو در اخر هم پاک کردن یک باکت: &#x60; s3cmd rb s3://bucketname &#x60; :پاک کردن خود باکتاین مورد رو چون خودم کار می‌کنم دوست داشتم به اشتراک بزارم، سر موضوع تحریم بودن باید به دنبال بهترین نسخه جایگزین باشیم، من به شخصه در این مورد از ابرآروان استفاده کردم. امیدوارم از این آموزش خوشتون اومده باشه.</description>
                <category>Ali</category>
                <author>Ali</author>
                <pubDate>Tue, 02 Aug 2022 22:16:12 +0430</pubDate>
            </item>
            </channel>
</rss>