<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدرضا شریفی</title>
        <link>https://virgool.io/feed/@r3z4</link>
        <description>Devops/SRE</description>
        <language>fa</language>
        <pubDate>2026-06-10 14:06:20</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1664257/avatar/nkAG3C.png?height=120&amp;width=120</url>
            <title>محمدرضا شریفی</title>
            <link>https://virgool.io/@r3z4</link>
        </image>

                    <item>
                <title>محدود کردن دسترسی به کانتینرهای داکر برای IPهای خاص</title>
                <link>https://virgool.io/@r3z4/docker-ports-management-kh5upaucx0xq</link>
                <description>مواردی پیش میاد که لازمه پورت های یک کانتینر خاص رو به آیپی های مشخص شده محدود کنیم. پس از جستجوهایی که انجام دادم و مطالعه آموزش‌های مختلف درباره کانفیگ iptables با داکر، راه‌حل مناسبی پیدا نکردم. مستندات رسمی داکر هم در این زمینه کافی نبود. اما با ترکیب اطلاعاتی که جمع‌آوری کردم، تونستم راهکاری ساده و کاربری پیدا کنم. در این آموزش، نحوه استفاده از ipset و قوانین iptables برای محدود کردن دسترسی به IPهای خاص (لیست سفید) را توضیح می‌دهم. البته می‌توان همین روش را برای مسدود کردن IPهای خاص (لیست سیاه) نیز به کار برد.ابتدا لازمه پکیج ipset رو در سرور نصب کنیم اگه سیستم عامل سرور ما اوبونتو باشه از دستور زیر نصب رو انجام میدیم.sudo apt install ipsetمرحله 1: ایجاد یک IPSetابتدا باید یک IPSet ایجاد کنیم تا لیستی از IPهای مجاز به دسترسی به کانتینرهای داکر را نگهداری کند.sudo ipset create docker-allowed hash:ipدستور بالا یک IPSet خالی به نام docker-allowed ایجاد می‌کند. شما می‌توانید هر نام دلخواهی انتخاب کنید. حالا باید لیست IPهای مورد نظر را به این مجموعه اضافه کنیم:sudo ipset add docker-allowed 10.0.0.2 
  sudo ipset add docker-allowed 10.0.0.226 
  sudo ipset add docker-allowed 10.0.0.227برای بررسی پیکربندی IPSet:sudo ipset list docker-allowedخروجی شامل اطلاعاتی درباره نام، نوع، و اعضای IPSet خواهد بود.ذخیره تنظیمات:برای جلوگیری از حذف IPSet پس از راه‌اندازی مجدد سیستم، آن را ذخیره کنید:mkdir /etc/ipset
sudo ipset save &gt; /etc/ipset/ipsetمرحله 2: ایجاد قوانین IPTables برای مجاز کردن دسترسیبراساس مستندات داکر، قوانین دستی باید در زنجیره DOCKER-USER اضافه شوند. این قوانین پیش از قوانین زنجیره DOCKER اعمال می‌شوند.ایجاد اولین قانون:sudo iptables -I DOCKER-USER -i eth0 -m set ! --match-set docker-allowed src -j DROPاین قانون ترافیکی که از IPهای خارج از لیست docker-allowed باشد را مسدود می‌کند. توجه داشته باشید که باید eth0 را با نام رابط شبکه خود جایگزین کنید.افزودن قانون برای ترافیک‌های موجود:sudo iptables -I DOCKER-USER -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPTنتیجه‌گیریاین روش ساده‌ترین و مؤثرترین راهی بود که توانستم برای محدود کردن دسترسی به IPهای خاص در داکر پیدا کنم. این روش به‌راحتی قابل تنظیم برای نیازهای مختلف است. اگر شما هم روش دیگری می‌شناسید، خوشحال می‌شوم نظراتتان را بشنوم.</description>
                <category>محمدرضا شریفی</category>
                <author>محمدرضا شریفی</author>
                <pubDate>Tue, 19 Nov 2024 16:41:20 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه نصب و استفاده از ماژول real-time ساعت در raspberry pi</title>
                <link>https://virgool.io/@r3z4/%D9%86%D8%AD%D9%88%D9%87-%D9%86%D8%B5%D8%A8-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%85%D8%A7%DA%98%D9%88%D9%84-real-time-%D8%B3%D8%A7%D8%B9%D8%AA-%D8%AF%D8%B1-raspberry-pi-y2ekuxbwaqpb</link>
                <description>raspberry pi دستگاه اگه دقت کرده باشید روی مادربرد کامپیوتر یه باتری وجود  داره و بصورت کلی همه میدونیم که وظیفه این قسمت نگهداری یه سری اطلاعات  مثل زمان و تاریخه که با قطع شدن برق مادربرد نباید از بین بره. دستگاه  رزبری پای این قطعه رو نداره و زمانی که دستگاه خاموش بشه و بعد از مدتی  دوباره دستگاه روشن بشه آخرین زمانی که سیستم عامل داشته رو نشون میده مثلا  اگه ساعت 8 شب خاموش بشه و 10 صبح دوباره روشن بشه دستگاه ساعت 8 شب رو  نشون میده. اگه برق دستگاه قطع بشه ممکنه کلا تاریخ و ساعت ریست بشه و  تاریخ نا مربوطی رو نشون میده .زمانی که دسترسی به اینترنت وجود داشته  باشه با انتخاب منطقه زمانی و فعال کردن automatic update این مشکل برطرف  میشه و دستگاه تاریخ و زمان خودش رو آپدیت میکنه.اخیرا پروژه ای داشتم  که باید دستگاه توی ساعات مختلف کار های متفاوتی رو انجام میداد پروژه رو  تماما با bash script نوشتم توی محیطی که دستگاه قرار میگرفت دسترسی به  اینترنت نداشت و اگه به هر دلیل دستگاه خاموش میشد و یا برق قطع میشد تایم  دستگاه بهم میریخت و پروژه شکست میخورد.با پرس وجو هایی که انجام دادم  متوجه شدم ماژولی برای اینکار وجود داره ولی این که این ماژول رو از کجا  تهیه کنم و چجوری به رزبری پای متصلش کنم و چجوری برنامه نویسیش کنم کمی  پیچیده به نظرم می رسید.توی مطلب زیر نحوه استفاده از ماژول real-time clock در زربری پای رو آموزش دادم ممکنه یه روزی به دردتون بخوره.اسم ماژول RTC DS3231 نوع ماژول I2Cماژول RTC DS3231نحوه  اتصال این ماژول به رزبری پای بصورت زیر هستش از سیم هایی که مخصوص این  ماژول ها هست استفاده کنید باید دو طرف مادگی باشه و نیازی به لحیم کاری هم  نداره .فقط پین های زیر رو به دستگاه متصل کنید و دقت کنید که دستگاه خاموش باشه وقتی اینکار رو میکنید.پین SCL که Serial Clock Input هستش و مطابق شکل به سومین پین وصل میشهپین SDA که Serial Data Input نام داره و مطابق شکل به دومین پین رزبری پای وصل میشه.پین VCC که برق ورودی ماژول هست که باید به اولین پین رزبری پای که 3.3 ولت هست وصل بشهپین GND اتصال به زمین هست که میتونید به یکی از پین های 9 یا 25 یا 39 وصل کنید.توی  اتصال پین ها دقت کنید که اگه اشتباه وارد کنید ماژول داغ میشه و یه سری  کریستال هایی داره که روی اون وجود داره ممکنه بسوزه و دردسر درست بشه .به پین های 32K و SQW هم کاری نداریم و متصلشون نمی کنیم. این ها کاربرد های دیگه ای دارن.نحوه کانفیگ نرم افزاری ماژول در رزبری پایابتدا دستگاه را بروزرسانی می کنیم و پیش نیاز های ماژول را نصب میکنیم.sudo apt-get updatesudo apt-get install python-smbussudo apt-get install i2c-toolsباید در تنظیمات رزبری پای ماژول I2C را فعال کنید؛ دستور زیر را وارد می کنیم و Advanced Options را انتخاب و i2c را enable میکنیم.· sudo raspi-configفایل زیر را باز کردهsudo nano /etc/modulesو مقادیر زیر را در ان قرار می دهیمi2c-bcm2708i2c-devrtc-ds1307با دستور زیر Bus را تست میکنیم.sudo i2cdetect -y 1خروجی باید بصورت زیر باشد.سپس در ادامه فایل زیر را باز کردهsudo nano /etc/rc.localمقادیر زیر را قبل از عبارت exit 0 قرار می دهیم.echo ds1307 0x68 &gt; /sys/class/i2c-adapter/i2c-1/new_devicehwclock -sسپس دستگاه را ریبوت می کنیم .Sudo rebootبعد از بالا امدن دستگاه ساعت دستگاه را تنظیم کرده و با دستور sudo hwclock -w ساعت سیستم را به ماژول می دهیم.با دستور sudo hwclock -r میتوانیم ساعت فعلی ماژول را بخوانیم.امیدوارم این اموزش واستون مفید بوده باشه 😊تمام</description>
                <category>محمدرضا شریفی</category>
                <author>محمدرضا شریفی</author>
                <pubDate>Sun, 02 Jun 2024 16:19:40 +0330</pubDate>
            </item>
                    <item>
                <title>چطوری سایتی مثل GTmetrix بسازیم؟</title>
                <link>https://virgool.io/@r3z4/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA%DB%8C-%D9%85%D8%AB%D9%84-gtmetrix-%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D9%85-kwhgfwtntco1</link>
                <description>در این مطلب میخوام آموزش بدم چطوری میتونیم سایتی داشته باشیم که از طریق اون بتونیم سرعت بارگزاری بقیه سایت هارو ارزیابی کنیم. برای پیاده سازی این پروژه داشتن تجربه کار با سرور های لینوکس و همچنین یه مقدار کمی برنامه نویسی لازمه. علاوه بر این ها لازم هست یه سری چیز های دیگه هم داشته باشیم!یک دامنه برای این که سایتمون رو با اون آدرس باز کنیم بهمراه یک سرور مجازی لینوکسی و چند تا چیز دیگه که در ادامه کامل در موردش توضیح میدم.قبل این که روال بالا آوردن پروژه رو شروع کنم باید سرویس lighthouse رو خدمتتون معرفی کنم سرویس فانوس دریایی گوگل (انصافا اسم قشنگی هم واسش انتخاب کردن) یک ابزار متن بازه که با استفاده ازش میشه سرعت بارگزاری و میزان بهینه بودن سایت رو آنالیز کرد این ابزار بصورت پیشفرض روی مرورگر کروم نصب هستش اگه توی مرورگر کروم F12 رو بزنید بعدش به tab مربوط به lighthouse وارد بشید کافیه Generate Report رو بزنید تا بعد از گذشت چند دقیقه یک گزارش کامل از سایتی که باز کردین رو بهتون بده.توی مرورگر کروم F12 بزنید و توی این قسمت این ابزار رو میبینیدخروجی که این ابزار به ما میده کاملا همه نیاز هایی که دولوپر ها و SEO کار ها میخوان رو در اختیار قرار میده و حتی در برخی از پارامتر ها از ابزار های GTMetrix و سرویس های مشابه بهتر هم باشه!داشتم گیت هاب این ابزار رو زیر و رو میکردم که به فکرم رسید بصورت خیلی ساده و می نیمال یک سایت بالا بیارم و از این ابزار در Backend استفاده کنم قطعا چیز جذابی میشه.شروع پروژهگام اول اتصال دامنه به سرورخب برای شروع ابتدا به یک دامنه و یک سرور نیاز داریم این که دامنه چه پسوندی داشته باشه و یا سرورمون ایران باشه یا خارج اهمیتی نداره. برای اتصال دامنه به سرور من ساده ترین راه رو انتخاب کردم! درست حدس زدید استفاده از CDN. چون با اینکار دیگه لازم نیست DNSسرور واسه خودم بالا بیارم و کلی وقت بزارم کانفیگش کنم و همچنین این که من برای دامنه م گواهی ssl هم میخواستم و اگه میخواستم روی سرور خودم ssl بگیرم وقت گیر بود. همه این ها با استفاده از CDN انجام شد و من چند مرحله جلو افتادم! روی دامنه م dns های ns1.f95.com و ns2.f95.com رو ست کردم و از cdn گرین پلاس استفاده کردم بعدش هم توی پنل ابرایرانسرور توی قسمت &quot;شبکه توزیع محتوا&quot; دامنه م رو اضافه کردم و رکورد هایی که میخواستم رو اد کردم. پنل ابر ایرانسروراین cdn رو انتخاب کردم چون واسه من راحت تر بود و امکاناتی که میخواستم رو داشت شما میتونین از هر cdn که خاستید و راحتتر بودید استفاده کنید. برای فعال سازی گواهی ssl هم وارد تب ssl شدم و درخواست گواهی رو زدمنحوه صدور گواهی دیجیتال.گام دومکانفیگ سرورخب رسیدیدم به مرحله ای که من خیلی بهش علاقه دارم و همیشه دنبالشم! برای اینکه درخواست هایی که از سمت دامنه به سرور میرسه مدیریت بشه نیاز به یک وبسرور داریم انتخاب من به دلایل خیلی زیادی استفاده از وبسرور Nginx بود این وبسرور حتما به گوشتون خورده و نیاز به توضیح اضافه تری نداره با دستور زیر به راحتی یک نسخه stable از nginx رو روی سرور نصب کردمapt install nginx -yچون میخواستم برای ارتباط سایت با ابزار فانوس دریایی گوگل از دستور لینوکس و bash script  استفاده کنم لازم بود زبان php هم نصب کنم و از همه مهمتر اون رو به وبسرور ارتباط بدم!sudo apt -y install php7.4-fpm php7.4-bcmath php7.4-curl php7.4-gd php7.4-mbstring php7.4-mysql php7.4-xml php7.4-zip بعد از نصب و کانفیگ وبسرور و php لازمه بود که برای سایتم توی تنظیمات nginx یک فایل در مسیر /etc/nginx/sites-enabled/ ایجاد کنم و مقادیر زیر رو داخلش بزارم تا زمانی که سایت رو در مرورگر فراخوانی میکنم سایت باز بشه.server {        listen 80;        listen [::]:80;        server_name perfme.xyz;        root /var/www/perfme.xyz/;        index index.html index.php;        location / {                try_files $uri $uri/ =404;        }حالا که خیالم بابت ارتباط دامنه و سرورم راحت شد رفتم سراغ نصب  Lighthouse گوگل این نکته رو بگم که سرورتون لازمه رابط گرافیکی یا همون GUI داشته باشه که بتونید روش مرورگر کروم رو نصب کنید من روی سرورم kubuntu20.04 رو نصب کردم و بعدش هم آخرین نسخه کروم رو.بریم برای اجرای پروژهمن چون میخواستم سورس پروژه رو داشته باشم Git clone کردم و پروژه رو build گرفتم ولی شما اگه دنبال راه ساده تر میگردین همونطور که توی گیت توضیح داده شده خیلی راحت با دستور زیر اون رو نصب کنید ولی قبلش لازمه npm و node نسخه ۱۴ یا جدیدتر رو روی سرور نصب کرده باشین.npm install -g lighthouseبعد از نصب فانوس دریایی گوگل اگه همه مراحل رو درست رفته باشین میشه با دستور زیر ازش استفاده کرد.lighthouse perfme.xyzکافیه بجای آدرس سایت من هر آدرسی که میخواید رو وارد کنید.این دستور رو اگه به همراه فلگ --help بزنید کاملا آپشن های موجود رو میبینین و این دستور رو با سویچ هایی که لازمه اجرا کنید مثلا من چون میخواستم خروجی رو توی سایتم نشون بدم از سویچ --output html استفاده کردم و خروجی رو ریختم توی مسیری که وبسرورم بهش دسترسی داشته باشه تا بتونه اون رو فراخوانی کنه سویچ --chrome-flags=&quot;--no-sandbox --headless&quot; رو باید بزنید تا برای هر بار اجرای دستور لازم نباشه مرورگر کروم رو باز کنه .گام سومطراحی سایت!از اونجایی که من طراح سایت و توسعه دهنده front و backend نیستم کارم رو با ساده ترین شکل ممکن انجام دادم که فقط کار کنه و نا زیبا بودن قالب سایت رو سایر موارد رو از بنده قبول کنید دیگه :D اولین کاری که کردم دستوراتی که بالاتر توضیح دادم رو بصورت بش اسکریپت در اوردم و ادرس سایت رو بعنوان متغییر از ورودی دریافت کردم. بش اسکریپتی که نوشتم به این شکله :#!/bin/bashSITE=&amp;quot&amp;quotSITE=$1VALUE=$(echo $SITE | awk -F&#039;//&#039; &#039;{print $2}&#039;)lighthouse $SITE --output html --chrome-flags=&amp;quot--no-sandbox --headless&amp;quot  --output-path ./path/$VALUE.htmlحالا لازم بود که یک فرم داشته باشم تا این بش رو اجرا کنه!سرچ کردم و به لطف w3school یک فرم پیدا کردم که نیاز داشت کمی ویرایش بشه (فقط تگ body رو اینجا گذاشتم که زیاد شلوغ  نشه)  &lt;body&gt;    &lt;div class=&amp;quotmain-block&amp;quot&gt;      &lt;h1&gt;Site Performance Checker&lt;/h1&gt;      &lt;form action=&amp;quot./run_bash.php&amp;quot method=&amp;quotget&amp;quot&gt;        &lt;hr&gt;        &lt;div class=&amp;quotaccount-type&amp;quot&gt;          &lt;input type=&amp;quotradio&amp;quot value=&amp;quotnone&amp;quot id=&amp;quotradioOne&amp;quot name=&amp;quotaccount&amp;quot checked/&gt;          &lt;label for=&amp;quotradioOne&amp;quot class=&amp;quotradio&amp;quot&gt;Personal&lt;/label&gt;          &lt;input type=&amp;quotradio&amp;quot value=&amp;quotnone&amp;quot id=&amp;quotradioTwo&amp;quot name=&amp;quotaccount&amp;quot /&gt;          &lt;label for=&amp;quotradioTwo&amp;quot class=&amp;quotradio&amp;quot&gt;Company&lt;/label&gt;        &lt;/div&gt;        &lt;hr&gt;        &lt;label id=&amp;quoticon&amp;quot for=&amp;quotname&amp;quot&gt;&lt;i class=&amp;quotfas fa-envelope&amp;quot&gt;&lt;/i&gt;&lt;/label&gt;        &lt;input type=&amp;quottext&amp;quot name=&amp;quotsubject1&amp;quot id=&amp;quotname&amp;quot placeholder=&amp;quotEmail (not required)&amp;quot checked/&gt;        &lt;label id=&amp;quoticon&amp;quot for=&amp;quotsubject2&amp;quot&gt;&lt;i class=&amp;quotfas fa-user&amp;quot&gt;&lt;/i&gt;&lt;/label&gt;        &lt;input type=&amp;quottext&amp;quot name=&amp;quotsubject2&amp;quot id=&amp;quotsubject2&amp;quot placeholder=&amp;quotYour Site (https://domain.com)&amp;quot required/&gt;        &lt;hr&gt;        &lt;hr&gt;        &lt;div class=&amp;quotbtn-block&amp;quot&gt;&lt;input type=&amp;quotsubmit&amp;quot value=&amp;quotSubmit&amp;quot&gt;&lt;/form&gt;        &lt;/div&gt;      &lt;/form&gt;    &lt;/div&gt;  &lt;/body&gt;همونطور که میدونید html به تنهایی نمیتونه دستورات bash رو اجرا کنه و به زبان backend نیاز هست که من از php استفاده کردم و یک فایل خیلی ساده نوشتم و در اون ورودی رو از کاربر گرفتم و پاس دادم به بش اسکریپت و در انتها این فایل رو در تگ های html فراخوانی کردم و تمام.&lt;?phpif(isset($_GET[&#039;subject2&#039;])) {    $text = $_GET[&#039;subject2&#039;];    $text = escapeshellarg($text);//echo $text1;$output = exec&#40;&#039;./rex.sh  &#039; . $text  &#41;;$string = str_replace(&amp;quot&#039;&amp;quot, &#039;&#039;, $text); // Replaces all spaces with hyphens.$string = str_replace(&amp;quothttps://&amp;quot, &#039;&#039;, $string); // Replaces all spaces with hyphens.$string = str_replace(&amp;quothttp://&amp;quot, &#039;&#039;, $string); // Replaces all spaces with hyphens.echo ($string);header(&amp;quotLocation: ./path/$string.html&amp;quot);exit;}?&gt;یاداوری کنم چون من طراح نیستم سایت رو به شکل ساده و ابتدایی بالا اوردم اگه همزمان چند تا درخواست وارد بشه ممکنه خروجی نده چون صف نداره :D و از لحاظ آسیب پذیری امنیتی هم خیلی جای کار داره. شما با امکانات بهتر و بیشتر و UI-UX قشنگتر این رو بیارید بالا :Dو همینطور که در تصویر میبینید اگه لینک زیر رو باز کنین و آدرس سایتتون رو وارد بعد از چند دقیقه سایتتون توسط فانوس دریایی گوگل آنالیز میشه و خروجی رو میبینید.و خروجی هم اینطوری خواهد بود .و کلی توضیحات دیگه!این بخشی از آنالیز سایت هستش خروجی کامل رو اینجا میتونین مشاهده کنین.مرسی که تا اینجا همراه من بودین اگه از این مطلب خوشتون اومد لطفا برای دوستاتون ارسال کنید و با فیدبک هایی که میدین همراهم باشین :)</description>
                <category>محمدرضا شریفی</category>
                <author>محمدرضا شریفی</author>
                <pubDate>Wed, 08 Jun 2022 18:58:33 +0430</pubDate>
            </item>
            </channel>
</rss>