<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های aminaleahmad</title>
        <link>https://virgool.io/feed/@aminaleahmad</link>
        <description>Site Reliability Engineer</description>
        <language>fa</language>
        <pubDate>2026-06-16 10:32:47</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/39282/avatar/NbrTbc.png?height=120&amp;width=120</url>
            <title>aminaleahmad</title>
            <link>https://virgool.io/@aminaleahmad</link>
        </image>

                    <item>
                <title>قراردادن helm-chartها برروی artifacthub</title>
                <link>https://virgool.io/@aminaleahmad/publish-helm-chart-on-artifacthub-skwsqx8zrhda</link>
                <description>سلام، توی این آموزش قراره که هلم‌چارت‌هامون رو روی artifacthub با استفاده از github pages قرار بدیم.فرض می‌کنیم که یه هلم‌چارت نوشتیم [قصد دارم بعدا آموزشش رو بزارم] یا یه هلم‌چارت از اینترنت گرفتیم و توش تغییرات دادیم و می‌خوایم نشرش بدیم و توی artifacthub بزاریمش.مقدمه داستانی: [این بخش رو می‌تونید ازش بگذرید]بخوام توی عمل نمونه‌ این‌کارو رو بگم بهتون، ما توی شرکت نیاز به metabase داشتیم و خواستم که با هلم‌چارت اون رو اپلای کنم، توی اینترنت دنبال هلم‌چارت برای متابیس گشتم و این رو پیدا کردم: https://github.com/pmint93/helm-charts اما دردسر زیاد داشت،‌ کنارش باید دیتابیس mysql یا postgres بالا می‌آوردم که دیتاش رو بریزه داخل اون، که خودش یه هلم دیتابیس هم می‌خواست و به نظرم بالا آوردن یه دیتابیس فقط برای دیتای متابیس یکم اسراف منابع بود.نکته دیگه‌ای هم که وجود داشت این بود که دیتابیس متابیس [چه قافیه‌ای :))] زیاد اهمیت نداشت بخاطر همین تصمیم گرفتم یه تغییراتی توی هلم‌چارتی که پیدا کرده بودم بدم و دیتابیس h2 [که برای پروداکشن توصیه نمی‌شه] رو سمت کوبرنتیز persist کنم. برای همین توی هلم‌چارت اصلی یکم تغییرات دادم و بعد از اینکه تستش کردم و کارم تموم شد، برام جالب بود که روی artifact-hub هم آپلودش کنم.مرحله اول: بررسی ساختار مورد نیاز یک helm repoبرای اینکه بتونیم هلم‌چارت خودمون رو توی artifacthub آپلود و اضافه کنیم نیاز داریم که هلم چارت خودمون رو داخل یک ریپازیتوری helm قرار بدیم. پس نیازه که اول یدونه ریپازیتوری هلم بسازیم :دیبه صورت کلی یک ریپوزیتوری هلم چنین ساختاری رو نیاز داره: [نمونه‌اش رو اینجا ببینید]هلم ریپو‌ها تقریبا مثل ریپوهای APT و خیلی از ریپو‌های دیگه یک فایل مشترک دارن که حاوی لیستی از پکیج‌هایی که ارائه می‌دن هست.مثلا توی ریپو‌های APT این فایل Release نام داره که سال ۹۶ توی آموزش زیر باهم ساختیمش: https://virgool.io/@aminaleahmad/create-your-own-cydia-repo-nwkuaegz21pm به همین ترتیب توی ریپو‌های هلمی اسم این فایل index.yaml هست.طبق الگوی آموزش قبلی برای تهیه و ساخت فایل index.yaml نیازه که اول پکیج‌هامون رو لیست کنیم و بعد از روی این پکیج‌ها فایل index.yaml رو بسازیمش.پس میریم سراغ مرحله بعد...مرحله دوم: پکیج کردن هلم‌چارتخب، برای این‌کار کافیه که هلم‌چارت مدنظرمون رو پکیجش کنیم، فرض می‌کنیم یه همچین ساختاری رو توی سیستممون داریم.با کامند زیر از هلم‌چارت خودمون پکیج می‌گیریم:$ helm package metabase-chart
Successfully packaged chart and saved it to: /tmp/virgool-artifacthub/metabase-2.7.1.tgz

 $ ls
metabase-2.7.1.tgz    metabase-chartکه می‌بینید خود helm یه فایل tar با اسم و ورژن چارتمون که داخل Chart.yaml [نمونه اش اینجاست] نوشته بودیم ساخت.مرحله سوم: ساخت فایل index.yamlهمون‌طور که گفتیم این فایل حاوی لیست پکیج‌هایی که ما داخل ریپو خودمون داریم به همراه متادیتای اونا هست.پس بدون فوت وقت می‌ریم که بسازیمش، برای اینکار از دستورhelm repo index .استفاده می‌کنیم:همین‌طور که می‌بینید یک فایل index.yaml از روی پکیج ما ساخته شده و ریپوی ما آماده‌ست.بریم برای هاست کردنش روی گیت‌هاب pages.مرحله چهارم: هاست کردن ریپو روی github pagesبرای اینکار لازمه که پروژه جدید داخل گیت‌هاب بسازید و ترجیها روی branch اصلی هلم‌چارت خودتون رو پوش کنید. [که مراحل انجامش رو خود گیت‌هاب وقتی پروژه جدید می‌سازین بهتون نمایش می‌ده]برای راه‌اندازی گیت‌هاب pages اول میایم یه برنچ جدید می‌سازیم با دستور:git checkout -b gh-pagesسپس فایل tgz و index.yaml رو توی فولدر پروژه‌مون کپی می‌کنیم و با دستور زیر پوش می‌کنیم توی گیت‌هاب:git pushبعد از اینکه ریپو آماده شد وقتشه که pages رو فعال کنیم، توی ریپوی گیت‌هاب روی گزینه Settings می‌زنیم:و از صفحه Pages این قابلیت رو فعال می‌کنیم:پس از فعال شدن می‌ریم برای اضافه کردنش به artifacthub.مرحله پنجم: اضافه کردن ریپو به artifacthubوارد سایت artifacthub.io می‌شیم و اکانت می‌سازیم.از منوی سمت راست برروی Control Panel کلیک می‌کنیم:پس از ورود به کنترل پنل، سمت راست گزینه ADD + رو می‌زنیم.و فرم رو به صورت زیر وارد می‌کنیم:بعد از اینکه ریپوی خودمون رو به artifacthub معرفی کردیم می‌تونیم داخل کنترل پنل ببینیم و وقتی سرچ می‌کنیم جزو نتایج میاد.تبریک می‌گم - شما اولین ریپوی هلم خودتون رو ساختید و داخل artifacthub به اصطلاح خارجیا publish کردین D:ممنون می‌شم اگه پست من مفید بود لایکش کنید و اگه مشکلی داشت یا به مشکلی برخوردید برام کامنت بزارید.</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Thu, 06 Jul 2023 16:14:30 +0330</pubDate>
            </item>
                    <item>
                <title>با من همراه باشید | پر بودن دیسک سنتری و خالی کردن آن</title>
                <link>https://virgool.io/@aminaleahmad/sentry-cleanup-k1ekyxvghv9b</link>
                <description>سلام، سلام، بعد از ماه‌ها یه کوچولو وقت اضافی گیر آوردم و دارم توی ویرگول مینویسم؛ اوایل متن یه خورده داستان سرایی داریم، بخاطر همین اگه میخواید فقط بعد فنی مطلب رو ببینید باید یکم برید پایین تر تا به تیتر اول برسید :))، من به تازگی به تیم زیرساخت هولدینگ پگاه (شرکت مادرِ تپسل، مدیااد، فانتوری، متریکس و چندین محصول دیگه) اضافه شدم و به عنوان یه نیرویی که قراره کلی چیزای جدید یاد بگیره، کلی انگیزه دارم برای مسیر جدیدی پیش روم قراره گرفته.دو هفته اولی که وارد تیم شدم، بکوب درحال یادگیری بودم و به لطف بچه‌های تیم تسک های زیادی سمتم نمی‌اومد به جز موارد شبکه و تلفن‌های شرکت که از پوزیشن قبلی با خودم آورده بودم سمت تیم زیرساخت.بعد از گذشت دو هفته، در جلسه Weekly (که توی این جلسه برنامه و تسک‌های 2 هفته آینده هرکدوم از اعضای تیم رو مشخص می‌کنیم) بحث‌های زیادی مطرح شد و تسک‌های مختلف به هرکدوم از بچه‌ها اساین شد، میون صحبت‌ها بحث از پر بودن درصد زیادی از دیسک Sentry شرکت شد.سنتری چیه؟ نرم‌افزاری هستش که به شما کمک میکنه که با اضافه کردن چند خط کد به پروژه ای که داری، تمام اررورهای پروژه رو هل بدی سمت خودش و اون برات سازمان دهی‌شون کنه و همینطور با کلی ابزار خفن (مثل integration با Gitlab) کمک میکنه که بعد از مراحل Production از سمت کاربر‌ها Feedback بگیری و کد اصلی رو بهینه کنی و باگ‌ها و مشکلات رو برطرف کنی. که هم به صورت Self-Hosted و opensource کار میکنه و هم میتونین از سایت خودش استفاده کنین و پلن متناسب با کارتون رو خریداری کنید. https://sentry.io/ شروع بعد فنی داستانتا اینجا گفتیم که سرور سنتری شرکت Diskش پر شده بود و میخواستیم راه خالی کردنش رو پیدا کنیم.حالا مشکل چی بود؟ خب اینجا شروع سختی داستان بود، چون بچه‌ها میخواستن سطح علمی من رو بسنجن، قرار بر این شد به‌جز دسترسی SSH سرور و محل نصب سنتری به من هیچ اطلاعات دیگه ای داده نشه ?با سپهر که از بچه‌های تیم بود صحبت کردیم.یه مقداری راهنمایی کرد و اطلاعاتی که بالا گفتم رو پاس داد سمت من. اطلاعات چی بود؟ اینکه سنتری ما به صورت docker-composeی نصب شده، فایل‌ها و بقیه موارد هم توی پوشه /opt هست و ما نهایتا دیتای 2 هفته اخیر رو میخوایم نه بیشتر ضمنا اگه بخوای به صورت معمول با خود سنتری cleanup کنی، سی پی یو سرور 100 درصد میشه و سنتری به صورت کلی داون میشه پس اینکار رو هم نمیشه انجام داد.اولین قدم این بود که بفهمیم کلا چندگیگ مصرف شده و چندگیگ خالی داریم برای اینکار از دستورdf -h /استفاده کردم و مشخص شد که 93 درصد فضا پر هست و عملا 19 گیگ بیشتر نداریم.Storage Usage/About 93 Percentفرض رو بر این گرفتیم که میخوایم دیتا رو پاک کنیم فقط، برای اینکار لازم بود بدونیم که چه چیزی این فضارو گرفته و کلا سنتری کجا دیتارو نگه میداره، راه اول این بود که بریم توی اینترنت سرچ کنیم و به راحتی کامپوننت‌های سنتری رو پیدا کنیم و به جواب برسیم. ولی خب همه نرم‌افزارها مثل سنتری با ادب و Fully Documented نیستن که، ازونجایی که من همیشه دنبال تجربه کردن هستم، تصمیم گرفتم با روش اصولی پیداش کنم.بالاتر گفته بودم که سنتری شرکت ما به صورت داکری اومده بود بالا و راهش این بود که ببینم کدوم volume بیشترین حجم رو گرفته. یکم سرچ و تحقیق کردم به یه مطلب جالب داخل سایت medium برخوردم. https://medium.com/homullus/how-to-inspect-volumes-size-in-docker-de1068d57f6b توی این آموزش اومده بود که با استفاده از دستور:$ docker system df -v
...
Local Volumes space usage:
VOLUME NAME                                  SIZE
sentry-self-hosted_sentry-smtp-log           1.609kB
sentry-self-hosted_sentry-zookeeper-log      939.5MB
sentry-clickhouse                            36.73GB
....
sentry-postgres                              145.8GB
sentry-redis                                 550.9MB
sentry-self-hosted_sentry-kafka-log          0B
sentry-self-hosted_sentry-smtp               1.236kB
...می‌شه اطلاعات تمامی volumeهارو به همراه حجمشون به دست آورد. بین volumeها Postgres توجهم رو جلب کرد! 62.5 درصد از حجم دیسک توسط پستگرس اشغال شده بود، می‌شد نتیجه گرفت که دیتای سنتری داخل پستگرس ذخیره میشه.اگه میخواید بدونید دیتابیس PostgreSQL چی هست. به وبسایتش سر بزنید: https://www.postgresql.org/ پس تا اینجا نتیجه میگیریم که باید دیتابیس PostgreSQL رو خالی کنیم و تمامی دیتاهای قدیمی رو تا 14 روز قبل پاک کنیم. (اینجا بگم که من تجربه زیادی از کارکردن با postgres نداشتم و فقط یه دیدگاه اولیه ای نسبت بهش داشتم)میدونستم که برای اجرای کوئری و پاک کردن دیتاها باید وارد کنسول کانتینتر postgres بشم و به کنسول خود دیتابیس وصل بشم. برای اینکار اجرای 2 تا دستور کافی بود.$ docker exec -it sentry-self-hosted-postgres-1 bashroot@d75asdfdsa3:/# psql -U postgres
psql (9.6.24)
Type &amp;quothelp&amp;quot for help.

postgres=#Logging into PostgresSQL Consoleایول! الان به کنسول postgres وصل شدیم و فقط مونده لیست دیتابیس هارو بگیریم. وارد دیتابیس موردنظرمون بشیم و تیبل مربوط به Eventهای سنتری رو پاک کنیم (البته تا اینجای کار نمیدونستم آیا پاک کردن این Eventها ممکنه باعث کرش کردن sentry بشه یا نه، برای همین با کمک سید (یکی دیگه از اعضای تیم) یک Clone از سرور گرفتیم تا دستورات رو اول توی یه محیط Safe تست کنیم و بعد وارد سرور اصلی و Production کنیم)برای گرفتن لیست دیتابیس‌ها عبارتpostgres=# \lرو وارد کنسول postgres میکنیم:Database List from PostgreSQL Consoleهمونطور که مشاهده میکنید اینجا 3 تا دیتابیس داریم. من از روی غریزه دیتابیس اولی رو انتخاب کردم و تصمیم گرفتم داخل اون یکم گشت‌و‌گزار کنم.برای انتخاب دیتابیس از دستور زیر استفاده میکنیم:postgres=# \c postgres
You are now connected to database &amp;quotpostgres&amp;quot as user &amp;quotpostgres&amp;quot.postgres=#خب، الان وارد دیتابیس شدیم، وقتشه که لیست Table هارو بگیریم و ببینیم کدومشون حجم بیشتری رو گرفته:PostgreSQL list of tablesاین دستور یک لیست از Tableهای توی دیتابیس بهمون میده، ولی این اطلاعات کافی نیست، باید بفهمیم هر جدول چه فضایی رو اشغال کرده. داخل اینترنت یکم سرچ کردم و در نهایت به کوئری زیر رسیدم:select table_name, pg_relation_size(quote_ident(table_name))
from information_schema.tables
where table_schema = &#039;public&#039;
order by 2کوئری رو داخل دیتابیس وارد کردم و نتیجه زیر رو بهم نشون داد:Disk Usage for each tableهمونطور که میبینید جدول nodestore_node، حدودا 130 گیگ فضا اشغال کرده و یعنی تمامی اطلاعات داخل این جدول هست. وقتشه که یکم پاکسازیش کنیم.اول باید بفهمیم این جدول چه columnهایی داره که براساس اون کوئری SELECT و سپس DELETE رو اجرا کنیم.برای اینکار از دستور زیر استفاده میکنیم:\d+ table_namenodestore_node table columnsخب column کلیدی ما پیدا شد. timestamp! بر اساس این column میتونیم دیتای داخل جدول رو فیلتر کنیم و اطلاعات اضافی رو پاک کنیم. اول چندخط اول این column رو خروجی میگیریم که ببینیم دیتا رو از چه تاریخی داریم. با استفاده از دستور:SELECT timestamp
        FROM nodestore_node
        ORDER BY timestamp limit 5;که خروجی زیر رو بهمون میده:این یعنی من اطلاعات 2 ماه رو داخل سرور دارم درحالی که اطلاعات 2 هفته رو بیشتر نمیخوام.دست به کار میشیم برای حذف اطلاعات، من از دستور زیر برای پاک کردن 1 میلیون رکورد استفاده کردم:DELETE
FROM nodestore_node
WHERE id = any(array(
        SELECT id
        FROM nodestore_node
        WHERE timestamp &lt;= &#039;2022-10-15 00:00:00.000000+00&#039; ORDER BY timestamp Limit 1000000));که داخل دستور بالا تاریخ داده شده، خواستم 1 میلیون تا از رکوردهارو پاک کنم و ببینم چقدر فضا خالی میشه.راستشو بخواید من این دستور رو با سرچ کردن و یا تجربه قبلی ننوشتم. توی گشت گذارم داخل سورس sentry داخل گیت‌هاب، بخش cleanup رو یکم خوندم و دیدم که پایتون دستور بالا رو داخل پستگرس اجرا میکنه، لینکش رو هم میزارم اینجا: https://github.com/getsentry/sentry/blob/f4ca58925908adfc20ee8371b5a883857dcee23c/src/sentry/db/deletion.py#L48:L62 و بله، دستور بالا رو زدم، 1 میلیون رکورد دیتابیس رو پاک کردم. خوشحال و خندان بودم که یکبار دیگه با استفاده از دستورdf -h /وضعیت دیسک رو گرفتم که ببرم به بچه ها نشون بدم ولی دیدم عه!!! هیچی خالی نشده...دوباره مجدد کلی سرچ و تحقیقات کردم، نتیجه بر این شد که دیتابیس پستگرس، بعد از پاک کردن رکوردها اون هارو به صورت Dead همچنان نگه میداره و برای پاک کردن نهاییشون باید از دستورvaccum fullاستفاده کنم، این دستور رو اجرا کردم، بعد از چند دقیقه دیسک سرور 100 درصد پر میشد و خطای دیسک میخورد، و می‌گفت که فضا ندارم. یکم تحقیق کردم مجدد و فهمیدم موقعی که ما دستور وکیوم رو اجرا میکنیم. پستگرس یک کپی از رکوردهای Live ما درست میکنه و سپس هرچی از قبل بوده رو پاک می‌کنه، یعنی ما به اندازه فضای خالی فعلی دیسک فقط میتونیم دیتا ذخیره کنیم. پس بیخیال آزمون و خطا شدم و دستور پاک کردن رو بدون لیمیت وارد کردم و 26 میلیون از 27 میلیون رکورد دیتابیس پاک شد، سپس با دستور وکیوم رکوردهای مرده دیتابیس رو هم پاک کردم و فضا خالی شد.الان فقط تست کردن سنتری مونده، یکم توی سنتری چرخیدم و همه چیز رو تست کردم، رکوردهای قبلی همچنان Titleشون داخل سنتری بود ولی دیتا پاک شده بود و اررور زیر رو میداد:نتایج به نظر موفقیت‌آمیز میومدن، نتیجه رو با یکی از بچه‌های تیم به اشتراک گذاشتم و پس از اوکی گرفتن نهایی عملیات بالا رو روی سرور اصلی (نه clone) نهایی کردیم و این تسک رو به نتیجه رسوندیم.</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sat, 05 Nov 2022 13:01:32 +0330</pubDate>
            </item>
                    <item>
                <title>نصب و راه اندازی Gitlab روی سرور شخصی با استفاده از داکر</title>
                <link>https://virgool.io/@aminaleahmad/run-a-gitlab-server-using-docker-qotxql8ao03y</link>
                <description>گیت‌لب مثل هزاران سرویس دیگه خارجی ما ایرانی‌ها رو تحریم کرده و بخاطر تجربه ای که اکثرمون از این اتفاق داریم، گیت‌هاب هم الآن زیاد مورد اعتماد نیست...!چه چیزی بهتر از راه انداختن گیت‌لب روی سرور داخل شرکت خودمون، که هم کاهش ترافیک بین الملل در شرکت رو به همراه داره، و هم سرعت کانکشن بالای شبکه داخلی!بریم سر اصل مطلب، راه اندازی گیت‌لب روی داکر:اول از همه نیاز هستش که داکر رو نصب کنیم، توی این مثال من از توزیع Ubuntu استفاده می‌کنم:قدم اول پاک کردن نسخه های قبلی داکر هست:sudo apt-get remove docker docker-engine docker.io containerd runcقدم دوم اضافه کردن Repository داکر روی سرور:sudo apt-get updatesudo apt-get install  ca-certificates curl gnupg lsb-releasecurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho &amp;quotdeb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;quot | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/nullقدم سوم دانلود و نصب انجین داکر:sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.ioبا استفاده از دستورdocker -vمطمئن می‌شیم که داکر نصب شده و بعد می‌ریم سراغ مراحل دانلود و نصب گیت‌لب:اول یک محیطی رو برای گیت‌لب می‌سازیم و اسم اون رو GITLAB_HOMEمی‌زاریم:export GITLAB_HOME=/srv/gitlabmountpointsداخل جدول بالا توضیح داده شده که کدوم فولدر و مسیر توی کانتینر داکر کدوم نقش رو بازی می‌کنه.روش اول - نصب با استفاده از خود داکر:sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  gitlab/gitlab-ee:latestدر دستور بالا gitlab.example.com با FQDN شما، یا همون آدرس دامین سرور شما باید جایگزین بشه.این دستور ایمیج گیت‌لب رو از داکر دانلود و اجرا می‌کنه، همچنین پورت های 443، 80 و 22 هم به اصطلاح NAT می‌شن.همه اطلاعات سرور گیت‌لب شما هم داخل مسیرGITLAB_HOME$نوشته می‌شه .اگر از SELinux استفاده می‌کنین به جای دستور بالا از دستور پایین باید استفاده کنین:sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
  --shm-size 256m \
  gitlab/gitlab-ee:latestبعد از اینکه کار دانلود و اجرا تموم شد، آدرس FQDN خودتون رو داخل مرورگر بزنین و وب گیت‌لب باز می‌شه:)برای به دست آوردن پسورد ادمین اصلی، از دستور زیر استفاده کنین:sudo docker exec -it gitlab grep &#039;Password:&#039; /etc/gitlab/initial_root_passwordحالا می‌تونین با استفاده از نام کاربری root و پسوردی که به دست آوردین وارد پنل ادمین گیت‌لب بشین.دقت کنین که این پسورد فقط برای 24 ساعت اولیه فرایند نصب کار می‌کنه و بعد از 24 ساعت به طور اتوماتیک پاک می‌شه و دیگه بهش دسترسی نخواهید داشت.روش دوم - نصب با استفاده از docker-compose:با استفاده از docker-compose شما می‌تونین به راحتی گیت‌لب خودتون رو نصب، کانفیگ و آپدیت کنین:اولین مرحله نصب انجین داکر هستش که در مراحل بالاتر توضیح دادم، بعد از اینکه از نصب داکر مطمئن شدید، نوبت نصب docker-compose می‌رسه:sudo curl -L &amp;quothttps://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)&amp;quot -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composesudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-composeو با استفاده از دستورdocker-compose --versionمطمئن می‌شیم که مراحل نصب رو درست رفتیم و docker-compose نصب شده و در نهایت می‌ریم سراغ نصب گیت‌لب:اول از همه یک فایل به اسم docker-compose.yml می‌سازیم که قراره کانفیگ های گیت‌لب سرور خودمون رو داخلش بنویسیم:version: &#039;3.6&#039;
services:
  web:
    image: &#039;gitlab/gitlab-ee:latest&#039;
    restart: always
    hostname: &#039;gitlab.example.com&#039;
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url &#039;https://gitlab.example.com&#039;
        # Add any other gitlab.rb configuration here, each on its own line
    ports:
      - &#039;80:80&#039;
      - &#039;443:443&#039;
      - &#039;22:22&#039;
    volumes:
      - &#039;$GITLAB_HOME/config:/etc/gitlab&#039;
      - &#039;$GITLAB_HOME/logs:/var/log/gitlab&#039;
      - &#039;$GITLAB_HOME/data:/var/opt/gitlab&#039;
    shm_size: &#039;256m&#039;داخل کانفیگ بالا gitlab.example.com رو با FQDN خودمون جایگزین می‌کنیم.و در نهایت:docker-compose up -dو دوباره مثل مراحل نهایی نصب با استفاده از انجین داکر بعد از اینکه کار دانلود و اجرا تموم شد، آدرس FQDN خودتون رو داخل مرورگر بزنین و وب گیت‌لب باز می‌شه:)برای به دست آوردن پسورد ادمین اصلی، از دستور زیر استفاده کنین:sudo docker exec -it gitlab grep &#039;Password:&#039; /etc/gitlab/initial_root_passwordحالا می‌تونین با استفاده از نام کاربری root و پسوردی که به دست آوردین وارد پنل ادمین گیت‌لب بشین.دقت کنین که این پسورد فقط برای 24 ساعت اولیه فرایند نصب کار می‌کنه و بعد از 24 ساعت به طور اتوماتیک پاک می‌شه و دیگه بهش دسترسی نخواهید داشت.</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sun, 23 Jan 2022 16:03:22 +0330</pubDate>
            </item>
                    <item>
                <title>کانفیگ پرومتئوس Prometheus راه اندازی AlertManager روی داکر</title>
                <link>https://virgool.io/@aminaleahmad/configure-promtheus-and-alertmanager-hapu5rsbogli</link>
                <description>چندوقتی بود که از پرومتئوس و گرافانا برای مانیتور کردن سرورهای بیگ بلو باتن به صورت Visual یا &quot;بصری&quot; استفاده می‌کردم، و خب بعد از یه مدت وقت مانیتور کردن به صورت &quot;بصری&quot; رو نداشتم و به فکر راه اندازی AlertManager افتادم، که مثلا هرموقع دیسک سرورها پر شد، یک ایمیل دریافت کنم.توی این آموزش فرض می‌کنیم که شما از قبل سرور Prometheus داکری رو راه‌اندازی کردین و همچنین دانش نوشتن Expression های پرومتئوسی رو دارین.من توی این آموزش سراغ مانیتور کردن up یا down بودن سرورها رفتم، اول Expression مورد نظرمون رو می‌نویسیم و تست می‌گیریم:اینجا مقدار up اگه برای هر exporter صفر بشه، یعنی سرور یا خاموشه یا exporter خراب شده که در هر دو صورت باید به مشکل رسیدگی بشه.پس شرط مورد نظر ما اینطوری می‌شه:up == 0یعنی اگر مقدار up برابر صفر شد برای ما نوتیفیکیشن بفرست.حالا که شرط رو به دست آوردیم داخل فولدر کانفیگ های پرومتئوس یک فایل جدید درست می‌کنیم که شرط هامون رو داخلش قرار بدیم، توی سناریوی من اسم این فایل rules.yml هست، داخل این فایل کانفیگ زیر رو می‌زنیم:groups:
- name: AllInstances
  rules:
  - alert: InstanceUptime
    # Condition for alerting
    expr: up == 0
    for: 1m
    # Annotation - additional informational labels to store more information
    annotations:
      title: &#039;Instance {{ $labels.instance }} is down!!&#039;
      description: &#039;{{ $labels.instance }} of job {{ $labels.job }} has been down for 1 minute!&#039;
    # Labels - additional labels to be attached to the alert
    labels:
      severity: &#039;critical&#039;همونطور که می‌بینید داخل این فایل بخش expr شرط خودم رو نوشتم.حالا داخل فایل docker-compose.yml خطوط زیر رو اضافه می‌کنیم:version: &#039;3.2&#039;
services:
  ...
  alertmanager:
    container_name: alertmanager
    image: prom/alertmanager:v0.23.0
    restart: unless-stopped
    ports:
      - &amp;quot9093:9093&amp;quot
    volumes:
      - &amp;quot./alertmanager:/config&amp;quot
      - alertmanager-data:/data
    command: --config.file=/config/alertmanager.yml --log.level=debug
volumes:
  alertmanager-data:و داخل تنظیمات مربوط به پرومتئوس، خط زیر رو اضافه می‌کنیم که فایل شرط های ما داخل کانتینر داکر هم لینک بشه:داخل فایل prometheus.yml هم کانفیگ های زیر رو اضافه می‌کنیم که بین AlertManager و پرومتئوس ارتباط برقرار بشه:rule_files:
  - ./rules.yml

alerting:
  alertmanagers:
    - scheme: http
      static_configs:
        - targets: [ &#039;127.0.0.1:9093&#039; ]حالا کنار فایل prometheus.yml و rules.yml یک فولدر جدید به اسم alertmanager می‌سازیم:و داخل این فولدر یک فایل جدید به اسم alertmanager.yml اضافه می‌کنیم و کانفیگ های زیر رو داخلش می‌ریزیم: (داخل بخش receivers، از SMTP های جی‌میل استفاده کردیم، براساس اطلاعات جی‌میل خودتون این بخش رو تکمیل کنین)route:
  group_by: [&#039;alertname&#039;]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: &#039;mail&#039;

receivers:
  - name: &#039;mail&#039;
    email_configs:
      - smarthost: &#039;smtp.gmail.com:587&#039;
        auth_username: &#039;YOUR_GMAIL@gmail.com&#039;
        auth_identity: &#039;YOUR_GMAIL@gmail.com&#039;
        auth_password: &amp;quotGMAIL_PASSWORD&amp;quot
        from: &#039;YOUR_GMAIL@gmail.com&#039;
        to: &#039;receiver1@yahoo.com, receiver2@yahoo.com&#039;

inhibit_rules:
  - source_match:
      severity: &#039;critical&#039;
    target_match:
      severity: &#039;warning&#039;
    equal: [&#039;alertname&#039;, &#039;dev&#039;, &#039;instance&#039;]تا اینجا ما AlertManager رو نصب کردیم، شرط‌هامون رو هم نوشتیم، AlertManager رو به پرومتئوس وصل کردیم و تنظیمات جی‌میل خودمون رو هم وارد کردیم.حالا با دستورdocker-compose up -dکانتینرهای داکری خودمون رو اجرا می‌کنیم، داخل مسیر http://prometheus:9091/new/alertsباید شرط های خودمون رو ببینیم، اگه instance ای از پرومئوس خاموش بشه و وضعیت up اون به صفر تبدیل بشه و این شرایط برای یک دقیقه ثابت باشه، AlertManager به شما ایمیل می‌زنه و وضعیت رو بهتون اطلاع رسانی می‌کنه. D:اگه می‌خوای از تلگرام استفاده کنی و نوتیفیکیشن ها رو داخل تلگرام دریافت کنی به این لینک یه سری بزن:https://prometheus.io/docs/alerting/latest/configuration/#webhook_config https://prometheus.io/docs/alerting/latest/configuration/#webhook_config </description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sat, 22 Jan 2022 16:52:32 +0330</pubDate>
            </item>
                    <item>
                <title>خروجی گرفتن از داخلی ها در ایزابل Issabel / الستیکس Elastix</title>
                <link>https://virgool.io/@aminaleahmad/how-to-export-extensions-in-issabel-awyk4ic7rnq4</link>
                <description>ممکنه یک روزی نیاز به خروجی گرفتن از داخلی های ایزابل پیدا کنین، مثلا من امروز میخواستم داخلی های 15 نفر از اعضای شرکت رو پاک کنم، ولی کامل مطمئن نبودم که از شرکت رفتن یا نه، و ممکن بود مجبور شم دوباره داخلی رو با همون secret قبلی بسازم! پس به یه بکاپ نیاز داشتم.بهترین راه، خروجی گرفتن بود که روش انجامش رو خیلی خلاصه و سریع براتون توضیح میدم.بعد از ورود به پنل وب ایزابل از منوی اصلی وارد مسیر زیر میشیم:PBX/Batch Configurations/Batch of Extensionsوارد صفحه Batch of Extensions که شدید، اگر روی گزینه Download the current extensions in CSV format بزنید، فایل CSV خروجی داخلی‌ها براتون دانلود میشه، همچنین میتونین از قالب این فایل برای ساختن داخلی ها به صورت Bulk یا انبوه استفاده کنین.به همین راحتی و خوشمزگی :)Download the current extensions in CSV formatنمونه خروجی:Example of export</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Mon, 17 Jan 2022 17:30:09 +0330</pubDate>
            </item>
                    <item>
                <title>گرفتن فضای بیشتر از Dropbox - تا 16 گیگابایت!</title>
                <link>https://virgool.io/@aminaleahmad/get-more-space-on-dropbox-t67rfpghbke8</link>
                <description>چندروز پیش توی یک شرکت جدید استخدام شدم، و یک بخشی از شرکت برای اشتراک فایل ها و نگه داری بکاپ‌ها از دراپ‌باکس استفاده می‌کردن، از اونجایی که دراپ‌باکس فضای رایگان اولیه‌ش 2 گیگ هست، نیاز به افزایش این فضا به صورت &quot;رایگان&quot; داشتیم :)برای افزایش این فضا، چندراه وجود داره که اینجا با هم تست می‌کنیم،انجام Get Started Tour (250 MB): وارد لینک Get Started بشید، و مراحلی که توی این صفحه نشون داده شده رو انجام بدین، مثل ورق زدن کتابچه Dropbox Tour، یا ریختن اولین فایل‌ها روی این سرویس و ... Get started tourوصل کردن اکانت فیسبوک به دراپ‌‌باکس (125 MB): می‌تونین با وارد شدن به لینک https://www.dropbox.com/getspace با لینک کردن اکانت فیسبوکتون به دراپ‌باکس 125 مگابایت فضای بیشتر دریافت کنین.وصل کردن اکانت توییتر به دراپ‌‌باکس (125 MB): همچنین می‌تونین با وارد شدن به لینک  https://www.dropbox.com/getspace با لینک کردن اکانت فیسبوکتون به دراپ‌باکس 125 مگابایت فضای بیشتر دریافت کنین.دنبال کردن توییتر دراپ‌باکس (125 MB): بعد از لینک کردن اکانت توییترتون با دراپ‌باکس می‌تونین با فالو کردن دراپ‌باکس در توییتر هم 125 مگابایت فضای بیشتر دریافت کنین.ارسال بازخورد به تیم دراپ‌باکس (125 MB): وارد لینک https://www.dropbox.com/getspace می‌شیم و از گزینه Tell us why you love Dropbox استفاده می‌کنیم و یک جمله ساده می‌نویسیم مثلا:I love Dropbox because it&#x27;s fast.دعوت کردن دوستان (16 GB): در روش های قبلی شما می‌تونین مجموعا 750 مگابایت فضا دریافت کنین ولی روش آخر که هم سخت ترین روش هست، و هم بیشترین فضا رو به شما می‌ده، دعوت کردن دوستانتون به دراپ‌باکس هست - به ازای هر دوستی که به دراپ‌باکس ملحق می‌شه شما 500 مگابایت دریافت می‌کنین - ولی کیه که 64 تا دوست داشته باشه؟؟! نظرتون چیه که 64 تا دوست بسازیم؟ :)))با استفاده از VirtualBox و رفیق همیشگیمون Ubuntu می‌تونیم طی یه پروسه وقت‌گیر ولی جذاب، 64 تا دوست برای خودمون بسازیم.اولین مراحل برای اینکار دانلود VirtualBox و Ubuntu Desktop و ساخت یک ایمیل موقت هستش،برای ساخت ایمیل موقت می‌تونین از ربات تلگرامی @fakemailbot یا از وبسایت https://temp-mail.org/en استفاده کنین.بعد از ساختن ایمیل موقت وارد صفحه https://www.dropbox.com/account/referrals می‌شیم و برای ایمیل موقتی که ساختیم یک دعوتنامه می‌فرستیم، وقتی دعوتنامه ارسال شد، داخل ایمیل دریافتی لینک مخصوص دعوت وجود داره:Referral Linkاین لینک رو ذخیره کنین که بعدا بهش نیاز داریم.برای دانلود Ubuntu و VirtualBox می‌تونین از لینک های زیر استفاده کنین:VirtualBox : https://soft98.ir/os/virtual-machine/330-virtualbox.htmlUbuntu Desktop 20.04 : https://releases.ubuntu.com/20.04.3/ubuntu-20.04.3-desktop-amd64.isoبعد از دانلود و نصب VirtualBox مراحل نصب و راه‌اندازیِ ماشینِ Ubuntu شروع می‌شه:برای شروع از گزینه New استفاده می‌کنیم:VirtualBox First Pageبعد صفحه جدید باز می‌شه، که چندتا فیلد ساده مثل اسم ماشین، و محل قرارگیری فایل های ماشین رو ازتون می‌پرسه:Create Virtual Machineبعد از کلیک روی گزینه Next صفحه جدیدی باز می‌شه که ازتون مقدار Ram ای که می‌خواین به ماشین تون اختصاص بدین رو می‌گیره.Virtual Machine - Dedicating Ramدر مرحله بعدی ازتون می‌پرسه که آیا از قبل برای این ماشین دیسک و فضا دارین یا نه، که ما قاعدتا نباید داشته باشیم پس با انتخاب Create a virtual hard disk now یکی می‌سازیم:Hard Disk Type SelectionHard Disk File TypeStorage typeدقت کنین که در مرحله آخر، اگه Dynamically allocated رو انتخاب کنین، هرچقدر دیسک ماشین تون پر بشه فایل های virtualbox هم بزرگ می‌شن، (گزینه پیشنهادی)ولی اگه گزینه Fixed size رو انتخاب کنین، Virtualbox همون اول یه فایل حجیم به اندازه حجم دیسکی که به ماشین می‌دین می‌سازه و خب طبیعتا فضای خیلی زیادی رو بی‌خود و بی‌جهت اشغال می‌کنه.در مرحله بعدی، ازتون می‌خواد که حجم دیسک ماشین‌تون رو اختصاص بدین و یک محلی برای ذخیره - که قراره حجم زیادی باشه - مشخص کنین، به نظر من 20 گیگ کافیه، که نه سیخ بسوزه و نه کباب (نه کم بیاد نه زیاد).Storage Size and Locationبعد از زدن دکمه Create، می‌بینیم که ماشینی که ساختیم به جمع ماشین‌های ما اضافه شده:Virtualbox home - after creating machineالان باید iso فایل Ubuntu رو به ماشین‌‌مون بدیم که با اون فایل بوت بشه، روی چرخ‌دنده Settings منو کلیک می‌کنیم، و داخل بخش Storage، زیر تیتر Controller: IDE روی گزینه سی‌دی کلیک می‌کنیم و در پنجره جدید با استفاده از دکمه Add فایل ISO رو به برنامه می‌دیم و در نهایت روی گزینه Choose انتخاب می‌کنیم و پنجره تنظیمات رو می‎‌بندیم:iso file selectionدوباره به صفحه اصلی برگشته و ماشین‌مون رو روشن می‌کنیم و مراحل نصب Ubuntu رو پیش می‌ریم.بعد از اتمام نصب اوبونتو، وارد لینک https://www.dropbox.com/install-linux می‌شیم و لینک فایل Deb برای ubuntu 64 رو برمی‌داریم که الآن که من دارم این مطلب رو می‌نویسم لینک اینطوریه:https://www.dropbox.com/download?dl=packages/ubuntu/dropbox_2020.03.04_amd64.debباید از ترمینال برای دانلود این فایل استفاده کنیم:wget https://www.dropbox.com/download?dl=packages/ubuntu/dropbox_2020.03.04_amd64.debو در نهایت با اجرای دو دستور زیر، کلاینت دراپ‌باکس روی Ubuntu ما نصب می‌شه:mv download?dl=packages/ubuntu/dropbox_2020.03.04_amd64.deb dropbox.debdpkg -i dropbox.debاینجا ما لازمه یک Snapshot از ماشین خودمون بگیریم، که هربار می‌خوایم افزایش حجم بدیم مجبور به نصب Ubuntu از اول نباشیم، برای گرفتن اسنپ‌شات مراحل زیر رو دنبال کنین: Take Snapshot... (Host+T) &quot; /&gt; Take Snapshot... (Host+T)&quot; /&gt;Machine -&gt; Take Snapshot... (Host+T) &quot; /&gt;Machine -&gt; Take Snapshot... (Host+T) &quot; /&gt; Take Snapshot... (Host+T)&quot; /&gt;Machine -&gt; Take Snapshot... (Host+T) در این مرحله یک اسم برای اسنپ‌شات خودمون انتخاب می‌کنیم (مثلا After installing dropbox) و بر روی دکمه Ok کلیک می‌کنیم.- مرحله تکرار -از اینجا به بعد برای هر 500 مگابایت مراحل پایینی رو باید انجام بدیم:دراپ‌باکس رو سرچ می‌کنیم:https://itsfoss.com/install-dropbox-ubuntu/https://itsfoss.com/install-dropbox-ubuntu/بعد از نصب روی آیکون Dropbox کلیک کرده و اینستالر دراپ‌باکس اجرا می‌شه و اتوماتیک نصب می‌شهhttps://itsfoss.com/install-dropbox-ubuntu/  https://itsfoss.com/install-dropbox-ubuntu/ بعد از اینکه آیکون دراپ‌باکس در بالا ظاهر شد، از لینکی که داخل ایمیل بود استفاده می‌کنیم و لینک رو با Mozilla Firefox ماشین‌مون باز میکنیم و مراحل ورود رو با اطلاعات &quot;ایمیل موقت&quot; انجام می‌دیم.بعد از اینکه مراحل ورود انجام شد، 500مگابایت به حجم اکانت اصلی اضافه می‌شه که داخل صفحه https://www.dropbox.com/account/referrals می‌تونین ببینین:Referallsالآن ماشین‌مون رو خاموش می‌کنیم و Mac Address ماشین رو تغییر می‌دیم:در صفحه اول Virtualbox روی چرخ‌دنده کلیک می‌کنیم و طبق عکس پایین مراحل رو جلو می‌ریم:الآن که مک آدرس ماشین‌ما عوض شده، وقت برگردوندن اسنپ‌شات هستش، دوباره از صفحه اول مراحل زیر رو جلو می‌ریم:روی اسنپ‌شاتی که گرفته بودیم کلیک راست می‌کنیم و گزینه Restore رو می‌زنیم:دقت کنید که در این مرحله حتما باید تیک Create a snapshot of .... برداشته بشه، وگرنه به ازای هربار برگردوندن اسنپ‌شات یکبار اسنپ‌شات گرفته می‌شه و فضای بسیار زیادی الکی اشغال می‌شه.بعد از زدن گزینه Restore، ماشین رو روشن می‌کنیم و دوباره از &quot;مرحله تکرار&quot; مراحل رو تکرار می‌کنیم.امیدوارم این آموزش مفید واقع بشه، این کار رو هم با ریسک خودتون انجام بدین، ممکنه یه روزی دراپ‌باکس به اکانت شما مشکوک بشه و ایمیل‌های فیک و موقتی که وارد کردین رو شناسایی بکنه، به همین دلیل همیشه حداقل از آخرین نسخه فایل‌ها بکاپ داشته باشین!ایده مطلب از https://www.expertreviews.co.uk/dropbox/1404899/how-to-get-more-dropbox-space-for-free-32gb-the-easy-way، فارسی نوشتن و اسکرین شات‌ها از خودم :)</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sun, 16 Jan 2022 11:15:02 +0330</pubDate>
            </item>
                    <item>
                <title>اجرا کردن نرم افزار های GUI لینوکسی بر روی ویندوز 11 | WSL</title>
                <link>https://virgool.io/@aminaleahmad/run-linux-gui-apps-on-windows-11-w4btfxq6ul6s</link>
                <description>خوشبختانه با معرفی WSL 2، میشه نرم افزارهای GUI لینوکسی رو دقیقا مثل یه برنامه ویندوزی اجرا کرد و استفاده کرد.اجرا کردن نرم افزارهای لینوکسی از استارت منوی ویندوزپین کردنشون توی تسک‌بار ویندوزاستفاده از Alt + Tab برای جا به جا شدن بین برنامه های ویندوزی و لینوکسیکپی و پیست کردن بین برنامه های ویندوزی و لینوکسی (فکر کنم بهترین خاصیتش همینه)بدون طولانی کردن مقدمه بریم سراغ مراحل انجام کار:اول از همه این رو درنظر داشته باشید که اجرا کردن برنامه های GUI فقط برای WSL 2 قابل استفاده هست.wsl --set-version &lt;distribution name&gt; &lt;versionNumber&gt;برای تنظیم کردن نسخه WSL از دستور بالا استفاده میکنیم که به جای distribution name از نام توزیع مورد نظرتون (که از قبل نصب کردید) قرار میگیره و به جای versionNumber هم 2 رو مینویسیم.اگه توی پیدا کردن distribution name مشکل دارید میتونید از دستور زیر کمک بگیرینC:\Users\Amin&gt;wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2با توجه به تنظیمات کامپیوترم، دستور برای من این شکلی میشه:wsl --set-version Ubuntu-20.04 2بعد از تغییر نسخه از 1 به 2، میریم که چندتا برنامه ساده رو روی توزیع لینوکسی خودمون نصب کنیم، من برای اوبونتو خودم از gedit, VLC و gimp استفاده کردم.برای نصب geditsudo apt install gedit -yبرای نصب gimpsudo apt install gimp -yبرای نصب VLCsudo apt install vlc -yبعد از نصب برنامه های مورد نظرتون، اگه برای اجرا نرم افزار تلاش کنین با اررور زیر مواجه خواهید شد:دلیل این اررور ناقص یا خاموش بودنِ سرورِ تصویرِ X11 ِ ویندوز هستش :)اینجاست که از VcXsrv کمک میگیریم، برنامه VcXsrv رو دانلود میکنیم: https://sourceforge.net/projects/vcxsrv/ بعد از دانلود کردن و نصب، برنامه رو با دستور و پارامترهای زیر اجرا کنین: (من برای خودم روی دسکتاپ ویندوز شورتکات ساختم که لازم نباشه هربار که میخوام استفاده کنم دستور رو کپی پیست کنم، ضمناً میشه شورتکات رو داخل Startup ویندوز هم گذاشت)&amp;quotC:\Program Files\VcXsrv\vcxsrv.exe&amp;quot :0 -multiwindow -clipboard -wgl -acبعد از اجرا کردن VcXsrv توی تسک‌بار آیکون VcXsrv ظاهر میشه، لاگ فایل VcXsrv رو باز کنین، اگه این دو خط داخل لاگ بود یعنی سرورِ ما بدون مشکل استارت شده:حالا که سرورِ تصویرِ ما استارت شده، وقتشه که سرور رو به توزیع لینوکسیمون بشناسونیم، به صورت دستی میشه اینکارو رو با اجرای دستورِ زیر، هربار که نشست ترمینال جدید درست میکنیم انجام بدیم، ولی طبعاً ما دوست داریم این کار به صورت اتوماتیک اجرا بشه.export DISPLAY=$(grep nameserver /etc/resolv.conf | awk &#039;{print $2}&#039;):0.0دستور بالا رو داخل مسیر زیر (ترجیحا بین چندخط اول فایل) قرار میدیم:/etc/bash.bashrcبعد از ذخیره فایل، لازمه که یکبار ترمینال رو ببندیم و باز کنیم.حالا وقتی یکی از برنامه هایی که نصب کردیم رو داخل ترمینال لینوکس اجرا کنیم میبینیم که پنجره جدید باز میشه و بوووووم :)))!GEDITVLCبرای شورت‌کات کردن برنامه های لینوکس داخل دسک‌تاپ ویندوز یا تسکبار هم میتونین یه فایل bat بسازین و دستور زیر رو داخلش قرار بدین:ubuntu2004.exe run &amp;quotexport DISPLAY=$(grep nameserver /etc/resolv.conf | awk &#039;{print $2}&#039;):0.0 &amp;&amp;  vlc&amp;quot</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Tue, 02 Nov 2021 00:25:05 +0330</pubDate>
            </item>
                    <item>
                <title>سایدلود کردن برنامه های اندرویدی روی ویندوز 11 | WSA</title>
                <link>https://virgool.io/@aminaleahmad/sideload-apks-windows-11-wsa-kcfcijznxeiv</link>
                <description>پیشنهاد میکنم قبل از شروع به خوندن این مطلب به قسمت قبلی حتما سر بزنین: https://virgool.io/@aminaleahmad/how-to-install-windows11-wsa-s6amcak6o6ji نصب اپلیکیشن مقصود اصلی ما از نصب کردن ساب‌سیستم اندروید روی ویندوز هست، ولی باز هم از سخت گیری‌های مایکروسافت بگم خدمتتون که شما به عنوان یک کاربر عادی اجازه ندارین همینطوری خوشگل و راحت پکیج APK رو دانلود کنین و روی اندرویدِ ویندوزتون نصب کنین :)) باید از آمازون استور این کار رو انجام بدین که اپلیکیشن های خیلی محدودی داره، و از همه مهم تر اینه که کل کِیفش به اینه که هرچی دلمون میخواد رو نصب کنیم دیگه :))اولین قدم نصب adb روی ویندوز 11 هست، که واردش نمیشیم، از قبل آموزش برای نصبش داخل گوگل هست و دوستان زحمتش رو کشیدن.اولین قدم برای شروع، APK اپلیکیشن اندرویدی که مدنظرتون هست رو دانلود کنین، بعد از دانلود APK، باید ساب‌سیستم اندروید رو استارت کنیم، از استارت منویِ خوشگلِ ویندوز11 استفاده میکنیم.باید آپشن Developer Mode رو روشن کنین، و آیپی ساب‌سیستم رو درنظر داشته باشید.اگه برای شما آیپی آدرس رو Unavailable زده، به دلیل اینه که ساب‌سیستم هنوز استارت نشده، از گزینه اول توی این پنجره که &quot;Files&quot; هست برای استارت زدن استفاده کنین، بعدش با کلیک روی گزینه Refresh جلوی آیپی آدرس، آیپی آدرس ظاهر میشه.برای ادامه کار CMD رو باز میکنیم، به مسیر فایل APK که دانلود کردیم می‌ریم.از دستورadb connect WSAIPADDRESSاستفاده میکنیم که به جای WSAIPADDRESS باید آیپی ساب‌سیستم خودمون رو وارد کنیم، مثلا:adb connect 172.23.31.215بعد از کانکت شدن، میتونیم با استفاده از دستورadb devicesآیپی ساب‌سیستم رو ببینیم.مرحله بعدی که مرحله اصلی هست نصب APK مورد نظرمون هست، با استفاده از دستورadb install &lt;path to apk&gt;اینکار عملی میشه، مثلا من میخواستم اپلیکیشن ADM رو روی دیوایس خودم نصب کنم که دستور برای من اینطوری میشه:adb install &amp;quotAdvanced-Download-Manager-Pro-12.6.9+Arm64-v8a.apk&amp;quotاگه همه مراحل رو درست رفته باشید، آیکون اپلیکیشنی که نصب کردید رو داخل استارت منوی ویندوز 11 خواهید دید:خیلی شیک و مجلسی اپلیکیشن مورد نظرمون رو نصب کردیم، این مورد هم درنظر داشته باشید که این ساب‌سیستم به تازگی معرفی شده و طبیعتن هنوز خیلی جا داره تا به مراحل پایدار برسه، حتما توی آزمایش هاتون به کرش و گلیچ بر میخورید، درمورد سرویس ها و اپلیکیشن های گوگل هم بگم که زحمت نصبش رو نکشید، من نصب کردم کرش میکرد. امیدوارم به زودی راه حل این مشکل هم باهم پیدا کنیم.</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sun, 31 Oct 2021 23:30:06 +0330</pubDate>
            </item>
                    <item>
                <title>نصب اندروید بر روی ویندوز 11 | WSA</title>
                <link>https://virgool.io/@aminaleahmad/how-to-install-windows11-wsa-s6amcak6o6ji</link>
                <description>خیلی قبل ترها مایکروسافت با معرفی ساب‌سیستم (زیرسیستم) لینوکس داخل ویندوز 10 همه کاربرها رو سورپرایز کرد، که همه با نام (Windows Subsystem for Linux) WSL این سیستم رو میشناسیم.حدود دو ماه بعد از معرفی ویندوز 11، مایکروسافت از ساب‌سیستم جدید به صورت عمومی پرده برداشت، ساپورت رسمی اندروید روی ویندوز 11! که طبق روال همیشگی اینطوری نام گذاری میشه:WSA (Windows Subsystem for Android)WSA Bannerاین قابلیت به شما امکان اجرای اپلیکیشن های اندرویدی رو داخل ویندوز میده و چی بهتر از یه قابلیت رسمی که خود مایکروسافت تاییدش میکنه!؟از طرفی دیگه سخت گیری های زیادی روی ویندوز 11 انجام شده، از الزامی بودن TPM 2.0 تا خیلی چیزهای دیگه، که این سیستم WSA هم جزوی از این سخت گیری هاست، و به راحتی نمیشه روی سیستم نه چندان قدیمی تون با یک کلیک نصبش کنین.خب سریع بریم سراغ مراحل نصب:قدم اول اینه که پکیج WSA و پیش نیازهاش رو دانلود کنیم، ازونجایی که مایکروسافت به صورت رسمی اجازه دانلود فایلِ پکیج از مایکروسافت استور رو به ما نمی‌ده مجبوریم به زور متوسل بشیم :))وارد سایت store.rg-adguard.net میشیم، Product ID برای ساب‌سیستم اندروید 9P3395VX91NR هست، از داخل منوی اول ProductID رو انتخاب میکنیم و مقدار بالا رو وارد میکنیم، و داخل منوی آخر هم گزینه Slow انتخاب ما خواهد بود.داخل لیستی که باز میشه، دنبال سنگین ترین فایل بگردین (توی عکس مشخص شده) فایل مورد نظرمون از همه فایل ها پر حجم تره و فرمتش msixbundle هست.فایل رو دانلود کنین، با PowerShell به محلی که فایل رو دانلود کردید برید، و دستور زیر رو داخل PowerShell وارد کنین:Add-AppxPackage -Path &lt;آدرس فایل دانلود شده&gt;مثلا برای من اینطوری می‌شد:Add-AppxPackage -Path &amp;quotC:\Users\Amin\Downloads\MicrosoftCorporationII.WindowsSubsystemForAndroid_1.7.32815.0_neutral_~_8wekyb3d8bbwe.msixbundle&amp;quotاین خیلی مهمه و درنظر داشته باشید که ممکنه به اررور هایی با متن های خیلی طولانی بر بخورید که نشان دهنده نبود یک سری پیش نیازهاست، اصلا نگران نباشید، داخلِ لیستِ همون سایت که پکیج WSA رو دانلود کردید، تمام پیش نیازها رو لیست کرده، اونی که ندارید رو نصب کنین و بعد دوباره امتحان کنین.بعد از اینکه مراحل نصب تموم شد، میتونین آیکون WSA رو داخل استارت ویندوزتون ببینین و ازش لذت ببرین!برای نصب APK هایی که دوست دارین هم میتونین از آموزش بعدی من استفاده کنین: https://virgool.io/@aminaleahmad/sideload-apks-windows-11-wsa-kcfcijznxeiv </description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sun, 31 Oct 2021 23:01:31 +0330</pubDate>
            </item>
                    <item>
                <title>تنظیم ساعت تلفن های گرند استریم Grand Stream</title>
                <link>https://virgool.io/@aminaleahmad/configure-grandstream-time-pdil3zcpwtcj</link>
                <description>بعد از خرید تلفن و کانفیگ کردن اکانت، رفتم که ساعت و تاریخ رو تنظیم کنم، دیدم ای دل غافل! تایم زون تهران +3:00 تنظیم شده، و طبیعتا ساعت تلفن نیم ساعت عقب تر از ساعت ایران میشه. سرتون رو درد نمیارم، مستقیم بریم سراغ روش تنظیم:اول وارد کنترل پنل وب تلفن میشیم، از منوی Settings، گزینه Date and Time رو انتخاب میکنیم.از لیست تایم زون ها Self-Defined Time Zone رو انتخاب میکنیم و داخل فیلد Self-Defined Time Zone تایم زون تهران رو قرار میدیم. (برای باقی شهرها میتونین به این صفحه مراجعه کنین)IRST-3:30IRDT,M3.3.3,M9.3.5و در نهایت با دکمه Save and Apply کار رو تموم میکنیم.</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Sat, 16 Oct 2021 13:11:47 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از کلید SSH برای بکاپ گرفتن اتوماتیک روی Synology NAS</title>
                <link>https://virgool.io/@aminaleahmad/automatic-backup-to-synology-nas-using-ssh-key-cweqih3m3azk</link>
                <description>امروز تصمیم گرفتم برای MySQL سرورها سیستم بکاپ اتوماتیک برای جلوگیری از «از دست رفتن اطلاعات» یا «نجات اطلاعات در برابر هکر های عزیز» راه بندازم.اول از همه استفاده از سرویس گوگل درایو به ذهنم رسید که خداروشکر بخاطر تحریم نمیشه ازش استفاده کرد و باید به موازین ملی پایبند بود. اینجا یخورده کارم سخت شد و چون از قبل رو سرورمون NAS سینولوژی داشتیم گفتم خب بزار از اون استفاده کنم، و چون از rsync استفاده میکردم که روی پروتکل Secure Shell (AKA SSH) هست نمیشد این کار رو از راه معمولیش اتوماتیک کرد. (به این دلیل که هربار موقع آپلود فایل پسورد رو باید دستی وارد کرد)، معمولا تو این مواقع SSH Key ها به کارمون میان و درواقع توی این آموزش قراره بهتون توضیح بدم که چجوری این کلید هارو روی NAS خودمون راه بندازیم:اول از همه این دوتا نکته رو توی ذهنتون داشته باشین:به طور پیشفرض نمیشه با root به سرور ssh زد، توی این آموزش با اکانتی که توی گروه ادمین هاست وارد میشیم و بعد از دستور sudo su برای گرفتن دسترسی root استفاده میکنیم.فقط کاربرانی که توی گروه ادمین ها هستن میتونن به سرور ssh بزنن، ولی استفاده از rsync برای همه کاربرها ممکن هست.مرحله اول اینه که بریم تنظیمات ورود با استفاده از کلید عمومی (public key) رو فعال کنیم:اول مطمئن بشید که سرویس SSH روی سرورتون روشنه، برای اینکار باید به مسیرControl panel &gt; Terminal &amp; SNMP برید و سرویس SSH رو روشن کنید.اگه از قبل اکانتی که توی گروه ادمین ها باشه ندارید باید یدونه بسازیم. توی این آموزش از اسم foaly استفاده میکنیم و داخل مسیرControl panel &gt; User &gt; foaly &gt; Edit &gt; User groupsاون رو به صورت موقت داخل گروه ادمین ها اون رو قرار میدیم.به SSH ،NAS میزنیم و برای گرفتن دسترسی root دستورsudo suرو تایپ میکنیم.با دستورvim /etc/ssh/sshd_configفایل کانفیگ SSH باز میشه، داخلش دوتا خط PubkeyAuthentication yes و AuthorizedKeysFile .ssh/authorized_keys  رو از کامنت درمیاریم، حواستون باشه به چیز دیگه ای دست نزنین و گرنه ممکنه برای همیشه دسترسی SSH رو از دست بدین!بعد از این مرحله سرویس SSH رو از داخل پنل وب NAS یه بار خاموش و روشن میکنیم.اگه کاربری رو برای این کار داخل گروه ادمین ها گذاشتین الان میتونین از این گروه خارجش کنین.حالا احراز هویت با کلید عمومی (Public key) فعال شده، الآن باید کلید هارو داخل NAS و کلاینت مون قرار بدیم تا بدون پسورد کارمون انجام بشه (فرض میکنیم کلاینتمون میخواد خودشو با یوزر backup احراز کنه)کاربر backup رو توی گروه ادمین ها قرار میدیمبه کلاینتمون وصل میشیم و یک کلید میسازیم (اگه از قبل ندارین):ssh-keygen -t rsaکلیدی که ساختیم رو روی NAS کپی میکنیم (اینجا ازتون پسورد اکانت backup رو میخواد) :ssh-copy-id backup@[nas-ip]و این بخش مهمه که به NAS وصل بشیم و دستورات زیر رو تایپ کنیمchmod 0711 ~chmod 0711 ~/.sshchmod 0600 ~/.ssh/authorized_keysالان دیگه باید احراز هویت ـمون کار کنه، برای تستssh backup@nas-ipرو تایپ میکنیم و نباید پسورد بخوادو یادمون نره که یوزر backup رو اگه لازم نداریم از گروه ادمین ها خارج کنیمبرای فرستادن بکاپ ها به NAS هم میتونین کارهای زیر رو انجام بدین:مطمئن میشیم که سرویس rsync روی NAS فعاله (حواستون باشه تیک Enable rsync account رو نزنید)Control panel &gt; File Services &gt; rsync &gt; Enable rsync serviceفولدر اشتراکی (Shared Folder) رو بسازید که بکاپ ها اونجا ریخته بشن (مثلا poshtibanha - در کل من پیشنهاد میکنم توی اینجور موارد از عبارات فینگلیش استفاده کنین که اگه آقای هکر به هر نحوی به NAS دسترسی پیدا کرد سخت تر بتونه فولدر های حساس و مهم رو پیدا کنه).و در نهایت از دستورrsync -az /var/www backup@[nas-ip]:/volume1/Backups/میتونین برای ارسال بکاپ ها استفاده کنیناین هم یه دستور پیچیده برای انجام یه کار تمیزتر:rsync -az -e &amp;quotssh -p 23342&amp;quot --backup --backup-dir=&amp;quotrsync_bak_`date &#039;+%F_%H-%M&#039;`&amp;quot --exclude &#039;tmp*&#039; --exclude &#039;cache*&#039; --exclude &#039;logs&#039; /var/www backup@[nas-ip]:/volume1/Backups/توضیحات برای دستور بالا:اتصال به پورت رندوم 23342 برای NAS های که پشت فایروال یا NAT هستن (بیشتر برای گمراه کردن رباتها استفاده میشه)استفاده از تاریخ و ساعت در بکاپ که فایل جدید روی بکاپ قبلی overwrite نشه و از بکاپتون نسخه های مختلف داشته باشید.خارج کردن فولدر هایی که لازممون نمیشن از لیست ارسال.منبع: https://silica.io/using-ssh-key-authentification-on-a-synology-nas-for-remote-rsync-backups/ (اگه به مشکل برخوردید به نظرم یه نگاهی به کامنت های پست اصلی بندازید ? و اگر جوابی پیدا نکردین همینجا کامنت بزارین امیدوارم که بتونم کمکتون کنم)</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Thu, 07 Oct 2021 21:17:37 +0330</pubDate>
            </item>
                    <item>
                <title>دسترسی به ریموت کنسول iLo 3 - ویندوز</title>
                <link>https://virgool.io/@aminaleahmad/acess-hp-ilo-3-remote-console-jxgupyb14s6u</link>
                <description>چندروز پیش رفتیم یه مدرسه ای که میگفت سرور بیگ بلو باتن و مودل برای آموزش مجازی مدرسه میخوام، سرور هم خودم دارم DL380 G7.کارای سرور رو انجام دادیم و بردیم دیتاسنتر، نصب کردیم و برگشتیم، آیپی iLo رو از دیتاسنتر گرفتیم و دیدم ای دل غافل! ریموت کنسول iLo باز نمیشه که روی ESXi آیپی ست کنم.و طبیعتن به زحمت و وقتی که طلف می شد نمی ارزید که از دیتاسنتر وقت بگیریم، موس و کیبورد و مانیتور ببریم و به صورت فیزیکی روی ESXi آیپی تنظیم کنیم.خلاصه کلی توی فروم ها گشتم و آزمون خطا کردم تا اینکه بالاخره به یه راه حل رسیدم که اینجا باهاتون به اشتراک میذارم:خب برای اولین قدم لازمه که از توی منوی iLo به بخش Administration و بعد Security بریم، داخل تب Encryption باید گزینه Enforce AES/3DES Encryption برروی Enabled قرار بگیره.بعد از این مرحله نوبت به نصب جاوا میرسه، ازونجایی که iLo ما آخرین نسخه نیست پس جاوا آخرین نسخه هم به دردش نمیخوره. نسخه ای که لازمه 8.0.1620.12 هست.https://repo.croweb.host/windows/java/میتونین از اینجا با توجه به معماری ویندوزتون نسخه لازم رو دانلود و نصب کنین.بعد از دانلود کردن و نصب کردن جاوا، مجدد وارد بخش Remote Console از منوی iLo میشیم.و داخل سرفصل Java Integrated Remote Console برروی گزینه Web Start کلیک میکنیم، مرورگر بصورت خودکار یه فایل با پسوند jnlp دانلود میکنه.فایل دانلود شده رو باز میکنیم با همچین پنجره ای رو به رو میشیم:برروی گزینه آخر کلیک میکنیموب سرور iLo سرتیفیکیت SSL ساین شده نداره، برای همین Continue رو انتخاب میکنیم.مجدد خطای سرتیفیکیت داریم، اهمیت نمیدیم و با زدن تیک پایین سمت چپ و انتخاب گزینه Run برنامه رو اجرا میکنیم.و بوووووم!!! ریموت کنسول ما با موفقیت اجرا شد.</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Tue, 07 Sep 2021 14:31:35 +0430</pubDate>
            </item>
                    <item>
                <title>ساختن Repo یا ریپوزیتوری شخصی در سیدیا Cydia</title>
                <link>https://virgool.io/@aminaleahmad/create-your-own-cydia-repo-nwkuaegz21pm</link>
                <description>سلام، تو این مطلب قراره ریپوزیتوری یا همون Repo یا Repository خودمون رو برای سیدیا بسازیم!توجه کنید که این آموزش با آی او اس ۱۱٫۳٫۱ و دیوایس آیفون ۶ جیلبریک شده با electra1131 تست شده و کاملا هماهنگ میباشد.طبق معمول اول ابزارهای مورد نیاز:سرورسیستمی که روش دستور های bz2، dpkg و nano نصب باشه (اگه سرور دارید از همون میشه استفاده کرد)چندتا پکیج با فرمت deb. که آموزش ساختشو بعدا میزارمآموزش نصب وب سرور apache :دستور زیر رو در ترمینال سرور اجرا کنید.sudo apt-get install apache2خب الان ما وب سرور رو در آدرس /var/www/html/ نصب کردیم و هرچی فایل با فرمت html. بریزیم توی این فولدر، وقتی آیپی سرور رو توی آدرس بار مرورگر بزنیم باز میشه.دسته بندی فایل های deb. :فایل های deb. رو در آدرس /var/www/html/ بریزید و به صورت زیر عمل کنید:[root@desktop:/var/www/html]# dpkg-scanpackages -m . /dev/null &gt;Packages
 ** Packages in archive but missing from override file: **
  com.saurik.myprogram

 Wrote 1 entries to output Packages file.
[root@desktop:/var/www/html]# bzip2 Packages
[root@desktop:/var/www/html]# ls -la *
-rw-r--r-- 1 root root 906 2008-07-01 07:48 MyProgram.deb
-rw-r--r-- 1 root root 380 2008-07-01 08:00 Packages.bz2
[root@desktop:/var/www/html]#در دستور اول m- استفاده میشه برای اینکه بگیم تمامی فایل های توی این فولدر، هنگام اجرای این دستورها خطاها عادیه و اگر خطایی داد بهش توجه نکنید.شما الآن Repository رو ساختید و کار تمومه، مراحل بعدی اختیاری هستش و جهت قیافه دادن به ریپوزیتوری استفاده میشه! D:اطلاعات اضافی : (اختیاری)در این مرحله یاد میگیریم که چطوری باید به Repository خودمون اسم و توضیحات و … بدیم!اول از همه باید یه فایل با نام Release بسازیم که با دستور زیر قابل انجامه، این دستور برای ساختن فایل “خالی” استفاده میشه.$ touch Releaseالآن یک فایل به نام Release ساخته شده، باید محتویات زیر رو بهش اضافه کنیم که اینجا ابزار ادیتور فایل nano که تحت ترمینال هست به کار ما میاد.$ nano Releaseمتن زیر رو درون فایلpaste کنید تغییرش بدید و با دستورهای CTRL + X و بعد y و بعد Enter از محیط ادیتور خارج بشید.Origin: Saurik’s Example for Cydia
Label: Cydia Example
Suite: stable
Version: 0.9
Codename: tangelo
Architectures: iphoneos-arm
Components: main
Description: An Example Repository from HowTo InstructionsOrigin:این خط نام ریپوزیتوری در سورس ادیتور نمایش داده میشه، یکم از نام اصلی ریپوزیتوری طولانی تره.Label:یک نام ساده که برای ریپوزیتوری استفاده میشه و همون نامیه که سیدیا به کاربر نشون میده.Suite:لازم نیست تغییرش بدید، بزارید همون stable بمونه.Version:یک شماره نسخه دلخواه، فرقی نمیکنه چ عددی باشه.Codename:اینو نفهمیدم چیه ولی همون tangelo بزارید کار میکنهArchitectures:این خط مشخص میکنه که ریپوزیتوری شما برای چه دیوایس هایی مورد استفاده قرار میگیره، دیوایس های جدید iphoneos-arm هستند.Components:لازم نیست تغییرش بدید، بزارید همون main بمونه.Description:این خط هم توضیحات ریپوزیتوری هست.بعد از تغییراتی که در فایل دادین کار تمومه، اونو سیو کنید و ریپوزیتوری رو به سیدیا اضافه کنید :)آموزش اضافه کردن ریپوزیتوری به سیدیا:اضافه کردن ریپوزیتوری به سیدیا ۳ مرحله هستش! ۱ – بازکردن سیدیا ۲ – رفتن به تب دوم ۳ – اضافه کردن ریپوزیتوری</description>
                <category>aminaleahmad</category>
                <author>aminaleahmad</author>
                <pubDate>Thu, 02 Sep 2021 18:27:04 +0430</pubDate>
            </item>
            </channel>
</rss>